Exemple #1
0
        public void Generate(TypeBuilder classBuilder, bool isStatic)
        {
            var             symbols     = MethodContext.Symbols;
            EmitStmtContext stmtContext = new EmitStmtContext(MethodContext.EmitContext);
            var             il          = MethodContext.EmitContext.ILout;

            for (int i = 0; i < MethodContext.LoacalVarList.Count; i++)
            {
                string    ident     = MethodContext.LoacalVarList[i];
                SymbolVar varSymbol = symbols.Get(ident) as SymbolVar;
                varSymbol.VarBuilder = il.DeclareLocal(varSymbol.DimType);
                varSymbol.VarBuilder.SetLocalSymInfo(varSymbol.SymbolName);
            }
            if (MethodContext.RetType != typeof(void))
            {
                if (MethodContext.RetType.IsValueType)
                {
                    EmitHelper.LoadInt(il, 0);
                }
                else
                {
                    il.Emit(OpCodes.Ldnull);
                }
                EmitHelper.StormVar(il, (symbols.Get(MethodContext.LoacalVarList[0]) as SymbolVar).VarBuilder);
            }

            if (FnName.IsConstructor(this.ClassName) != -1)
            {
                if (!isStatic)
                {
                    callBaseDefault();
                    if (ClassContext.InitMemberValueMethod != null)
                    {
                        il.Emit(OpCodes.Ldarg_0);
                        EmitHelper.CallDynamic(il, ClassContext.InitMemberValueMethod, true);//EmitHelper.CallDynamic(il, ClassContext.InitMemberValueMethod);
                    }
                }
                else
                {
                    if (ClassContext.InitMemberValueMethod != null)
                    {
                        EmitHelper.CallDynamic(il, ClassContext.InitMemberValueMethod, true);//EmitHelper.CallDynamic(il, ClassContext.InitMemberValueMethod);
                    }
                }
            }
            //var MethodName = getMethodName(isStatic);
            //if(MethodName=="启动")
            //{
            //    //EmitHelper.CallDynamic(il, typeof(DebugHelper).GetMethod("PrintBaseDirectory"));
            //}
            FnBody.Generate(stmtContext);

            if (MethodContext.RetType != typeof(void))
            {
                il.Emit(OpCodes.Ldloc, retResult.VarBuilder);
                EmitHelper.EmitConv(il, MethodContext.RetType, retResult.DimType);
            }
            il.Emit(OpCodes.Ret);
        }
Exemple #2
0
        public override string ToCode()
        {
            FnBody.Deep = 3;
            StringBuilder buf = new StringBuilder();

            buf.AppendLine();
            buf.Append("过程:");
            buf.Append(FnName.ToCode());
            buf.AppendLine(FnBody.ToCode());
            return(buf.ToString());
        }
Exemple #3
0
        public void AnalyBody()
        {
            var symbols = MethodContext.Symbols;

            if (MethodContext.RetType != typeof(void))
            {
                retResult                = new SymbolVar("结果", MethodContext.RetType);
                retResult.IsAssigned     = true;
                retResult.LoacalVarIndex = this.MethodContext.CreateLocalVarIndex("结果");
                symbols.AddSafe(retResult);
            }
            FnBody.Method = this;
            FnBody.Analy(MethodContext);
        }
Exemple #4
0
        private FnBody ParseFnBody()
        {
            var body = new FnBody();

            var hasEq = false;
            if (Check(EQ))
            {
                hasEq = true;
                body.eq = Current;
                Advance();
            }
            
            if (hasEq && !Check(LBRACE))
            {
                body.Add(ParseExpr());
                return body;
            }

            // TODO(kai): Maybe I need a break. check this out?
            if (HasCurrent)
                body.lbrace = Current;
            Expect(LBRACE, !hasEq ? "Expected '{' to start function body when '=' is not present." :
                "Expected '{' to start function body.");

            while (HasCurrent && !Check(RBRACE))
            {
                var node = ParseTopLevel();
                if (node == null)
                    break;
                body.Add(node);
                if (Check(RBRACE))
                    break;
            }

            if (HasCurrent)
                body.rbrace = Current;
            Expect(RBRACE, "Expected '}' to end function body block.");

            return body;
        }
 /// <summary>
 /// 过滤结果
 /// </summary>
 /// <param name="flux"></param>
 /// <param name="fnBody">过滤函数的body</param>
 /// <param name="behavior"></param>
 /// <returns></returns>
 public static IFlux Filter(this IFlux flux, FnBody fnBody, SingleQuotesBehavior behavior = SingleQuotesBehavior.Replace)
 {
     return(flux.Pipe($"filter(fn: ({fnBody.ParamName}) => {fnBody})", behavior));
 }