Fixes after integration tests

This commit is contained in:
Denis Zharkov
2014-06-25 18:06:55 +04:00
committed by Alexander Udalov
parent 3fa5fc7b11
commit 11af678767
2 changed files with 37 additions and 2 deletions
@@ -161,6 +161,8 @@ public class FunctionCodegen extends ParentCodegenAware {
new Label(),
methodContextKind
);
mv.visitEnd();
return;
}
@@ -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() {
}
}
}