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 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; }
public static MethodTable BuildMethodTable(ClassLoader classLoader, TypeDefinition typeDef) { return new MethodTableBuilder(classLoader, typeDef).BuildMethodTable(); }
static void Main(string[] args) { // Setup InternalCallMethods PetitClrRuntime.Current.InternalCallMethods.Add("System.String System.Environment::GetStackTraceInternal(System.Exception,System.Boolean)", (thisArg, frame, methArgs) => { return "HogeMoge"; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::Write(System.String)", (thisArg, frame, methArgs) => { System.Console.Write(methArgs[0]); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::Write(System.String,System.Object)", (thisArg, frame, methArgs) => { System.Console.Write(methArgs[0].ToString(), methArgs[1]); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::Write(System.Int32)", (thisArg, frame, methArgs) => { System.Console.Write(methArgs[0]); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::WriteLine()", (thisArg, frame, methArgs) => { System.Console.WriteLine(); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::WriteLine(System.String)", (thisArg, frame, methArgs) => { System.Console.WriteLine(methArgs[0]); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::WriteLine(System.String,System.Object)", (thisArg, frame, methArgs) => { System.Console.WriteLine(methArgs[0].ToString(), methArgs[1]); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Console::WriteLine(System.Int32)", (thisArg, frame, methArgs) => { System.Console.WriteLine(methArgs[0]); return null; }); PetitClrRuntime.Current.InternalCallMethods.Add("System.Void System.Diagnostics.Debugger::Break()", (thisArg, frame, methArgs) => { Debugger.Break(); return null; }); // Load Assembly & Get EntryPoint var assemblyResolver = new InazumaAssemblyResolver(); var classLoader = new ClassLoader(); var readerparameters = new ReaderParameters() { AssemblyResolver = assemblyResolver, MetadataResolver = new InazumaMetadataResolver(assemblyResolver) }; InazumaAssemblyResolver.PetitCorLib = AssemblyDefinition.ReadAssembly("../../../Inazuma.PetitClr.PetitCorlib/Bin/Debug/Inazuma.PetitClr.PetitCorlib.dll", readerparameters); // = mscorlibAssembly var asm = AssemblyDefinition.ReadAssembly("Inazuma.PetitClr.SampleHost.exe", readerparameters); var entryPointType = asm.MainModule.GetType("Inazuma.PetitClr.SampleHost.SampleProgram"); // Execute Program bool doJmpCall; PetitClrInterpreter.ExecuteMethodWrapper(classLoader, entryPointType.Methods[0], false, new List<ObjectInstance>(), null, out doJmpCall); System.Console.ReadLine(); }
public MethodTableBuilder(ClassLoader classLoader, TypeDefinition typeDef) { _classLoader = classLoader; _typeDefinition = typeDef; }