Exemplo n.º 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);
        }
Exemplo n.º 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);
            });
        }
Exemplo n.º 3
0
 public static void BuildClrObject(ClrObject clrObject, DisassembledClass typeDefinition, bool isstatic = false)
 {
     foreach (var disassembledField in typeDefinition.Fields)
     {
         if (isstatic && disassembledField.Modifiers.Contains("static"))
         {
             if (!clrObject.Fields.ContainsKey(disassembledField.ShortName))
             {
                 clrObject.Fields[disassembledField.ShortName] = new StackItemPtr();
             }
         }
         if (!isstatic && !disassembledField.Modifiers.Contains("static"))
         {
             if (!clrObject.Fields.ContainsKey(disassembledField.ShortName))
             {
                 clrObject.Fields[disassembledField.ShortName] = new StackItemPtr();
             }
         }
     }
     if (typeDefinition.BaseType != null && typeDefinition.BaseType != "[mscorlib]System.Object")
     {
         BuildClrObject(clrObject, GetTypeDefineByName(typeDefinition.BaseType).TypeDefinition, isstatic);
     }
 }
Exemplo n.º 4
0
        public void CompileIL()
        {
            IsCompiled = true;
            var clr = this.Clr;

            //如果是对象则进行初始化
            if (Localvars != null)
            {
                var localvars = this.Localvars;
                for (int i = 0; i < localvars.Count; i++)
                {
                    var typeDefine = Extensions.GetTypeDefineByName(localvars["V_" + i]);
                    if (typeDefine == null)
                    {
                        var type = Extensions.GetTypeByName(localvars["V_" + i]);
                        //if (type.IsClass)
                        //{
                        //    (clr.Csp + i)->ValueType = StackValueType.Ref;
                        //}
                        //非基础类型
                        if (!type.IsBaseType())
                        {
                            (clr.Csp + i)->ValueType = StackValueType.Ref;
                        }
                    }
                    else
                    {
                        var clrobj = new ClrObject(typeDefine.ClrType);

                        (clr.Csp + i)->SetValue(StackValueType.Ref, clrobj, true);
                    }
                }
            }
            var list = ILLines;

            foreach (var line in list)
            {
                if (string.IsNullOrEmpty(line.OpCode))
                {
                    continue;
                }
                if (line.OpCode == "call")
                {
                }
                var  opcode      = line.OpCode.Replace(".s", "");
                var  opcodeValue = opcode.Split('.');
                var  baseOp      = opcodeValue[0];
                bool longOp      = true;


                var method = FindMethod1(opcode.Replace(".", "_"));
                //全

                if (method == null && baseOp + "_" + line.OpArg0 != opcode.Replace(".", "_"))
                {
                    method = FindMethod1(baseOp + "_" + line.OpArg0);
                    longOp = false;
                    if (method != null)
                    {
                        opcodeValue = new string[] { opcodeValue[0] + "_" + opcodeValue[1], opcodeValue[2] }
                    }
                    ;
                }


                if (method == null)
                {
                    method = FindMethod(baseOp);
                    longOp = false;
                }
                if (method == null)
                {
                    throw new NotImplementedException(line.Line);
                }
                if (opcode.IndexOf(".") == -1 && longOp)
                {
                    longOp = false;
                }
                object[] methodArg = null;
                if (longOp)
                {
                    methodArg = ArgsFix(new string[] { "", line.Arg0, line.Arg1, line.Arg2 }, method, list);
                }
                else
                {
                    var subvalue = new List <string>(opcodeValue);
                    if (method.GetParameters().Length == 3) //固定跳转
                    {
                        while (subvalue.Count < 3)
                        {
                            subvalue.Add(null);
                        }
                    }
                    subvalue.Add(line.Arg0);
                    subvalue.Add(line.Arg1);
                    subvalue.Add(line.Arg2);
                    methodArg = ArgsFix(subvalue.ToArray(), method, list);
                }

                var tasktype = typeof(OpCodeTask);
                var parms    = method.GetParameters();
                if (parms.Length > 0)
                {
                    if (
#if BRIDGE
                        false
#else
                        parms.Last().ParameterType.IsByRef
#endif
                        )
                    {
                        if (parms.Length == 1)
                        {
                            tasktype = typeof(OpCodeTaskRef <>).MakeGenericType(
                                parms[0].ParameterType.GetElementType()
                                );
                        }
                        else if (parms.Length == 2)
                        {
                            tasktype = typeof(OpCodeTaskRef <,>).MakeGenericType(
                                parms[0].ParameterType.GetElementType(),
                                parms[1].ParameterType.GetElementType()
                                );
                        }
                        else if (parms.Length == 3)
                        {
                            tasktype = typeof(OpCodeTaskRef <, ,>).MakeGenericType(
                                parms[0].ParameterType.GetElementType(),
                                parms[1].ParameterType.GetElementType(),
                                parms[2].ParameterType.GetElementType());
                        }
                        else if (parms.Length == 4)
                        {
                        }
                    }
                    else
                    {
                        {
                            if (parms.Length == 1)
                            {
                                tasktype = typeof(OpCodeTask <>).MakeGenericType(parms[0].ParameterType);
                            }
                            else if (parms.Length == 2)
                            {
                                tasktype = typeof(OpCodeTask <,>).MakeGenericType(parms[0].ParameterType,
                                                                                  parms[1].ParameterType);
                            }
                            else if (parms.Length == 3)
                            {
                                tasktype = typeof(OpCodeTask <, ,>).MakeGenericType(parms[0].ParameterType,
                                                                                    parms[1].ParameterType, parms[2].ParameterType);
                            }
                            else if (parms.Length == 4)
                            {
                            }
                        }
                    }
                }


                var task = Activator.CreateInstance(tasktype) as IOpTask;

                task.OpCode = line;

                var funtask = tasktype.GetField("Func").FieldType;
                var gtype   = method.GetGenericArguments();
                if (gtype.Length == 0)
                {
                    var @delage = Delegate.CreateDelegate(funtask, clr, method);

                    tasktype.GetField("Func").SetValue(task, @delage);
                }
                else
                {
                    if (methodArg.Length <= 0 ||
                        (
                            methodArg[0].GetType() != typeof(Type).GetType()
                            &&
                            methodArg[0].GetType() != typeof(ClrType)
                        )

                        )
                    {
                        throw new Exception("GenericMethod,First Pargram Type Mast Be System.Type!");
                    }
#if BRIDGE
                    throw new NotSupportedException("GenericMethod, In BRIDGE Was Not Supported!");
#else
                    if (methodArg[0].GetType() == typeof(ClrType))
                    {
                        var genmethod = method.MakeGenericMethod(typeof(ClrType));

                        var @delage = Delegate.CreateDelegate(funtask, clr, genmethod);

                        tasktype.GetField("Func").SetValue(task, @delage);
                    }
                    else
                    {
                        var genmethod = method.MakeGenericMethod(methodArg[0] as Type);

                        var @delage = Delegate.CreateDelegate(funtask, clr, genmethod);

                        tasktype.GetField("Func").SetValue(task, @delage);
                    }
#endif
                }
                for (int i = 1; i < 4; i++)
                {
                    var v = tasktype.GetField("V" + i);
                    if (v != null)
                    {
                        v.SetValue(task, methodArg[i - 1]);
                    }
                    else
                    {
                        break;
                    }
                }

                this.TaskList.Add(task);
            }
        }
Exemplo n.º 5
0
 public virtual void InitMember(ClrObject clrObj)
 {
 }