Browse Source

#451 optimize EvaluateMemberExpression static member access (#453)

Marko Lahma 7 years ago
parent
commit
c2f013df48
1 changed files with 9 additions and 7 deletions
  1. 9 7
      Jint/Runtime/ExpressionIntepreter.cs

+ 9 - 7
Jint/Runtime/ExpressionIntepreter.cs

@@ -747,19 +747,21 @@ namespace Jint.Runtime
         {
         {
             var baseReference = EvaluateExpression(memberExpression.Object);
             var baseReference = EvaluateExpression(memberExpression.Object);
             var baseValue = _engine.GetValue(baseReference);
             var baseValue = _engine.GetValue(baseReference);
-            Expression expression = memberExpression.Property;
-
 
 
+            string propertyNameString;
             if (!memberExpression.Computed) // index accessor ?
             if (!memberExpression.Computed) // index accessor ?
             {
             {
-                var name = memberExpression.Property.As<Identifier>().Name;
-                expression = new Literal(name, name);
+                // we can take fast path without querying the engine again
+                propertyNameString = memberExpression.Property.As<Identifier>().Name;
+            }
+            else
+            {
+                var propertyNameReference = EvaluateExpression(memberExpression.Property);
+                var propertyNameValue = _engine.GetValue(propertyNameReference);
+                propertyNameString = TypeConverter.ToString(propertyNameValue);
             }
             }
 
 
-            var propertyNameReference = EvaluateExpression(expression);
-            var propertyNameValue = _engine.GetValue(propertyNameReference);
             TypeConverter.CheckObjectCoercible(_engine, baseValue, memberExpression, baseReference);
             TypeConverter.CheckObjectCoercible(_engine, baseValue, memberExpression, baseReference);
-            var propertyNameString = TypeConverter.ToString(propertyNameValue);
 
 
             return new Reference(baseValue, propertyNameString, StrictModeScope.IsStrictModeCode);
             return new Reference(baseValue, propertyNameString, StrictModeScope.IsStrictModeCode);
         }
         }