Преглед изворни кода

Refactoring Execute() method

Returning Engine to chain with other calls. Use
GetCompletionValue() explicitly if the last evaluated
value needs to be returned.
Sebastien Ros пре 11 година
родитељ
комит
9ec3f04dd9

+ 4 - 4
Jint.Tests/Runtime/EngineTests.cs

@@ -45,7 +45,7 @@ namespace Jint.Tests.Runtime
         public void ShouldInterpretLiterals(object expected, string source)
         {
             var engine = new Engine();
-            var result = engine.Execute(source).ToObject();
+            var result = engine.Execute(source).GetCompletionValue().ToObject();
 
             Assert.Equal(expected, result);
         }
@@ -73,7 +73,7 @@ namespace Jint.Tests.Runtime
         public void ShouldInterpretBinaryExpression(object expected, string source)
         {
             var engine = new Engine();
-            var result = engine.Execute(source).ToObject();
+            var result = engine.Execute(source).GetCompletionValue().ToObject();
 
             Assert.Equal(expected, result);
         }
@@ -527,7 +527,7 @@ namespace Jint.Tests.Runtime
         public void OperatorsPrecedence(object expected, string source)
         {
             var engine = new Engine();
-            var result = engine.Execute(source).ToObject();
+            var result = engine.Execute(source).GetCompletionValue().ToObject();
 
             Assert.Equal(expected, result);
         }
@@ -553,7 +553,7 @@ namespace Jint.Tests.Runtime
         public void ShouldEvaluateParseInt(object expected, string source)
         {
             var engine = new Engine();
-            var result = engine.Execute(source).ToObject();
+            var result = engine.Execute(source).GetCompletionValue().ToObject();
 
             Assert.Equal(expected, result);
         }

+ 7 - 7
Jint.Tests/Runtime/InteropTests.cs

@@ -304,7 +304,7 @@ namespace Jint.Tests.Runtime
                 .SetValue("values", new[] { 1, 2, 3, 4, 5, 6 })
                 .Execute("values.filter(function(x){ return x % 2 == 0; })");
 
-            var parts = result.ToObject();
+            var parts = result.GetCompletionValue().ToObject();
 
             Assert.True(parts.GetType().IsArray);
             Assert.Equal(3, ((object[])parts).Length);
@@ -320,7 +320,7 @@ namespace Jint.Tests.Runtime
                 .SetValue("values", new List<object> { 1, 2, 3, 4, 5, 6 })
                 .Execute("values.filter(function(x){ return x % 2 == 0; })");
 
-            var parts = result.ToObject();
+            var parts = result.GetCompletionValue().ToObject();
 
             Assert.True(parts.GetType().IsArray);
             Assert.Equal(3, ((object[])parts).Length);
@@ -333,7 +333,7 @@ namespace Jint.Tests.Runtime
         public void ShouldConvertArrayInstanceToArray()
         {
             var result = _engine.Execute("'[email protected]'.split('@');");
-            var parts = result.ToObject();
+            var parts = result.GetCompletionValue().ToObject();
             
             Assert.True(parts.GetType().IsArray);
             Assert.Equal(2, ((object[])parts).Length);
@@ -345,7 +345,7 @@ namespace Jint.Tests.Runtime
         public void ShouldConvertBooleanInstanceToBool()
         {
             var result = _engine.Execute("new Boolean(true)");
-            var value = result.ToObject();
+            var value = result.GetCompletionValue().ToObject();
 
             Assert.Equal(typeof(bool), value.GetType());
             Assert.Equal(true, value);
@@ -355,7 +355,7 @@ namespace Jint.Tests.Runtime
         public void ShouldConvertDateInstanceToDateTime()
         {
             var result = _engine.Execute("new Date(0)");
-            var value = result.ToObject();
+            var value = result.GetCompletionValue().ToObject();
 
             Assert.Equal(typeof(DateTime), value.GetType());
             Assert.Equal(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), value);
@@ -365,7 +365,7 @@ namespace Jint.Tests.Runtime
         public void ShouldConvertNumberInstanceToDouble()
         {
             var result = _engine.Execute("new Number(10)");
-            var value = result.ToObject();
+            var value = result.GetCompletionValue().ToObject();
 
             Assert.Equal(typeof(double), value.GetType());
             Assert.Equal(10d, value);
@@ -375,7 +375,7 @@ namespace Jint.Tests.Runtime
         public void ShouldConvertStringInstanceToString()
         {
             var result = _engine.Execute("new String('foo')");
-            var value = result.ToObject();
+            var value = result.GetCompletionValue().ToObject();
 
             Assert.Equal(typeof(string), value.GetType());
             Assert.Equal("foo", value);

+ 1 - 0
Jint.Tests/Runtime/SamplesTests.cs

@@ -30,6 +30,7 @@ namespace Jint.Tests.Runtime
             var square = new Engine()
                 .SetValue("x", 3)
                 .Execute("x * x")
+                .GetCompletionValue()
                 .ToObject();
 
             Assert.Equal(9d, square);

+ 15 - 4
Jint/Engine.cs

@@ -30,8 +30,9 @@ namespace Jint
         private readonly ExpressionInterpreter _expressions;
         private readonly StatementInterpreter _statements;
         private readonly Stack<ExecutionContext> _executionContexts;
+        private JsValue _completionValue = JsValue.Undefined;
         private int _statementsCount;
-
+        
         public Engine() : this(null)
         {
         }
@@ -202,13 +203,13 @@ namespace Jint
             _statementsCount = 0;
         }
 
-        public JsValue Execute(string source)
+        public Engine Execute(string source)
         {
             var parser = new JavaScriptParser();
             return Execute(parser.Parse(source));
         }
 
-        public JsValue Execute(Program program)
+        public Engine Execute(Program program)
         {
             ResetStatementsCount();
 
@@ -222,8 +223,18 @@ namespace Jint
                     throw new JavaScriptException(result.GetValueOrDefault());
                 }
 
-                return GetValue(result.Value);
+                _completionValue = result.GetValueOrDefault();
             }
+
+            return this;
+        }
+
+        /// <summary>
+        /// Gets the last evaluated statement completion value
+        /// </summary>
+        public JsValue GetCompletionValue()
+        {
+            return _completionValue;
         }
 
         public Completion ExecuteStatement(Statement statement)