From 4a4e237539e243d5efabe84cbd4ae880f197dd47 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Mon, 24 Feb 2014 14:16:53 +0400 Subject: [PATCH] made PseudocodeVariableDataCollector know about variables (not about abstract data) --- .../cfg/PseudocodeVariableDataCollector.java | 56 +++++++++---------- .../jet/lang/cfg/PseudocodeVariablesData.java | 32 +++++------ 2 files changed, 41 insertions(+), 47 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.java index 4748353c033..8f4efc98e2a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.java @@ -23,12 +23,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.cfg.pseudocode.Instruction; import org.jetbrains.jet.lang.cfg.pseudocode.LocalFunctionDeclarationInstruction; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; +import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; public class PseudocodeVariableDataCollector extends PseudocodeTraverser { private final BindingContext bindingContext; @@ -37,39 +35,37 @@ public class PseudocodeVariableDataCollector extends PseudocodeTraverser { bindingContext = context; } - public Map> collectData( + public Map>> collectData( @NotNull Pseudocode pseudocode, @NotNull TraversalOrder traversalOrder, - @NotNull LookInsideStrategy lookInside, - @NotNull D initialDataValue, - @NotNull D initialDataValueForEnterInstruction, - @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy + @NotNull InstructionDataMergeStrategy> instructionDataMergeStrategy ) { - - Map> edgesMap = Maps.newLinkedHashMap(); - initializeEdgesMap(pseudocode, lookInside, edgesMap, initialDataValue); - edgesMap.put(getStartInstruction(pseudocode, traversalOrder), Edges.create(initialDataValueForEnterInstruction, initialDataValueForEnterInstruction)); + Map initialDataValue = Collections.emptyMap(); + Map>> edgesMap = Maps.newLinkedHashMap(); + initializeEdgesMap(pseudocode, edgesMap, initialDataValue); + edgesMap.put(getStartInstruction(pseudocode, traversalOrder), Edges.create(initialDataValue, initialDataValue)); boolean[] changed = new boolean[1]; changed[0] = true; while (changed[0]) { changed[0] = false; - collectDataFromSubgraph(pseudocode, traversalOrder, lookInside, edgesMap, instructionDataMergeStrategy, - Collections.emptyList(), changed, false); + collectDataFromSubgraph(pseudocode, traversalOrder, LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS, edgesMap, + instructionDataMergeStrategy, Collections.emptyList(), changed, false); } return edgesMap; } - private void initializeEdgesMap( - @NotNull Pseudocode pseudocode, LookInsideStrategy lookInside, - @NotNull Map> edgesMap, - @NotNull D initialDataValue) { + private static void initializeEdgesMap( + @NotNull Pseudocode pseudocode, + @NotNull Map> edgesMap, + @NotNull M initialDataValue + ) { List instructions = pseudocode.getInstructions(); - Edges initialEdge = Edges.create(initialDataValue, initialDataValue); + Edges initialEdge = Edges.create(initialDataValue, initialDataValue); for (Instruction instruction : instructions) { edgesMap.put(instruction, initialEdge); - if (shouldLookInside(instruction, lookInside)) { - initializeEdgesMap(((LocalFunctionDeclarationInstruction) instruction).getBody(), lookInside, edgesMap, initialDataValue); + if (shouldLookInside(instruction, LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS)) { + initializeEdgesMap(((LocalFunctionDeclarationInstruction) instruction).getBody(), edgesMap, initialDataValue); } } } @@ -78,8 +74,8 @@ public class PseudocodeVariableDataCollector extends PseudocodeTraverser { @NotNull Pseudocode pseudocode, @NotNull TraversalOrder traversalOrder, @NotNull LookInsideStrategy lookInside, - @NotNull Map> edgesMap, - @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy, + @NotNull Map>> edgesMap, + @NotNull InstructionDataMergeStrategy> instructionDataMergeStrategy, @NotNull Collection previousSubGraphInstructions, boolean[] changed, boolean isLocal @@ -109,25 +105,25 @@ public class PseudocodeVariableDataCollector extends PseudocodeTraverser { previousInstructions, changed, true); Instruction lastInstruction = getLastInstruction(subroutinePseudocode, traversalOrder); - Edges previousValue = edgesMap.get(instruction); - Edges newValue = edgesMap.get(lastInstruction); + Edges> previousValue = edgesMap.get(instruction); + Edges> newValue = edgesMap.get(lastInstruction); if (!previousValue.equals(newValue)) { changed[0] = true; edgesMap.put(instruction, newValue); } continue; } - Edges previousDataValue = edgesMap.get(instruction); + Edges> previousDataValue = edgesMap.get(instruction); - Collection incomingEdgesData = Sets.newHashSet(); + Collection> incomingEdgesData = Sets.newHashSet(); for (Instruction previousInstruction : allPreviousInstructions) { - Edges previousData = edgesMap.get(previousInstruction); + Edges> previousData = edgesMap.get(previousInstruction); if (previousData != null) { incomingEdgesData.add(previousData.out); } } - Edges mergedData = instructionDataMergeStrategy.execute(instruction, incomingEdgesData); + Edges> mergedData = instructionDataMergeStrategy.execute(instruction, incomingEdgesData); if (!mergedData.equals(previousDataValue)) { changed[0] = true; edgesMap.put(instruction, mergedData); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java index 19c564fba43..9931c530c7f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java @@ -20,16 +20,21 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.cfg.PseudocodeTraverser.*; +import org.jetbrains.jet.lang.cfg.PseudocodeTraverser.Edges; +import org.jetbrains.jet.lang.cfg.PseudocodeTraverser.InstructionAnalyzeStrategy; +import org.jetbrains.jet.lang.cfg.PseudocodeTraverser.InstructionDataMergeStrategy; import org.jetbrains.jet.lang.cfg.pseudocode.*; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.resolve.BindingContext; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; -import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS; import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.BACKWARD; import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.FORWARD; @@ -129,9 +134,9 @@ public class PseudocodeVariablesData { private Map>> getVariableInitializers(@NotNull Pseudocode pseudocode) { final Set declaredVariables = getDeclaredVariables(pseudocode, true); - Map initialMap = Collections.emptyMap(); - InstructionDataMergeStrategy> instructionDataMergeStrategy = + return new PseudocodeVariableDataCollector(bindingContext).collectData( + pseudocode, FORWARD, new InstructionDataMergeStrategy>() { @Override public Edges> execute( @@ -145,11 +150,7 @@ public class PseudocodeVariablesData { addVariableInitStateFromCurrentInstructionIfAny(instruction, enterInstructionData, declaredVariables); return Edges.create(enterInstructionData, exitInstructionData); } - }; - - return new PseudocodeVariableDataCollector(bindingContext).collectData( - pseudocode, FORWARD, ANALYSE_LOCAL_DECLARATIONS, - initialMap, initialMap, instructionDataMergeStrategy); + }); } public static VariableInitState getDefaultValueForInitializers( @@ -228,8 +229,8 @@ public class PseudocodeVariablesData { @NotNull public Map>> getVariableUseStatusData() { - Map sinkInstructionData = Maps.newHashMap(); - InstructionDataMergeStrategy> collectVariableUseStatusStrategy = + return new PseudocodeVariableDataCollector(bindingContext).collectData( + pseudocode, BACKWARD, new InstructionDataMergeStrategy>() { @Override public Edges> execute( @@ -272,10 +273,7 @@ public class PseudocodeVariablesData { } return Edges.create(enterResult, exitResult); } - }; - return new PseudocodeVariableDataCollector(bindingContext).collectData( - pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS, Collections.emptyMap(), - sinkInstructionData, collectVariableUseStatusStrategy); + }); } public static class VariableInitState {