diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstBinExprLogicalCondition.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstBinExprLogicalCondition.java index 1b411da..5190e9b 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstBinExprLogicalCondition.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstBinExprLogicalCondition.java @@ -53,18 +53,18 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) { if (!isLeftLogical) { methodVisitor.visitJumpInsn(opcodeCompareFalse, labelFalse); } - if (!isTopBinExpr() && isRightLogical) { + if (labelSwitched && isRightLogical) { right.as(Ts2JavaAstBinExprLogical.class).setLabelSwitched(true); } sizes.add(right.apply(methodVisitor, context)); if (!isRightLogical) { - methodVisitor.visitJumpInsn(opcodeCompareFalse, labelFalse); + methodVisitor.visitJumpInsn(opcodeCompareFalse, labelSwitched ? labelTrue : labelFalse); + } + if (labelSwitched && isLeftLogical) { + Ts2JavaAstBinExprLogical leftLogical = left.as(Ts2JavaAstBinExprLogical.class); + methodVisitor.visitLabel(leftLogical.getLabelFalse()); + methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); } -// if (!isTopBinExpr() && isLeftLogical) { -// Ts2JavaAstBinExprLogical leftLogical = left.as(Ts2JavaAstBinExprLogical.class); -// methodVisitor.visitLabel(labelFalse); -// methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); -// } break; } case LogicalOr: { diff --git a/src/test/java/com/caoccao/javet/buddy/ts2java/ast/expr/TestTs2JavaAstBinExprLogicalCondition.java b/src/test/java/com/caoccao/javet/buddy/ts2java/ast/expr/TestTs2JavaAstBinExprLogicalCondition.java index aaf1985..6dd2af4 100644 --- a/src/test/java/com/caoccao/javet/buddy/ts2java/ast/expr/TestTs2JavaAstBinExprLogicalCondition.java +++ b/src/test/java/com/caoccao/javet/buddy/ts2java/ast/expr/TestTs2JavaAstBinExprLogicalCondition.java @@ -338,9 +338,8 @@ public boolean not_LogicalAnd_ZZ_Z(boolean a, boolean b) { return !(a || b); } -// @Test + @Test public void testLogicalAndOrAnd_II_Z() throws Exception { - enableLogging(); assertTrue(logicalAndOrAnd_II_Z(2, 2)); assertFalse(logicalAndOrAnd_II_Z(1, 1)); assertTrue(logicalAndOrAnd_II_Z(1, 2));