Exemplo n.º 1
0
        public static Result <EmitFunction> CompileCore(
            CoreSqlContext coreSql,
            SdmapCompilerContext context,
            string functionName)
        {
            var visitor = new CoreSqlVisitor(context);

            return(visitor.Process(coreSql, functionName)
                   .OnSuccess(() => visitor.Function));
        }
Exemplo n.º 2
0
        private static Result <EmitFunction> CompileCore(
            SdmapCompilerContext context,
            CoreSqlContext coreSql)
        {
            var fullName = NameUtil.GetFunctionName(coreSql);

            return(CoreSqlVisitor.CompileCore(
                       coreSql,
                       context,
                       fullName));
        }
Exemplo n.º 3
0
        public Result Process(CoreSqlContext parseRule, string functionName)
        {
            var method = new DynamicMethod(functionName,
                                           typeof(Result <string>), new[] { typeof(SdmapCompilerContext), typeof(object) });

            _il = method.GetILGenerator();

            void returnBlock()
            {
                _il.Emit(OpCodes.Ldloc_0);                                        // sb
                var okMethod = typeof(Result)
                               .GetTypeInfo()
                               .GetMethods()
                               .Single(x => x.IsGenericMethod && x.Name == "Ok")
                               .MakeGenericMethod(typeof(string));

                _il.Emit(OpCodes.Call, typeof(StringBuilder)
                         .GetTypeInfo()
                         .GetMethod(nameof(StringBuilder.ToString), Type.EmptyTypes)); // str
                _il.Emit(OpCodes.Call, okMethod);                                      // result<str>

                _il.Emit(OpCodes.Ret);                                                 // [empty-returned]
                Function = (EmitFunction)method.CreateDelegate(typeof(EmitFunction));
            };

            if (parseRule == null)
            {
                returnBlock();
                return(Result.Ok());
            }

            _il.DeclareLocal(typeof(StringBuilder));
            _il.Emit(OpCodes.Newobj, typeof(StringBuilder)
                     .GetTypeInfo()
                     .GetConstructor(Type.EmptyTypes));                               // sb
            _il.Emit(OpCodes.Stloc_0);                                                // [empty]

            return(Visit(parseRule)
                   .OnSuccess(() =>                                                   // [must be empty]
            {
                returnBlock();
            }));
        }
Exemplo n.º 4
0
 public static SqlEmiter CreateCore(CoreSqlContext parseTree, string ns)
 {
     return(new SqlEmiter(parseTree, ns,
                          ctx => CompileCore(ctx, parseTree)));
 }
Exemplo n.º 5
0
        public Result Process(CoreSqlContext parseRule, string functionName)
        {
            var method = new DynamicMethod(functionName,
                                           typeof(Result <string>), new[] { typeof(OneCallContext) });

            _il = method.GetILGenerator();

            void returnBlock()
            {
                bool isNamed = NameUtil.IsNamed(functionName);
                // root:
                //     combine deps
                // child-named:
                //     not combine
                // child-unnamed:
                //     combine strings

                Label defaultExit          = _il.DefineLabel();
                Label childNamedNotCombine = _il.DefineLabel();

                _il.Emit(OpCodes.Ldarg_0);                         // ctx
                _il.Emit(OpCodes.Call, OneCallContext.GetIsChild); // isChild
                _il.Emit(isNamed ?
                         OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);     // isNamed
                _il.Emit(OpCodes.And);                             // if (isChild && isNamed)
                _il.Emit(OpCodes.Brtrue_S, childNamedNotCombine);  //     goto notCombine

                _il.MarkLabel(defaultExit);
                {
                    string methodName = isNamed ?
                                        nameof(CoreSqlVisitorHelper.CombineDeps) :
                                        nameof(CoreSqlVisitorHelper.CombineStrings);
                    MethodInfo combineMethod = typeof(CoreSqlVisitorHelper).GetMethod(methodName);
                    _il.Emit(OpCodes.Ldarg_0);                                   // ctx
                    _il.Emit(OpCodes.Call, combineMethod);                       // result<str>
                    _il.Emit(OpCodes.Ret);                                       //
                }
                _il.MarkLabel(childNamedNotCombine);
                {
                    MethodInfo ok = typeof(Result).GetMethods()
                                    .Single(x => x.IsGenericMethod && x.Name == nameof(Result.Ok))
                                    .MakeGenericMethod(typeof(string));
                    _il.Emit(OpCodes.Ldstr, "");                                  // [empty]
                    _il.Emit(OpCodes.Call, ok);                                   // result<empty>
                    _il.Emit(OpCodes.Ret);                                        //
                }

                Function = (EmitFunction)method.CreateDelegate(typeof(EmitFunction));
            };

            if (parseRule == null)
            {
                returnBlock();
                return(Result.Ok());
            }

            _il.DeclareLocal(typeof(List <object>));
            _il.Emit(OpCodes.Ldarg_0);                                                // ctx
            _il.Emit(OpCodes.Call, OneCallContext.GetTempStore);                      // sb
            _il.Emit(OpCodes.Stloc_0);                                                // [empty]

            return(Visit(parseRule)
                   .OnSuccess(() =>                                                   // [must be empty]
            {
                returnBlock();
            }));
        }