Преглед изворни кода

Change: Integrate LuaRuntimeExceptions

Akeit0 пре 11 месеци
родитељ
комит
a5c788c8e3
4 измењених фајлова са 48 додато и 29 уклоњено
  1. 35 14
      src/Lua/Exceptions.cs
  2. 1 3
      src/Lua/LuaCoroutine.cs
  3. 1 1
      src/Lua/Runtime/LuaVirtualMachine.cs
  4. 11 11
      src/Lua/Standard/BasicLibrary.cs

+ 35 - 14
src/Lua/Exceptions.cs

@@ -4,7 +4,20 @@ using Lua.Runtime;
 
 namespace Lua;
 
-public class LuaException(string message) : Exception(message);
+public class LuaException : Exception
+{
+    protected LuaException(Exception innerException) : base(innerException.Message, innerException)
+    {
+    }
+
+    public LuaException(string message) : base(message)
+    {
+    }
+
+    internal LuaException()
+    {
+    }
+}
 
 public class LuaParseException(string? chunkName, SourcePosition position, string message) : LuaException(message)
 {
@@ -44,9 +57,27 @@ public class LuaParseException(string? chunkName, SourcePosition position, strin
     public override string Message => $"{ChunkName}:{(Position == null ? "" : $"{Position.Value}:")} {base.Message}";
 }
 
-public class LuaRuntimeException(Traceback traceback, string message) : LuaException(message)
+public class LuaRuntimeException : LuaException
 {
-    public Traceback LuaTraceback { get; } = traceback;
+    public LuaRuntimeException(Traceback traceback, Exception innerException) : base(innerException)
+    {
+        LuaTraceback = traceback;
+    }
+
+    public LuaRuntimeException(Traceback traceback, string message) : base(message)
+    {
+        LuaTraceback = traceback;
+    }
+
+    public LuaRuntimeException(Traceback traceback, LuaValue errorObject)
+    {
+        LuaTraceback = traceback;
+        ErrorObject = errorObject;
+    }
+
+    public Traceback LuaTraceback { get; }
+
+    public LuaValue? ErrorObject { get; }
 
     public static void AttemptInvalidOperation(Traceback traceback, string op, LuaValue a, LuaValue b)
     {
@@ -97,14 +128,4 @@ public class LuaAssertionException(Traceback traceback, string message) : LuaRun
     }
 }
 
-public class LuaModuleNotFoundException(string moduleName) : LuaException($"module '{moduleName}' not found");
-
-public class LuaRuntimeCSharpException(Traceback traceback, Exception exception) : LuaRuntimeException(traceback, exception.Message)
-{
-    public Exception Exception { get; } = exception;
-}
-
-public class LuaRuntimeLuaValueException(Traceback traceback, LuaValue value) : LuaRuntimeException(traceback, value.ToString())
-{
-    public LuaValue Value { get; } = value;
-}
+public class LuaModuleNotFoundException(string moduleName) : LuaException($"module '{moduleName}' not found");

+ 1 - 3
src/Lua/LuaCoroutine.cs

@@ -191,9 +191,7 @@ public sealed class LuaCoroutine : LuaThread, IValueTaskSource<LuaCoroutine.Yiel
 
                     Volatile.Write(ref status, (byte)LuaThreadStatus.Dead);
                     buffer.Span[0] = false;
-                    buffer.Span[1] = ex is LuaRuntimeLuaValueException luaValueException
-                        ? luaValueException.Value
-                        : ex.Message;
+                    buffer.Span[1] = ex is LuaRuntimeException { ErrorObject: not null } luaEx ? luaEx.ErrorObject.Value: ex.Message;
                     return 2;
                 }
                 else

+ 1 - 1
src/Lua/Runtime/LuaVirtualMachine.cs

@@ -960,7 +960,7 @@ public static partial class LuaVirtualMachine
             LuaValueArrayPool.Return1024(context.ResultsBuffer, true);
             if (e is not LuaRuntimeException)
             {
-                var newException = new LuaRuntimeCSharpException(GetTracebacks(ref context), e);
+                var newException = new LuaRuntimeException(GetTracebacks(ref context), e);
                 context = default;
                 throw newException;
             }

+ 11 - 11
src/Lua/Standard/BasicLibrary.cs

@@ -106,7 +106,7 @@ public sealed class BasicLibrary
             ? "(error object is a nil value)"
             : context.Arguments[0];
 
-        throw new LuaRuntimeLuaValueException(context.State.GetTraceback(), value);
+        throw new LuaRuntimeException(context.State.GetTraceback(), value);
     }
 
     public ValueTask<int> GetMetatable(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
@@ -156,7 +156,7 @@ public sealed class BasicLibrary
         buffer.Span[2] = 0;
         return new(3);
     }
-    
+
     public async ValueTask<int> LoadFile(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
         // Lua-CSharp does not support binary chunks, the mode argument is ignored.
@@ -240,7 +240,7 @@ public sealed class BasicLibrary
             return new(1);
         }
     }
-    
+
     public ValueTask<int> Pairs(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
         var arg0 = context.GetArgument<LuaTable>(0);
@@ -285,9 +285,9 @@ public sealed class BasicLibrary
         catch (Exception ex)
         {
             buffer.Span[0] = false;
-            if(ex is LuaRuntimeLuaValueException luaEx)
+            if (ex is LuaRuntimeException { ErrorObject: not null } luaEx)
             {
-                buffer.Span[1] = luaEx.Value;
+                buffer.Span[1] = luaEx.ErrorObject.Value;
             }
             else
             {
@@ -360,7 +360,7 @@ public sealed class BasicLibrary
         arg0[arg1] = arg2;
         return new(0);
     }
-    
+
     public ValueTask<int> Select(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
         var arg0 = context.GetArgument(0);
@@ -398,7 +398,7 @@ public sealed class BasicLibrary
             return default;
         }
     }
-    
+
     public ValueTask<int> SetMetatable(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
         var arg0 = context.GetArgument<LuaTable>(0);
@@ -567,7 +567,7 @@ public sealed class BasicLibrary
         var arg0 = context.GetArgument(0);
         return arg0.CallToStringAsync(context, buffer, cancellationToken);
     }
-    
+
     public ValueTask<int> Type(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
         var arg0 = context.GetArgument(0);
@@ -613,8 +613,8 @@ public sealed class BasicLibrary
         catch (Exception ex)
         {
             methodBuffer.AsSpan().Clear();
-            var error = (ex is LuaRuntimeLuaValueException luaEx) ? luaEx.Value : ex.Message;
-            
+            var error = ex is LuaRuntimeException { ErrorObject: not null } luaEx ? luaEx.ErrorObject.Value : ex.Message;
+
             context.State.Push(error);
 
             // invoke error handler
@@ -627,7 +627,7 @@ public sealed class BasicLibrary
 
             buffer.Span[0] = false;
             buffer.Span[1] = methodBuffer[0];
-            
+
 
             return 2;
         }