Browse Source

refactor: remove unnecessary blank lines and simplify code structure

Akeit0 7 months ago
parent
commit
8182a85448

+ 3 - 4
src/Lua/CodeAnalysis/Compilation/Dump.cs

@@ -341,7 +341,6 @@ internal unsafe ref struct UnDumpState(ReadOnlySpan<byte> span, ReadOnlySpan<cha
         return *(double*)(&i);
         return *(double*)(&i);
     }
     }
 
 
-
     public Prototype UnDump()
     public Prototype UnDump()
     {
     {
         Header h = default;
         Header h = default;
@@ -382,7 +381,7 @@ internal unsafe ref struct UnDumpState(ReadOnlySpan<byte> span, ReadOnlySpan<cha
             desc.Name = name;
             desc.Name = name;
         }
         }
 
 
-        return new Prototype(source, lineDefined, lastLineDefined, parameterCount, maxStackSize, isVarArg, constants, code, prototypes, lineInfo, localVariables, upValues);
+        return new(source, lineDefined, lastLineDefined, parameterCount, maxStackSize, isVarArg, constants, code, prototypes, lineInfo, localVariables, upValues);
     }
     }
 
 
 
 
@@ -463,7 +462,7 @@ internal unsafe ref struct UnDumpState(ReadOnlySpan<byte> span, ReadOnlySpan<cha
             var name = ReadString();
             var name = ReadString();
             var startPc = ReadInt();
             var startPc = ReadInt();
             var endPc = ReadInt();
             var endPc = ReadInt();
-            localVariables[i] = new LocalVariable { Name = name, StartPc = startPc, EndPc = endPc };
+            localVariables[i] = new() { Name = name, StartPc = startPc, EndPc = endPc };
         }
         }
 
 
         return localVariables;
         return localVariables;
@@ -478,7 +477,7 @@ internal unsafe ref struct UnDumpState(ReadOnlySpan<byte> span, ReadOnlySpan<cha
         {
         {
             var isLocal = ReadBool();
             var isLocal = ReadBool();
             var index = ReadByte();
             var index = ReadByte();
-            upValues[i] = new UpValueDesc { IsLocal = isLocal, Index = index };
+            upValues[i] = new() { IsLocal = isLocal, Index = index };
         }
         }
 
 
         return upValues;
         return upValues;

+ 0 - 71
src/Lua/CodeAnalysis/Compilation/Function.cs

@@ -50,7 +50,6 @@ internal class Function : IPoolNode<Function>
         pool.TryPush(this);
         pool.TryPush(this);
     }
     }
 
 
-
     public const int OprMinus = 0;
     public const int OprMinus = 0;
 
 
     public const int OprNot = 1;
     public const int OprNot = 1;
@@ -97,7 +96,6 @@ internal class Function : IPoolNode<Function>
 
 
     public const int OprNoBinary = 15;
     public const int OprNoBinary = 15;
 
 
-
     public void OpenFunction(int line)
     public void OpenFunction(int line)
     {
     {
         var newProto = PrototypeBuilder.Get(P.Scanner.Source);
         var newProto = PrototypeBuilder.Get(P.Scanner.Source);
@@ -114,7 +112,6 @@ internal class Function : IPoolNode<Function>
         P.Function.EnterBlock(false);
         P.Function.EnterBlock(false);
     }
     }
 
 
