fix formatting everywhere and make operation resolving faster

This commit is contained in:
Qrakhen 2025-11-23 07:38:22 +01:00
parent fad93a7973
commit a39096014c
94 changed files with 3941 additions and 3862 deletions

View File

@ -121,16 +121,14 @@ do {
Console.WriteLine();
runner.Run(stream);
stream.Dispose();
}
catch (QampException e) {
} catch (QampException e) {
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($" !> {e.Message}");
if (e.StackTrace != null) {
Console.Write($" ! ");
Console.WriteLine(string.Join("\n ! ", e.StackTrace.Split('\n')));
}
}
catch (Exception e) {
} catch (Exception e) {
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine($" !? {e.Message}");
if (e.StackTrace != null) {
@ -138,7 +136,7 @@ do {
Console.WriteLine(string.Join("\n ! ", e.StackTrace.Split('\n')));
}
}
} while(code != ConsoleCode.Exit);
} while (code != ConsoleCode.Exit);
public class Command
{

View File

@ -31,8 +31,7 @@ public static class Benchmark
string key = MakeKey(id, member, file);
if (!_clocks.TryGetValue(key, out Stopwatch? sw))
{
if (!_clocks.TryGetValue(key, out Stopwatch? sw)) {
sw = _clocks[key] = new Stopwatch();
Console.WriteLine($" ::: Registered new benchmark clock '{key}'");
}
@ -60,8 +59,7 @@ public static class Benchmark
string key = MakeKey(id, member, file);
if (!_clocks.TryGetValue(key, out Stopwatch sw))
{
if (!_clocks.TryGetValue(key, out Stopwatch sw)) {
#if LOG
_logger.Debug($"No clock found for '{key}', start one first using Benchmark.Start()");
#endif

View File

@ -18,8 +18,7 @@ public class SegmentBuilder() : IBuilder<Segment>, IDebug<string>
public string Debug(DebugLevel level = DebugLevel.None)
{
string str = Debugger.GetContextString(this);
for (int i = 0; i < Instructions.Count; i++)
{
for (int i = 0; i < Instructions.Count; i++) {
var instruction = Instructions[i];
/*if ((instruction.Code & 0x80) == 1) {
// dynamic

View File

@ -129,10 +129,14 @@ public class Digester : ISteppable<Token>
#if LOG
_logger.Method();
#endif
if (Match(T.Class)) DeclareClass();
else if (Match(T.Function)) DeclareFunction();
else if (Match(T.Var)) DeclareVariable();
else Statement();
if (Match(T.Class))
DeclareClass();
else if (Match(T.Function))
DeclareFunction();
else if (Match(T.Var))
DeclareVariable();
else
Statement();
}
internal void Statement()
@ -140,21 +144,36 @@ public class Digester : ISteppable<Token>
#if LOG
_logger.Method();
#endif
if (Match(T.If)) If();
else if (Match(T.Else)) Else();
else if (Match(T.While)) While();
else if (Match(T.Do)) Do();
else if (Match(T.For)) For();
else if (Match(T.Return)) Return();
else if (Match(T.TypeOf)) TypeOf();
else if (Match(T.Print)) Print();
else if (Match(T.PrintStack)) PrintStack();
else if (Match(T.PrintGlobals)) PrintGlobals();
else if (Match(T.PrintExpr)) PrintExpr();
else if (Match(T.Export)) Export();
else if (Match(T.Import)) Import();
else if (Match(T.ContextOpen)) Context();
else Expression();
if (Match(T.If))
If();
else if (Match(T.Else))
Else();
else if (Match(T.While))
While();
else if (Match(T.Do))
Do();
else if (Match(T.For))
For();
else if (Match(T.Return))
Return();
else if (Match(T.TypeOf))
TypeOf();
else if (Match(T.Print))
Print();
else if (Match(T.PrintStack))
PrintStack();
else if (Match(T.PrintGlobals))
PrintGlobals();
else if (Match(T.PrintExpr))
PrintExpr();
else if (Match(T.Export))
Export();
else if (Match(T.Import))
Import();
else if (Match(T.ContextOpen))
Context();
else
Expression();
}
internal void Expression()
@ -240,8 +259,7 @@ public class Digester : ISteppable<Token>
IsDerived = false
};
if (Match(T.Colon))
{
if (Match(T.Colon)) {
Consume(T.Identifier, "Expected base class name.", false);
ExpressionParser.Variable(this, false);
if (name == Previous.Value!)
@ -718,8 +736,7 @@ public class Digester : ISteppable<Token>
/// </summary>
internal void Patch(byte[] bytes, long position)
{
for (int i = 0; i < bytes.Length; i++)
{
for (int i = 0; i < bytes.Length; i++) {
Function.Segment.Instructions[position + i] = bytes[i];
}
}
@ -856,7 +873,7 @@ public class Digester : ISteppable<Token>
private void ReportError(Token token, string errorMessage)
{
#if LOG
#if LOG
_logger.Method();
#endif
ErrorPosition = token.Position;

View File

@ -28,25 +28,62 @@ public static class ExpressionParser
digester.WeightedDigest(rule.Weight + 1);
switch (operatorType) {
case TokenType.BangEqual: digester.Emit(OpCode.Equal, OpCode.Not); break;
case TokenType.EqualEqual: digester.Emit(OpCode.Equal); break;
case TokenType.Greater: digester.Emit(OpCode.Greater); break;
case TokenType.GreaterEqual: digester.Emit(OpCode.Less, OpCode.Not); break;
case TokenType.Less: digester.Emit(OpCode.Less); break;
case TokenType.LessEqual: digester.Emit(OpCode.Greater, OpCode.Not); break;
case TokenType.Plus: digester.Emit(OpCode.Add); break;
case TokenType.Minus: digester.Emit(OpCode.Subtract); break;
case TokenType.Star: digester.Emit(OpCode.Multiply); break;
case TokenType.Slash: digester.Emit(OpCode.Divide); break;
case TokenType.BitwiseAnd: digester.Emit(OpCode.BitwiseAnd); break;
case TokenType.BitwiseOr: digester.Emit(OpCode.BitwiseOr); break;
case TokenType.BitwiseXor: digester.Emit(OpCode.BitwiseXor); break;
case TokenType.BitwiseNot: digester.Emit(OpCode.BitwiseNot); break;
case TokenType.BitwiseLeft: digester.Emit(OpCode.BitwiseLeft); break;
case TokenType.BitwiseRight: digester.Emit(OpCode.BitwiseRight); break;
case TokenType.Increment: digester.Emit(OpCode.Increment); break;
case TokenType.Decrement: digester.Emit(OpCode.Decrement); break;
default: return;
case TokenType.BangEqual:
digester.Emit(OpCode.Equal, OpCode.Not);
break;
case TokenType.EqualEqual:
digester.Emit(OpCode.Equal);
break;
case TokenType.Greater:
digester.Emit(OpCode.Greater);
break;
case TokenType.GreaterEqual:
digester.Emit(OpCode.Less, OpCode.Not);
break;
case TokenType.Less:
digester.Emit(OpCode.Less);
break;
case TokenType.LessEqual:
digester.Emit(OpCode.Greater, OpCode.Not);
break;
case TokenType.Plus:
digester.Emit(OpCode.Add);
break;
case TokenType.Minus:
digester.Emit(OpCode.Subtract);
break;
case TokenType.Star:
digester.Emit(OpCode.Multiply);
break;
case TokenType.Slash:
digester.Emit(OpCode.Divide);
break;
case TokenType.BitwiseAnd:
digester.Emit(OpCode.BitwiseAnd);
break;
case TokenType.BitwiseOr:
digester.Emit(OpCode.BitwiseOr);
break;
case TokenType.BitwiseXor:
digester.Emit(OpCode.BitwiseXor);
break;
case TokenType.BitwiseNot:
digester.Emit(OpCode.BitwiseNot);
break;
case TokenType.BitwiseLeft:
digester.Emit(OpCode.BitwiseLeft);
break;
case TokenType.BitwiseRight:
digester.Emit(OpCode.BitwiseRight);
break;
case TokenType.Increment:
digester.Emit(OpCode.Increment);
break;
case TokenType.Decrement:
digester.Emit(OpCode.Decrement);
break;
default:
return;
}
}
@ -203,14 +240,12 @@ public static class ExpressionParser
digester.ErrorAtPrevious("We're currently not in a class. 'base' only works inside of a class context.");
else if (digester.ClassBuilder.Outer == null)
digester.ErrorAtPrevious($"{digester.ClassBuilder.Name} is not inherited from any class, so the 'base' keyword points to nothing.");
else
{
else {
digester.Consume(TokenType.Dot, "Expected '.' after 'base' keyword.");
digester.Consume(TokenType.Identifier, "Expected an identifier after 'base' keyword.");
long name = digester.IdentifierConstant(digester.Previous.Value);
Variable(digester, "this", false);
if (digester.Match(TokenType.GroupOpen))
{
if (digester.Match(TokenType.GroupOpen)) {
byte arguments = digester.Arguments();
Variable(digester, "base", false);
digester.Emit(OpCode.InvokeBase);
@ -235,9 +270,15 @@ public static class ExpressionParser
Token token = digester.Previous;
digester.WeightedDigest(Weight.Modifier);
switch (token.Type) {
case TokenType.Bang: digester.Emit(OpCode.Not); break;
case TokenType.Minus: digester.Emit(OpCode.Negate); break;
case TokenType.BitwiseNot: digester.Emit(OpCode.BitwiseNot); break;
case TokenType.Bang:
digester.Emit(OpCode.Not);
break;
case TokenType.Minus:
digester.Emit(OpCode.Negate);
break;
case TokenType.BitwiseNot:
digester.Emit(OpCode.BitwiseNot);
break;
}
}

View File

@ -59,7 +59,7 @@ public class Runner : IDisposable
#if LOG
_logger.Warn($"Something went wrong, stack cursor is at {Stack.Position}. Resetting Stack.");
#endif
Stack.Decimate(0);
Stack = new StackLike<Value>(Options.InitialStackSize);
}
using Reader reader = new Reader(stream);
Compilation.Digester digester = new(reader);
@ -99,11 +99,21 @@ public class Runner : IDisposable
}
switch (opCode) {
case Op.Null: Push(Value.Void); break;
case Op.Constant: Push(call.Instruction.NextConstant()); break;
case Op.Pop: Pop(); break;
case Op.True: Push(Value.True); break;
case Op.False: Push(Value.False); break;
case Op.Null:
Push(Value.Void);
break;
case Op.Constant:
Push(call.Instruction.NextConstant());
break;
case Op.Pop:
Pop();
break;
case Op.True:
Push(Value.True);
break;
case Op.False:
Push(Value.False);
break;
case Op.GetGlobal: {
string? name = call.Instruction.GetStringConstant(call.Instruction.NextDynamic())?.Value;
@ -421,7 +431,7 @@ public class Runner : IDisposable
private Outer CaptureOuter(Pointer<Value> target)
{
Outer? outer = null;
for (int i = Outers.Count; i-->0;) {
for (int i = Outers.Count; i-- > 0;) {
outer = Outers[i];
if (outer.Target.Cursor <= target.Cursor)
break;
@ -435,7 +445,7 @@ public class Runner : IDisposable
private void CloseOuters(Pointer<Value> last)
{
for (int i = Outers.Count;i-->0;) {
for (int i = Outers.Count; i-- > 0;) {
Outer outer = Outers[i];
if (outer.IsClosed)
continue;

View File

@ -19,7 +19,6 @@ public static class ValueOperation
#if LOG
_logger.Method($"{operation.Left} {operation.OpCode} {operation.Right}");
#endif
// p sure switch is faster here (as opposed to dict lookup)
return operation.OpCode switch {
OpCode.Equal => Equal(operation),
@ -94,9 +93,6 @@ public static class ValueOperation
public static Value Not(Operation operation)
{
Value value = operation.Left;
#if LOG
_logger.Method($"{value}");
#endif
Assert.NotVoid(value);
ulong inner = value.Unsigned;
return new Value(inner == 0);

View File

@ -111,8 +111,7 @@ public class Logger : ILogger, ILogFormatter
result.Add("null");
else if (value is string str)
result.AddRange(str.Split('\n'));
else if (value is Exception e)
{
else if (value is Exception e) {
result.Add(e.Message);
if (!string.IsNullOrEmpty(e.StackTrace))
result.AddRange(e.StackTrace.Split('\n'));
@ -129,8 +128,7 @@ public class Logger : ILogger, ILogFormatter
var header = headers[level];
Console.ForegroundColor = colors[level];
foreach (var value in values)
{
foreach (var value in values) {
var lines = Format(value);
for (int i = 0; i < lines.Length; i++)
Console.WriteLine($"{(i == 0 ? header.First : header.Extra)}{lines[i]}");
@ -151,13 +149,12 @@ public class Logger : ILogger, ILogFormatter
if (Level < LogLevel.Trace)
return; // save some ticks here
if (caller == null)
{
if (caller == null) {
var st = new StackTrace();
var previous = st.GetFrame(1)?.GetMethod();
if (previous != null)
caller = $"{previous.DeclaringType?.Name}.{previous.Name}";
}
Log(LogLevel.Trace, [ $"[{caller}] {value}" ]);
Log(LogLevel.Trace, [$"[{caller}] {value}"]);
}
}

View File

@ -13,8 +13,7 @@ public class Tokens : IDebug<string>
public string Debug(DebugLevel level = DebugLevel.None)
{
string str = Debugger.GetContextString(this);
foreach (var token in _tokens)
{
foreach (var token in _tokens) {
str += $"\n {token}";
}
return str;

View File

@ -42,7 +42,7 @@ public class NativeExtension(
static NativeExtension()
{
Register(ValueType.String, "Length", (v, p) => new Value((long)v.Ptr.As<Objects.String>()!.Value!.Length), []);
Register(ValueType.String, "IndexOf", (v, p) => new Value((long)v.Ptr.As<Objects.String>()!.Value!.IndexOf(p[0].Ptr.As<Objects.String>()!.Value!)), [ "needle" ]);
Register(ValueType.String, "IndexOf", (v, p) => new Value((long)v.Ptr.As<Objects.String>()!.Value!.IndexOf(p[0].Ptr.As<Objects.String>()!.Value!)), ["needle"]);
}
public override string ToString()

View File

@ -18,8 +18,7 @@ public class Outer(Pointer<Value> target) : Obj(T.Outer)
/// Dynamic getter & setter that returns or writes to either the target value directly,
/// or the stored value if this <see cref="Outer"/> has been closed.
/// </summary>
public Value Value
{
public Value Value {
get => IsClosed ? _stored : Target!.Get();
set {
if (IsClosed)

View File

@ -143,8 +143,7 @@ public partial class EditorFrame : UserControl
AutoScroll(offset);
else
HideCaret();
}
else
} else
MoveCaret(position);
if (!CurrentSelection.IsVoid) {

View File

@ -6,6 +6,13 @@ public struct BufferRegion(BufferPosition from, BufferPosition to)
public bool IsVoid => (From - To).IsInitial;
public BufferPosition From = from;
public readonly BufferPosition From = from;
public BufferPosition To = to;
public static BufferRegion operator +(BufferRegion left, BufferPosition right)
=> new(left.From, left.To + right);
public static BufferRegion operator -(BufferRegion left, BufferPosition right)
=> new(left.From, left.To - right);
}

View File

@ -3,6 +3,7 @@ using Qrakhen.Qamp.Editor.Primitives;
using Qrakhen.Qamp.Memory;
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Windows.Documents;
using System.Windows.Input;
@ -16,6 +17,12 @@ public class SelectableLineBuffer(LineBuffer buffer)
public class EditorFrameViewModel : ObservableObject
{
private FileInfo _fileInfo;
public FileInfo FileInfo {
get => _fileInfo;
set => SetProperty(ref _fileInfo, value);
}
private BufferPosition _cursorPosition;
public BufferPosition CursorPosition {
get => _cursorPosition;
@ -56,8 +63,6 @@ public class EditorFrameViewModel : ObservableObject
ClipBoardCommand = new RelayCommand(() => { });
}
public void SetCursor(int line, int column) => SetCursor(new BufferPosition(line, column));
public void SetCursor(BufferPosition position)
{
@ -111,6 +116,20 @@ public class EditorFrameViewModel : ObservableObject
}
}
public void Select(BufferPosition relativePosition, bool jump = false)
{
if (CurrentSelection.IsVoid) {
CurrentSelection = new BufferRegion(CursorPosition, CursorPosition);
}
CurrentSelection += relativePosition;
}
public void Deselect()
{
CurrentSelection = BufferRegion.Void;
}
/*
asdasdy