Пример #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>
        /// 创建一个值类型的新对象或新实例,并将对象引用(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);
            });
        }