/// <summary> /// 创建一个值类型的新对象或新实例,并将对象引用(O 类型)推送到计算堆栈上。 /// </summary> /// <param name="type"></param> public void Newobj(string instance, string @return, MethodTasks task) { if (task.Clr.ArgsVarCount > 0) { //初始化 task.Clr.Argp->ValueType = StackValueType.Ref; var clrObj = new ClrObject(); task.InitMember(clrObj); task.Clr.Argp->SetValue(StackValueType.Ref, clrObj); } task.Run(); EvaluationStack_Push(task.Clr.ResultPoint); }
/// <summary> /// "IL_0009" : "call" "int32" "ApolloClr.Program::fib(int32)" null /// 调用由传递的方法说明符指示的方法 /// </summary> public void Call(string retType, string method, MethodTasks task) { //如果有新的层级进来 if (!task.IsEnd) { var newtask = task.Clone(); //获取空余方法 //从堆栈拷贝参数 if (newtask.Clr.ArgsVarCount > 0) { CopyToArgs(newtask.Clr); } newtask.Run(() => { //如果有返回 if (newtask.Clr.RetResult) { //压入返回值 EvaluationStack_Push(newtask.Clr.ResultPoint); } }); } else { if (task.Clr.ArgsVarCount > 0) { CopyToArgs(task.Clr); } //如果是非静态 //把先吧对象压入栈 //克隆 对战 并 运行 task.Run(() => { //如果有返回 if (task.Clr.RetResult) { //压入返回值 EvaluationStack_Push(task.Clr.ResultPoint); } }); } }
/// <summary> /// 创建一个值类型的新对象或新实例,并将对象引用(O 类型)推送到计算堆栈上。 /// </summary> /// <param name="type"></param> public void Newobj(string instance, string @return, MethodTasks task) { int begin = 1; if ((task is CrossMethod) && (task as CrossMethod).CrossMethodDelegate is DelegateBuild) { begin = 0; } else { if (task.Clr.ArgsVarCount > 0) { //初始化 var clrObj = new ClrObject(); task.InitMember(clrObj); task.Clr.Argp->SetValue(StackValueType.Ref, clrObj, true); } } if (task.Clr.ArgsVarCount > 0) { var vs = EvaluationStack_Pop(task.Clr.ArgsVarCount - begin); for (int i = 0; i < task.Clr.ArgsVarCount - begin; i++) { *(task.Clr.Argp + i + begin) = *(vs + i); (task.Clr.Argp + i + begin)->Fix(); } } task.Run(() => { EvaluationStack_Push(task.Clr.ResultPoint); }); }