From c71d9796a21a84424e072bd06dbd7e37c1de27de Mon Sep 17 00:00:00 2001 From: svtk Date: Mon, 7 Nov 2011 18:49:30 +0400 Subject: [PATCH] improved processing of local declarations in cfg construction --- .../cfg/JetControlFlowGraphTraverser.java | 5 +- .../jet/lang/cfg/JetControlFlowProcessor.java | 28 +- .../lang/cfg/JetFlowInformationProvider.java | 21 +- .../jet/lang/cfg/pseudocode/Pseudocode.java | 20 +- compiler/testData/cfg/Basic.instructions | 34 +- compiler/testData/cfg/Finally.instructions | 170 ++++---- compiler/testData/cfg/Finally.jet | 20 +- .../cfg/LocalDeclarations.instructions | 402 ++++++++++++++++++ compiler/testData/cfg/LocalDeclarations.jet | 77 ++++ .../UninitializedOrReassignedVariables.jet | 40 +- .../jetbrains/jet/cfg/JetControlFlowTest.java | 7 +- 11 files changed, 662 insertions(+), 162 deletions(-) create mode 100644 compiler/testData/cfg/LocalDeclarations.instructions create mode 100644 compiler/testData/cfg/LocalDeclarations.jet 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