Skip to content

Commit

Permalink
🦄 refactor: Redesign ast 43
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Dec 9, 2024
1 parent f0c816a commit 4b4fb90
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public abstract class Ts2JavaAstBinExprLogical extends Ts2JavaAstBinExpr
implements ITs2JavaBangFlippable {
protected boolean bangFlipped;
protected Label labelFalse;
protected boolean labelSwitched;
protected Label labelTrue;

protected Ts2JavaAstBinExprLogical(
Expand All @@ -40,20 +41,13 @@ protected Ts2JavaAstBinExprLogical(
bangFlipped = false;
labelFalse = new Label();
labelTrue = new Label();
labelSwitched = false;
type = TypeDescription.ForLoadedType.of(boolean.class);
}

@Override
public void flipBang() {
if (isBangFlippable()) {
bangFlipped = !bangFlipped;
if (left instanceof ITs2JavaBangFlippable) {
left.as(ITs2JavaBangFlippable.class).flipBang();
}
if (right instanceof ITs2JavaBangFlippable) {
right.as(ITs2JavaBangFlippable.class).flipBang();
}
}
bangFlipped = !bangFlipped;
}

public Label getLabelFalse() {
Expand All @@ -73,6 +67,10 @@ public boolean isBangFlipped() {
return bangFlipped;
}

public boolean isLabelSwitched() {
return labelSwitched;
}

public abstract boolean isLabelTrueRequired();

protected Size logicalClose(MethodVisitor methodVisitor) {
Expand Down Expand Up @@ -103,4 +101,8 @@ public Ts2JavaAstBinExprLogical setLabelTrue(Label labelTrue) {
this.labelTrue = labelTrue;
return this;
}

public void switchLabel() {
labelSwitched = !labelSwitched;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@

import com.caoccao.javet.buddy.ts2java.ast.enums.Ts2JavaAstBinaryOp;
import com.caoccao.javet.buddy.ts2java.ast.interfaces.ITs2JavaAst;
import com.caoccao.javet.buddy.ts2java.ast.interfaces.abilities.ITs2JavaBangFlippable;
import com.caoccao.javet.buddy.ts2java.ast.memo.Ts2JavaMemoFunction;
import com.caoccao.javet.buddy.ts2java.compiler.JavaClassCast;
import com.caoccao.javet.swc4j.ast.enums.Swc4jAstBinaryOp;
import com.caoccao.javet.swc4j.ast.expr.Swc4jAstBinExpr;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.implementation.bytecode.StackManipulation;
import net.bytebuddy.jar.asm.Label;
import net.bytebuddy.jar.asm.MethodVisitor;

import java.util.ArrayList;
Expand Down Expand Up @@ -58,12 +60,24 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) {
.map(s -> s.apply(methodVisitor, context))
.orElse(Size.ZERO));
final Swc4jAstBinaryOp finalOp = bangFlipped ? op.getOppositeOperator() : op;
sizes.add(Ts2JavaAstBinaryOp.getLogicalCompareStackManipulation(ast, finalOp, upCastType, labelFalse)
final Label label = labelSwitched ? labelTrue : labelFalse;
sizes.add(Ts2JavaAstBinaryOp.getLogicalCompareStackManipulation(ast, finalOp, upCastType, label)
.apply(methodVisitor, context));
sizes.add(logicalClose(methodVisitor));
return aggregateSize(sizes);
}

@Override
public void flipBang() {
super.flipBang();
if (left instanceof ITs2JavaBangFlippable) {
left.as(ITs2JavaBangFlippable.class).flipBang();
}
if (right instanceof ITs2JavaBangFlippable) {
right.as(ITs2JavaBangFlippable.class).flipBang();
}
}

@Override
public boolean isLabelTrueRequired() {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.caoccao.javet.buddy.ts2java.ast.expr;

import com.caoccao.javet.buddy.ts2java.ast.interfaces.ITs2JavaAst;
import com.caoccao.javet.buddy.ts2java.ast.interfaces.abilities.ITs2JavaBangFlippable;
import com.caoccao.javet.buddy.ts2java.ast.memo.Ts2JavaMemoFunction;
import com.caoccao.javet.buddy.ts2java.exceptions.Ts2JavaAstException;
import com.caoccao.javet.swc4j.ast.enums.Swc4jAstBinaryOp;
Expand Down Expand Up @@ -46,19 +47,19 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) {
final Swc4jAstBinaryOp finalOp = bangFlipped ? op.getOppositeOperator() : op;
final boolean isLeftLogical = left instanceof Ts2JavaAstBinExprLogical;
final boolean isRightLogical = right instanceof Ts2JavaAstBinExprLogical;
if (isLeftLogical) {
left.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelSwitched ? labelFalse : labelTrue)
.setLabelFalse(labelSwitched ? labelTrue : labelFalse);
}
if (isRightLogical) {
right.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelTrue)
.setLabelFalse(labelFalse);
.setLabelTrue(labelSwitched ? labelFalse : labelTrue)
.setLabelFalse(labelSwitched ? labelTrue : labelFalse);
}
final int opcodeCompareFalse = bangFlipped ? Opcodes.IFNE : Opcodes.IFEQ;
switch (finalOp) {
case LogicalAnd: {
if (isLeftLogical) {
left.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelTrue)
.setLabelFalse(labelFalse);
}
sizes.add(left.apply(methodVisitor, context));
if (!isLeftLogical) {
methodVisitor.visitJumpInsn(opcodeCompareFalse, labelFalse);
Expand All @@ -71,9 +72,7 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) {
}
case LogicalOr: {
if (isLeftLogical) {
left.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelFalse)
.setLabelFalse(labelTrue);
left.as(Ts2JavaAstBinExprLogical.class).switchLabel();
}
final int opcodeCompareTrue = bangFlipped ? Opcodes.IFEQ : Opcodes.IFNE;
sizes.add(left.apply(methodVisitor, context));
Expand Down Expand Up @@ -125,10 +124,8 @@ public void compile() {
@Override
public void flipBang() {
super.flipBang();
if (isBangFlippable()) {
if (left instanceof Ts2JavaAstBinExprLogical) {
left.as(Ts2JavaAstBinExprLogical.class).flipBang();
}
if (right instanceof ITs2JavaBangFlippable) {
right.as(ITs2JavaBangFlippable.class).flipBang();
}
}

Expand Down

0 comments on commit 4b4fb90

Please sign in to comment.