added LookInsideStrategy enum

This commit is contained in:
Svetlana Isakova
2012-12-14 18:42:02 +04:00
parent 0626225ea5
commit 62f35e5e87
2 changed files with 20 additions and 8 deletions
@@ -37,7 +37,7 @@ public class PseudocodeTraverser {
public static enum TraversalOrder { public static enum TraversalOrder {
FORWARD, FORWARD,
BACKWARD; BACKWARD
} }
@NotNull @NotNull
@@ -65,8 +65,17 @@ public class PseudocodeTraverser {
: instruction instanceof SubroutineSinkInstruction; : instruction instanceof SubroutineSinkInstruction;
} }
public static enum LookInsideStrategy {
ANALYSE_LOCAL_DECLARATIONS,
SKIP_LOCAL_DECLARATIONS
}
private static boolean shouldLookInside(Instruction instruction, LookInsideStrategy lookInside) {
return lookInside == LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS && instruction instanceof LocalDeclarationInstruction;
}
public static <D> Map<Instruction, Edges<D>> collectData( public static <D> Map<Instruction, Edges<D>> collectData(
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside, @NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, LookInsideStrategy lookInside,
@NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction, @NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction,
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy) { @NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy) {
@@ -85,21 +94,22 @@ public class PseudocodeTraverser {
} }
private static <D> void initializeEdgesMap( private static <D> void initializeEdgesMap(
@NotNull Pseudocode pseudocode, boolean lookInside, @NotNull Pseudocode pseudocode, LookInsideStrategy lookInside,
@NotNull Map<Instruction, Edges<D>> edgesMap, @NotNull Map<Instruction, Edges<D>> edgesMap,
@NotNull D initialDataValue) { @NotNull D initialDataValue) {
List<Instruction> instructions = pseudocode.getInstructions(); List<Instruction> instructions = pseudocode.getInstructions();
Edges<D> initialEdge = Edges.create(initialDataValue, initialDataValue); Edges<D> initialEdge = Edges.create(initialDataValue, initialDataValue);
for (Instruction instruction : instructions) { for (Instruction instruction : instructions) {
edgesMap.put(instruction, initialEdge); edgesMap.put(instruction, initialEdge);
if (lookInside && instruction instanceof LocalDeclarationInstruction) { if (shouldLookInside(instruction, lookInside)) {
initializeEdgesMap(((LocalDeclarationInstruction) instruction).getBody(), lookInside, edgesMap, initialDataValue); initializeEdgesMap(((LocalDeclarationInstruction) instruction).getBody(), lookInside, edgesMap, initialDataValue);
} }
} }
} }
private static <D> void collectDataFromSubgraph( private static <D> void collectDataFromSubgraph(
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside, @NotNull Pseudocode pseudocode, TraversalOrder traversalOrder,
LookInsideStrategy lookInside,
@NotNull Map<Instruction, Edges<D>> edgesMap, @NotNull Map<Instruction, Edges<D>> edgesMap,
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy, @NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy,
@NotNull Collection<Instruction> previousSubGraphInstructions, @NotNull Collection<Instruction> previousSubGraphInstructions,
@@ -123,7 +133,7 @@ public class PseudocodeTraverser {
allPreviousInstructions = previousInstructions; allPreviousInstructions = previousInstructions;
} }
if (lookInside && instruction instanceof LocalDeclarationInstruction) { if (shouldLookInside(instruction, lookInside)) {
Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody(); Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody();
collectDataFromSubgraph(subroutinePseudocode, traversalOrder, lookInside, edgesMap, instructionDataMergeStrategy, collectDataFromSubgraph(subroutinePseudocode, traversalOrder, lookInside, edgesMap, instructionDataMergeStrategy,
previousInstructions, previousInstructions,
@@ -33,6 +33,8 @@ import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS;
import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.LookInsideStrategy.SKIP_LOCAL_DECLARATIONS;
import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.BACKWARD; import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.BACKWARD;
import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.FORWARD; import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.FORWARD;
@@ -141,7 +143,7 @@ public class PseudocodeVariablesData {
usedVariables, declaredVariables); usedVariables, declaredVariables);
Map<Instruction, Edges<Map<VariableDescriptor, VariableInitState>>> variableInitializersMap = PseudocodeTraverser.collectData( Map<Instruction, Edges<Map<VariableDescriptor, VariableInitState>>> variableInitializersMap = PseudocodeTraverser.collectData(
pseudocode, FORWARD, /* lookInside = */ false, pseudocode, FORWARD, SKIP_LOCAL_DECLARATIONS,
initialMap, initialMapForStartInstruction, new PseudocodeTraverser.InstructionDataMergeStrategy<Map<VariableDescriptor, VariableInitState>>() { initialMap, initialMapForStartInstruction, new PseudocodeTraverser.InstructionDataMergeStrategy<Map<VariableDescriptor, VariableInitState>>() {
@Override @Override
public Edges<Map<VariableDescriptor, VariableInitState>> execute( public Edges<Map<VariableDescriptor, VariableInitState>> execute(
@@ -292,7 +294,7 @@ public class PseudocodeVariablesData {
return Edges.create(enterResult, exitResult); return Edges.create(enterResult, exitResult);
} }
}; };
variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, true, variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS,
Collections.<VariableDescriptor, VariableUseState>emptyMap(), Collections.<VariableDescriptor, VariableUseState>emptyMap(),
sinkInstructionData, collectVariableUseStatusStrategy); sinkInstructionData, collectVariableUseStatusStrategy);
} }