Fixes after integration tests
This commit is contained in:
committed by
Alexander Udalov
parent
3fa5fc7b11
commit
11af678767
@@ -161,6 +161,8 @@ public class FunctionCodegen extends ParentCodegenAware {
|
||||
new Label(),
|
||||
methodContextKind
|
||||
);
|
||||
|
||||
mv.visitEnd();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+35
-2
@@ -26,6 +26,7 @@ import org.jetbrains.org.objectweb.asm.tree.LocalVariableNode;
|
||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class OptimizationMethodVisitor extends MethodVisitor {
|
||||
private final MethodTransformer methodTransformer = new RedundantBoxingMethodTransformer(null);
|
||||
@@ -49,14 +50,46 @@ public class OptimizationMethodVisitor extends MethodVisitor {
|
||||
|
||||
@Override
|
||||
public void visitEnd() {
|
||||
// force mv to calculate maxStack/maxLocals in case it didn't yet done
|
||||
if (methodNode.maxLocals <= 0 || methodNode.maxStack <= 0) {
|
||||
mv.visitMaxs(-1, -1);
|
||||
}
|
||||
|
||||
super.visitEnd();
|
||||
|
||||
methodTransformer.transform("fake", methodNode);
|
||||
if (methodNode.instructions.size() > 0) {
|
||||
methodTransformer.transform("fake", methodNode);
|
||||
}
|
||||
|
||||
methodNode.accept(delegate);
|
||||
methodNode.accept(new EndIgnoringMethodVisitorDecorator(OptimizationUtils.API, delegate));
|
||||
|
||||
/*
|
||||
In case of empty instructions list MethodNode.accept doesn't call visitLocalVariables of delegate
|
||||
So we just do it here
|
||||
*/
|
||||
if (methodNode.instructions.size() == 0) {
|
||||
List<LocalVariableNode> localVariables = methodNode.localVariables;
|
||||
// visits local variables
|
||||
int n = localVariables == null ? 0 : localVariables.size();
|
||||
for (int i = 0; i < n; ++i) {
|
||||
localVariables.get(i).accept(delegate);
|
||||
}
|
||||
}
|
||||
|
||||
delegate.visitEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* You can use it when you need to ignore visit end
|
||||
*/
|
||||
private static class EndIgnoringMethodVisitorDecorator extends MethodVisitor {
|
||||
public EndIgnoringMethodVisitorDecorator(int api, @NotNull MethodVisitor mv) {
|
||||
super(api, mv);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitEnd() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user