Example #1
0
        internal static Delegate Emit(this Binder b, Codeblock macro, string source)
        {
            var dm = b.CreateMethod(source);

            macro.Emit(dm.GetILGenerator());
            return(b.CreateDelegate(dm));
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        //---------------------------------------------------------------- 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);
        }
Example #5
0
 internal Codeblock Bind(Codeblock macro)
 {
     Bind(ref macro);
     return(macro);
 }
Example #6
0
        //---------------------------------------------------------------- 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;
        }