package me.august.lumen.compile.codegen; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class Branch implements MethodCodeGen { public static Branch branchBoolean(MethodCodeGen gen, MethodCodeGen ifBranch, MethodCodeGen elseBranch) { Label label = new Label(); MethodCodeGen cond = (m, c) -> { gen.generate(m, c); m.visitJumpInsn(Opcodes.IFEQ, label); }; return new Branch(cond, label, ifBranch, elseBranch); } private MethodCodeGen cond; private Label elseJump; private MethodCodeGen ifBranch; private MethodCodeGen elseBranch; public Branch(MethodCodeGen cond, Label elseJump, MethodCodeGen ifBranch, MethodCodeGen elseBranch) { this.cond = cond; this.elseJump = elseJump; this.ifBranch = ifBranch; this.elseBranch = elseBranch; } public MethodCodeGen getCond() { return cond; } public void setCond(MethodCodeGen cond) { this.cond = cond; } public Label getElseJump() { return elseJump; } public void setElseJump(Label elseJump) { this.elseJump = elseJump; } public MethodCodeGen getIfBranch() { return ifBranch; } public void setIfBranch(MethodCodeGen ifBranch) { this.ifBranch = ifBranch; } public MethodCodeGen getElseBranch() { return elseBranch; } public void setElseBranch(MethodCodeGen elseBranch) { this.elseBranch = elseBranch; } @Override public void generate(MethodVisitor visitor, BuildContext context) { cond.generate(visitor, context); ifBranch.generate(visitor, context); Label avoidElse = null; if (elseBranch != null) { avoidElse = new Label(); visitor.visitJumpInsn(Opcodes.GOTO, avoidElse); } visitor.visitLabel(elseJump); if (elseBranch != null) { elseBranch.generate(visitor, context); visitor.visitLabel(avoidElse); } } }