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 75c4e510c95..05171e2ad95 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java @@ -93,7 +93,10 @@ public class JetControlFlowGraphTraverser { Collection incomingEdgesData = Sets.newHashSet(); for (Instruction previousInstruction : allPreviousInstructions) { - incomingEdgesData.add(dataMap.get(previousInstruction).getSecond()); + Pair previousData = dataMap.get(previousInstruction); + if (previousData != null) { + incomingEdgesData.add(previousData.getSecond()); + } } Pair mergedData = instructionsMergeStrategy.execute(instruction, incomingEdgesData); if (!mergedData.equals(previousDataValue)) { 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 430ab186fdc..0a32419c9a2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -22,6 +22,7 @@ import static org.jetbrains.jet.lang.diagnostics.Errors.*; /** * @author abreslav +* @author svtk */ public class JetControlFlowProcessor { @@ -547,7 +548,10 @@ public class JetControlFlowProcessor { public void visitNamedFunction(JetNamedFunction function) { JetExpression bodyExpression = function.getBodyExpression(); if (bodyExpression != null) { + Label afterFunctionLabel = builder.createUnboundLabel(); + builder.nondeterministicJump(afterFunctionLabel); generate(function, bodyExpression); + builder.bindLabel(afterFunctionLabel); } } @@ -557,7 +561,10 @@ public class JetControlFlowProcessor { JetBlockExpression bodyExpression = functionLiteral.getBodyExpression(); if (bodyExpression != null) { List statements = bodyExpression.getStatements(); + Label afterFunctionLiteralLabel = builder.createUnboundLabel(); + builder.nondeterministicJump(afterFunctionLiteralLabel); generateSubroutineControlFlow(functionLiteral, statements); + builder.bindLabel(afterFunctionLiteralLabel); } builder.read(expression); } @@ -744,28 +751,9 @@ public class JetControlFlowProcessor { functions.add(localDeclaration); } } - Queue