/// <summary> /// Run analysis of program loaded via given loader. Execution starts from method generated by given /// generator. /// </summary> /// <param name="loader">Loader which provides instruction generation and type/methods resolving.</param> /// <param name="entryMethodGenerator">Generator of entry method.</param> /// <returns>Result of analysis.</returns> public AnalyzingResult Run(LoaderBase loader, GeneratorBase entryMethodGenerator) { return(contextInvoker(loader, (context) => { context.PushCall(new MethodID("[email protected]", false), entryMethodGenerator, new Instance[0]); })); }
/// <summary> /// Run analysis of program loaded via given loader. Execution starts from entryMethod. /// </summary> /// <param name="loader">Loader which provides instruction generation and type/methods resolving.</param> /// <param name="entryMethod">Identifier entry method of analysis.</param> /// <param name="arguments">Arguments pasted to entry method.</param> /// <returns>Result of analysis.</returns> public AnalyzingResult Run(LoaderBase loader, MethodID entryMethod, params Instance[] arguments) { return(contextInvoker(loader, (context) => { foreach (var argument in arguments) { if (argument != null) { argument.IsEntryInstance = true; _createdInstances.Add(argument.ID, argument); } } context.FetchCall(entryMethod, arguments); })); }
/// <summary> /// Invoke context that is initialized by given initializer. /// </summary> /// <param name="loader">Loader used for invoking.</param> /// <param name="initializer">Initializer of context used for invoking.</param> /// <returns>Result of analyzing.</returns> private AnalyzingResult contextInvoker(LoaderBase loader, ContextInitializer initializer) { Settings.FireBeforeInterpretation(); _createdInstances.Clear(); var context = new AnalyzingContext(this, loader); Exception runtimeException = null; #if !PassExceptions try { #endif initializer(context); runContext(context); #if !PassExceptions } catch (Exception ex) { if (!Settings.CatchExceptions) { //we have to pass the exception to the caller throw; } runtimeException = ex; } #endif var result = context.GetResult(new Dictionary <string, Instance>(_createdInstances)); result.RuntimeException = runtimeException; Settings.FireAfterInterpretation(); _createdInstances.Clear(); return(result); }