Selaa lähdekoodia

Add Engine.Advanced.StackTrace to get current stack trace string (#1712)

Marko Lahma 1 vuosi sitten
vanhempi
commit
24b45d6f85
2 muutettua tiedostoa jossa 66 lisäystä ja 0 poistoa
  1. 49 0
      Jint.Tests.PublicInterface/CallStackTests.cs
  2. 17 0
      Jint/Engine.Advanced.cs

+ 49 - 0
Jint.Tests.PublicInterface/CallStackTests.cs

@@ -0,0 +1,49 @@
+namespace Jint.Tests.PublicInterface;
+
+public class CallStackTests
+{
+    [Fact]
+    public void CanInjectTraceFunction()
+    {
+        var engine = new Engine();
+        Assert.Empty(engine.Advanced.StackTrace);
+
+        using var stringWriter = new StringWriter();
+        engine.SetValue("console", new Console(engine, stringWriter));
+        engine.Execute("function x() { console.trace(); }; function y() { x(); } y();");
+
+        const string Expected = """
+Trace
+   at trace <anonymous>:1:16
+   at x () <anonymous>:1:16
+   at y () <anonymous>:1:51
+   at <anonymous>:1:58
+
+""";
+
+        var actual = stringWriter.ToString();
+        Assert.Equal(Expected, actual);
+    }
+
+    private class Console
+    {
+        private readonly Engine _engine;
+        private readonly StringWriter _output;
+
+        public Console(Engine engine, StringWriter output)
+        {
+            _engine = engine;
+            _output = output;
+        }
+
+        public void Log(string message)
+        {
+            _output.WriteLine(message);
+        }
+
+        public void Trace()
+        {
+            _output.WriteLine($"Trace{Environment.NewLine}{_engine.Advanced.StackTrace}");
+        }
+    }
+}

+ 17 - 0
Jint/Engine.Advanced.cs

@@ -14,6 +14,23 @@ public class AdvancedOperations
         _engine = engine;
     }
 
+    /// <summary>
+    /// Gets current stack trace that is active in engine.
+    /// </summary>
+    public string StackTrace
+    {
+        get
+        {
+            var lastSyntaxElement = _engine._lastSyntaxElement;
+            if (lastSyntaxElement is null)
+            {
+                return string.Empty;
+            }
+
+            return _engine.CallStack.BuildCallStackString(lastSyntaxElement.Location);
+        }
+    }
+
     /// <summary>
     /// Forcefully processes the current task queues (micro and regular), this API may break and change behavior!
     /// </summary>