Browse Source

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 years ago
parent
commit
9ec3f04dd9

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

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

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

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

+ 15 - 4
Jint/Engine.cs

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