private ObjectInstance InterpretMethodBody(MethodDefinition methDef, bool directCall, IList<ObjectInstance> args, object stubContext) { for (var doJmpCall = true; doJmpCall; ) { var retVal = ExecuteMethodWrapper(_classLoader, methDef, directCall, args, stubContext, out doJmpCall); if (!doJmpCall) { return retVal; } } throw ThrowHelper.NotImplementedYet; }
public PetitClrInterpreter(ClassLoader classLoader, MethodDefinition methodDef, bool directCall, IList<ObjectInstance> args, object stubContext) { _classLoader = classLoader; _methInfo2 = methodDef; _directCall = directCall; _args = args; _stubContext = stubContext; _instructions = methodDef.Body.Instructions.ToArray(); _instructionPtr = 0; _opStack = new Stack<ObjectInstance>(); _localSlot = new ObjectInstance[methodDef.Body.Variables.Count]; }
public MethodDesc LookupMethodDescFromMethodDef(MethodDefinition methodDef) { return _methodDescByMethodDef.ContainsKey(methodDef) ? _methodDescByMethodDef[methodDef] : null; }
public void RegisterMethodDesc(MethodDefinition methodDef, MethodDesc methodDesc) { _methodDescByMethodDef[methodDef] = methodDesc; }
public void RemoveOverrideMapping (MethodDefinition method) { Overrides.Remove (method.token.RID); }
public bool TryGetOverrideMapping (MethodDefinition method, out MetadataToken [] mapping) { return Overrides.TryGetValue (method.token.RID, out mapping); }
public void AddMethodDefinition (MethodDefinition method) { Methods [method.token.RID - 1] = method; }
public static ObjectInstance ExecuteMethodWrapper(ClassLoader classLoader, MethodDefinition methDef, bool directCall, IList<ObjectInstance> args, object stubContext, out bool doJmpCall) { var interp = new PetitClrInterpreter(classLoader, methDef, directCall, args, stubContext); var interpFrame = new InterpreterFrame(interp); ObjectInstance retVal; MemberReference jmpCallToken; interp.ExecuteMethod(out retVal, out doJmpCall, out jmpCallToken); if (doJmpCall) { throw ThrowHelper.NotImplementedYet; } interpFrame.Pop(); return retVal; }
private void InvokeInternalCall(MethodDefinition methDef) { object retVal; var args = new object[methDef.Parameters.Count]; for (var i = args.Length - 1; i >= 0; i--) { args[i] = _opStack.Pop().ToClrObject(); } if (PetitClrRuntime.Current.InternalCallMethods.ContainsKey(methDef.ToString())) { var func = PetitClrRuntime.Current.InternalCallMethods[methDef.ToString()]; retVal = func(_callThisArg, PetitClrThread.CurrentThread.Frame, args); } else { var realType = Type.GetType(methDef.DeclaringType.FullName.Replace("Inazuma.PetitClr.PetitCorlib.", "")); var realMethod = realType.GetMethod(methDef.Name, BindingFlags.Static | BindingFlags.Public, null, methDef.Parameters.Select(x => Type.GetType(x.ParameterType.FullName)).ToArray(), null); if (realMethod == null) { throw new InazumaExecutionException("Could not find the internal method: " + methDef.FullName); } retVal = realMethod.Invoke(null, args); } if (methDef.ReturnType.FullName != "System.Void") // TODO: should refer typevalue { _opStack.Push(ObjectInstance.FromClrObject(retVal)); } }
static Collection<ParameterDefinition> MirrorParameters (MethodDefinition method, int bound) { var parameters = new Collection<ParameterDefinition> (); if (!method.HasParameters) return parameters; var original_parameters = method.Parameters; var end = original_parameters.Count - bound; for (int i = 0; i < end; i++) parameters.Add (original_parameters [i]); return parameters; }