Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
                    }
                });
            }
        }
Пример #3
0
        /// <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);
            });
        }