From 11af678767db3d20e8e9a6f179b256e05fc85779 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 25 Jun 2014 18:06:55 +0400 Subject: [PATCH] Fixes after integration tests --- .../jet/codegen/FunctionCodegen.java | 2 + .../OptimizationMethodVisitor.java | 37 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 64ee59d8fbb..51f3d23a507 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -161,6 +161,8 @@ public class FunctionCodegen extends ParentCodegenAware { new Label(), methodContextKind ); + + mv.visitEnd(); return; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/optimization/OptimizationMethodVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/optimization/OptimizationMethodVisitor.java index 5a8366dc834..1495746f910 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/optimization/OptimizationMethodVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/optimization/OptimizationMethodVisitor.java @@ -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 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() { + + } } }