public override INode DoResolve(ResolveContext rc) { Label lb = rc.DefineLabel(LabelType.IF); ExitIf = rc.DefineLabel(lb.Name + "_EXIT"); Else = rc.DefineLabel(lb.Name + "_ELSE"); ParentIf = rc.EnclosingIf; rc.EnclosingIf = this; rc.CreateNewState(); rc.CurrentGlobalScope |= ResolveScopes.If; // enter if Expression = (Expression)Expression.DoResolve(rc); TrueStatement = (Statement)TrueStatement.DoResolve(rc); FalseStatement = (Statement)FalseStatement.DoResolve(rc); if (Expression.IsVoid) { ResolveContext.Report.Error(3, Location, "cannot evaluate void type in if statement"); } rc.RestoreOldState(); // exit current if rc.EnclosingIf = ParentIf; return(base.DoResolve(rc)); }
public override INode DoResolve(ResolveContext rc) { rc.CreateNewState(); rc.CurrentGlobalScope |= ResolveScopes.Loop; Label lb = rc.DefineLabel(LabelType.WHILE); ExitLoop = rc.DefineLabel(lb.Name + "_EXIT"); LoopCondition = rc.DefineLabel(lb.Name + "_COND"); EnterLoop = rc.DefineLabel(lb.Name + "_ENTER"); ParentLoop = rc.EnclosingLoop; // enter loop Expression = (Expression)Expression.DoResolve(rc); Statement = (Statement)Statement.DoResolve(rc); if (Expression.IsVoid) { ResolveContext.Report.Error(104, Location, "cannot evaluate void type in while statement"); } if (Expression is IntegralExpression && (Expression as IntegralExpression).Value != 0) { ResolveContext.Report.Warning(Location, "Infinite loop"); } rc.RestoreOldState(); // exit current loop rc.EnclosingLoop = ParentLoop; return(base.DoResolve(rc)); }