public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter) { interpreter.PushLocation(this); var count = interpreter.GetTemporaryCount(); try { Statement.Execute(ref result, ref callFrame, interpreter); } catch (JSException e) { if (Catch != null) Catch.Execute(ref e.Value, ref callFrame, interpreter); else throw; } finally { if (Finally != null) Finally.Execute(ref result, ref callFrame, interpreter); interpreter.ReleaseTemporariesAfter(count); } //if (Catch != null) //{ // if (Finally != null) // { // try // { // Statement.Execute(ref result, ref callFrame, interpreter); // } // catch (JSException e) // { // Catch.Execute(ref e.Value, ref callFrame, interpreter); // } // finally // { // Finally.Execute(ref result, ref callFrame, interpreter); // } // } // else // { // try // { // Statement.Execute(ref result, ref callFrame, interpreter); // } // catch (JSException e) // { // Catch.Execute(ref e.Value, ref callFrame, interpreter); // } // } //} //else //{ // try // { // Statement.Execute(ref result, ref callFrame, interpreter); // } // finally // { // Finally.Execute(ref result, ref callFrame, interpreter); // } //} interpreter.PopLocation(this, ref result); }
public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter) { interpreter.PushLocation(this); interpreter.PushTarget(this); if (Initialization != null) Initialization.Execute(ref result, ref callFrame, interpreter); var tempCount = interpreter.GetTemporaryCount(); //int backedgeCount = 0; while (true) { if (Condition != null) { Condition.Execute(ref result, ref callFrame, interpreter); if (!result.AsBoolean()) break; } //backedgeCount++; Body.Execute(ref result, ref callFrame, interpreter); if (interpreter.CompletionType == Interpreter.CompletionTypes.Continue && interpreter.CompletionTargetStatement == this) interpreter.SetCompletion(Interpreter.CompletionTypes.Normal, null); else if (interpreter.CompletionType != Interpreter.CompletionTypes.Normal) break; if (Increment != null) Increment.Execute(ref result, ref callFrame, interpreter); interpreter.ReleaseTemporariesAfter(tempCount); } interpreter.PopTarget(this); //interpreter.IncrementBackedgeCount(backedgeCount); interpreter.PopLocation(this, ref result); }
public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter) { ///We try to do as much here as possible to avoid reaching the InternalCall and InternalNew ///See NodeFactory.MakeForEachInStatement to understand the logic interpreter.PushLocation(this); Expression.Execute(ref result, ref callFrame, interpreter); var iterator = new JSPropertyNameEnumerator(result.AsDObject()); Debug.Assert( ExtendedBody.Statements.Count == 2 && ExtendedBody.Statements[0] is ExpressionStatement , "Invalid situation! We must have a ExpressionStatement here!"); var assignToLeft = (ExtendedBody.Statements[0] as ExpressionStatement).Expression; interpreter.PushTarget(this); var tempCount = interpreter.GetTemporaryCount(); //int backedgeCount = 0; while (iterator.MoveNext()) { var writeId = assignToLeft as WriteIdentifierExpression; if (writeId != null) { result.Set(iterator.GetCurrent()); interpreter.WriteSymbol(writeId.Symbol, ref result, ref callFrame); } else { //This is an unlikely case anyways! var writeIndex = assignToLeft as WriteIndexerExpression; Debug.Assert(writeIndex != null, "Invalid situation! We must have a WriteIndexerExpression here!"); writeIndex.Container.Execute(ref result, ref callFrame, interpreter); var obj = result.AsDObject(); writeIndex.Index.Execute(ref result, ref callFrame, interpreter); obj.SetField(ref result, iterator.GetCurrent()); } //backedgeCount++; OriginalBody.Execute(ref result, ref callFrame, interpreter); if (interpreter.CompletionType == Interpreter.CompletionTypes.Continue && interpreter.CompletionTargetStatement == this) interpreter.SetCompletion(Interpreter.CompletionTypes.Normal, null); else if (interpreter.CompletionType != Interpreter.CompletionTypes.Normal) break; interpreter.ReleaseTemporariesAfter(tempCount); } interpreter.PopTarget(this); //interpreter.IncrementBackedgeCount(backedgeCount); interpreter.PopLocation(this, ref result); }
public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter) { interpreter.PushLocation(this); interpreter.PushTarget(this); var tempCount = interpreter.GetTemporaryCount(); //int backedgeCount = -1; do { //if (JSRuntime.Instance.Configuration.EnableProfiling) //backedgeCount++; Body.Execute(ref result, ref callFrame, interpreter); if (interpreter.CompletionType == Interpreter.CompletionTypes.Continue && interpreter.CompletionTargetStatement == this) interpreter.SetCompletion(Interpreter.CompletionTypes.Normal, null); else if (interpreter.CompletionType != Interpreter.CompletionTypes.Normal) break; Condition.Execute(ref result, ref callFrame, interpreter); interpreter.ReleaseTemporariesAfter(tempCount); } while (result.AsBoolean()); interpreter.PopTarget(this); //interpreter.IncrementBackedgeCount(backedgeCount); interpreter.PopLocation(this, ref result); }