Example #1
0
 // i0 ? i1 : i2
 public static void Run(ref mdr.DValue i0, ref mdr.DValue i1, ref mdr.DValue i2, ref mdr.DValue result)
 {
     if (Operations.Convert.ToBoolean.Run(ref i0))
         result.Set(ref i1);
     else
         result.Set(ref i2);
 }
Example #2
0
        internal static void EvalString(string inputString, ref mdr.DValue result, mdr.DFunction callerFunction = null, mdr.DObject callerContext = null, mdr.DObject thisArg = null)
        {
          var funcMetadata = JSParser.ParseScript(inputString).Expression.Metadata;
          var func = new mdr.DFunction(funcMetadata, null);

          var tempCallFrame = new mdr.CallFrame();
          bool isDirectEval = callerContext != null;

          if (isDirectEval)
          {
            //function will behave as if it was the caller
            Debug.Assert(thisArg != null && callerFunction != null && callerContext != null, "Invalid situation! Direct eval call must have thisArg, callerFunction, callerContext set");
            funcMetadata.Scope.IsProgram = false;
            funcMetadata.Scope.IsEvalFunction = true;
            funcMetadata.ParentFunction = (JSFunctionMetadata)callerFunction.Metadata;
            tempCallFrame.CallerContext = callerContext;
            tempCallFrame.This = thisArg;
          }
          else
          {
            //This will behave just like a program code
            tempCallFrame.CallerContext = mdr.Runtime.Instance.GlobalContext;
            tempCallFrame.This = (mdr.Runtime.Instance.GlobalContext);
          }

          //TODO: find a way to assign a name to this
          //funcMetadata.Name += "_eval"; //After we know the ParentFunction

          tempCallFrame.Function = func;
          tempCallFrame.Signature = mdr.DFunctionSignature.EmptySignature;
          func.Call(ref tempCallFrame);
          result.Set(ref tempCallFrame.Return);
        }
Example #3
0
 public static void Run(ref mdr.DValue i0, int i1)
 {
     switch (i0.ValueType)
     {
         case mdr.ValueTypes.Double:
             {
                 double oldValue = i0.DoubleValue;
                 double newValue = oldValue + i1;
                 i0.DoubleValue = newValue;
                 //i0.Set(newValue);
                 break;
             }
         case mdr.ValueTypes.Int32:
             {
                 int oldValue = i0.IntValue;
                 int newValue = oldValue + i1;
                 i0.IntValue = newValue;
                 //i0.Set(newValue);
                 break;
             }
         case mdr.ValueTypes.Boolean:
             {
                 int oldValue = i0.BooleanValue ? 1 : 0;
                 int newValue = oldValue + i1;
                 i0.Set(newValue);
                 break;
             }
         default:
             {
                 double oldValue = i0.AsDouble();
                 double newValue = oldValue + i1;
                 i0.Set(newValue);
                 break;
             }
     }
 }
Example #4
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);
 }
Example #5
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);
 }
Example #6
0
 public static void Run(mdr.DArray i0, ref mdr.DValue result) { result.Set(i0); }
Example #7
0
 public static void Run(ulong i0, ref mdr.DValue result) { result.Set(i0); }
Example #8
0
 public static void Run(mdr.DUndefined i0, ref mdr.DValue result) { result.Set(i0); }
Example #9
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);
 }
Example #10
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);
    }
Example #11
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);
 }
Example #12
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);
   if (mdr.Runtime.Instance.Configuration.ProfileStats)
   {
     mdr.Runtime.Instance.Counters.GetCounter("ToObject").Count++;
     string toObjectCounterName = "ToObject_" + result.ValueType;
     mdr.Runtime.Instance.Counters.GetCounter(toObjectCounterName).Count++;
   }
   result.Set(Operations.Convert.ToObject.Run(ref result));
   interpreter.PopLocation(this, ref result);
 }
