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); }
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()); }
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); }
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)); }