Skip to content

Commit

Permalink
🦄 refactor: Calculate stack size instead of hardcode
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Oct 26, 2024
1 parent ecc888e commit fe59f33
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,33 @@
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;
import net.bytebuddy.implementation.bytecode.StackManipulation;
import net.bytebuddy.jar.asm.MethodVisitor;
import net.bytebuddy.jar.asm.Opcodes;

import java.util.stream.Stream;

public final class Ts2JavaAstBinExpr implements ITs2JavaAstStackManipulation<Swc4jAstBinExpr> {
@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);
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
}

0 comments on commit fe59f33

Please sign in to comment.