diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index ff546c6a750..93bf99c889c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -174,7 +174,9 @@ public class FunctionCodegen extends GenerationStateAware { genNotNullAssertionsForParameters(new InstructionAdapter(mv), state, functionDescriptor, frameMap); - strategy.generateBody(mv, signature, context, localVariableNames, frameMap); + strategy.generateBody(mv, signature, context, frameMap); + + localVariableNames.addAll(strategy.getLocalVariableNames()); } Label methodEnd = new Label(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionGenerationStrategy.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionGenerationStrategy.java index df5d8910d60..c7fe204b797 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionGenerationStrategy.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionGenerationStrategy.java @@ -23,18 +23,28 @@ import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.lang.psi.JetDeclarationWithBody; +import java.util.ArrayList; import java.util.Collection; public abstract class FunctionGenerationStrategy { + private final Collection localVariableNames = new ArrayList(); public abstract void generateBody( @NotNull MethodVisitor mv, @NotNull JvmMethodSignature signature, @NotNull MethodContext context, - @NotNull Collection localVariableNames, @NotNull FrameMap frameMap ); + protected void addLocalVariableName(@NotNull String name) { + localVariableNames.add(name); + } + + @NotNull + public Collection getLocalVariableNames() { + return localVariableNames; + } + public static class Default extends FunctionGenerationStrategy { private final GenerationState state; @@ -50,14 +60,15 @@ public abstract class FunctionGenerationStrategy { @NotNull MethodVisitor mv, @NotNull JvmMethodSignature signature, @NotNull MethodContext context, - @NotNull Collection localVariableNames, @NotNull FrameMap frameMap ) { ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, signature.getAsmMethod().getReturnType(), context, state); codegen.returnExpression(declaration.getBodyExpression()); - localVariableNames.addAll(codegen.getLocalVariableNamesForExpression()); + for (String name : codegen.getLocalVariableNamesForExpression()) { + addLocalVariableName(name); + } } } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index aa56723536c..a0f22584982 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -685,7 +685,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @NotNull MethodVisitor mv, @NotNull JvmMethodSignature signature, @NotNull MethodContext context, - @NotNull Collection localVariableNames, @NotNull FrameMap frameMap ) { InstructionAdapter iv = new InstructionAdapter(mv); @@ -711,7 +710,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @NotNull MethodVisitor mv, @NotNull JvmMethodSignature signature, @NotNull MethodContext context, - @NotNull Collection localVariableNames, @NotNull FrameMap frameMap ) { InstructionAdapter iv = new InstructionAdapter(mv); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index a64e5503c37..4bcd2b04912 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -183,7 +183,6 @@ public class PropertyCodegen extends GenerationStateAware { @NotNull MethodVisitor mv, @NotNull JvmMethodSignature signature, @NotNull MethodContext context, - @NotNull Collection localVariableNames, @NotNull FrameMap frameMap ) { generateDefaultAccessor(descriptor, new InstructionAdapter(mv), typeMapper, context);