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)); } }
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);*/ }