while (done(counter,info)) {
while (LoopIterInfo.inRange(counter,info)) {
    private JBlock doUnroll(UnrollInfo info, JForStatement self) {        // make a list of statements        List statementList = new LinkedList();        statementList.add(self.getInit());        // get the initial value of the counter        int counter = info.initVal;        // simulate execution of the loop...        Propagator prop=new Propagator(new Hashtable());        while (done(counter,info)) {            // replace induction variable with its value current value            prop.getConstants().put(info.var, new JIntLiteral(counter));            // do the replacement            JStatement newBody =                (JStatement)ObjectDeepCloner.deepCopy(self.getBody());            newBody.accept(prop);            // add to statement list            statementList.add(newBody);            // increment counter            counter = incrementCounter(counter, info);        }        statementList.add(new JExpressionStatement(self.getTokenReference(),new JAssignmentExpression(self.getTokenReference(),new JLocalVariableExpression(self.getTokenReference(),info.var),new JIntLiteral(counter)),null));        /*  Hashtable cons=prop.getConstants();            Enumeration enum=prop.getChanged().keys();            while(enum.hasMoreElements()) {            JLocalVariable var=(JLocalVariable)enum.nextElement();            Object val=cons.get(var);            if(val instanceof JLiteral)            statementList.add(new JExpressionStatement(null,new JAssignmentExpression(null,new JLocalVariableExpression(null,var),(JLiteral)val),null));            System.err.println(var+"="+val);            }*/        // mark that we've unrolled        this.hasUnrolled = true;        // return new block instead of the for loop        constants.remove(info.var);        return new JBlock(null,                           (JStatement[])statementList.                          toArray(new JStatement[0]),                          null);    }