예제 #1
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);
      var expression = Expression;
      var parent = expression as ParenExpression;
      if (parent != null)
        expression = parent.Expression;
      var indexer = expression as ReadIndexerExpression;
      if (indexer != null)
      {
        indexer.Container.Execute(ref result, ref callFrame, interpreter);
        var obj = result.AsDObject();
        indexer.Index.Execute(ref result, ref callFrame, interpreter);
        result.Set(Operations.Unary.DeleteProperty.Run(obj, ref result));
      }
      else
      {
        //we need to visit in case the expression has side effects, but then throw away result
        expression.Execute(ref result, ref callFrame, interpreter);

        var readId = expression as ReadIdentifierExpression;
        if (readId != null)
          result.Set(Operations.Unary.DeleteVariable.Run(interpreter.Context, readId.Symbol.FieldId));
        else
          result.Set(Operations.Unary.Delete.Run(ref result));
      }
      interpreter.PopLocation(this, ref result);
    }
예제 #2
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   var catchSymbol = Identifier.Symbol;
   Debug.Assert(catchSymbol.SymbolType == JSSymbol.SymbolTypes.Local, "catch symbol must be local, nothing else is supported at this time");
   interpreter.SymbolValues[catchSymbol.ValueIndex] = result;
   Statement.Execute(ref result, ref callFrame, interpreter);
   //catchSymbol.SymbolType = JSSymbol.SymbolTypes.Unknown;
   interpreter.PopLocation(this, ref result);
 }
예제 #3
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   result.Set(Value);
   interpreter.PopLocation(this, ref result);
 }
예제 #4
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   if (Expression != null)
   {
     Expression.Execute(ref result, ref callFrame, interpreter);
     callFrame.Return = result;
   }
   interpreter.SetCompletion(Interpreter.CompletionTypes.Return, null);
   interpreter.PopLocation(this, ref result);
 }
예제 #5
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Expression.Execute(ref result, ref callFrame, interpreter);
   JSException.Throw(ref result);
   interpreter.PopLocation(this, ref result);
 }
예제 #6
0
    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);
    }
예제 #7
0
    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);
    }
예제 #8
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Value.Execute(ref result, ref callFrame, interpreter);
   interpreter.WriteSymbol(Symbol, ref result, ref callFrame);
   interpreter.PopLocation(this, ref result);
 }
예제 #9
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);

      Container.Execute(ref result, ref callFrame, interpreter);
      var obj = result.AsDObject();
      var index = new mdr.DValue();
      Index.Execute(ref index, ref callFrame, interpreter);
      Value.Execute(ref result, ref callFrame, interpreter);
      obj.SetField(ref index, ref result);

      //interpreter.PopLocation(this, ref result, obj);
      interpreter.PopLocation(this, ref result);
    }
예제 #10
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Left.Execute(ref result, ref callFrame, interpreter);
   if (result.AsBoolean())
     Middle.Execute(ref result, ref callFrame, interpreter);
   else
     Right.Execute(ref result, ref callFrame, interpreter);
   interpreter.PopLocation(this, ref result);
 }
예제 #11
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      var temp = interpreter.Declare(this);
      if (temp.Node == null)
      {
        //This is the very first visit
        //We need to regenerate results
        temp.Node = this;

        interpreter.PushLocation(this);
        Value.Execute(ref result, ref callFrame, interpreter);
        temp.Value = result;
        interpreter.PopLocation(this, ref result);
      }
      else
        result = temp.Value;
    }
예제 #12
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   var tmp = new mdr.DValue();
   Left.Execute(ref result, ref callFrame, interpreter);
   Right.Execute(ref tmp, ref callFrame, interpreter);
   result.Set(Operations.Binary.BitwiseXor.Run(ref result, ref tmp));
   interpreter.PopLocation(this, ref result);
 }
예제 #13
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Expression.Execute(ref result, ref callFrame, interpreter);
   result.Set(Operations.Unary.LogicalNot.Run(ref result));
   interpreter.PopLocation(this, ref result);
 }
예제 #14
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Expression.Execute(ref result, ref callFrame, interpreter);
   result.SetUndefined();
   interpreter.PopLocation(this, ref result);
 }
예제 #15
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   if (Initialization != null)
     Initialization.Execute(ref result, ref callFrame, interpreter);
   interpreter.PopLocation(this, ref result);
 }
예제 #16
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);

      Container.Execute(ref result, ref callFrame, interpreter);
      var obj = result.AsDObject();
      AssignFieldId();
      Value.Execute(ref result, ref callFrame, interpreter);
      obj.SetFieldByFieldId(FieldId, ref result);

      //interpreter.PopLocation(this, ref result, obj);
      interpreter.PopLocation(this, ref result);
    }
