Browse Source

Add: function field to CallStackFrame

AnnulusGames 1 year ago
parent
commit
227438bc85

+ 1 - 34
src/Lua/LuaFunction.cs

@@ -15,6 +15,7 @@ public abstract partial class LuaFunction
             ChunkName = context.ChunkName ?? LuaState.DefaultChunkName,
             ChunkName = context.ChunkName ?? LuaState.DefaultChunkName,
             RootChunkName = context.RootChunkName ?? LuaState.DefaultChunkName,
             RootChunkName = context.RootChunkName ?? LuaState.DefaultChunkName,
             VariableArgumentCount = this is Closure closure ? context.ArgumentCount - closure.Proto.ParameterCount : 0,
             VariableArgumentCount = this is Closure closure ? context.ArgumentCount - closure.Proto.ParameterCount : 0,
+            Function = this,
         };
         };
 
 
         state.PushCallStackFrame(frame);
         state.PushCallStackFrame(frame);
@@ -30,38 +31,4 @@ public abstract partial class LuaFunction
 
 
     public virtual string Name => GetType().Name;
     public virtual string Name => GetType().Name;
     protected abstract ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken);
     protected abstract ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken);
-
-    protected void ThrowIfArgumentNotExists(LuaFunctionExecutionContext context, int index)
-    {
-        if (context.ArgumentCount <= index)
-        {
-            LuaRuntimeException.BadArgument(context.State.GetTracebacks(), index + 1, Name);
-        }
-    }
-
-    protected LuaValue ReadArgument(LuaFunctionExecutionContext context, int index)
-    {
-        ThrowIfArgumentNotExists(context, index);
-        return context.Arguments[index];
-    }
-
-    protected T ReadArgument<T>(LuaFunctionExecutionContext context, int index)
-    {
-        ThrowIfArgumentNotExists(context, index);
-
-        var arg = context.Arguments[index];
-        if (!arg.TryRead<T>(out var argValue))
-        {
-            if (LuaValue.TryGetLuaValueType(typeof(T), out var type))
-            {
-                LuaRuntimeException.BadArgument(context.State.GetTracebacks(), 1, Name, type.ToString(), arg.Type.ToString());
-            }
-            else
-            {
-                LuaRuntimeException.BadArgument(context.State.GetTracebacks(), 1, Name, typeof(T).Name, arg.Type.ToString());
-            }
-        }
-
-        return argValue;
-    }
 }
 }

+ 37 - 0
src/Lua/LuaFunctionExecutionContext.cs

@@ -1,3 +1,4 @@
+using System.Runtime.CompilerServices;
 using Lua.CodeAnalysis;
 using Lua.CodeAnalysis;
 
 
 namespace Lua;
 namespace Lua;
@@ -13,4 +14,40 @@ public readonly record struct LuaFunctionExecutionContext
 
 
     public int FrameBase => State.GetCurrentFrame().Base;
     public int FrameBase => State.GetCurrentFrame().Base;
     public ReadOnlySpan<LuaValue> Arguments => State.GetStackValues().Slice(FrameBase, ArgumentCount);
     public ReadOnlySpan<LuaValue> Arguments => State.GetStackValues().Slice(FrameBase, ArgumentCount);
+    
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public LuaValue ReadArgument(int index)
+    {
+        ThrowIfArgumentNotExists(index);
+        return Arguments[index];
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public T ReadArgument<T>(int index)
+    {
+        ThrowIfArgumentNotExists(index);
+
+        var arg = Arguments[index];
+        if (!arg.TryRead<T>(out var argValue))
+        {
+            if (LuaValue.TryGetLuaValueType(typeof(T), out var type))
+            {
+                LuaRuntimeException.BadArgument(State.GetTracebacks(), 1, State.GetCurrentFrame().Function.Name, type.ToString(), arg.Type.ToString());
+            }
+            else
+            {
+                LuaRuntimeException.BadArgument(State.GetTracebacks(), 1, State.GetCurrentFrame().Function.Name, typeof(T).Name, arg.Type.ToString());
+            }
+        }
+
+        return argValue;
+    }
+
+    void ThrowIfArgumentNotExists(int index)
+    {
+        if (ArgumentCount <= index)
+        {
+            LuaRuntimeException.BadArgument(State.GetTracebacks(), index + 1, State.GetCurrentFrame().Function.Name);
+        }
+    }
 }
 }

+ 1 - 0
src/Lua/Runtime/CallStackFrame.cs

@@ -7,6 +7,7 @@ public record struct CallStackFrame
     public required int Base;
     public required int Base;
     public required string ChunkName;
     public required string ChunkName;
     public required string RootChunkName;
     public required string RootChunkName;
+    public required LuaFunction Function;
     public required SourcePosition? CallPosition;
     public required SourcePosition? CallPosition;
     public required int VariableArgumentCount;
     public required int VariableArgumentCount;
 }
 }

