Example #1
0
        public static string ToString(ref mdr.DValue arg)
        {
          //TODO: it seems eventually, this is the right implementation, but for now, we use the special implementation
          //mdr.DValue output;
          //if (Operations.Internals.CallToStringProperty(Operations.Convert.ToObject.Run(ref arg), out output))
          //  return output.AsString();
          //else
          //  return Operations.Convert.ToString.Run(ref arg);

          string s;
          if (!mdr.ValueTypesHelper.IsObject(arg.ValueType))
          {
            s = Operations.Convert.ToString.Run(ref arg);
          }
          else
          {
            var argObj = arg.AsDObject(); //TODO: should we call ToObject(arg) here instead?!
            var toString = argObj.GetField("toString");
            if (toString.ValueType == mdr.ValueTypes.Function)
            {
              var cf = new mdr.CallFrame();
              cf.Function = toString.AsDFunction();
              cf.Signature = mdr.DFunctionSignature.EmptySignature;
              cf.This = argObj;
              cf.Arguments = null;
              cf.Function.Call(ref cf);
              s = Operations.Convert.ToString.Run(ref cf.Return);
            }
            else
            {
              s = arg.AsString();
            }
          }
          return s;
        }
Example #2
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);
    }
Example #3
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 #4
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);
    }
Example #5
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 #6
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();
      var pd = obj.GetPropertyDescriptorByFieldId(FieldId);
      obj.GetFieldByPD(pd, ref result);

      interpreter.PopLocation(this, obj, pd);
    }
Example #7
0
 /// <summary>
 /// if the toString property of the input is a callable, calls it and sets the result in the output
 /// </summary>
 /// <param name="input">input</param>
 /// <param name="output">The return value of toString property</param>
 /// <returns>true if toString is callable and returns a primitive value, otherwise return false</returns>
 public static bool CallToStringProperty(ref mdr.DValue input, out mdr.DValue output)
 {
   return CallToStringProperty(input.AsDObject(), out output);
 }
Example #8
0
 /// <summary>
 /// ECMA-262, 8.12.8: Implements [[DefaultValue]] for JS objects
 /// </summary>
 /// <param name="input"></param>
 /// <param name="output"></param>
 /// <param name="stringHint">Specifies whether the hint is string or number. Default is number.</param>
 public static void DefaultValue(ref mdr.DValue input, out mdr.DValue output, bool stringHint = false)
 {
   Debug.Assert(ValueTypesHelper.IsObject(input.ValueType));
   DefaultValue(input.AsDObject(), out output, stringHint);
 }