Jelajahi Sumber

#451 cache literals (#513)

Marko Lahma 7 tahun lalu
induk
melakukan
14c6554342
3 mengubah file dengan 16 tambahan dan 12 penghapusan
  1. 0 0
      Jint.Benchmark/ArrayBenchmark.cs
  2. 1 1
      Jint/Jint.csproj
  3. 15 11
      Jint/Runtime/ExpressionIntepreter.cs

File diff ditekan karena terlalu besar
+ 0 - 0
Jint.Benchmark/ArrayBenchmark.cs


+ 1 - 1
Jint/Jint.csproj

@@ -7,6 +7,6 @@
     <LangVersion>latest</LangVersion>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="Esprima" Version="1.0.0-beta-1026" />
+    <PackageReference Include="Esprima" Version="1.0.0-beta-1036" />
   </ItemGroup>
 </Project>

+ 15 - 11
Jint/Runtime/ExpressionIntepreter.cs

@@ -642,23 +642,27 @@ namespace Jint.Runtime
             switch (literal.TokenType)
             {
                 case TokenType.BooleanLiteral:
-                    return literal.BooleanValue ? JsBoolean.True : JsBoolean.False;
+                    // bool is fast enough
+                    return (JsValue) (literal.CachedValue = literal.CachedValue ?? (literal.NumericValue != 0.0 ? JsBoolean.True : JsBoolean.False));
+                
                 case TokenType.NullLiteral:
+                    // and so is null
                     return JsValue.Null;
+
                 case TokenType.NumericLiteral:
-                    // implicit conversion operator goes through caching
-                    return literal.NumericValue;
+                    return (JsValue) (literal.CachedValue = literal.CachedValue ?? JsNumber.Create(literal.NumericValue));
+                
                 case TokenType.StringLiteral:
-                    // implicit conversion operator goes through caching
-                    return literal.StringValue;
-            }
+                    return (JsValue) (literal.CachedValue = literal.CachedValue ?? (literal.CachedValue = JsString.Create((string) literal.Value)));
+                
+                case TokenType.RegularExpression:
+                    // should not cache
+                    return _engine.RegExp.Construct((System.Text.RegularExpressions.Regex) literal.Value, literal.Regex.Flags);
 
-            if (literal.RegexValue != null) //(literal.Type == Nodes.RegularExpressionLiteral)
-            {
-                return _engine.RegExp.Construct(literal.RegexValue, literal.Regex.Flags);
+                default:
+                    // a rare case, above types should cover all
+                    return JsValue.FromObject(_engine, literal.Value);
             }
-
-            return JsValue.FromObject(_engine, literal.Value);
         }
 
         public JsValue EvaluateObjectExpression(ObjectExpression objectExpression)

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini