package me.august.lumen.compile.parser.ast.expr;
import me.august.lumen.compile.codegen.BuildContext;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
public class BitwiseComplementExpr extends UnaryExpression {
public BitwiseComplementExpr(Expression operand) {
super(operand);
}
@Override
public Type expressionType() {
Type type = operand.expressionType();
if (type.getSort() <= Type.INT)
return Type.INT_TYPE;
else if (type.getSort() == Type.LONG)
return Type.LONG_TYPE;
else
return null;
}
@Override
public void generate(MethodVisitor visitor, BuildContext context) {
Type type = expressionType();
operand.generate(visitor, context);
int opcode;
if (type.getSort() == Type.INT) {
opcode = Opcodes.IXOR;
} else {
opcode = Opcodes.LXOR;
}
// load -1 (all bits set)
visitor.visitInsn(Opcodes.ICONST_M1);
// ixor or lxor, depending on expression type
visitor.visitInsn(opcode);
}
}