package me.august.lumen.compile.parser.ast.expr; import me.august.lumen.compile.codegen.Branch; import me.august.lumen.compile.codegen.BuildContext; import me.august.lumen.compile.codegen.Conditional; import me.august.lumen.compile.codegen.MethodCodeGen; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; public class NotExpr extends UnaryExpression implements Conditional { public NotExpr(Expression operand) { super(operand); } @Override public Branch branch(MethodCodeGen ifBranch, MethodCodeGen elseBranch) { Label label = new Label(); MethodCodeGen cond = (m, c) -> { operand.generate(m, c); m.visitJumpInsn(Opcodes.IFNE, label); }; return new Branch(cond, label, ifBranch, elseBranch); } @Override public Type expressionType() { return Type.BOOLEAN_TYPE; } @Override public void generate(MethodVisitor visitor, BuildContext context) { branch(Conditional.PUSH_TRUE, Conditional.PUSH_FALSE).generate(visitor, context); } }