private ClassSyntax BuildMethod_GetParserAction(ClassSyntax context)
        {
            var generator = new ReadOnlyTableGenerator(
                data.ParserActionTable,
                il => il.Ldarg(0),
                il => il.Ldarg(1));

            var args = context.Method()
                       .Private.Static
                       .Returning(context.Types.Int32)
                       .Named(GetParserActionMethodName)
                       .BeginArgs();

            return(args
                   .Argument(context.Types.Int32, args.Args.Generate())
                   .Argument(context.Types.Int32, args.Args.Generate())
                   .EndArgs()

                   .NoOptimization

                   .BeginBody()
                   .Do(generator.Build)
                   .Ret()
                   .EndBody());
        }
        public void Test()
        {
            const int rows    = 2;
            const int columns = 3;

            int[,] table = new int[rows, columns];
            for (int r = 0; r != rows; ++r)
            {
                for (int c = 0; c != columns; ++c)
                {
                    table[r, c] = r * columns + c;
                }
            }

            var target = new ReadOnlyTableGenerator(new MutableTable <int>(table), emit => emit.Ldarg(0), emit => emit.Ldarg(1));

            var getCell = new CachedMethod <Func <int, int, int> >("TableSerializerTest.Assembly0", (emit, args) => { target.Build(emit); return(emit.Ret()); }).Delegate;

            for (int r = 0; r != rows; ++r)
            {
                for (int c = 0; c != columns; ++c)
                {
                    Assert.AreEqual(table[r, c], getCell(r, c), "r={0}, c={1}", r, c);
                }
            }
        }