+ 2 - 0
src/Lua/Runtime/Closure.cs

@@ -23,6 +23,8 @@ public sealed class Closure : LuaFunction
     public Chunk Proto => proto;
     public Chunk Proto => proto;
     public ReadOnlySpan<UpValue> UpValues => upValues.AsSpan();
     public ReadOnlySpan<UpValue> UpValues => upValues.AsSpan();
 
 
+    public override string Name => Proto.Name;
+
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
         return LuaVirtualMachine.ExecuteClosureAsync(context.State, this, context.State.GetCurrentFrame(), buffer, cancellationToken);
         return LuaVirtualMachine.ExecuteClosureAsync(context.State, this, context.State.GetCurrentFrame(), buffer, cancellationToken);

+ 2 - 2
src/Lua/Standard/Base/AssertFunction.cs

@@ -7,14 +7,14 @@ public sealed class AssertFunction : LuaFunction
 
 
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
-        var arg0 = ReadArgument(context, 0);
+        var arg0 = context.ReadArgument(0);
 
 
         if (!arg0.ToBoolean())
         if (!arg0.ToBoolean())
         {
         {
             var message = "assertion failed!";
             var message = "assertion failed!";
             if (context.ArgumentCount >= 2)
             if (context.ArgumentCount >= 2)
             {
             {
-                message = ReadArgument<string>(context, 1);
+                message = context.ReadArgument<string>(1);
             }
             }
 
 
             throw new LuaAssertionException(context.State.GetTracebacks(), message);
             throw new LuaAssertionException(context.State.GetTracebacks(), message);

+ 3 - 5
src/Lua/Standard/Base/GetMetatableFunction.cs

@@ -10,11 +10,9 @@ public sealed class GetMetatableFunction : LuaFunction
 
 
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
-        ThrowIfArgumentNotExists(context, 0);
-
-        var obj = context.Arguments[0];
-
-        if (obj.TryRead<LuaTable>(out var table))
+        var arg0 = context.ReadArgument(0);
+        
+        if (arg0.TryRead<LuaTable>(out var table))
         {
         {
             if (table.Metatable == null)
             if (table.Metatable == null)
             {
             {

+ 3 - 3
src/Lua/Standard/Base/RawGetFunction.cs

@@ -8,9 +8,9 @@ public sealed class RawGetFunction : LuaFunction
 
 
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
-        var arg0 = ReadArgument<LuaTable>(context, 0);
-        var arg1 = ReadArgument(context, 1);
-        
+        var arg0 = context.ReadArgument<LuaTable>(0);
+        var arg1 = context.ReadArgument(1);
+
         buffer.Span[0] = arg0[arg1];
         buffer.Span[0] = arg0[arg1];
         return new(1);
         return new(1);
     }
     }

+ 3 - 3
src/Lua/Standard/Base/RawSetFunction.cs

@@ -8,9 +8,9 @@ public sealed class RawSetFunction : LuaFunction
 
 
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
-        var arg0 = ReadArgument<LuaTable>(context, 0);
-        var arg1 = ReadArgument(context, 1);
-        var arg2 = ReadArgument(context, 2);
+        var arg0 = context.ReadArgument<LuaTable>(0);
+        var arg1 = context.ReadArgument(1);
+        var arg2 = context.ReadArgument(2);
 
 
         arg0[arg1] = arg2;
         arg0[arg1] = arg2;
         return new(0);
         return new(0);

+ 3 - 3
src/Lua/Standard/Base/SetMetatableFunction.cs

@@ -10,9 +10,9 @@ public sealed class SetMetatableFunction : LuaFunction
 
 
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
-        var arg0 = ReadArgument<LuaTable>(context, 0);
-
-        var arg1 = context.Arguments[1];
+        var arg0 = context.ReadArgument<LuaTable>(0);
+        var arg1 = context.ReadArgument(1);
+        
         if (arg1.Type is not (LuaValueType.Nil or LuaValueType.Table))
         if (arg1.Type is not (LuaValueType.Nil or LuaValueType.Table))
         {
         {
             LuaRuntimeException.BadArgument(context.State.GetTracebacks(), 2, Name, [LuaValueType.Nil, LuaValueType.Table]);
             LuaRuntimeException.BadArgument(context.State.GetTracebacks(), 2, Name, [LuaValueType.Nil, LuaValueType.Table]);

+ 1 - 1
src/Lua/Standard/Base/ToStringFunction.cs

@@ -7,7 +7,7 @@ public sealed class ToStringFunction : LuaFunction
 
 
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
-        var arg0 = ReadArgument(context, 0);
+        var arg0 = context.ReadArgument(0);
         return arg0.CallToStringAsync(context, buffer, cancellationToken);
         return arg0.CallToStringAsync(context, buffer, cancellationToken);
     }
     }
 }
 }