Ejemplo n.º 1
0
        public override void VisitForIn(ASTForIn n)
        {
            //define the block scope now to incapsulate the declared variable.
            BeginForLoopBlock();

            n.Lower.CFlatType = CheckSubTree(n.Lower);
            n.Upper.CFlatType = CheckSubTree(n.Upper);

            if (n.Lower.CFlatType is TypeInt && n.Upper.CFlatType is TypeInt)
            {
                //check if the temp variable has been assigned.
                if (!_scopeMgr.HasSymbol(n.TempVariable.ID))
                {
                    //we're good
                    _scopeMgr.AddLocal(n.TempVariable.ID, new TypeInt(), _currentMethod);

                    CheckSubTree(n.Body);
                }
                else
                {
                    ReportError(n.Location, "ID '{0}' has already been assigned.", n.TempVariable.ID);
                }
            }
            else
            {
                ReportError(n.Location, "Bounds of the for in loop must be integers. Got types '{0}' and '{1}'.", TypeToFriendlyName(n.Lower.CFlatType), TypeToFriendlyName(n.Upper.CFlatType));
            }
        }
Ejemplo n.º 2
0
        public override void VisitForIn(ASTForIn n)
        {
            throw new NotImplementedException();

            /*
             * //define labels
             * Label loop = _gen.DefineLabel();
             * Label exit = _gen.DefineLabel();
             *
             * //evaluate lower
             * n.Lower.Visit(this);
             *
             * LocalBuilder lb = _gen.DeclareLocal(typeof(int));
             *
             * //store temp variable
             * StoreLocal(n.TempVariable.ID, lb.LocalIndex);
             *
             * //loop label
             * _gen.MarkLabel(loop);
             *
             * //load value into temp variable - set type so _typeManager.LookupCilType()
             * //doesn't get confused
             * n.TempVariable.CFlatType = new TypeInt();
             * n.TempVariable.Visit(this);
             *
             * //visit upper bound
             * n.Upper.Visit(this);
             *
             * _gen.Emit(OpCodes.Cgt);
             *
             * //break on true
             * _gen.Emit(OpCodes.Brtrue, exit);
             *
             * //emit body of loop
             * n.Body.Visit(this);
             *
             * n.TempVariable.Visit(this);
             * _gen.Emit(OpCodes.Ldc_I4_1);
             * _gen.Emit(OpCodes.Add);
             *
             * StoreLocal(n.TempVariable.ID, lb.LocalIndex);
             *
             * //unconditional loop branch
             * _gen.Emit(OpCodes.Br, loop);
             *
             * //break label
             * _gen.MarkLabel(exit);*/
        }