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);
 }
Esempio n. 2
0
        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,
            });
        }
Esempio n. 6
0
 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));
 }
Esempio n. 7
0
        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);
        }