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(),
|
new Label(),
|
||||||
methodContextKind
|
methodContextKind
|
||||||
);
|
);
|
||||||
|
|
||||||
|
mv.visitEnd();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+35
-2
@@ -26,6 +26,7 @@ import org.jetbrains.org.objectweb.asm.tree.LocalVariableNode;
|
|||||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
|
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class OptimizationMethodVisitor extends MethodVisitor {
|
public class OptimizationMethodVisitor extends MethodVisitor {
|
||||||
private final MethodTransformer methodTransformer = new RedundantBoxingMethodTransformer(null);
|
private final MethodTransformer methodTransformer = new RedundantBoxingMethodTransformer(null);
|
||||||
@@ -49,14 +50,46 @@ public class OptimizationMethodVisitor extends MethodVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitEnd() {
|
public void visitEnd() {
|
||||||
|
// force mv to calculate maxStack/maxLocals in case it didn't yet done
|
||||||
if (methodNode.maxLocals <= 0 || methodNode.maxStack <= 0) {
|
if (methodNode.maxLocals <= 0 || methodNode.maxStack <= 0) {
|
||||||
mv.visitMaxs(-1, -1);
|
mv.visitMaxs(-1, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.visitEnd();
|
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