CSPspEmu.Core.Cpu.Emitter.MipsMethodEmitter.CreateDelegate C# (CSharp) Method

CreateDelegate() public method

public CreateDelegate ( AstNodeStm AstNodeStm, int TotalInstructions ) : System.Result
AstNodeStm AstNodeStm
TotalInstructions int
return System.Result
		public Result CreateDelegate(AstNodeStm AstNodeStm, int TotalInstructions)
		{
			var Time0 = DateTime.UtcNow;

			AstNodeStm = AstOptimizerPsp.GlobalOptimize(Processor, ast.Statements(AstNodeStm, ast.Return()));

			var Time1 = DateTime.UtcNow;

#if DEBUG_GENERATE_IL
			Console.WriteLine("{0}", GeneratorIL.GenerateToString<GeneratorILPsp>(DynamicMethod, AstNodeStm));
#endif
#if DEBUG_GENERATE_IL_CSHARP
			Console.WriteLine("{0}", AstNodeExtensions.ToCSharpString(AstNodeStm).Replace("CpuThreadState.", ""));
#endif

			Action<CpuThreadState> Delegate;
			var Time2 = Time1;

			bool DisableOptimizations = _DynarecConfig.DisableDotNetJitOptimizations;
			if (TotalInstructions >= _DynarecConfig.InstructionCountToDisableOptimizations) DisableOptimizations = true;

			if (Platform.IsMono) DisableOptimizations = false;
			if (_DynarecConfig.ForceJitOptimizationsOnEvenLargeFunctions) DisableOptimizations = false;

			try
			{
				Delegate = MethodCreator.CreateDynamicMethod<Action<CpuThreadState>>(
				//Delegate = MethodCreator.CreateMethodInClass<Action<CpuThreadState>>(
					Assembly.GetExecutingAssembly().ManifestModule,
					String.Format("DynamicMethod_0x{0:X}", this.PC),
					DisableOptimizations,
					(DynamicMethod) =>
					{
						AstNodeStm.GenerateIL(DynamicMethod);
						Time2 = DateTime.UtcNow;
					}
				);
			}
			catch (InvalidProgramException InvalidProgramException)
			{
				Console.Error.WriteLine("Invalid Delegate:");
#if LOG_TRACE
				Console.WriteLine("Invalid Delegate:");
				foreach (var Line in SafeILGenerator.GetEmittedInstructions())
				{
					if (Line.Substr(0, 1) == ":")
					{
						Console.WriteLine("{0}", Line);
					}
					else
					{
						Console.WriteLine("    {0}", Line);
					}
				}
#endif
				throw (InvalidProgramException);
			}

			var Time3 = DateTime.UtcNow;

			return new Result()
			{
				Delegate = Delegate,
				DisableOptimizations = DisableOptimizations,
				TimeOptimize = Time1 - Time0,
				TimeGenerateIL = Time2 - Time1,
				TimeCreateDelegate = Time3 - Time2,
			};
		}
	}