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 {
FORWARD,
BACKWARD;
BACKWARD
}
@NotNull
@@ -65,8 +65,17 @@ public class PseudocodeTraverser {
: 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(
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside,
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, LookInsideStrategy lookInside,
@NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction,
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy) {
@@ -85,21 +94,22 @@ public class PseudocodeTraverser {
}
private static <D> void initializeEdgesMap(
@NotNull Pseudocode pseudocode, boolean lookInside,
@NotNull Pseudocode pseudocode, LookInsideStrategy lookInside,
@NotNull Map<Instruction, Edges<D>> edgesMap,
@NotNull D initialDataValue) {
List<Instruction> instructions = pseudocode.getInstructions();
Edges<D> initialEdge = Edges.create(initialDataValue, initialDataValue);
for (Instruction instruction : instructions) {
edgesMap.put(instruction, initialEdge);
if (lookInside && instruction instanceof LocalDeclarationInstruction) {
if (shouldLookInside(instruction, lookInside)) {
initializeEdgesMap(((LocalDeclarationInstruction) instruction).getBody(), lookInside, edgesMap, initialDataValue);
}
}
}
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 InstructionDataMergeStrategy<D> instructionDataMergeStrategy,
@NotNull Collection<Instruction> previousSubGraphInstructions,
@@ -123,7 +133,7 @@ public class PseudocodeTraverser {
allPreviousInstructions = previousInstructions;
}
if (lookInside && instruction instanceof LocalDeclarationInstruction) {
if (shouldLookInside(instruction, lookInside)) {
Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody();
collectDataFromSubgraph(subroutinePseudocode, traversalOrder, lookInside, edgesMap, instructionDataMergeStrategy,
previousInstructions,
@@ -33,6 +33,8 @@ 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.LookInsideStrategy.SKIP_LOCAL_DECLARATIONS;
import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.BACKWARD;
import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.FORWARD;
@@ -141,7 +143,7 @@ public class PseudocodeVariablesData {
usedVariables, declaredVariables);
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>>() {
@Override
public Edges<Map<VariableDescriptor, VariableInitState>> execute(
@@ -292,7 +294,7 @@ public class PseudocodeVariablesData {
return Edges.create(enterResult, exitResult);
}
};
variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, true,
variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS,
Collections.<VariableDescriptor, VariableUseState>emptyMap(),
sinkInstructionData, collectVariableUseStatusStrategy);
}