ソースを参照

Fix error stack handling when last syntax node is not present (#1322)

Marko Lahma 2 年 前
コミット
3bd75e1b0c
2 ファイル変更32 行追加7 行削除
  1. 19 1
      Jint.Tests/Runtime/ErrorTests.cs
  2. 13 6
      Jint/Native/Error/ErrorConstructor.cs

+ 19 - 1
Jint.Tests/Runtime/ErrorTests.cs

@@ -1,4 +1,6 @@
-using Esprima;
+using System.Reflection;
+using Esprima;
+using Jint.Native;
 using Jint.Runtime;
 using Jint.Runtime;
 using Jint.Tests.Runtime.TestClasses;
 using Jint.Tests.Runtime.TestClasses;
 
 
@@ -441,6 +443,22 @@ $variable1 + -variable2 - variable3;");
             Assert.Equal("   at <anonymous>:5:15", e.JavaScriptStackTrace);
             Assert.Equal("   at <anonymous>:5:15", e.JavaScriptStackTrace);
         }
         }
 
 
+        [Fact]
+        public void InvokingDelegateShouldContainJavascriptExceptionAsInnerException()
+        {
+            Delegate func = null;
+            void SetFuncValue(Delegate scriptFunc) => func = scriptFunc;
+
+            var engine = new Engine();
+            engine.SetValue("SetFuncValue", SetFuncValue);
+            engine.Execute("SetFuncValue(() => { foo.bar });");
+
+            var ex = Assert.Throws<TargetInvocationException>(() => func?.DynamicInvoke(JsValue.Undefined, Array.Empty<JsValue>()));
+
+            var exception = Assert.IsType<JavaScriptException>(ex.InnerException);
+            Assert.Equal("foo is not defined", exception.Message);
+        }
+
         private static void EqualIgnoringNewLineDifferences(string expected, string actual)
         private static void EqualIgnoringNewLineDifferences(string expected, string actual)
         {
         {
             expected = expected.Replace("\r\n", "\n");
             expected = expected.Replace("\r\n", "\n");

+ 13 - 6
Jint/Native/Error/ErrorConstructor.cs

@@ -57,20 +57,27 @@ namespace Jint.Native.Error
             }
             }
 
 
             var stackString = BuildStackString();
             var stackString = BuildStackString();
-            var stackDesc = new PropertyDescriptor(stackString, PropertyFlag.NonEnumerable);
-            o.DefinePropertyOrThrow(CommonProperties.Stack, stackDesc);
+            if (stackString is not null)
+            {
+                var stackDesc = new PropertyDescriptor(stackString, PropertyFlag.NonEnumerable);
+                o.DefinePropertyOrThrow(CommonProperties.Stack, stackDesc);
+            }
 
 
             var options = arguments.At(1);
             var options = arguments.At(1);
-
-            o.InstallErrorCause(options);
+            if (!options.IsUndefined())
+            {
+                o.InstallErrorCause(options);
+            }
 
 
             return o;
             return o;
 
 
-            JsValue BuildStackString()
+            JsValue? BuildStackString()
             {
             {
                 var lastSyntaxNode = _engine.GetLastSyntaxElement();
                 var lastSyntaxNode = _engine.GetLastSyntaxElement();
                 if (lastSyntaxNode == null)
                 if (lastSyntaxNode == null)
-                    return Undefined;
+                {
+                    return null;
+                }
 
 
                 var callStack = _engine.CallStack;
                 var callStack = _engine.CallStack;
                 var currentFunction = callStack.TryPeek(out var element) ? element.Function : null;
                 var currentFunction = callStack.TryPeek(out var element) ? element.Function : null;