values);
values, constants);
    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...	while (done(counter,info)) {	    // create new for statement, just to replace the variable	    JForStatement newSelf		= (JForStatement)ObjectDeepCloner.deepCopy(self);	    // get unroll info for <newSelf>	    UnrollInfo newInfo = getUnrollInfo(newSelf.getInit(),					       newSelf.getCondition(),					       newSelf.getIncrement(),					       newSelf.getBody(),					       values);	    // replace induction variable with its value current value	    Hashtable newConstants = new Hashtable();	    newConstants.put(newInfo.var, new JIntLiteral(counter));	    // do the replacement	    newSelf.getBody().accept(new Propagator(newConstants));	    // add to statement list	    statementList.add(newSelf.getBody());	    // 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));	// 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);    }