예제 #1
0
 /// <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]);
     }));
 }
예제 #2
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);
     }));
 }
예제 #3
0
        /// <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);
        }