Example #13
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   var obj = new mdr.DObject();
   for (var i = 0; i < Properties.Count; ++i)
   {
     var prop = Properties[i];
     prop.Execute(ref result, ref callFrame, interpreter);
     obj.DefineOwnProperty(prop.Name, ref result, mdr.PropertyDescriptor.Attributes.Data);
   }
   result.Set(obj);
   interpreter.PopLocation(this, ref result);
 }
Example #14
0
 public override void Execute(ref mdr.DValue result, ref mdr.CallFrame callFrame, Interpreter interpreter)
 {
   interpreter.PushLocation(this);
   var array = new mdr.DArray(Items.Count);
   for (var i = 0; i < Items.Count; ++i)
     Items[i].Execute(ref array.Elements[i], ref callFrame, interpreter);
   result.Set(array);
   interpreter.PopLocation(this, ref result);
 }
Example #15
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);
 }
Example #16
0
 public static void Run(/*const*/ ref mdr.DValue i0, ref mdr.DValue result) { result.Set(ref i0); }
Example #17
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);
    }
Example #18
0
 public static void Run(double i0, ref mdr.DValue result) { result.Set(i0); }
Example #19
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);
 }
Example #20
0
 public static void Run(mdr.DFunction i0, ref mdr.DValue result) { result.Set(i0); }
Example #21
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);
    }
Example #22
0
 public static void Run(object i0, ref mdr.DValue result) { result.Set(i0); }
Example #23
0
        //public static mdr.DValue IncDec(ref mdr.DValue i0, int i1)
        //{
        //    var result = new mdr.DValue();
        //    switch (i0.ValueType)
        //    {
        //        case mdr.ValueTypes.Int:
        //            {
        //                int oldValue = i0.IntValue;
        //                int newValue = oldValue + i1;
        //                result.Set(newValue);
        //                break;
        //            }
        //        case mdr.ValueTypes.Boolean:
        //            {
        //                int oldValue = i0.BoolValue ? 1 : 0;
        //                int newValue = oldValue + i1;
        //                result.Set(newValue);
        //                break;
        //            }
        //        default:
        //            {
        //                double oldValue = i0.ToDouble();
        //                double newValue = oldValue + i1;
        //                result.Set(newValue);
        //                break;
        //            }
        //    }
        //    return result;
        //}

        /// <summary>
        /// The following is used for inc/dec that involves DValue. To handle arrays and properties well, we will have a separate object for 
        /// reading the value, and another for setting. To make the inc/dec and assign, etc. uniform, we should consider that on the stack 
        /// we have all the paramertes always for all kinds of values (symbols, arrays, properties, ...)
        /// 
        /// followings:
        ///     dest for writing
        ///     DObject  for setting (for array/property will be a member of the object itself)
        ///     DObject  for reading (for array/property may be a member of the object's prototype)
        /// </summary>
        /// <param name="result">for returing the value that is used in the next instruction.</param>
        /// <param name="dest">For updating the source itself</param>
        /// <param name="i0">the source for reading the value</param>
        /// <param name="i1">1 for inc and -1 for dec</param>
        /// <param name="isPostfix"></param>
        /// <returns></returns>
        public static void AddConst(ref mdr.DValue dest, /*const*/ ref mdr.DValue i0, int i1, bool isPostfix, ref mdr.DValue result)
        {
            switch (i0.ValueType)
            {
                case mdr.ValueTypes.Int32:
                    {
                        int oldValue = i0.IntValue;
                        int newValue = oldValue + i1;
                        dest.Set(newValue);
                        result.Set(isPostfix ? oldValue : newValue);
                        break;
                    }
                case mdr.ValueTypes.Boolean:
                    {
                        int oldValue = i0.BooleanValue ? 1 : 0;
                        int newValue = oldValue + i1;
                        dest.Set(newValue);
                        result.Set(isPostfix ? oldValue : newValue);
                        break;
                    }
                default:
                    {
                        double oldValue = i0.AsDouble();
                        double newValue = oldValue + i1;
                        dest.Set(newValue);
                        result.Set(isPostfix ? oldValue : newValue);
                        break;
                    }
            }
        }