-
     public ExprDesc CloseFunction()
     public ExprDesc CloseFunction()
     {
     {
         var e = P.Function.Previous!.ExpressionToNextRegister(MakeExpression(Kind.Relocatable, Previous!.EncodeABx(OpCode.Closure, 0, Previous!.Proto.PrototypeList.Length - 1)));
         var e = P.Function.Previous!.ExpressionToNextRegister(MakeExpression(Kind.Relocatable, Previous!.EncodeABx(OpCode.Closure, 0, Previous!.Proto.PrototypeList.Length - 1)));
@@ -127,7 +124,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public void EnterBlock(bool isLoop)
     public void EnterBlock(bool isLoop)
     {
     {
         var b = Block.Get(Block, P.ActiveLabels.Length, P.PendingGotos.Length, ActiveVariableCount, false, isLoop);
         var b = Block.Get(Block, P.ActiveLabels.Length, P.PendingGotos.Length, ActiveVariableCount, false, isLoop);
@@ -135,7 +131,6 @@ internal class Function : IPoolNode<Function>
         Assert(FreeRegisterCount == ActiveVariableCount);
         Assert(FreeRegisterCount == ActiveVariableCount);
     }
     }
 
 
-
     public void UndefinedGotoError(Label g)
     public void UndefinedGotoError(Label g)
     {
     {
         if (Scanner.IsReserved(g.Name))
         if (Scanner.IsReserved(g.Name))
@@ -148,14 +143,12 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public ref LocalVariable LocalVariable(int i)
     public ref LocalVariable LocalVariable(int i)
     {
     {
         var index = P.ActiveVariables[FirstLocal + i];
         var index = P.ActiveVariables[FirstLocal + i];
         return ref Proto.LocalVariablesList[index];
         return ref Proto.LocalVariablesList[index];
     }
     }
 
 
-
     public void AdjustLocalVariables(int n)
     public void AdjustLocalVariables(int n)
     {
     {
         for (ActiveVariableCount += n; n != 0; n--)
         for (ActiveVariableCount += n; n != 0; n--)
@@ -164,7 +157,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void RemoveLocalVariables(int level)
     public void RemoveLocalVariables(int level)
     {
     {
         for (var i = level; i < ActiveVariableCount; i++)
         for (var i = level; i < ActiveVariableCount; i++)
@@ -176,7 +168,6 @@ internal class Function : IPoolNode<Function>
         ActiveVariableCount = level;
         ActiveVariableCount = level;
     }
     }
 
 
-
     public void MakeLocalVariable(string name)
     public void MakeLocalVariable(string name)
     {
     {
         var r = Proto.LocalVariablesList.Length;
         var r = Proto.LocalVariablesList.Length;
@@ -185,21 +176,18 @@ internal class Function : IPoolNode<Function>
         P.ActiveVariables.Add(r);
         P.ActiveVariables.Add(r);
     }
     }
 
 
-
     public void MakeGoto(string name, int line, int pc)
     public void MakeGoto(string name, int line, int pc)
     {
     {
         P.PendingGotos.Add(new() { Name = name, Line = line, Pc = pc, ActiveVariableCount = ActiveVariableCount });
         P.PendingGotos.Add(new() { Name = name, Line = line, Pc = pc, ActiveVariableCount = ActiveVariableCount });
         FindLabel((P.PendingGotos.Length - 1));
         FindLabel((P.PendingGotos.Length - 1));
     }
     }
 
 
-
     public int MakeLabel(string name, int line)
     public int MakeLabel(string name, int line)
     {
     {
         P.ActiveLabels.Add(new() { Name = name, Line = line, Pc = Proto.CodeList.Length, ActiveVariableCount = ActiveVariableCount });
         P.ActiveLabels.Add(new() { Name = name, Line = line, Pc = Proto.CodeList.Length, ActiveVariableCount = ActiveVariableCount });
         return (P.ActiveLabels.Length - 1);
         return (P.ActiveLabels.Length - 1);
     }
     }
 
 
-
     public void CloseGoto(int i, Label l)
     public void CloseGoto(int i, Label l)
     {
     {
         var g = P.PendingGotos[i];
         var g = P.PendingGotos[i];
@@ -213,7 +201,6 @@ internal class Function : IPoolNode<Function>
         P.PendingGotos.RemoveAtSwapBack(i);
         P.PendingGotos.RemoveAtSwapBack(i);
     }
     }
 
 
-
     public int FindLabel(int i)
     public int FindLabel(int i)
     {
     {
         var g = P.PendingGotos[i];
         var g = P.PendingGotos[i];
@@ -235,7 +222,6 @@ internal class Function : IPoolNode<Function>
         return 1;
         return 1;
     }
     }
 
 
-
     public void CheckRepeatedLabel(string name)
     public void CheckRepeatedLabel(string name)
     {
     {
         foreach (var l in P.ActiveLabels.AsSpan().Slice(Block.FirstLabel))
         foreach (var l in P.ActiveLabels.AsSpan().Slice(Block.FirstLabel))
@@ -247,7 +233,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void FindGotos(int label)
     public void FindGotos(int label)
     {
     {
         for (var i = Block.FirstGoto; i < P.PendingGotos.Length;)
         for (var i = Block.FirstGoto; i < P.PendingGotos.Length;)
@@ -280,7 +265,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void LeaveBlock()
     public void LeaveBlock()
     {
     {
         var b = Block;
         var b = Block;
@@ -313,7 +297,6 @@ internal class Function : IPoolNode<Function>
         b.Release();
         b.Release();
     }
     }
 
 
-
     public static int Not(int b) => b == 0 ? 1 : 0;
     public static int Not(int b) => b == 0 ? 1 : 0;
 
 
 
 
@@ -326,7 +309,6 @@ internal class Function : IPoolNode<Function>
         P.Scanner.SyntaxError(message);
         P.Scanner.SyntaxError(message);
     }
     }
 
 
-
     public void BreakLabel() => FindGotos(MakeLabel("break", 0));
     public void BreakLabel() => FindGotos(MakeLabel("break", 0));
 
 
     [Conditional("DEBUG")]
     [Conditional("DEBUG")]
@@ -356,13 +338,11 @@ internal class Function : IPoolNode<Function>
         Proto.LineInfoList.Pop();
         Proto.LineInfoList.Pop();
     }
     }
 
 
-
     public int EncodeABC(OpCode op, int a, int b, int c)
     public int EncodeABC(OpCode op, int a, int b, int c)
     {
     {
         return Encode(CreateABC(op, a, b, c));
         return Encode(CreateABC(op, a, b, c));
     }
     }
 
 
-
     public int EncodeABx(OpCode op, int a, int bx) => Encode(CreateABx(op, a, bx));
     public int EncodeABx(OpCode op, int a, int bx) => Encode(CreateABx(op, a, bx));
 
 
 
 
@@ -380,7 +360,6 @@ internal class Function : IPoolNode<Function>
         return pc;
         return pc;
     }
     }
 
 
-
     public ExprDesc EncodeString(string s) => MakeExpression(Kind.Constant, StringConstant(s));
     public ExprDesc EncodeString(string s) => MakeExpression(Kind.Constant, StringConstant(s));
 
 
 
 
@@ -408,7 +387,6 @@ internal class Function : IPoolNode<Function>
         EncodeABC(OpCode.LoadNil, from, n - 1, 0);
         EncodeABC(OpCode.LoadNil, from, n - 1, 0);
     }
     }
 
 
-
     public int Jump()
     public int Jump()
     {
     {
         Assert(IsJumpListWalkable(JumpPc));
         Assert(IsJumpListWalkable(JumpPc));
@@ -432,7 +410,6 @@ internal class Function : IPoolNode<Function>
         SetReturns(e, MultipleReturns);
         SetReturns(e, MultipleReturns);
     }
     }
 
 
-
     public void Return(ExprDesc e, int resultCount)
     public void Return(ExprDesc e, int resultCount)
     {
     {
         if (e.HasMultipleReturns())
         if (e.HasMultipleReturns())
@@ -456,14 +433,12 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public int ConditionalJump(OpCode op, int a, int b, int c)
     public int ConditionalJump(OpCode op, int a, int b, int c)
     {
     {
         EncodeABC(op, a, b, c);
         EncodeABC(op, a, b, c);
         return Jump();
         return Jump();
     }
     }
 
 
-
     public void FixJump(int pc, int dest)
     public void FixJump(int pc, int dest)
     {
     {
         Assert(IsJumpListWalkable(pc));
         Assert(IsJumpListWalkable(pc));
@@ -480,7 +455,6 @@ internal class Function : IPoolNode<Function>
         return LastTarget;
         return LastTarget;
     }
     }
 
 
-
     public int Jump(int pc)
     public int Jump(int pc)
     {
     {
         Assert(IsJumpListWalkable(pc));
         Assert(IsJumpListWalkable(pc));
@@ -490,7 +464,6 @@ internal class Function : IPoolNode<Function>
         return NoJump;
         return NoJump;
     }
     }
 
 
-
     public bool IsJumpListWalkable(int list)
     public bool IsJumpListWalkable(int list)
     {
     {
         if (list == NoJump)
         if (list == NoJump)
@@ -501,7 +474,6 @@ internal class Function : IPoolNode<Function>
         return offset == NoJump || IsJumpListWalkable(list + 1 + offset);
         return offset == NoJump || IsJumpListWalkable(list + 1 + offset);
     }
     }
 
 
-
     public ref Instruction JumpControl(int pc)
     public ref Instruction JumpControl(int pc)
     {
     {
         if (pc >= 1 && TestTMode(Proto.CodeList[pc - 1].OpCode))
         if (pc >= 1 && TestTMode(Proto.CodeList[pc - 1].OpCode))
@@ -509,7 +481,6 @@ internal class Function : IPoolNode<Function>
         return ref Proto.CodeList[pc];
         return ref Proto.CodeList[pc];
     }
     }
 
 
-
     public bool NeedValue(int list)
     public bool NeedValue(int list)
     {
     {
         Assert(IsJumpListWalkable(list));
         Assert(IsJumpListWalkable(list));
@@ -522,7 +493,6 @@ internal class Function : IPoolNode<Function>
         return false;
         return false;
     }
     }
 
 
-
     public bool PatchTestRegister(int node, int register)
     public bool PatchTestRegister(int node, int register)
     {
     {
         ref var i = ref JumpControl(node);
         ref var i = ref JumpControl(node);
@@ -544,7 +514,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void PatchListHelper(int list, int target, int register, int defaultTarget)
     public void PatchListHelper(int list, int target, int register, int defaultTarget)
     {
     {
         Assert(IsJumpListWalkable(list));
         Assert(IsJumpListWalkable(list));
@@ -597,7 +566,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void PatchToHere(int list)
     public void PatchToHere(int list)
     {
     {
         Assert(IsJumpListWalkable(list));
         Assert(IsJumpListWalkable(list));
@@ -640,7 +608,6 @@ internal class Function : IPoolNode<Function>
         return index;
         return index;
     }
     }
 
 
-
     public unsafe int NumberConstant(double n)
     public unsafe int NumberConstant(double n)
     {
     {
         if (n == 0.0 || double.IsNaN(n))
         if (n == 0.0 || double.IsNaN(n))
@@ -664,14 +631,12 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void ReserveRegisters(int n)
     public void ReserveRegisters(int n)
     {
     {
         CheckStack(n);
         CheckStack(n);
         FreeRegisterCount += n;
         FreeRegisterCount += n;
     }
     }
 
 
-
     public void FreeRegister(int r)
     public void FreeRegister(int r)
     {
     {
         if (!IsConstant(r) && r >= ActiveVariableCount)
         if (!IsConstant(r) && r >= ActiveVariableCount)
@@ -689,7 +654,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public int StringConstant(string s)
     public int StringConstant(string s)
     {
     {
         return AddConstant(s, s);
         return AddConstant(s, s);
@@ -811,7 +775,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc DischargeToAnyRegister(ExprDesc e)
     public ExprDesc DischargeToAnyRegister(ExprDesc e)
     {
     {
         if (e.Kind != Kind.NonRelocatable)
         if (e.Kind != Kind.NonRelocatable)
@@ -823,14 +786,12 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public int EncodeLabel(int a, int b, int jump)
     public int EncodeLabel(int a, int b, int jump)
     {
     {
         Label();
         Label();
         return EncodeABC(OpCode.LoadBool, a, b, jump);
         return EncodeABC(OpCode.LoadBool, a, b, jump);
     }
     }
 
 
-
     public ExprDesc ExpressionToRegister(ExprDesc e, int r)
     public ExprDesc ExpressionToRegister(ExprDesc e, int r)
     {
     {
         e = DischargeToRegister(e, r);
         e = DischargeToRegister(e, r);
@@ -863,7 +824,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc ExpressionToNextRegister(ExprDesc e)
     public ExprDesc ExpressionToNextRegister(ExprDesc e)
     {
     {
         e = DischargeVariables(e);
         e = DischargeVariables(e);
@@ -872,7 +832,6 @@ internal class Function : IPoolNode<Function>
         return ExpressionToRegister(e, FreeRegisterCount - 1);
         return ExpressionToRegister(e, FreeRegisterCount - 1);
     }
     }
 
 
-
     public ExprDesc ExpressionToAnyRegister(ExprDesc e)
     public ExprDesc ExpressionToAnyRegister(ExprDesc e)
     {
     {
         e = DischargeVariables(e);
         e = DischargeVariables(e);
@@ -889,7 +848,6 @@ internal class Function : IPoolNode<Function>
         return ExpressionToNextRegister(e);
         return ExpressionToNextRegister(e);
     }
     }
 
 
-
     public ExprDesc ExpressionToAnyRegisterOrUpValue(ExprDesc e)
     public ExprDesc ExpressionToAnyRegisterOrUpValue(ExprDesc e)
     {
     {
         if (e.Kind != Kind.UpValue || e.HasJumps())
         if (e.Kind != Kind.UpValue || e.HasJumps())
@@ -900,14 +858,12 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc ExpressionToValue(ExprDesc e)
     public ExprDesc ExpressionToValue(ExprDesc e)
     {
     {
         if (e.HasJumps()) return ExpressionToAnyRegister(e);
         if (e.HasJumps()) return ExpressionToAnyRegister(e);
         return DischargeVariables(e);
         return DischargeVariables(e);
     }
     }
 
 
-
     public (ExprDesc, int) ExpressionToRegisterOrConstant(ExprDesc e)
     public (ExprDesc, int) ExpressionToRegisterOrConstant(ExprDesc e)
     {
     {
         e = ExpressionToValue(e);
         e = ExpressionToValue(e);
@@ -949,7 +905,6 @@ internal class Function : IPoolNode<Function>
         return (e, e.Info);
         return (e, e.Info);
     }
     }
 
 
-
     public void StoreVariable(ExprDesc v, ExprDesc e)
     public void StoreVariable(ExprDesc v, ExprDesc e)
     {
     {
         switch (v.Kind)
         switch (v.Kind)
@@ -976,7 +931,6 @@ internal class Function : IPoolNode<Function>
         FreeExpression(e);
         FreeExpression(e);
     }
     }
 
 
-
     public ExprDesc Self(ExprDesc e, ExprDesc key)
     public ExprDesc Self(ExprDesc e, ExprDesc key)
     {
     {
         e = ExpressionToAnyRegister(e);
         e = ExpressionToAnyRegister(e);
@@ -990,7 +944,6 @@ internal class Function : IPoolNode<Function>
         return result;
         return result;
     }
     }
 
 
-
     public void InvertJump(int pc)
     public void InvertJump(int pc)
     {
     {
         ref var i = ref JumpControl(pc);
         ref var i = ref JumpControl(pc);
@@ -998,7 +951,6 @@ internal class Function : IPoolNode<Function>
         i.A = Not(i.A);
         i.A = Not(i.A);
     }
     }
 
 
-
     public int JumpOnCondition(ExprDesc e, int cond)
     public int JumpOnCondition(ExprDesc e, int cond)
     {
     {
         if (e.Kind == Kind.Relocatable)
         if (e.Kind == Kind.Relocatable)
@@ -1016,7 +968,6 @@ internal class Function : IPoolNode<Function>
         return ConditionalJump(OpCode.TestSet, NoRegister, e.Info, cond);
         return ConditionalJump(OpCode.TestSet, NoRegister, e.Info, cond);
     }
     }
 
 
-
     public ExprDesc GoIfTrue(ExprDesc e)
     public ExprDesc GoIfTrue(ExprDesc e)
     {
     {
         var pc = NoJump;
         var pc = NoJump;
@@ -1042,7 +993,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc GoIfFalse(ExprDesc e)
     public ExprDesc GoIfFalse(ExprDesc e)
     {
     {
         var pc = NoJump;
         var pc = NoJump;
@@ -1066,7 +1016,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc EncodeNot(ExprDesc e)
     public ExprDesc EncodeNot(ExprDesc e)
     {
     {
         e = DischargeVariables(e);
         e = DischargeVariables(e);
@@ -1102,7 +1051,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc Indexed(ExprDesc t, ExprDesc k)
     public ExprDesc Indexed(ExprDesc t, ExprDesc k)
     {
     {
         Assert(!t.HasJumps());
         Assert(!t.HasJumps());
@@ -1155,7 +1103,6 @@ internal class Function : IPoolNode<Function>
         return (e1, true);
         return (e1, true);
     }
     }
 
 
-
     public ExprDesc EncodeArithmetic(OpCode op, ExprDesc e1, ExprDesc e2, int line)
     public ExprDesc EncodeArithmetic(OpCode op, ExprDesc e1, ExprDesc e2, int line)
     {
     {
         var (e, folded) = FoldConstants(op, e1, e2);
         var (e, folded) = FoldConstants(op, e1, e2);
@@ -1185,7 +1132,6 @@ internal class Function : IPoolNode<Function>
         return e1;
         return e1;
     }
     }
 
 
-
     public ExprDesc Prefix(int op, ExprDesc e, int line)
     public ExprDesc Prefix(int op, ExprDesc e, int line)
     {
     {
         switch (op)
         switch (op)
@@ -1207,7 +1153,6 @@ internal class Function : IPoolNode<Function>
         throw new("unreachable");
         throw new("unreachable");
     }
     }
 
 
-
     public ExprDesc Infix(int op, ExprDesc e)
     public ExprDesc Infix(int op, ExprDesc e)
     {
     {
         switch (op)
         switch (op)
@@ -1238,7 +1183,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc EncodeComparison(OpCode op, int cond, ExprDesc e1, ExprDesc e2)
     public ExprDesc EncodeComparison(OpCode op, int cond, ExprDesc e1, ExprDesc e2)
     {
     {
         (e1, var o1) = ExpressionToRegisterOrConstant(e1);
         (e1, var o1) = ExpressionToRegisterOrConstant(e1);
@@ -1253,7 +1197,6 @@ internal class Function : IPoolNode<Function>
         return MakeExpression(Kind.Jump, ConditionalJump(op, cond, o1, o2));
         return MakeExpression(Kind.Jump, ConditionalJump(op, cond, o1, o2));
     }
     }
 
 
-
     public ExprDesc Postfix(int op, ExprDesc e1, ExprDesc e2, int line)
     public ExprDesc Postfix(int op, ExprDesc e1, ExprDesc e2, int line)
     {
     {
         switch (op)
         switch (op)
@@ -1299,7 +1242,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void FixLine(int line) => Proto.LineInfoList[Proto.CodeList.Length - 1] = line;
     public void FixLine(int line) => Proto.LineInfoList[Proto.CodeList.Length - 1] = line;
 
 
 
 
@@ -1329,7 +1271,6 @@ internal class Function : IPoolNode<Function>
         FreeRegisterCount = @base + 1;
         FreeRegisterCount = @base + 1;
     }
     }
 
 
-
     public unsafe void CheckConflict(AssignmentTarget tv, ExprDesc e)
     public unsafe void CheckConflict(AssignmentTarget tv, ExprDesc e)
     {
     {
         var extra = FreeRegisterCount;
         var extra = FreeRegisterCount;
@@ -1372,7 +1313,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public void AdjustAssignment(int variableCount, int expressionCount, ExprDesc e)
     public void AdjustAssignment(int variableCount, int expressionCount, ExprDesc e)
     {
     {
         var extra = variableCount - expressionCount;
         var extra = variableCount - expressionCount;
@@ -1406,7 +1346,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public int MakeUpValue(string name, ExprDesc e)
     public int MakeUpValue(string name, ExprDesc e)
     {
     {
         P.CheckLimit(Proto.UpValuesList.Length + 1, MaxUpValue, "upvalues");
         P.CheckLimit(Proto.UpValuesList.Length + 1, MaxUpValue, "upvalues");
@@ -1414,7 +1353,6 @@ internal class Function : IPoolNode<Function>
         return Proto.UpValuesList.Length - 1;
         return Proto.UpValuesList.Length - 1;
     }
     }
 
 
-
     public static (ExprDesc, bool) SingleVariableHelper(Function? f, string name, bool b)
     public static (ExprDesc, bool) SingleVariableHelper(Function? f, string name, bool b)
     {
     {
         static Block owningBlock(Block b1, int level)
         static Block owningBlock(Block b1, int level)
@@ -1493,7 +1431,6 @@ internal class Function : IPoolNode<Function>
         }
         }
     }
     }
 
 
-
     public ExprDesc SingleVariable(string name)
     public ExprDesc SingleVariable(string name)
     {
     {
         var (e, found) = SingleVariableHelper(this, name, true);
         var (e, found) = SingleVariableHelper(this, name, true);
@@ -1507,7 +1444,6 @@ internal class Function : IPoolNode<Function>
         return e;
         return e;
     }
     }
 
 
-
     public (int pc, ExprDesc t) OpenConstructor()
     public (int pc, ExprDesc t) OpenConstructor()
     {
     {
         var pc = EncodeABC(OpCode.NewTable, 0, 0, 0);
         var pc = EncodeABC(OpCode.NewTable, 0, 0, 0);
@@ -1515,7 +1451,6 @@ internal class Function : IPoolNode<Function>
         return (pc, t);
         return (pc, t);
     }
     }
 
 
-
     public void FlushFieldToConstructor(int tableRegister, int freeRegisterCount, ExprDesc k, Func<ExprDesc> v)
     public void FlushFieldToConstructor(int tableRegister, int freeRegisterCount, ExprDesc k, Func<ExprDesc> v)
     {
     {
         (_, var rk) = ExpressionToRegisterOrConstant(k);
         (_, var rk) = ExpressionToRegisterOrConstant(k);
@@ -1524,7 +1459,6 @@ internal class Function : IPoolNode<Function>
         FreeRegisterCount = freeRegisterCount;
         FreeRegisterCount = freeRegisterCount;
     }
     }
 
 
-
     public int FlushToConstructor(int tableRegister, int pending, int arrayCount, ExprDesc e)
     public int FlushToConstructor(int tableRegister, int pending, int arrayCount, ExprDesc e)
     {
     {
         ExpressionToNextRegister(e);
         ExpressionToNextRegister(e);
@@ -1537,7 +1471,6 @@ internal class Function : IPoolNode<Function>
         return pending;
         return pending;
     }
     }
 
 
-
     public void CloseConstructor(int pc, int tableRegister, int pending, int arrayCount, int hashCount, ExprDesc e)
     public void CloseConstructor(int pc, int tableRegister, int pending, int arrayCount, int hashCount, ExprDesc e)
     {
     {
         if (pending != 0)
         if (pending != 0)
@@ -1563,7 +1496,6 @@ internal class Function : IPoolNode<Function>
         Proto.CodeList[pc].C = (((hashCount)));
         Proto.CodeList[pc].C = (((hashCount)));
     }
     }
 
 
-
     public int OpenForBody(int @base, int n, bool isNumeric)
     public int OpenForBody(int @base, int n, bool isNumeric)
     {
     {
         var prep = isNumeric ? EncodeAsBx(OpCode.ForPrep, @base, NoJump) : Jump();
         var prep = isNumeric ? EncodeAsBx(OpCode.ForPrep, @base, NoJump) : Jump();
@@ -1573,7 +1505,6 @@ internal class Function : IPoolNode<Function>
         return prep;
         return prep;
     }
     }
 
 
-
     public void CloseForBody(int prep, int @base, int line, int n, bool isNumeric)
     public void CloseForBody(int prep, int @base, int line, int n, bool isNumeric)
     {
     {
         LeaveBlock();
         LeaveBlock();
@@ -1594,14 +1525,12 @@ internal class Function : IPoolNode<Function>
         FixLine(line);
         FixLine(line);
     }
     }
 
 
-
     public void OpenMainFunction()
     public void OpenMainFunction()
     {
     {
         EnterBlock(false);
         EnterBlock(false);
         MakeUpValue("_ENV", MakeExpression(Kind.Local, 0));
         MakeUpValue("_ENV", MakeExpression(Kind.Local, 0));
     }
     }
 
 
-
     public Function CloseMainFunction()
     public Function CloseMainFunction()
     {
     {
         ReturnNone();
         ReturnNone();

+ 46 - 110
src/Lua/CodeAnalysis/Compilation/Parser.cs

@@ -53,7 +53,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         pool.TryPush(this);
         pool.TryPush(this);
     }
     }
 
 
-
     public void CheckCondition(bool c, string message)
     public void CheckCondition(bool c, string message)
     {
     {
         if (!c)
         if (!c)
@@ -62,7 +61,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public string CheckName()
     public string CheckName()
     {
     {
         Scanner.Check(TkName);
         Scanner.Check(TkName);
@@ -71,7 +69,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return s;
         return s;
     }
     }
 
 
-
     public void CheckLimit(int val, int limit, string what)
     public void CheckLimit(int val, int limit, string what)
     {
     {
         if (val > limit)
         if (val > limit)
@@ -87,14 +84,12 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public void CheckNext(int t)
     public void CheckNext(int t)
     {
     {
         Scanner.Check(t);
         Scanner.Check(t);
         Next();
         Next();
     }
     }
 
 
-
     public ExprDesc CheckNameAsExpression() => Function.EncodeString(CheckName());
     public ExprDesc CheckNameAsExpression() => Function.EncodeString(CheckName());
 
 
 
 
@@ -111,7 +106,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return new TempBlock(Scanner.L);
         return new TempBlock(Scanner.L);
     }
     }
 
 
-
     public (ExprDesc e, int n) ExpressionList()
     public (ExprDesc e, int n) ExpressionList()
     {
     {
         var n = 1;
         var n = 1;
@@ -124,26 +118,18 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return (e, n);
         return (e, n);
     }
     }
 
 
-
     public (int, int, int, ExprDesc) Field(int tableRegister, int a, int h, int pending, ExprDesc e)
     public (int, int, int, ExprDesc) Field(int tableRegister, int a, int h, int pending, ExprDesc e)
     {
     {
         var freeRegisterCount = Function.FreeRegisterCount;
         var freeRegisterCount = Function.FreeRegisterCount;
 
 
-        void hashField(ExprDesc k)
-        {
-            h++;
-            CheckNext('=');
-            Function.FlushFieldToConstructor(tableRegister, freeRegisterCount, k, Expression);
-        }
-
         if (T == TkName && Scanner.LookAhead() == '=')
         if (T == TkName && Scanner.LookAhead() == '=')
         {
         {
             CheckLimit(h, MaxInt, "items in a constructor");
             CheckLimit(h, MaxInt, "items in a constructor");
-            hashField(CheckNameAsExpression());
+            HashField(CheckNameAsExpression());
         }
         }
         else if (T == '[')
         else if (T == '[')
         {
         {
-            hashField(Index());
+            HashField(Index());
         }
         }
         else
         else
         {
         {
@@ -154,8 +140,14 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
 
 
         return (a, h, pending, e);
         return (a, h, pending, e);
-    }
 
 
+        void HashField(ExprDesc k)
+        {
+            h++;
+            CheckNext('=');
+            Function.FlushFieldToConstructor(tableRegister, freeRegisterCount, k, Expression);
+        }
+    }
 
 
     public ExprDesc Constructor()
     public ExprDesc Constructor()
     {
     {
@@ -183,7 +175,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return t;
         return t;
     }
     }
 
 
-
     public ExprDesc FunctionArguments(ExprDesc f, int line)
     public ExprDesc FunctionArguments(ExprDesc f, int line)
     {
     {
         ExprDesc args = default;
         ExprDesc args = default;
@@ -232,16 +223,14 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return e;
         return e;
     }
     }
 
 
-
     public ExprDesc PrimaryExpression()
     public ExprDesc PrimaryExpression()
     {
     {
-        ExprDesc e;
         switch (T)
         switch (T)
         {
         {
             case '(':
             case '(':
                 var line = Scanner.LineNumber;
                 var line = Scanner.LineNumber;
                 Next();
                 Next();
-                e = Expression();
+                ExprDesc e = Expression();
                 Scanner.CheckMatch(')', '(', line);
                 Scanner.CheckMatch(')', '(', line);
                 e = Function.DischargeVariables(e);
                 e = Function.DischargeVariables(e);
                 return e;
                 return e;
@@ -253,7 +242,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public ExprDesc SuffixedExpression()
     public ExprDesc SuffixedExpression()
     {
     {
         var line = Scanner.LineNumber;
         var line = Scanner.LineNumber;
@@ -283,7 +271,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public ExprDesc SimpleExpression()
     public ExprDesc SimpleExpression()
     {
     {
         ExprDesc e;
         ExprDesc e;
@@ -325,60 +312,38 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return e;
         return e;
     }
     }
 
 
-
     public static int UnaryOp(int op)
     public static int UnaryOp(int op)
     {
     {
-        switch (op)
+        return op switch
         {
         {
-            case TkNot:
-                return OprNot;
-            case '-':
-                return OprMinus;
-            case '#':
-                return OprLength;
-        }
-
-        return OprNoUnary;
+            TkNot => OprNot,
+            '-' => OprMinus,
+            '#' => OprLength,
+            _ => OprNoUnary
+        };
     }
     }
 
 
-
     public static int BinaryOp(int op)
     public static int BinaryOp(int op)
     {
     {
-        switch (op)
-        {
-            case '+':
-                return OprAdd;
-            case '-':
-                return OprSub;
-            case '*':
-                return OprMul;
-            case '/':
-                return OprDiv;
-            case '%':
-                return OprMod;
-            case '^':
-                return OprPow;
-            case TkConcat:
-                return OprConcat;
-            case TkNe:
-                return OprNE;
-            case TkEq:
-                return OprEq;
-            case '<':
-                return OprLT;
-            case TkLe:
-                return OprLE;
-            case '>':
-                return OprGT;
-            case TkGe:
-                return OprGE;
-            case TkAnd:
-                return OprAnd;
-            case TkOr:
-                return OprOr;
-        }
-
-        return OprNoBinary;
+        return op switch
+        {
+            '+' => OprAdd,
+            '-' => OprSub,
+            '*' => OprMul,
+            '/' => OprDiv,
+            '%' => OprMod,
+            '^' => OprPow,
+            TkConcat => OprConcat,
+            TkNe => OprNE,
+            TkEq => OprEq,
+            '<' => OprLT,
+            TkLe => OprLE,
+            '>' => OprGT,
+            TkGe => OprGE,
+            TkAnd => OprAnd,
+            TkOr => OprOr,
+            _ => OprNoBinary
+        };
     }
     }
 
 
 
 
@@ -425,14 +390,12 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return (e, op);
         return (e, op);
     }
     }
 
 
-
     public ExprDesc Expression()
     public ExprDesc Expression()
     {
     {
         (ExprDesc e, _) = SubExpression(0);
         (ExprDesc e, _) = SubExpression(0);
         return e;
         return e;
     }
     }
 
 
-
     public bool BlockFollow(bool withUntil)
     public bool BlockFollow(bool withUntil)
     {
     {
         switch (T)
         switch (T)
@@ -449,7 +412,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return false;
         return false;
     }
     }
 
 
-
     public void StatementList()
     public void StatementList()
     {
     {
         while (!BlockFollow(true))
         while (!BlockFollow(true))
@@ -464,7 +426,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public ExprDesc FieldSelector(ExprDesc e)
     public ExprDesc FieldSelector(ExprDesc e)
     {
     {
         e = Function.ExpressionToAnyRegisterOrUpValue(e);
         e = Function.ExpressionToAnyRegisterOrUpValue(e);
@@ -472,7 +433,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return Function.Indexed(e, CheckNameAsExpression());
         return Function.Indexed(e, CheckNameAsExpression());
     }
     }
 
 
-
     public ExprDesc Index()
     public ExprDesc Index()
     {
     {
         Next(); // skip '['
         Next(); // skip '['
@@ -481,7 +441,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return e;
         return e;
     }
     }
 
 
-
     public void Assignment(AssignmentTarget t, int variableCount)
     public void Assignment(AssignmentTarget t, int variableCount)
     {
     {
         CheckCondition(t.Description.IsVariable(), "syntax error");
         CheckCondition(t.Description.IsVariable(), "syntax error");
@@ -516,10 +475,8 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
 
 
         Function.StoreVariable(t.Description, MakeExpression(Kind.NonRelocatable, Function.FreeRegisterCount - 1));
         Function.StoreVariable(t.Description, MakeExpression(Kind.NonRelocatable, Function.FreeRegisterCount - 1));
-        //t.Release();
     }
     }
 
 
-
     public void ForBody(int @base, int line, int n, bool isNumeric)
     public void ForBody(int @base, int line, int n, bool isNumeric)
     {
     {
         Function.AdjustLocalVariables(3);
         Function.AdjustLocalVariables(3);
@@ -529,27 +486,20 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.CloseForBody(prep, @base, line, n, isNumeric);
         Function.CloseForBody(prep, @base, line, n, isNumeric);
     }
     }
 
 
-
     public void ForNumeric(string name, int line)
     public void ForNumeric(string name, int line)
     {
     {
-        void expr()
-        {
-            ExprDesc e = Function.ExpressionToNextRegister(Expression());
-            Assert(e.Kind == Kind.NonRelocatable);
-        }
-
         var @base = Function.FreeRegisterCount;
         var @base = Function.FreeRegisterCount;
         Function.MakeLocalVariable("(for index)");
         Function.MakeLocalVariable("(for index)");
         Function.MakeLocalVariable("(for limit)");
         Function.MakeLocalVariable("(for limit)");
         Function.MakeLocalVariable("(for step)");
         Function.MakeLocalVariable("(for step)");
         Function.MakeLocalVariable(name);
         Function.MakeLocalVariable(name);
         CheckNext('=');
         CheckNext('=');
-        expr();
+        Expr();
         CheckNext(',');
         CheckNext(',');
-        expr();
+        Expr();
         if (TestNext(','))
         if (TestNext(','))
         {
         {
-            expr();
+            Expr();
         }
         }
         else
         else
         {
         {
@@ -558,8 +508,14 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
 
 
         ForBody(@base, line, 1, true);
         ForBody(@base, line, 1, true);
-    }
+        return;
 
 
+        void Expr()
+        {
+            ExprDesc e = Function.ExpressionToNextRegister(Expression());
+            Assert(e.Kind == Kind.NonRelocatable);
+        }
+    }
 
 
     public void ForList(string name)
     public void ForList(string name)
     {
     {
@@ -583,7 +539,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         ForBody(@base, line, n - 3, false);
         ForBody(@base, line, n - 3, false);
     }
     }
 
 
-
     public void ForStatement(int line)
     public void ForStatement(int line)
     {
     {
         Function.EnterBlock(true);
         Function.EnterBlock(true);
@@ -607,14 +562,13 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.LeaveBlock();
         Function.LeaveBlock();
     }
     }
 
 
-
     public int TestThenBlock(int escapes)
     public int TestThenBlock(int escapes)
     {
     {
         int jumpFalse;
         int jumpFalse;
         Next();
         Next();
         var e = Expression();
         var e = Expression();
         CheckNext(TkThen);
         CheckNext(TkThen);
-        if (T == TkGoto || T == TkBreak)
+        if (T is TkGoto or TkBreak)
         {
         {
             e = Function.GoIfFalse(e);
             e = Function.GoIfFalse(e);
             Function.EnterBlock(false);
             Function.EnterBlock(false);
@@ -646,7 +600,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return escapes;
         return escapes;
     }
     }
 
 
-
     public void IfStatement(int line)
     public void IfStatement(int line)
     {
     {
         var escapes = TestThenBlock(NoJump);
         var escapes = TestThenBlock(NoJump);
@@ -664,7 +617,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.PatchToHere(escapes);
         Function.PatchToHere(escapes);
     }
     }
 
 
-
     public void Block()
     public void Block()
     {
     {
         Function.EnterBlock(false);
         Function.EnterBlock(false);
@@ -672,7 +624,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.LeaveBlock();
         Function.LeaveBlock();
     }
     }
 
 
-
     public void WhileStatement(int line)
     public void WhileStatement(int line)
     {
     {
         Next();
         Next();
@@ -687,7 +638,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.PatchToHere(conditionExit);
         Function.PatchToHere(conditionExit);
     }
     }
 
 
-
     public void RepeatStatement(int line)
     public void RepeatStatement(int line)
     {
     {
         var top = Function.Label();
         var top = Function.Label();
@@ -707,7 +657,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.LeaveBlock(); // finish loop
         Function.LeaveBlock(); // finish loop
     }
     }
 
 
-
     public int Condition()
     public int Condition()
     {
     {
         var e = Expression();
         var e = Expression();
@@ -719,7 +668,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return Function.GoIfTrue(e).F;
         return Function.GoIfTrue(e).F;
     }
     }
 
 
-
     public void GotoStatement(int pc)
     public void GotoStatement(int pc)
     {
     {
         var line = Scanner.LineNumber;
         var line = Scanner.LineNumber;
@@ -734,7 +682,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public void SkipEmptyStatements()
     public void SkipEmptyStatements()
     {
     {
         while (T == ';' || T == TkDoubleColon)
         while (T == ';' || T == TkDoubleColon)
@@ -743,7 +690,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public void LabelStatement(string label, int line)
     public void LabelStatement(string label, int line)
     {
     {
         Function.CheckRepeatedLabel(label);
         Function.CheckRepeatedLabel(label);
@@ -758,7 +704,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.FindGotos(l);
         Function.FindGotos(l);
     }
     }
 
 
-
     public void ParameterList()
     public void ParameterList()
     {
     {
         var n = 0;
         var n = 0;
@@ -791,7 +736,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.ReserveRegisters(Function.ActiveVariableCount);
         Function.ReserveRegisters(Function.ActiveVariableCount);
     }
     }
 
 
-
     public ExprDesc Body(bool isMethod, int line)
     public ExprDesc Body(bool isMethod, int line)
     {
     {
         Function.OpenFunction(line);
         Function.OpenFunction(line);
@@ -810,7 +754,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return Function.CloseFunction();
         return Function.CloseFunction();
     }
     }
 
 
-
     public (ExprDesc, bool IsMethod) FunctionName()
     public (ExprDesc, bool IsMethod) FunctionName()
     {
     {
         var e = SingleVariable();
         var e = SingleVariable();
@@ -824,7 +767,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return (e, false);
         return (e, false);
     }
     }
 
 
-
     public void FunctionStatement(int line)
     public void FunctionStatement(int line)
     {
     {
         Next();
         Next();
@@ -833,7 +775,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.FixLine(line);
         Function.FixLine(line);
     }
     }
 
 
-
     public void LocalFunction()
     public void LocalFunction()
     {
     {
         Function.MakeLocalVariable(CheckName());
         Function.MakeLocalVariable(CheckName());
@@ -841,7 +782,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.LocalVariable(Body(false, Scanner.LineNumber).Info).StartPc = (Function.Proto.CodeList.Length);
         Function.LocalVariable(Body(false, Scanner.LineNumber).Info).StartPc = (Function.Proto.CodeList.Length);
     }
     }
 
 
-
     public void LocalStatement()
     public void LocalStatement()
     {
     {
         var v = 0;
         var v = 0;
@@ -865,7 +805,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         Function.AdjustLocalVariables(v);
         Function.AdjustLocalVariables(v);
     }
     }
 
 
-
     public void ExpressionStatement()
     public void ExpressionStatement()
     {
     {
         var e = SuffixedExpression();
         var e = SuffixedExpression();
@@ -880,7 +819,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
     }
     }
 
 
-
     public void ReturnStatement()
     public void ReturnStatement()
     {
     {
         var f = Function;
         var f = Function;
@@ -897,7 +835,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         TestNext(';');
         TestNext(';');
     }
     }
 
 
-
     public void Statement()
     public void Statement()
     {
     {
         var line = Scanner.LineNumber;
         var line = Scanner.LineNumber;
@@ -990,7 +927,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         return f.Proto.CreatePrototypeAndRelease();
         return f.Proto.CreatePrototypeAndRelease();
     }
     }
 
 
-
     public static void Dump(Prototype prototype, IBufferWriter<byte> writer, bool useLittleEndian = true)
     public static void Dump(Prototype prototype, IBufferWriter<byte> writer, bool useLittleEndian = true)
     {
     {
         var state = new DumpState(writer, useLittleEndian ^ BitConverter.IsLittleEndian);
         var state = new DumpState(writer, useLittleEndian ^ BitConverter.IsLittleEndian);

+ 3 - 8
src/Lua/CodeAnalysis/Compilation/PrototypeBuilder.cs

@@ -15,12 +15,8 @@ internal class PrototypeBuilder : IPoolNode<PrototypeBuilder>
     public ReadOnlySpan<int> LineInfo => LineInfoList.AsSpan();
     public ReadOnlySpan<int> LineInfo => LineInfoList.AsSpan();
     internal FastListCore<LocalVariable> LocalVariablesList;
     internal FastListCore<LocalVariable> LocalVariablesList;
     public ReadOnlySpan<LocalVariable> LocalVariables => LocalVariablesList.AsSpan();
     public ReadOnlySpan<LocalVariable> LocalVariables => LocalVariablesList.AsSpan();
-
     internal FastListCore<UpValueDesc> UpValuesList;
     internal FastListCore<UpValueDesc> UpValuesList;
-
     public ReadOnlySpan<UpValueDesc> UpValues => UpValuesList.AsSpan();
     public ReadOnlySpan<UpValueDesc> UpValues => UpValuesList.AsSpan();
-
-    //public LuaClosure Cache;
     public string Source;
     public string Source;
     public int LineDefined, LastLineDefined;
     public int LineDefined, LastLineDefined;
     public int ParameterCount, MaxStackSize;
     public int ParameterCount, MaxStackSize;
@@ -32,7 +28,7 @@ internal class PrototypeBuilder : IPoolNode<PrototypeBuilder>
         Source = source;
         Source = source;
     }
     }
 
 
-    static LinkedPool<PrototypeBuilder> Pool;
+    static LinkedPool<PrototypeBuilder> pool;
 
 
 
 
     PrototypeBuilder? nextNode;
     PrototypeBuilder? nextNode;
@@ -40,7 +36,7 @@ internal class PrototypeBuilder : IPoolNode<PrototypeBuilder>
 
 
     internal static PrototypeBuilder Get(string source)
     internal static PrototypeBuilder Get(string source)
     {
     {
-        if (!Pool.TryPop(out var f))
+        if (!pool.TryPop(out var f))
         {
         {
             f = new PrototypeBuilder(source);
             f = new PrototypeBuilder(source);
         }
         }
@@ -57,10 +53,9 @@ internal class PrototypeBuilder : IPoolNode<PrototypeBuilder>
         LineInfoList.Clear();
         LineInfoList.Clear();
         LocalVariablesList.Clear();
         LocalVariablesList.Clear();
         UpValuesList.Clear();
         UpValuesList.Clear();
-        Pool.TryPush(this);
+        pool.TryPush(this);
     }
     }
 
 
-
     public Prototype CreatePrototypeAndRelease()
     public Prototype CreatePrototypeAndRelease()
     {
     {
         var protoTypes = Prototypes.Length == 0 ? Array.Empty<Prototype>() : new Prototype[Prototypes.Length];
         var protoTypes = Prototypes.Length == 0 ? Array.Empty<Prototype>() : new Prototype[Prototypes.Length];

+ 14 - 46
src/Lua/CodeAnalysis/Compilation/Scanner.cs

@@ -22,13 +22,11 @@ internal struct Scanner
 
 
     public int T => Token.T;
     public int T => Token.T;
 
 
-
     public const int FirstReserved = ushort.MaxValue + 257;
     public const int FirstReserved = ushort.MaxValue + 257;
     public const int EndOfStream = -1;
     public const int EndOfStream = -1;
 
 
     public const int MaxInt = int.MaxValue >> 1 + 1; //9223372036854775807
     public const int MaxInt = int.MaxValue >> 1 + 1; //9223372036854775807
 
 
-
     public const int TkAnd = FirstReserved;
     public const int TkAnd = FirstReserved;
     public const int TkBreak = TkAnd + 1;
     public const int TkBreak = TkAnd + 1;
     public const int TkDo = TkBreak + 1;
     public const int TkDo = TkBreak + 1;
@@ -65,7 +63,6 @@ internal struct Scanner
 
 
     public const int ReservedCount = TkWhile - FirstReserved + 1;
     public const int ReservedCount = TkWhile - FirstReserved + 1;
 
 
-
     static readonly string[] tokens =
     static readonly string[] tokens =
     [
     [
         "and", "break", "do", "else", "elseif",
         "and", "break", "do", "else", "elseif",
@@ -78,7 +75,6 @@ internal struct Scanner
 
 
     public static ReadOnlySpan<string> Tokens => tokens;
     public static ReadOnlySpan<string> Tokens => tokens;
 
 
-
     public void SyntaxError(string message) => ScanError(message, Token.T);
     public void SyntaxError(string message) => ScanError(message, Token.T);
     public void ErrorExpected(char t) => SyntaxError(TokenToString(t) + " expected");
     public void ErrorExpected(char t) => SyntaxError(TokenToString(t) + " expected");
     public void NumberError() => ScanError("malformed number", TkNumber);
     public void NumberError() => ScanError("malformed number", TkNumber);
@@ -112,7 +108,6 @@ internal struct Scanner
         _ => tokens[t - FirstReserved]
         _ => tokens[t - FirstReserved]
     };
     };
 
 
-
     public void ScanError(string message, int token)
     public void ScanError(string message, int token)
     {
     {
         var shortSourceBuffer = (stackalloc char[59]);
         var shortSourceBuffer = (stackalloc char[59]);
@@ -122,7 +117,6 @@ internal struct Scanner
         throw new LuaScanException(message);
         throw new LuaScanException(message);
     }
     }
 
 
-
     public void IncrementLineNumber()
     public void IncrementLineNumber()
     {
     {
         var old = Current;
         var old = Current;
@@ -132,33 +126,28 @@ internal struct Scanner
         if (++LineNumber >= MaxLine) SyntaxError("chunk has too many lines");
         if (++LineNumber >= MaxLine) SyntaxError("chunk has too many lines");
     }
     }
 
 
-
     public void Advance()
     public void Advance()
     {
     {
         Current = R.TryRead(out var c) ? c : EndOfStream;
         Current = R.TryRead(out var c) ? c : EndOfStream;
     }
     }
 
 
-
     public void SaveAndAdvance()
     public void SaveAndAdvance()
     {
     {
         Save(Current);
         Save(Current);
         Advance();
         Advance();
     }
     }
 
 
-
     public void AdvanceAndSave(int c)
     public void AdvanceAndSave(int c)
     {
     {
         Advance();
         Advance();
         Save(c);
         Save(c);
     }
     }
 
 
-
     public void Save(int c)
     public void Save(int c)
     {
     {
         Buffer.Append((char)c);
         Buffer.Append((char)c);
     }
     }
 
 
-
     public bool CheckNext(string str)
     public bool CheckNext(string str)
     {
     {
         if (Current == 0 || !str.Contains((char)Current)) return false;
         if (Current == 0 || !str.Contains((char)Current)) return false;
@@ -166,7 +155,6 @@ internal struct Scanner
         return true;
         return true;
     }
     }
 
 
-
     public int SkipSeparator()
     public int SkipSeparator()
     {
     {
         var (i, c) = (0, Current);
         var (i, c) = (0, Current);
@@ -176,7 +164,6 @@ internal struct Scanner
         return -i - 1;
         return -i - 1;
     }
     }
 
 
-
     public string ReadMultiLine(bool comment, int sep)
     public string ReadMultiLine(bool comment, int sep)
     {
     {
         SaveAndAdvance();
         SaveAndAdvance();
@@ -227,7 +214,6 @@ internal struct Scanner
         }
         }
     }
     }
 
 
-
     public int ReadDigits()
     public int ReadDigits()
     {
     {
         var c = Current;
         var c = Current;
@@ -235,10 +221,8 @@ internal struct Scanner
         return c;
         return c;
     }
     }
 
 
-
     public static bool IsHexadecimal(int c) => c is >= '0' and <= '9' or >= 'a' and <= 'f' or >= 'A' and <= 'F';
     public static bool IsHexadecimal(int c) => c is >= '0' and <= '9' or >= 'a' and <= 'f' or >= 'A' and <= 'F';
 
 
-
     public (double n, int c, int i) ReadHexNumber(double x)
     public (double n, int c, int i) ReadHexNumber(double x)
     {
     {
         var c = Current;
         var c = Current;
@@ -271,7 +255,6 @@ internal struct Scanner
         }
         }
     }
     }
 
 
-
     public Token ReadNumber()
     public Token ReadNumber()
     {
     {
         var c = Current;
         var c = Current;
@@ -375,7 +358,6 @@ internal struct Scanner
         return new() { T = TkNumber, N = f };
         return new() { T = TkNumber, N = f };
     }
     }
 
 
-
     static readonly Dictionary<int, char> escapes = new()
     static readonly Dictionary<int, char> escapes = new()
     {
     {
         { 'a', '\a' },
         { 'a', '\a' },
@@ -390,7 +372,6 @@ internal struct Scanner
         { '\'', '\'' },
         { '\'', '\'' },
     };
     };
 
 
-
     public void EscapeError(ReadOnlySpan<int> c, string message)
     public void EscapeError(ReadOnlySpan<int> c, string message)
     {
     {
         Buffer.Clear();
         Buffer.Clear();
@@ -412,7 +393,6 @@ internal struct Scanner
         ScanError(message, TkString);
         ScanError(message, TkString);
     }
     }
 
 
-
     public int ReadHexEscape()
     public int ReadHexEscape()
     {
     {
         Advance();
         Advance();
@@ -444,7 +424,6 @@ internal struct Scanner
         return r;
         return r;
     }
     }
 
 
-
     public int ReadDecimalEscape()
     public int ReadDecimalEscape()
     {
     {
         var b = (stackalloc int[3] { 0, 0, 0 });
         var b = (stackalloc int[3] { 0, 0, 0 });
@@ -465,7 +444,6 @@ internal struct Scanner
         return r;
         return r;
     }
     }
 
 
-
     public Token ReadString()
     public Token ReadString()
     {
     {
         var delimiter = Current;
         var delimiter = Current;
@@ -539,7 +517,6 @@ internal struct Scanner
         return new() { T = TkString, S = str };
         return new() { T = TkString, S = str };
     }
     }
 
 
-
     public static bool IsReserved(string s)
     public static bool IsReserved(string s)
     {
     {
         foreach (var reserved in Tokens)
         foreach (var reserved in Tokens)
@@ -553,7 +530,6 @@ internal struct Scanner
         return false;
         return false;
     }
     }
 
 
-
     public Token ReservedOrName()
     public Token ReservedOrName()
     {
     {
         var str = Buffer.ToString();
         var str = Buffer.ToString();
@@ -569,7 +545,6 @@ internal struct Scanner
         return new() { T = TkName, S = str };
         return new() { T = TkName, S = str };
     }
     }
 
 
-
     public Token Scan()
     public Token Scan()
     {
     {
         const bool comment = true, str = false;
         const bool comment = true, str = false;
@@ -710,9 +685,9 @@ internal struct Scanner
                             return ReadNumber();
                             return ReadNumber();
                         }
                         }
 
 
-                        if (c == '_' || IsLetter(c))
+                        if (IsLetter(c))
                         {
                         {
-                            for (; c == '_' || IsLetter(c) || IsDigit(c); c = Current)
+                            for (; IsLetter(c) || IsDigit(c); c = Current)
                             {
                             {
                                 SaveAndAdvance();
                                 SaveAndAdvance();
                             }
                             }
@@ -727,7 +702,6 @@ internal struct Scanner
         }
         }
     }
     }
 
 
-
     public void Next()
     public void Next()
     {
     {
         LastLine = LineNumber;
         LastLine = LineNumber;
@@ -742,7 +716,6 @@ internal struct Scanner
         }
         }
     }
     }
 
 
-
     public int LookAhead()
     public int LookAhead()
     {
     {
         Assert(LookAheadToken.T == TkEos);
         Assert(LookAheadToken.T == TkEos);
@@ -750,18 +723,15 @@ internal struct Scanner
         return LookAheadToken.T;
         return LookAheadToken.T;
     }
     }
 
 
-
     public bool TestNext(int t)
     public bool TestNext(int t)
     {
     {
         var r = Token.T == t;
         var r = Token.T == t;
-        if (r)
-        {
-            Next();
-        }
+        if (!r) return false;
 
 
-        return r;
-    }
+        Next();
 
 
+        return true;
+    }
 
 
     public void Check(int t)
     public void Check(int t)
     {
     {
@@ -771,19 +741,17 @@ internal struct Scanner
         }
         }
     }
     }
 
 
-
     public void CheckMatch(int what, int who, int where)
     public void CheckMatch(int what, int who, int where)
     {
     {
-        if (!TestNext(what))
+        if (TestNext(what)) return;
+
+        if (where == LineNumber)
         {
         {
-            if (where == LineNumber)
-            {
-                ErrorExpected((char)what);
-            }
-            else
-            {
-                SyntaxError($"{TokenToString(what)} expected (to close {TokenToString(who)} at line {where})");
-            }
+            ErrorExpected((char)what);
+        }
+        else
+        {
+            SyntaxError($"{TokenToString(what)} expected (to close {TokenToString(who)} at line {where})");
         }
         }
     }
     }
 
 

+ 0 - 2
src/Lua/Internal/LuaDebug.cs

@@ -123,7 +123,6 @@ internal readonly struct LuaDebug : IDisposable
         }
         }
     }
     }
 
 
-
     public static LuaDebug Create(LuaState state, CallStackFrame? prevFrame, CallStackFrame? frame, LuaFunction function, int pc, ReadOnlySpan<char> what, out bool isValid)
     public static LuaDebug Create(LuaState state, CallStackFrame? prevFrame, CallStackFrame? frame, LuaFunction function, int pc, ReadOnlySpan<char> what, out bool isValid)
     {
     {
         if (!state.DebugBufferPool.TryPop(out var buffer))
         if (!state.DebugBufferPool.TryPop(out var buffer))
@@ -141,7 +140,6 @@ internal readonly struct LuaDebug : IDisposable
         if (buffer.version != version) ThrowObjectDisposedException();
         if (buffer.version != version) ThrowObjectDisposedException();
     }
     }
 
 
-
     public void Dispose()
     public void Dispose()
     {
     {
         if (buffer.version != version) ThrowObjectDisposedException();
         if (buffer.version != version) ThrowObjectDisposedException();

+ 0 - 1
src/Lua/LuaState.cs

@@ -139,7 +139,6 @@ public sealed class LuaState
         }
         }
     }
     }
 
 
-
     public unsafe LuaClosure Load(ReadOnlySpan<char> chunk, string chunkName, LuaTable? environment = null)
     public unsafe LuaClosure Load(ReadOnlySpan<char> chunk, string chunkName, LuaTable? environment = null)
     {
     {
         Prototype prototype;
         Prototype prototype;

+ 0 - 3
src/Lua/LuaThreadExtensions.cs

@@ -15,7 +15,6 @@ public static class LuaThreadExtensions
         return new(LuaCoroutine.Create(thread, function, isProtectedMode));
         return new(LuaCoroutine.Create(thread, function, isProtectedMode));
     }
     }
 
 
-
     public static async ValueTask<int> DoStringAsync(this LuaThread thread, string source, Memory<LuaValue> buffer, string? chunkName = null, CancellationToken cancellationToken = default)
     public static async ValueTask<int> DoStringAsync(this LuaThread thread, string source, Memory<LuaValue> buffer, string? chunkName = null, CancellationToken cancellationToken = default)
     {
     {
         var closure = thread.State.Load(source, chunkName ?? source);
         var closure = thread.State.Load(source, chunkName ?? source);
@@ -54,7 +53,6 @@ public static class LuaThreadExtensions
         return results.AsSpan().ToArray();
         return results.AsSpan().ToArray();
     }
     }
 
 
-
     public static void Push(this LuaThread thread, LuaValue value)
     public static void Push(this LuaThread thread, LuaValue value)
     {
     {
         thread.CoreData!.Stack.Push(value);
         thread.CoreData!.Stack.Push(value);
@@ -81,7 +79,6 @@ public static class LuaThreadExtensions
         return new LuaReturnValuesReader(stack, stack.Count - argumentCount);
         return new LuaReturnValuesReader(stack, stack.Count - argumentCount);
     }
     }
 
 
-
     public static ref readonly CallStackFrame GetCurrentFrame(this LuaThread thread)
     public static ref readonly CallStackFrame GetCurrentFrame(this LuaThread thread)
     {
     {
         return ref thread.CoreData!.CallStack.PeekRef();
         return ref thread.CoreData!.CallStack.PeekRef();

+ 0 - 1
src/Lua/Standard/CoroutineLibrary.cs

@@ -51,7 +51,6 @@ public sealed class CoroutineLibrary
         }));
         }));
     }
     }
 
 
-
     public ValueTask<int> Wrap(LuaFunctionExecutionContext context, CancellationToken cancellationToken)
     public ValueTask<int> Wrap(LuaFunctionExecutionContext context, CancellationToken cancellationToken)
     {
     {
         var arg0 = context.GetArgument<LuaFunction>(0);
         var arg0 = context.GetArgument<LuaFunction>(0);

+ 0 - 1
src/Lua/Standard/DebugLibrary.cs

@@ -481,7 +481,6 @@ public class DebugLibrary
         return 0;
         return 0;
     }
     }
 
 
-
     public ValueTask<int> GetHook(LuaFunctionExecutionContext context, CancellationToken cancellationToken)
     public ValueTask<int> GetHook(LuaFunctionExecutionContext context, CancellationToken cancellationToken)
     {
     {
         var thread = GetLuaThread(context, out var argOffset);
         var thread = GetLuaThread(context, out var argOffset);