diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java index 5dbd9032499..75c4e510c95 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java @@ -18,14 +18,16 @@ import java.util.Map; */ public class JetControlFlowGraphTraverser { private final Pseudocode pseudocode; + private final boolean lookInside; private final Map> dataMap = Maps.newLinkedHashMap(); - public static JetControlFlowGraphTraverser create(Pseudocode pseudocode) { - return new JetControlFlowGraphTraverser(pseudocode); + public static JetControlFlowGraphTraverser create(Pseudocode pseudocode, boolean lookInside) { + return new JetControlFlowGraphTraverser(pseudocode, lookInside); } - private JetControlFlowGraphTraverser(Pseudocode pseudocode) { + private JetControlFlowGraphTraverser(Pseudocode pseudocode, boolean lookInside) { this.pseudocode = pseudocode; + this.lookInside = lookInside; } public void collectInformationFromInstructionGraph( @@ -51,7 +53,7 @@ public class JetControlFlowGraphTraverser { Pair initialPair = Pair.create(initialDataValue, initialDataValue); for (Instruction instruction : instructions) { dataMap.put(instruction, initialPair); - if (instruction instanceof LocalDeclarationInstruction) { + if (lookInside && instruction instanceof LocalDeclarationInstruction) { initializeDataMap(((LocalDeclarationInstruction) instruction).getBody(), initialDataValue); } } @@ -82,7 +84,7 @@ public class JetControlFlowGraphTraverser { allPreviousInstructions = previousInstructions; } - if (instruction instanceof LocalDeclarationInstruction) { + if (lookInside && instruction instanceof LocalDeclarationInstruction) { Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody(); traverseSubGraph(subroutinePseudocode, instructionsMergeStrategy, previousInstructions, straightDirection, changed, true); } @@ -111,11 +113,11 @@ public class JetControlFlowGraphTraverser { InstructionDataAnalyzeStrategy instructionDataAnalyzeStrategy) { List instructions = pseudocode.getInstructions(); for (Instruction instruction : instructions) { - if (((InstructionImpl)instruction).isDead()) continue; - if (instruction instanceof LocalDeclarationInstruction) { + if (instruction.isDead()) continue; + Pair pair = dataMap.get(instruction); + if (lookInside && instruction instanceof LocalDeclarationInstruction) { traverseAndAnalyzeInstructionGraph(((LocalDeclarationInstruction) instruction).getBody(), instructionDataAnalyzeStrategy); } - Pair pair = dataMap.get(instruction); instructionDataAnalyzeStrategy.execute(instruction, pair != null ? pair.getFirst() : null, pair != null ? pair.getSecond() : null); @@ -123,7 +125,7 @@ public class JetControlFlowGraphTraverser { } public D getResultInfo() { - return dataMap.get(pseudocode.getExitInstruction()).getFirst(); + return dataMap.get(pseudocode.getSinkInstruction()).getFirst(); } interface InstructionsMergeStrategy { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index fa05e1cd24f..1ab8c1369c8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -733,36 +733,47 @@ public class JetControlFlowProcessor { @Override public void visitObjectLiteralExpression(JetObjectLiteralExpression expression) { - value(expression.getObjectDeclaration(), inCondition); + JetObjectDeclaration declaration = expression.getObjectDeclaration(); + value(declaration, inCondition); + + List declarations = declaration.getDeclarations(); + List functions = Lists.newArrayList(); + for (JetDeclaration localDeclaration : declarations) { + if (!(localDeclaration instanceof JetProperty) && !(localDeclaration instanceof JetClassInitializer)) { + functions.add(localDeclaration); + } + } + Queue