Browse Source

refactor: simplify fixed statement usage and remove unnecessary nullability

Akeit0 7 months ago
parent
commit
a457cb07ee

+ 6 - 6
src/Lua/CodeAnalysis/Compilation/Dump.cs

@@ -26,7 +26,7 @@ internal unsafe struct Header
 
 
     public Header(bool isLittleEndian)
     public Header(bool isLittleEndian)
     {
     {
-        fixed (byte* signature = this.Signature)
+        fixed (byte* signature = Signature)
         {
         {
             LuaSignature.CopyTo(new(signature, 4));
             LuaSignature.CopyTo(new(signature, 4));
         }
         }
@@ -39,7 +39,7 @@ internal unsafe struct Header
         InstructionSize = 4;
         InstructionSize = 4;
         NumberSize = 8;
         NumberSize = 8;
         IntegralNumber = 0;
         IntegralNumber = 0;
-        fixed (byte* tail = this.Tail)
+        fixed (byte* tail = Tail)
         {
         {
             LuaTail.CopyTo(new(tail, 6));
             LuaTail.CopyTo(new(tail, 6));
         }
         }
@@ -47,7 +47,7 @@ internal unsafe struct Header
 
 
     public void Validate(ReadOnlySpan<char> name)
     public void Validate(ReadOnlySpan<char> name)
     {
     {
-        fixed (byte* signature = this.Signature)
+        fixed (byte* signature = Signature)
         {
         {
             if (!LuaSignature.SequenceEqual(new(signature, 4)))
             if (!LuaSignature.SequenceEqual(new(signature, 4)))
             {
             {
@@ -67,7 +67,7 @@ internal unsafe struct Header
             goto ErrIncompatible;
             goto ErrIncompatible;
         }
         }
 
 
-        fixed (byte* tail = this.Tail)
+        fixed (byte* tail = Tail)
         {
         {
             if (!LuaTail.SequenceEqual(new(tail, 6)))
             if (!LuaTail.SequenceEqual(new(tail, 6)))
             {
             {
@@ -463,7 +463,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 LocalVariable { Name = name, StartPc = startPc, EndPc = endPc };
         }
         }
 
 
         return localVariables;
         return localVariables;
@@ -478,7 +478,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 UpValueDesc { IsLocal = isLocal, Index = index };
         }
         }
 
 
         return upValues;
         return upValues;

+ 6 - 10
src/Lua/CodeAnalysis/Compilation/Function.cs

@@ -1,12 +1,12 @@
-using Lua.Runtime;
+using Lua.Internal;
+using Lua.Runtime;
 using System.Diagnostics;
 using System.Diagnostics;
 using Constants = Lua.Internal.Constants;
 using Constants = Lua.Internal.Constants;
 
 
 namespace Lua.CodeAnalysis.Compilation;
 namespace Lua.CodeAnalysis.Compilation;
 
 
 using static Debug;
 using static Debug;
-using static Lua.Runtime.Instruction;
-using Internal;
+using static Instruction;
 using static Constants;
 using static Constants;
 
 
 internal class Function : IPoolNode<Function>
 internal class Function : IPoolNode<Function>
@@ -20,7 +20,6 @@ internal class Function : IPoolNode<Function>
     public int FreeRegisterCount;
     public int FreeRegisterCount;
     public int ActiveVariableCount;
     public int ActiveVariableCount;
     public int FirstLocal;
     public int FirstLocal;
-    internal Function() { }
 
 
     static LinkedPool<Function> pool;
     static LinkedPool<Function> pool;
 
 
@@ -376,12 +375,9 @@ internal class Function : IPoolNode<Function>
     {
     {
         if (constant <= MaxArgBx)
         if (constant <= MaxArgBx)
             return EncodeABx(OpCode.LoadK, r, constant);
             return EncodeABx(OpCode.LoadK, r, constant);
-        else
-        {
-            var pc = EncodeABx(OpCode.LoadK, r, 0);
-            EncodeExtraArg(constant);
-            return pc;
-        }
+        var pc = EncodeABx(OpCode.LoadK, r, 0);
+        EncodeExtraArg(constant);
+        return pc;
     }
     }
 
 
 
 

+ 25 - 27
src/Lua/CodeAnalysis/Compilation/Parser.cs

@@ -27,7 +27,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
     {
     {
     }
     }
 
 
-    Parser? nextNode = null;
+    Parser? nextNode;
     ref Parser? IPoolNode<Parser>.NextNode => ref nextNode;
     ref Parser? IPoolNode<Parser>.NextNode => ref nextNode;
 
 
     static LinkedPool<Parser> pool;
     static LinkedPool<Parser> pool;
@@ -77,7 +77,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         if (val > limit)
         if (val > limit)
         {
         {
             string where = "main function";
             string where = "main function";
-            var line = Function!.Proto.LineDefined;
+            var line = Function.Proto.LineDefined;
             if (line != 0)
             if (line != 0)
             {
             {
                 where = $"function at line {line}";
                 where = $"function at line {line}";
@@ -95,10 +95,10 @@ internal class Parser : IPoolNode<Parser>, IDisposable
     }
     }
 
 
 
 
-    public ExprDesc CheckNameAsExpression() => Function!.EncodeString(CheckName());
+    public ExprDesc CheckNameAsExpression() => Function.EncodeString(CheckName());
 
 
 
 
-    public ExprDesc SingleVariable() => Function!.SingleVariable(CheckName());
+    public ExprDesc SingleVariable() => Function.SingleVariable(CheckName());
 
 
 
 
     public void LeaveLevel() => Scanner.L.CallCount--;
     public void LeaveLevel() => Scanner.L.CallCount--;
@@ -118,7 +118,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         var e = Expression();
         var e = Expression();
         for (; TestNext(','); n++, e = Expression())
         for (; TestNext(','); n++, e = Expression())
         {
         {
-            Function!.ExpressionToNextRegister(e);
+            Function.ExpressionToNextRegister(e);
         }
         }
 
 
         return (e, n);
         return (e, n);
@@ -127,13 +127,13 @@ internal class Parser : IPoolNode<Parser>, IDisposable
 
 
     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)
         void hashField(ExprDesc k)
         {
         {
             h++;
             h++;
             CheckNext('=');
             CheckNext('=');
-            Function!.FlushFieldToConstructor(tableRegister, freeRegisterCount, k, Expression);
+            Function.FlushFieldToConstructor(tableRegister, freeRegisterCount, k, Expression);
         }
         }
 
 
         if (T == TkName && Scanner.LookAhead() == '=')
         if (T == TkName && Scanner.LookAhead() == '=')
@@ -143,7 +143,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
         else if (T == '[')
         else if (T == '[')
         {
         {
-            hashField(this.Index());
+            hashField(Index());
         }
         }
         else
         else
         {
         {
@@ -159,7 +159,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
 
 
     public ExprDesc Constructor()
     public ExprDesc Constructor()
     {
     {
-        var (pc, t) = Function!.OpenConstructor();
+        var (pc, t) = Function.OpenConstructor();
         var (line, a, h, pending) = (Scanner.LineNumber, 0, 0, 0);
         var (line, a, h, pending) = (Scanner.LineNumber, 0, 0, 0);
         ExprDesc e = default;
         ExprDesc e = default;
         CheckNext('{');
         CheckNext('{');
@@ -170,7 +170,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
             {
             {
                 if (e.Kind != Kind.Void)
                 if (e.Kind != Kind.Void)
                 {
                 {
-                    pending = Function!.FlushToConstructor(t.Info, pending, a, e);
+                    pending = Function.FlushToConstructor(t.Info, pending, a, e);
                     e.Kind = Kind.Void;
                     e.Kind = Kind.Void;
                 }
                 }
 
 
@@ -179,7 +179,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         }
 
 
         Scanner.CheckMatch('}', '{', line);
         Scanner.CheckMatch('}', '{', line);
-        Function!.CloseConstructor(pc, t.Info, pending, a, h, e);
+        Function.CloseConstructor(pc, t.Info, pending, a, h, e);
         return t;
         return t;
     }
     }
 
 
@@ -198,7 +198,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 else
                 else
                 {
                 {
                     (args, _) = ExpressionList();
                     (args, _) = ExpressionList();
-                    Function!.SetMultipleReturns(args);
+                    Function.SetMultipleReturns(args);
                 }
                 }
 
 
                 Scanner.CheckMatch(')', '(', line);
                 Scanner.CheckMatch(')', '(', line);
@@ -207,7 +207,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 args = Constructor();
                 args = Constructor();
                 break;
                 break;
             case TkString:
             case TkString:
-                args = Function!.EncodeString(Scanner.Token.S);
+                args = Function.EncodeString(Scanner.Token.S);
                 Next();
                 Next();
                 break;
                 break;
             default:
             default:
@@ -220,13 +220,13 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         {
         {
             if (args.Kind != Kind.Void)
             if (args.Kind != Kind.Void)
             {
             {
-                Function!.ExpressionToNextRegister(args);
+                Function.ExpressionToNextRegister(args);
             }
             }
 
 
-            parameterCount = Function!.FreeRegisterCount - (@base + 1);
+            parameterCount = Function.FreeRegisterCount - (@base + 1);
         }
         }
 
 
-        var e = MakeExpression(Kind.Call, Function!.EncodeABC(OpCode.Call, @base, parameterCount + 1, 2));
+        var e = MakeExpression(Kind.Call, Function.EncodeABC(OpCode.Call, @base, parameterCount + 1, 2));
         Function.FixLine(line);
         Function.FixLine(line);
         Function.FreeRegisterCount = @base + 1; // call removed function and args & leaves (unless changed) one result
         Function.FreeRegisterCount = @base + 1; // call removed function and args & leaves (unless changed) one result
         return e;
         return e;
@@ -243,7 +243,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 Next();
                 Next();
                 e = Expression();
                 e = Expression();
                 Scanner.CheckMatch(')', '(', line);
                 Scanner.CheckMatch(')', '(', line);
-                e = Function!.DischargeVariables(e);
+                e = Function.DischargeVariables(e);
                 return e;
                 return e;
             case TkName:
             case TkName:
                 return SingleVariable();
                 return SingleVariable();
@@ -251,8 +251,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 Scanner.SyntaxError("unexpected symbol");
                 Scanner.SyntaxError("unexpected symbol");
                 return default;
                 return default;
         }
         }
-
-        return e;
     }
     }
 
 
 
 
@@ -268,16 +266,16 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                     e = FieldSelector(e);
                     e = FieldSelector(e);
                     break;
                     break;
                 case '[':
                 case '[':
-                    e = Function!.Indexed(Function!.ExpressionToAnyRegisterOrUpValue(e), this.Index());
+                    e = Function.Indexed(Function.ExpressionToAnyRegisterOrUpValue(e), Index());
                     break;
                     break;
                 case ':':
                 case ':':
                     Next();
                     Next();
-                    e = FunctionArguments(Function!.Self(e, CheckNameAsExpression()), line);
+                    e = FunctionArguments(Function.Self(e, CheckNameAsExpression()), line);
                     break;
                     break;
                 case '(':
                 case '(':
                 case TkString:
                 case TkString:
                 case '{':
                 case '{':
-                    e = FunctionArguments(Function!.ExpressionToNextRegister(e), line);
+                    e = FunctionArguments(Function.ExpressionToNextRegister(e), line);
                     break;
                     break;
                 default:
                 default:
                     return e;
                     return e;
@@ -296,7 +294,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 e.Value = Scanner.Token.N;
                 e.Value = Scanner.Token.N;
                 break;
                 break;
             case TkString:
             case TkString:
-                e = Function!.EncodeString(Scanner.Token.S);
+                e = Function.EncodeString(Scanner.Token.S);
                 break;
                 break;
             case TkNil:
             case TkNil:
                 e = MakeExpression(Kind.Nil, 0);
                 e = MakeExpression(Kind.Nil, 0);
@@ -308,8 +306,8 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 e = MakeExpression(Kind.False, 0);
                 e = MakeExpression(Kind.False, 0);
                 break;
                 break;
             case TkDots:
             case TkDots:
-                CheckCondition(Function!.Proto.IsVarArg, "cannot use '...' outside a vararg function");
-                e = MakeExpression(Kind.VarArg, Function!.EncodeABC(OpCode.VarArg, 0, 1, 0));
+                CheckCondition(Function.Proto.IsVarArg, "cannot use '...' outside a vararg function");
+                e = MakeExpression(Kind.VarArg, Function.EncodeABC(OpCode.VarArg, 0, 1, 0));
                 break;
                 break;
             case '{':
             case '{':
                 e = Constructor();
                 e = Constructor();
@@ -399,7 +397,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
     public (ExprDesc, int ) SubExpression(int limit)
     public (ExprDesc, int ) SubExpression(int limit)
     {
     {
         using var b = EnterLevel();
         using var b = EnterLevel();
-        ExprDesc e = default;
+        ExprDesc e;
         int u = UnaryOp(T);
         int u = UnaryOp(T);
         if (u != OprNoUnary)
         if (u != OprNoUnary)
         {
         {
@@ -536,7 +534,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
     {
     {
         void expr()
         void expr()
         {
         {
-            var e = Function.ExpressionToNextRegister(Expression());
+            ExprDesc e = Function.ExpressionToNextRegister(Expression());
             Assert(e.Kind == Kind.NonRelocatable);
             Assert(e.Kind == Kind.NonRelocatable);
         }
         }
 
 

+ 1 - 6
src/Lua/CodeAnalysis/Compilation/Scanner.cs

@@ -1,5 +1,4 @@
 using Lua.Internal;
 using Lua.Internal;
-using System.Diagnostics;
 using System.Globalization;
 using System.Globalization;
 using System.Text;
 using System.Text;
 using static System.Diagnostics.Debug;
 using static System.Diagnostics.Debug;
@@ -178,7 +177,7 @@ internal struct Scanner
     public int SkipSeparator()
     public int SkipSeparator()
     {
     {
         var (i, c) = (0, Current);
         var (i, c) = (0, Current);
-        Debug.Assert(c == '[' || c == ']');
+        Assert(c == '[' || c == ']');
         for (SaveAndAdvance(); Current == '='; i++) SaveAndAdvance();
         for (SaveAndAdvance(); Current == '='; i++) SaveAndAdvance();
         if (Current == c) return i;
         if (Current == c) return i;
         return -i - 1;
         return -i - 1;
@@ -289,15 +288,11 @@ internal struct Scanner
 
 
     public Token ReadNumber()
     public Token ReadNumber()
     {
     {
-        const int bits64 = 64;
-        const int base10 = 10;
         var c = Current;
         var c = Current;
         Assert(IsDecimal(c));
         Assert(IsDecimal(c));
         SaveAndAdvance();
         SaveAndAdvance();
         if (c == '0' && CheckNext("Xx")) // hexadecimal
         if (c == '0' && CheckNext("Xx")) // hexadecimal
         {
         {
-            var prefix = Buffer.ToString();
-            Assert(prefix is "0x" or "0X");
             Buffer.Clear();
             Buffer.Clear();
             var exponent = 0;
             var exponent = 0;
             (var fraction, c, var i) = ReadHexNumber(0);
             (var fraction, c, var i) = ReadHexNumber(0);