コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: ExpNewLambda.cs プロジェクト: pyzh/ZLanguage3
 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);
 }