Browse Source

Add: SetHook API

Akeit0 7 months ago
parent
commit
64e415ceba
2 changed files with 33 additions and 31 deletions
  1. 28 0
      src/Lua/LuaThread.cs
  2. 5 31
      src/Lua/Standard/DebugLibrary.cs

+ 28 - 0
src/Lua/LuaThread.cs

@@ -185,6 +185,34 @@ public abstract class LuaThread
         UpdateCurrentVersion(ref callStack);
     }
 
+    public void SetHook(LuaFunction? hook, string mask, int count = 0)
+    {
+        if (hook is null)
+        {
+            HookCount = 0;
+            BaseHookCount = 0;
+            Hook = null;
+            IsLineHookEnabled = false;
+            IsCallHookEnabled = false;
+            IsReturnHookEnabled = false;
+            return;
+        }
+
+        HookCount = count > 0 ? count + 1 : 0;
+        BaseHookCount = count;
+
+        IsLineHookEnabled = (mask.Contains('l'));
+        IsCallHookEnabled = (mask.Contains('c'));
+        IsReturnHookEnabled = (mask.Contains('r'));
+
+        if (IsLineHookEnabled)
+        {
+            LastPc = CallStackFrameCount > 0 ? GetCurrentFrame().CallerInstructionIndex : -1;
+        }
+
+        Hook = hook;
+    }
+
     internal void DumpStackValues()
     {
         var span = GetStackValues();

+ 5 - 31
src/Lua/Standard/DebugLibrary.cs

@@ -413,40 +413,14 @@ public class DebugLibrary
     {
         var thread = GetLuaThread(context, out var argOffset);
         LuaFunction? hook = context.GetArgumentOrDefault<LuaFunction?>(argOffset);
+        var mask = context.GetArgument<string>(argOffset + 1);
+        var count = context.GetArgumentOrDefault<int>(argOffset + 2);
+        thread.SetHook(hook, mask, count);
         if (hook is null)
         {
-            thread.HookCount = -1;
-            thread.BaseHookCount = 0;
-            thread.Hook = null;
-            thread.IsLineHookEnabled = false;
-            thread.IsCallHookEnabled = false;
-            thread.IsReturnHookEnabled = false;
             return 0;
         }
 
-        var mask = context.GetArgument<string>(argOffset + 1);
-        if (context.HasArgument(argOffset + 2))
-        {
-            var count = context.GetArgument<int>(argOffset + 2);
-            thread.BaseHookCount = count;
-            thread.HookCount = count + 1;
-        }
-        else
-        {
-            thread.HookCount = 0;
-            thread.BaseHookCount = 0;
-        }
-
-        thread.IsLineHookEnabled = (mask.Contains('l'));
-        thread.IsCallHookEnabled = (mask.Contains('c'));
-        thread.IsReturnHookEnabled = (mask.Contains('r'));
-
-        if (thread.IsLineHookEnabled)
-        {
-            thread.LastPc = thread.CallStackFrameCount > 0 ? thread.GetCurrentFrame().CallerInstructionIndex : -1;
-        }
-
-        thread.Hook = hook;
         if (thread.IsReturnHookEnabled && context.Thread == thread)
         {
             var stack = thread.Stack;
@@ -455,8 +429,8 @@ public class DebugLibrary
             stack.Push(LuaValue.Nil);
             context.Thread.IsInHook = true;
             var frame = context.Thread.CurrentAccess.CreateCallStackFrame(hook, 2, top, 0);
-            var access= context.Thread.PushCallStackFrame(frame);
-            var funcContext = new LuaFunctionExecutionContext { Access =access, ArgumentCount = stack.Count-frame.Base, ReturnFrameBase = frame.ReturnBase };
+            var access = context.Thread.PushCallStackFrame(frame);
+            var funcContext = new LuaFunctionExecutionContext { Access = access, ArgumentCount = stack.Count - frame.Base, ReturnFrameBase = frame.ReturnBase };
             try
             {
                 await hook.Func(funcContext, cancellationToken);