예제 #17
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);

      Condition.Execute(ref result, ref callFrame, interpreter);
      if (result.AsBoolean())
        Then.Execute(ref result, ref callFrame, interpreter);
      else if (Else != null)
        Else.Execute(ref result, ref callFrame, interpreter);

      interpreter.PopLocation(this, ref result);
    }
예제 #18
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);

      var tmpCallFrame = new mdr.CallFrame();

      Function.Execute(ref result, ref callFrame, interpreter);

      interpreter.LoadArguments(this.Arguments, ref tmpCallFrame, ref callFrame);

      tmpCallFrame.Function = result.AsDFunction();
      
      JSRuntime.StopTimer(interpreter.Timer);
      tmpCallFrame.Function.Construct(ref tmpCallFrame);
      JSRuntime.StartTimer(interpreter.Timer);
      result.Set(tmpCallFrame.This);

      interpreter.PopLocation(this, tmpCallFrame.Function);
    }
예제 #19
0
    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);
    }
예제 #20
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);

      var tmpCallFrame = new mdr.CallFrame();

      Function.Execute(ref result, ref callFrame, interpreter);

      if (ThisArg != null)
      {
        var thisValue = new mdr.DValue();
        ThisArg.Execute(ref thisValue, ref callFrame, interpreter);
        tmpCallFrame.This = thisValue.AsDObject();
      }
      else if (IsDirectEvalCall)
      {
        tmpCallFrame.CallerFunction = callFrame.Function;
        tmpCallFrame.CallerContext = interpreter.Context;
        tmpCallFrame.This = callFrame.This;
      }
      else
      {
        tmpCallFrame.This = mdr.Runtime.Instance.GlobalContext;
      }

      interpreter.LoadArguments(this.Arguments, ref tmpCallFrame, ref callFrame);

      tmpCallFrame.Function = result.AsDFunction();
      JSRuntime.StopTimer(interpreter.Timer);
      tmpCallFrame.Function.Call(ref tmpCallFrame);
      JSRuntime.StartTimer(interpreter.Timer);
      result = tmpCallFrame.Return;

      interpreter.PopLocation(this, tmpCallFrame.Function);
    }
예제 #21
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   interpreter.SetCompletion(Interpreter.CompletionTypes.Break, Target);
   interpreter.PopLocation(this, ref result);
 }
예제 #22
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   var func = new mdr.DFunction(
     ((JSFunctionMetadata)callFrame.Function.Metadata).SubFunctions[Metadata.FuncDefinitionIndex]
     , interpreter.Context);
   result.Set(func);
   interpreter.PopLocation(this, ref result);
 }
예제 #23
0
    public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
    {
      interpreter.PushLocation(this);

      interpreter.PushTarget(this);
      var i = 0;
      for (; i < CaseClauses.Count; ++i)
      {
        var caseClause = CaseClauses[i];
        if (caseClause.IsDefault)
          break;
        caseClause.Comparison.Execute(ref result, ref callFrame, interpreter);
        if (result.AsBoolean())
          break;
      }
      for (; i < CaseClauses.Count && interpreter.CompletionType == Interpreter.CompletionTypes.Normal; ++i)
      {
        var caseClause = CaseClauses[i];
        caseClause.Execute(ref result, ref callFrame, interpreter);
      }
      interpreter.PopTarget(this);

      interpreter.PopLocation(this, ref result);
    }
예제 #24
0
 public partial class Node { public virtual void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter) { throw new NotImplementedException(); } }
예제 #25
0
 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);
 }
예제 #26
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   for (var i = 0; i < Statements.Count; ++i)
   {
     Statements[i].Execute(ref result, ref callFrame, interpreter);
     if (interpreter.CompletionType != Interpreter.CompletionTypes.Normal)
       break;
   }
   interpreter.PopLocation(this, ref result);
 }
예제 #27
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Statement.Execute(ref result, ref callFrame, interpreter);
   interpreter.PopLocation(this, ref result);
 }
예제 #28
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   for (var i = 0; i < Declarations.Count; ++i)
     Declarations[i].Execute(ref result, ref callFrame, interpreter);
   interpreter.PopLocation(this, ref result);
 }
예제 #29
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   result.Set(new mdr.DRegExp(Regexp, Options));
   interpreter.PopLocation(this, ref result);
 }
예제 #30
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   Expression.Execute(ref result, ref callFrame, interpreter);
   var obj = Operations.Convert.ToObject.Run(ref result);
   result.Set(obj.ToDFunction());
   interpreter.PopLocation(this, ref result);
 }