/// <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> /// 创建一个值类型的新对象或新实例,并将对象引用(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); }); }
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); } }
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); } }
public virtual void InitMember(ClrObject clrObj) { }