added LookInsideStrategy enum
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user