internal static Delegate Emit(this Binder b, Codeblock macro, string source) { var dm = b.CreateMethod(source); macro.Emit(dm.GetILGenerator()); return(b.CreateDelegate(dm)); }
internal static R Emit <T, R>(this Binder <T, R> b, Codeblock macro, string source) where R : class { var dm = b.CreateMethod(source); macro.Emit(dm.GetILGenerator()); return(b.CreateDelegate(dm) as R); }
internal static R Emit <T, R>(this Binder <T, R> b, Codeblock macro, string source) where R : class { var dm = new DynamicMethod(source, typeof(T), new Type[] { typeof(T[]) }); macro.Emit(dm.GetILGenerator()); return(dm.CreateDelegate(typeof(R)) as R); }
//---------------------------------------------------------------- DoExamples() // public static void DoExamples() { // Example 1: Codeblock without parameters Codeblock cb = new Codeblock(); cb.Compile("{||5 + 3}"); double result = cb.Eval(); // result=8 Console.WriteLine("The result is: " + result); // Example 2: Codeblock with parameters cb.Compile("{|length,width|length*width}"); double area = cb.Eval(3, 17); // area=51 Console.WriteLine("The area is: " + area); // Example 3: Codeblock compile, eval and repeat cb.Compile("{|sales,r1,r2| r1*sales + iif( sales > 100000, (sales-100000)*r2, 0 ) }"); double commission1 = cb.Eval(152000, .08, .05); // commission1=14760 double commission2 = cb.Eval(186100, .08, .07); // commission2=20915 double commission3 = cb.Eval(320000, .08, .05); // commission3=36600 Console.WriteLine("commission1: " + commission1); Console.WriteLine("commission2: " + commission2); Console.WriteLine("commission3: " + commission3); }
internal Codeblock Bind(Codeblock macro) { Bind(ref macro); return(macro); }
//---------------------------------------------------------------- DoTestCase() // public static void DoTestCase(int testnumber, string description, string codeblockText, double[] args, ExpectedResult expectedResult) { Codeblock cb = new Codeblock(); int errCode = Error.None.ErrCode; double result = 0d; bool decompile = false; cb.OptimizerEnabled = true; // Count test testExecuted++; // Test description Mtelog.Console("********************"); Mtelog.Console(testnumber + " - " + description); Mtelog.Console("Codeblock=" + codeblockText); // Compile and report error (if any) errCode = cb.Compile(codeblockText); if (cb.LastError != Error.None) { if (cb.LastError == expectedResult.lastError) { testPassed++; } Mtelog.Console("Compile error=" + cb.LastError.ErrCode); Mtelog.Console("Error Description=" + cb.LastError.ErrDesc); Mtelog.Console("Error Detail=" + cb.ErrDetail); return; } Mtelog.Console("Codeblock compiled."); // Decompile if (decompile) { // Decompile code List <string> codelist = cb.Decompile(); // Output code listing foreach (var item in codelist) { Mtelog.Console(item); } } // Evaluate the Codeblock result = cb.Eval(args); Mtelog.Console("Codeblock executed!"); // Show results Mtelog.Console("Result=" + result.ToString()); // Report error if (cb.LastError != expectedResult.lastError) { Mtelog.Console("Eval() error=" + cb.LastError.ErrCode); Mtelog.Console("Error Description=" + cb.LastError.ErrDesc); Mtelog.Console("Error Detail:" + cb.ErrDetail); return; } // Format results string resultText = string.Format("{0:0.00}", result); string expectText = string.Format("{0:0.00}", expectedResult.result); // Verify results if (!resultText.Equals(expectText)) { Mtelog.Console("**************************"); Mtelog.Console("Error: Unexpected result. " + resultText + "!=" + expectText); Mtelog.Console("**************************"); return; } // Count test passed testPassed++; return; }