public Object visitBoolOp(BoolOp node) throws Exception { boolopType type = node.getInternalOp(); String aVar, elseStart, end; switch (type) { case And: // a && b <-> (a._booland(b)) if a else False aVar = getUnique("a$"); elseStart = getUnique("ifElse"); end = getUnique("ifEnd"); visit(node.getInternalValues().get(0)); addLine("POP " + aVar); addLine("PUSH " + aVar); addLine("JUMPIFFALSE " + elseStart); // if a addLine("PUSH " + aVar); visit(node.getInternalValues().get(1)); addLine("BOOLAND"); addLine("JUMP " + end); addLine("LABEL " + elseStart); addLine("PUSH False"); addLine("LABEL " + end); break; case Or: // a || b <-> (a._boolor(b)) if !a else True aVar = getUnique("a$"); elseStart = getUnique("ifElse"); end = getUnique("ifEnd"); visit(node.getInternalValues().get(0)); addLine("POP " + aVar); addLine("PUSH " + aVar); addLine("NOT"); addLine("JUMPIFFALSE " + elseStart); // if !a addLine("PUSH " + aVar); visit(node.getInternalValues().get(1)); addLine("BOOLOR"); addLine("JUMP " + end); addLine("LABEL " + elseStart); addLine("PUSH True"); addLine("LABEL " + end); break; case UNDEFINED: break; } return null; }