package zinara.ast.instructions;
import zinara.ast.expression.BooleanExp;
import zinara.code_generator.Genx86;
import zinara.exceptions.InvalidCodeException;
import zinara.exceptions.TypeClashException;
import java.io.IOException;
public class While extends Instruction{
private BooleanExp expr;
private CodeBlock code;
public While(CodeBlock cb, BooleanExp ex){
this.code = cb;
this.expr = ex;
}
public CodeBlock getCode(){
return this.code;
}
public BooleanExp getExpression(){
return this.expr;
}
public String toString() { return "While " + expr + ": " + code + ">"; }
public void checkNoReturns(){
code.checkNoReturns();
}
public void tox86(Genx86 generator)
throws IOException,InvalidCodeException{
expr.yesLabel = generator.newLabel();
expr.noLabel = nextInst;
code.register = register;
code.nextInst = generator.newLabel();
break_label = nextInst;
continue_label = code.nextInst;
set_breaks_continues(code,break_label,continue_label);
generator.write(generator.jump(code.nextInst));
generator.writeLabel(expr.yesLabel);
code.tox86(generator);
generator.writeLabel(code.nextInst);
expr.tox86(generator);
}
}