diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java index e1ded1b..8b70c43 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java @@ -21,6 +21,7 @@ import com.caoccao.javet.buddy.ts2java.compiler.JavaFunctionContext; import com.caoccao.javet.swc4j.ast.expr.Swc4jAstBinExpr; import com.caoccao.javet.swc4j.ast.expr.Swc4jAstIdent; +import com.caoccao.javet.swc4j.ast.interfaces.ISwc4jAstExpr; import com.caoccao.javet.utils.SimpleFreeMarkerFormat; import com.caoccao.javet.utils.SimpleMap; import net.bytebuddy.implementation.Implementation; @@ -28,26 +29,25 @@ import net.bytebuddy.jar.asm.MethodVisitor; import net.bytebuddy.jar.asm.Opcodes; -import java.util.stream.Stream; - public final class Ts2JavaAstBinExpr implements ITs2JavaAstStackManipulation { @Override public void manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast) { StackManipulation stackManipulation = new StackManipulation.Simple(( MethodVisitor methodVisitor, Implementation.Context implementationContext) -> { - Stream.of(ast.getLeft(), ast.getRight()).forEach(expr -> { + int stackSize = 0; + for (ISwc4jAstExpr expr : new ISwc4jAstExpr[]{ast.getLeft(), ast.getRight()}) { switch (expr.getType()) { case Ident: String name = Ts2JavaAstIdent.getSym(expr.as(Swc4jAstIdent.class)); - JavaByteCodeOpLoad.generateByteCode(functionContext, name, methodVisitor); + stackSize += JavaByteCodeOpLoad.generate(functionContext, name, methodVisitor); break; default: throw new Ts2JavaException( SimpleFreeMarkerFormat.format("BinExpr expr type ${exprType} is not supported", SimpleMap.of("exprType", expr.getType().name()))); } - }); + } switch (ast.getOp()) { case Add: methodVisitor.visitInsn(Opcodes.IADD); @@ -57,7 +57,7 @@ public void manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast) SimpleFreeMarkerFormat.format("BinExpr op ${op} is not supported", SimpleMap.of("op", ast.getOp().name()))); } - return new StackManipulation.Size(2, 0); + return new StackManipulation.Size(stackSize, 0); }); functionContext.getStackManipulations().add(stackManipulation); } diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaByteCodeOpLoad.java b/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaByteCodeOpLoad.java index f22f585..ef016c6 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaByteCodeOpLoad.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaByteCodeOpLoad.java @@ -42,7 +42,7 @@ public final class JavaByteCodeOpLoad { private JavaByteCodeOpLoad() { } - public static void generateByteCode(JavaFunctionContext functionContext, String name, MethodVisitor methodVisitor) { + public static int generate(JavaFunctionContext functionContext, String name, MethodVisitor methodVisitor) { final int size = functionContext.getStackFrames().size(); JavaStackObject stackObject = null; int stackFrameIndex = 0; @@ -62,5 +62,6 @@ public static void generateByteCode(JavaFunctionContext functionContext, String int stackDepth = functionContext.getStackDepth(stackFrameIndex - 1); int index = stackDepth + stackObject.getIndex() + 1; methodVisitor.visitVarInsn(opCode, index); + return 1; } }