Browse Source

Store identifier in local (#1565)

Co-authored-by: TechPizza <[email protected]>
TechPizza 2 years ago
parent
commit
75b2d703e6

+ 5 - 4
Jint/Runtime/Interpreter/Expressions/JintAssignmentExpression.cs

@@ -398,12 +398,13 @@ namespace Jint.Runtime.Interpreter.Expressions
                 var engine = context.Engine;
                 var env = engine.ExecutionContext.LexicalEnvironment;
                 var strict = StrictModeScope.IsStrictModeCode;
+                var identifier = left.Identifier;
                 if (JintEnvironment.TryGetIdentifierEnvironmentWithBinding(
                     env,
-                    left.Identifier,
+                    identifier,
                     out var environmentRecord))
                 {
-                    if (strict && hasEvalOrArguments && left.Identifier.Key != KnownKeys.Eval)
+                    if (strict && hasEvalOrArguments && identifier.Key != KnownKeys.Eval)
                     {
                         ExceptionHelper.ThrowSyntaxError(engine.Realm, "Invalid assignment target");
                     }
@@ -418,10 +419,10 @@ namespace Jint.Runtime.Interpreter.Expressions
 
                     if (right._expression.IsFunctionDefinition())
                     {
-                        ((FunctionInstance) rval).SetFunctionName(left.Identifier.Value);
+                        ((FunctionInstance) rval).SetFunctionName(identifier.Value);
                     }
 
-                    environmentRecord.SetMutableBinding(left.Identifier, rval, strict);
+                    environmentRecord.SetMutableBinding(identifier, rval, strict);
                     return rval;
                 }
 

+ 8 - 6
Jint/Runtime/Interpreter/Expressions/JintIdentifierExpression.cs

@@ -25,11 +25,12 @@ internal sealed class JintIdentifierExpression : JintExpression
         var engine = context.Engine;
         var env = engine.ExecutionContext.LexicalEnvironment;
         var strict = StrictModeScope.IsStrictModeCode;
-        var identifierEnvironment = JintEnvironment.TryGetIdentifierEnvironmentWithBinding(env, Identifier, out var temp)
+        var identifier = Identifier;
+        var identifierEnvironment = JintEnvironment.TryGetIdentifierEnvironmentWithBinding(env, identifier, out var temp)
             ? temp
             : JsValue.Undefined;
 
-        return engine._referencePool.Rent(identifierEnvironment, Identifier.Value, strict, thisValue: null);
+        return engine._referencePool.Rent(identifierEnvironment, identifier.Value, strict, thisValue: null);
     }
 
     public override JsValue GetValue(EvaluationContext context)
@@ -37,9 +38,10 @@ internal sealed class JintIdentifierExpression : JintExpression
         // need to notify correct node when taking shortcut
         context.LastSyntaxElement = _expression;
 
-        if (Identifier.CalculatedValue is not null)
+        var identifier = Identifier;
+        if (identifier.CalculatedValue is not null)
         {
-            return Identifier.CalculatedValue;
+            return identifier.CalculatedValue;
         }
 
         var strict = StrictModeScope.IsStrictModeCode;
@@ -48,7 +50,7 @@ internal sealed class JintIdentifierExpression : JintExpression
 
         if (JintEnvironment.TryGetIdentifierEnvironmentWithBindingValue(
                 env,
-                Identifier,
+                identifier,
                 strict,
                 out _,
                 out var value))
@@ -60,7 +62,7 @@ internal sealed class JintIdentifierExpression : JintExpression
         }
         else
         {
-            var reference = engine._referencePool.Rent(JsValue.Undefined, Identifier.Value, strict, thisValue: null);
+            var reference = engine._referencePool.Rent(JsValue.Undefined, identifier.Value, strict, thisValue: null);
             value = engine.GetValue(reference, true);
         }
 

+ 3 - 2
Jint/Runtime/Interpreter/Expressions/JintMemberExpression.cs

@@ -53,12 +53,13 @@ namespace Jint.Runtime.Interpreter.Expressions
             var engine = context.Engine;
             if (_objectExpression is JintIdentifierExpression identifierExpression)
             {
-                baseReferenceName = identifierExpression.Identifier.Key.Name;
+                var identifier = identifierExpression.Identifier;
+                baseReferenceName = identifier.Key.Name;
                 var strict = isStrictModeCode;
                 var env = engine.ExecutionContext.LexicalEnvironment;
                 JintEnvironment.TryGetIdentifierEnvironmentWithBindingValue(
                     env,
-                    identifierExpression.Identifier,
+                    identifier,
                     strict,
                     out _,
                     out baseValue);