public void TestMethod2() { var Pool = new ILInstanceHolderPool(typeof(int), 16); var Item = Pool.Alloc(); var AstNode = ast.Statements( ast.Assign(ast.StaticFieldAccess(Item.FieldInfo), ast.Argument<int>(0, "Value")), ast.Return() ); Console.WriteLine(GeneratorCSharp.GenerateString<GeneratorCSharp>(AstNode)); var GeneratorIL = new GeneratorIL(); var ItemSet = GeneratorIL.GenerateDelegate<Action<int>>("ItemSet", AstNode); ItemSet(10); Assert.AreEqual(10, Item.Value); }
public void TestMethod2() { var Pool = new ILInstanceHolderPool(typeof(int), 16); var Item = Pool.Alloc(); var AstNode = ast.Statements( ast.Assign(ast.StaticFieldAccess(Item.FieldInfo), ast.Argument <int>(0, "Value")), ast.Return() ); Console.WriteLine(GeneratorCSharp.GenerateString <GeneratorCSharp>(AstNode)); var GeneratorIL = new GeneratorIL(); var ItemSet = GeneratorIL.GenerateDelegate <Action <int> >("ItemSet", AstNode); ItemSet(10); Assert.AreEqual(10, Item.Value); }
public void TestAstSwitch() { var Argument = AstArgument.Create <int>(0, "Value"); var Ast = ast.Statements( ast.Switch( ast.Argument(Argument), ast.Default(ast.Return("-")), ast.Case(1, ast.Return("One")), ast.Case(3, ast.Return("Three")) ), ast.Return("Invalid!") ); var GeneratorIL = new GeneratorIL(); var Method = GeneratorIL.GenerateDelegate <Func <int, string> >("TestSwitch", Ast); Assert.AreEqual("-", Method(0)); Assert.AreEqual("One", Method(1)); Assert.AreEqual("-", Method(2)); Assert.AreEqual("Three", Method(3)); Assert.AreEqual("-", Method(4)); }
public void TestWriteLineLoadString() { var Ast = ast.Statements( ast.Statement(ast.CallStatic((Action <string>)Console.WriteLine, ast.Argument <string>(0))), ast.Statement(ast.CallStatic((Action <string>)Console.WriteLine, "Goodbye World!")), ast.Return() ); var GeneratorIL = new GeneratorIL(); var Method = GeneratorIL.GenerateDelegate <Action <string> >("TestWriteLine", Ast); Console.WriteLine(new GeneratorCSharp().GenerateRoot(Ast).ToString()); Console.WriteLine("{0}", new GeneratorIL().GenerateToString(Method.Method, Ast)); var Output = AstStringUtils.CaptureOutput(() => { Method("Hello World!"); }); Assert.AreEqual("Hello World!" + Environment.NewLine + "Goodbye World!" + Environment.NewLine, Output); }
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; var 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, $"DynamicMethod_0x{this._pc:X}", disableOptimizations, dynamicMethod => { astNodeStm.GenerateIl(dynamicMethod); time2 = DateTime.UtcNow; } ); } catch (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; } var time3 = DateTime.UtcNow; return(new Result { Delegate = Delegate, DisableOptimizations = disableOptimizations, TimeOptimize = time1 - time0, TimeGenerateIl = time2 - time1, TimeCreateDelegate = time3 - time2, }); }
public void TestAstSwitch() { var Argument = AstArgument.Create<int>(0, "Value"); var Ast = ast.Statements( ast.Switch( ast.Argument(Argument), ast.Default(ast.Return("-")), ast.Case(1, ast.Return("One")), ast.Case(3, ast.Return("Three")) ), ast.Return("Invalid!") ); var GeneratorIL = new GeneratorIL(); var Method = GeneratorIL.GenerateDelegate<Func<int, string>>("TestSwitch", Ast); Assert.AreEqual("-", Method(0)); Assert.AreEqual("One", Method(1)); Assert.AreEqual("-", Method(2)); Assert.AreEqual("Three", Method(3)); Assert.AreEqual("-", Method(4)); }
public void TestWriteLineLoadString() { var Ast = ast.Statements( ast.Statement(ast.CallStatic((Action<string>)Console.WriteLine, ast.Argument<string>(0))), ast.Statement(ast.CallStatic((Action<string>)Console.WriteLine, "Goodbye World!")), ast.Return() ); var GeneratorIL = new GeneratorIL(); var Method = GeneratorIL.GenerateDelegate<Action<string>>("TestWriteLine", Ast); Console.WriteLine(new GeneratorCSharp().GenerateRoot(Ast).ToString()); Console.WriteLine("{0}", new GeneratorIL().GenerateToString(Method.Method, Ast)); var Output = AstStringUtils.CaptureOutput(() => { Method("Hello World!"); }); Assert.AreEqual("Hello World!" + Environment.NewLine + "Goodbye World!" + Environment.NewLine, Output); }