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)
     {
-        fixed (byte* signature = this.Signature)
+        fixed (byte* signature = Signature)
         {
             LuaSignature.CopyTo(new(signature, 4));
         }
@@ -39,7 +39,7 @@ internal unsafe struct Header
         InstructionSize = 4;
         NumberSize = 8;
         IntegralNumber = 0;
-        fixed (byte* tail = this.Tail)
+        fixed (byte* tail = Tail)
         {
             LuaTail.CopyTo(new(tail, 6));
         }
@@ -47,7 +47,7 @@ internal unsafe struct Header
 
     public void Validate(ReadOnlySpan<char> name)
     {
-        fixed (byte* signature = this.Signature)
+        fixed (byte* signature = Signature)
         {
             if (!LuaSignature.SequenceEqual(new(signature, 4)))
             {
@@ -67,7 +67,7 @@ internal unsafe struct Header
             goto ErrIncompatible;
         }
 
-        fixed (byte* tail = this.Tail)
+        fixed (byte* tail = Tail)
         {
             if (!LuaTail.SequenceEqual(new(tail, 6)))
             {
@@ -463,7 +463,7 @@ internal unsafe ref struct UnDumpState(ReadOnlySpan<byte> span, ReadOnlySpan<cha
             var name = ReadString();
             var startPc = 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;
@@ -478,7 +478,7 @@ internal unsafe ref struct UnDumpState(ReadOnlySpan<byte> span, ReadOnlySpan<cha
         {
             var isLocal = ReadBool();
             var index = ReadByte();
-            upValues[i] = new UpValueDesc() { IsLocal = isLocal, Index = index };
+            upValues[i] = new UpValueDesc { IsLocal = isLocal, Index = index };
         }
 
         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 Constants = Lua.Internal.Constants;
 
 namespace Lua.CodeAnalysis.Compilation;
 
 using static Debug;
-using static Lua.Runtime.Instruction;
-using Internal;
+using static Instruction;
 using static Constants;
 
 internal class Function : IPoolNode<Function>
@@ -20,7 +20,6 @@ internal class Function : IPoolNode<Function>
     public int FreeRegisterCount;
     public int ActiveVariableCount;
     public int FirstLocal;
-    internal Function() { }
 
     static LinkedPool<Function> pool;
 
@@ -376,12 +375,9 @@ internal class Function : IPoolNode<Function>
     {
         if (constant <= MaxArgBx)
             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;
 
     static LinkedPool<Parser> pool;
@@ -77,7 +77,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         if (val > limit)
         {
             string where = "main function";
-            var line = Function!.Proto.LineDefined;
+            var line = Function.Proto.LineDefined;
             if (line != 0)
             {
                 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--;
@@ -118,7 +118,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         var e = Expression();
         for (; TestNext(','); n++, e = Expression())
         {
-            Function!.ExpressionToNextRegister(e);
+            Function.ExpressionToNextRegister(e);
         }
 
         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)
     {
-        var freeRegisterCount = Function!.FreeRegisterCount;
+        var freeRegisterCount = Function.FreeRegisterCount;
 
         void hashField(ExprDesc k)
         {
             h++;
             CheckNext('=');
-            Function!.FlushFieldToConstructor(tableRegister, freeRegisterCount, k, Expression);
+            Function.FlushFieldToConstructor(tableRegister, freeRegisterCount, k, Expression);
         }
 
         if (T == TkName && Scanner.LookAhead() == '=')
@@ -143,7 +143,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
         else if (T == '[')
         {
-            hashField(this.Index());
+            hashField(Index());
         }
         else
         {
@@ -159,7 +159,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
 
     public ExprDesc Constructor()
     {
-        var (pc, t) = Function!.OpenConstructor();
+        var (pc, t) = Function.OpenConstructor();
         var (line, a, h, pending) = (Scanner.LineNumber, 0, 0, 0);
         ExprDesc e = default;
         CheckNext('{');
@@ -170,7 +170,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
             {
                 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;
                 }
 
@@ -179,7 +179,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         }
 
         Scanner.CheckMatch('}', '{', line);
-        Function!.CloseConstructor(pc, t.Info, pending, a, h, e);
+        Function.CloseConstructor(pc, t.Info, pending, a, h, e);
         return t;
     }
 
@@ -198,7 +198,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 else
                 {
                     (args, _) = ExpressionList();
-                    Function!.SetMultipleReturns(args);
+                    Function.SetMultipleReturns(args);
                 }
 
                 Scanner.CheckMatch(')', '(', line);
@@ -207,7 +207,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 args = Constructor();
                 break;
             case TkString:
-                args = Function!.EncodeString(Scanner.Token.S);
+                args = Function.EncodeString(Scanner.Token.S);
                 Next();
                 break;
             default:
@@ -220,13 +220,13 @@ internal class Parser : IPoolNode<Parser>, IDisposable
         {
             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.FreeRegisterCount = @base + 1; // call removed function and args & leaves (unless changed) one result
         return e;
@@ -243,7 +243,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 Next();
                 e = Expression();
                 Scanner.CheckMatch(')', '(', line);
-                e = Function!.DischargeVariables(e);
+                e = Function.DischargeVariables(e);
                 return e;
             case TkName:
                 return SingleVariable();
@@ -251,8 +251,6 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 Scanner.SyntaxError("unexpected symbol");
                 return default;
         }
-
-        return e;
     }
 
 
@@ -268,16 +266,16 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                     e = FieldSelector(e);
                     break;
                 case '[':
-                    e = Function!.Indexed(Function!.ExpressionToAnyRegisterOrUpValue(e), this.Index());
+                    e = Function.Indexed(Function.ExpressionToAnyRegisterOrUpValue(e), Index());
                     break;
                 case ':':
                     Next();
-                    e = FunctionArguments(Function!.Self(e, CheckNameAsExpression()), line);
+                    e = FunctionArguments(Function.Self(e, CheckNameAsExpression()), line);
                     break;
                 case '(':
                 case TkString:
                 case '{':
-                    e = FunctionArguments(Function!.ExpressionToNextRegister(e), line);
+                    e = FunctionArguments(Function.ExpressionToNextRegister(e), line);
                     break;
                 default:
                     return e;
@@ -296,7 +294,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 e.Value = Scanner.Token.N;
                 break;
             case TkString:
-                e = Function!.EncodeString(Scanner.Token.S);
+                e = Function.EncodeString(Scanner.Token.S);
                 break;
             case TkNil:
                 e = MakeExpression(Kind.Nil, 0);
@@ -308,8 +306,8 @@ internal class Parser : IPoolNode<Parser>, IDisposable
                 e = MakeExpression(Kind.False, 0);
                 break;
             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;
             case '{':
                 e = Constructor();
@@ -399,7 +397,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
     public (ExprDesc, int ) SubExpression(int limit)
     {
         using var b = EnterLevel();
-        ExprDesc e = default;
+        ExprDesc e;
         int u = UnaryOp(T);
         if (u != OprNoUnary)
         {
@@ -536,7 +534,7 @@ internal class Parser : IPoolNode<Parser>, IDisposable
     {
         void expr()
         {
-            var e = Function.ExpressionToNextRegister(Expression());
+            ExprDesc e = Function.ExpressionToNextRegister(Expression());
             Assert(e.Kind == Kind.NonRelocatable);
         }
 

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

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