public void EmitBody() { var IL = this.NestedMethodContext.GetILGenerator(); List <ZCLocalVar> localList = this.NestedMethodContext.LocalManager.LocalVarList; BuilderUtil.EmitLocalVar(NestedMethodContext, false, IL, localList); //EmitLocalVar(IL, localList); ActionExp.Emit(); //if (!ZTypeUtil.IsVoid(this.RetZType)) //{ // IL.Emit(OpCodes.Ldloc_0); //} if (this.RetSymbol == null) { if (!ZTypeUtil.IsVoid(this.ActionExp.RetType)) { IL.Emit(OpCodes.Pop); } } else { EmitHelper.StormVar(IL, this.RetSymbol.VarBuilder); } IL.Emit(OpCodes.Ret); //CreateNestedType(); }
public override Exp Analy( ) { if (this.IsAnalyed) { return(this); } AnalyCorrect = true; if (LeftExp == null && RightExp != null) { ExpUnary unexp = new ExpUnary(this.ExpContext, OpToken, RightExp); var exp = unexp.Analy(); return(exp); } else if (LeftExp == null && RightExp == null) { Errorf(this.OpToken.Position, "运算符'{0}'两边缺少表达式", OpToken.Text); } OpKind = OpToken.Kind; LeftExp = AnalySubExp(LeftExp); RightExp = AnalySubExp(RightExp); if (RightExp == null) { Errorf(OpToken.Position, "运算符'{0}'右边缺少运算元素", OpToken.Text); } else { this.AnalyCorrect = this.LeftExp.AnalyCorrect && RightExp.AnalyCorrect && this.AnalyCorrect; if (LeftExp.AnalyCorrect && RightExp.AnalyCorrect) { ZType ltype = LeftExp.RetType; ZType rtype = RightExp.RetType; if (ZTypeUtil.IsVoid(ltype) || ZTypeUtil.IsVoid(rtype)) { Errorf(OpToken.Position, "没有结果的表达式无法进行'{0}'运算", OpToken.ToCode()); } else { OpMethod = ExpBinaryUtil.GetCalcMethod(OpKind, ltype, rtype); if (OpMethod != null) { RetType = ZTypeManager.GetBySharpType(OpMethod.ReturnType) as ZType; } else { Errorf(OpToken.Position, "两种类型无法进行'{0}'运算", OpToken.ToCode()); } } } else { this.RetType = ZLangBasicTypes.ZOBJECT; } } //AnalyResultLocal(); IsAnalyed = true; return(this); }
public override void Emit() { //if (Raw.CallExp.ToString().StartsWith("子弹群添加Z")) //{ // Debugr.WriteLine("StmtCall Emit 子弹群添加Z"); //} CallExp.Emit(); if (!ZTypeUtil.IsVoid(CallExp.RetType)) { IL.Emit(OpCodes.Pop); } }
public void EmitBody() { var IL = this.MethodContext.GetILGenerator(); List <ZCLocalVar> localList = this.MethodContext.LocalManager.LocalVarList; EmitLocalVar(IL, localList); Body.Emit(); if (!ZTypeUtil.IsVoid(this.RetZType)) { IL.Emit(OpCodes.Ldloc_0); } IL.Emit(OpCodes.Ret); CreateNestedType(); }