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; }
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); }
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); 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); }
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); }
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); }
/// <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); }
/// <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); }