public override void Emit() { SubjectExp.Emit(); EmitHelper.StormVar(IL, ListSymbol.VarBuilder); EmitHelper.LoadInt(IL, START_INDEX); EmitHelper.StormVar(IL, IndexSymbol.VarBuilder); EmitHelper.LoadVar(IL, ListSymbol.VarBuilder); EmitHelper.CallDynamic(IL, getCountMethod); EmitHelper.StormVar(IL, CountSymbol.VarBuilder); var True_Label = IL.DefineLabel(); var False_Label = IL.DefineLabel(); EmitCondition(); IL.Emit(OpCodes.Brfalse, False_Label); //定义一个标签,表示从下面开始进入循环体 IL.MarkLabel(True_Label); BodyExp.Emit(); if (ZTypeUtil.IsBool(BodyExp.RetType))//(BodyExp.RetType.SharpType != typeof(void)) { IL.Emit(OpCodes.Pop); } EmitHelper.Inc(IL, IndexSymbol.VarBuilder); EmitCondition(); IL.Emit(OpCodes.Brtrue, True_Label); IL.MarkLabel(False_Label); }
private bool CheckRetType() { if (lambdaInfo.ActionExp.RetType == null) { throw new CCException(); } else if (ZTypeUtil.IsConditionFn(lambdaInfo.FnRetType)) { if (!ZTypeUtil.IsBool(lambdaInfo.ActionExp.RetType)) { Errorf(lambdaInfo.ActionExp.Position, "结果应该是" + lambdaInfo.FnRetType.ZTypeName); return(false); } } else if (ZTypeUtil.IsAction(lambdaInfo.FnRetType)) { return(true); } return(true); }