package scotch.compiler.intermediate;
import static me.qmx.jitescript.util.CodegenUtils.p;
import static me.qmx.jitescript.util.CodegenUtils.sig;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import me.qmx.jitescript.CodeBlock;
import org.objectweb.asm.tree.LabelNode;
import scotch.compiler.target.BytecodeGenerator;
import scotch.runtime.Callable;
import scotch.runtime.RuntimeSupport;
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ToString
public class IntermediateConditional extends IntermediateValue {
private final IntermediateValue condition;
private final IntermediateValue whenTrue;
private final IntermediateValue whenFalse;
@Override
public CodeBlock generateBytecode(BytecodeGenerator generator) {
return new CodeBlock() {{
LabelNode falseBranch = new LabelNode();
LabelNode end = new LabelNode();
append(condition.generateBytecode(generator));
invokestatic(p(RuntimeSupport.class), "unboxBool", sig(boolean.class, Callable.class));
iffalse(falseBranch);
append(whenTrue.generateBytecode(generator));
go_to(end);
label(falseBranch);
append(whenFalse.generateBytecode(generator));
label(end);
}};
}
}