// 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); }
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); }
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; } } }
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); }
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); }
public static void Run(mdr.DArray i0, ref mdr.DValue result) { result.Set(i0); }
public static void Run(ulong i0, ref mdr.DValue result) { result.Set(i0); }
public static void Run(mdr.DUndefined i0, ref mdr.DValue result) { result.Set(i0); }
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); }
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); Expression.Execute(ref result, ref callFrame, interpreter); var obj = Operations.Convert.ToObject.Run(ref result); result.Set(obj.ToDFunction()); interpreter.PopLocation(this, ref result); }
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); }
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); }
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); }
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); }
public static void Run(/*const*/ ref mdr.DValue i0, ref mdr.DValue result) { result.Set(ref i0); }
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); }
public static void Run(double i0, ref mdr.DValue result) { result.Set(i0); }
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); }
public static void Run(mdr.DFunction i0, ref mdr.DValue result) { result.Set(i0); }
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 static void Run(object i0, ref mdr.DValue result) { result.Set(i0); }
//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; } } }