Browse Source

don't use Esprima's AST to cache call expression data (#668)

Marko Lahma 5 years ago
parent
commit
dc884808d7
1 changed files with 9 additions and 6 deletions
  1. 9 6
      Jint/Runtime/Interpreter/Expressions/JintCallExpression.cs

+ 9 - 6
Jint/Runtime/Interpreter/Expressions/JintCallExpression.cs

@@ -12,6 +12,9 @@ namespace Jint.Runtime.Interpreter.Expressions
         private readonly bool _isDebugMode;
         private readonly int _maxRecursionDepth;
 
+        private CachedArgumentsHolder _cachedArguments;
+        private bool _cached;
+
         private readonly JintExpression _calleeExpression;
         private bool _hasSpreads;
 
@@ -55,7 +58,7 @@ namespace Jint.Runtime.Interpreter.Expressions
 
             if (cacheable)
             {
-                expression.Cached = true;
+                _cached = true;
                 var arguments = ArrayExt.Empty<JsValue>();
                 if (cachedArgumentsHolder.JintArguments.Length > 0)
                 {
@@ -66,7 +69,7 @@ namespace Jint.Runtime.Interpreter.Expressions
                 cachedArgumentsHolder.CachedArguments = arguments;
             }
 
-            expression.CachedArguments = cachedArgumentsHolder;
+            _cachedArguments = cachedArgumentsHolder;
         }
 
         protected override object EvaluateInternal()
@@ -81,9 +84,9 @@ namespace Jint.Runtime.Interpreter.Expressions
 
             // todo: implement as in http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.4
 
-            var cachedArguments = (CachedArgumentsHolder) expression.CachedArguments;
+            var cachedArguments = _cachedArguments;
             var arguments = ArrayExt.Empty<JsValue>();
-            if (expression.Cached)
+            if (_cached)
             {
                 arguments = cachedArguments.CachedArguments;
             }
@@ -174,7 +177,7 @@ namespace Jint.Runtime.Interpreter.Expressions
                 _engine.CallStack.Pop();
             }
 
-            if (!expression.Cached && arguments.Length > 0)
+            if (!_cached && arguments.Length > 0)
             {
                 _engine._jsValueArrayPool.ReturnArray(arguments);
             }
@@ -183,7 +186,7 @@ namespace Jint.Runtime.Interpreter.Expressions
             return result;
         }
 
-        internal class CachedArgumentsHolder
+        private class CachedArgumentsHolder
         {
             internal JintExpression[] JintArguments;
             internal JsValue[] CachedArguments;