removed cached data for each instruction
This commit is contained in:
@@ -48,9 +48,6 @@ public class PseudocodeVariablesData {
|
|||||||
private final Map<Pseudocode, Set<VariableDescriptor>> declaredVariablesForDeclaration = Maps.newHashMap();
|
private final Map<Pseudocode, Set<VariableDescriptor>> declaredVariablesForDeclaration = Maps.newHashMap();
|
||||||
private final Map<Pseudocode, Set<VariableDescriptor>> usedVariablesForDeclaration = Maps.newHashMap();
|
private final Map<Pseudocode, Set<VariableDescriptor>> usedVariablesForDeclaration = Maps.newHashMap();
|
||||||
|
|
||||||
private Map<Instruction, Edges<Map<VariableDescriptor, VariableInitState>>> variableInitializersMap;
|
|
||||||
private Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> variableStatusMap;
|
|
||||||
|
|
||||||
public PseudocodeVariablesData(@NotNull Pseudocode pseudocode, @NotNull BindingContext bindingContext) {
|
public PseudocodeVariablesData(@NotNull Pseudocode pseudocode, @NotNull BindingContext bindingContext) {
|
||||||
this.pseudocode = pseudocode;
|
this.pseudocode = pseudocode;
|
||||||
this.bindingContext = bindingContext;
|
this.bindingContext = bindingContext;
|
||||||
@@ -127,10 +124,7 @@ public class PseudocodeVariablesData {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Map<Instruction, Edges<Map<VariableDescriptor, VariableInitState>>> getVariableInitializers() {
|
public Map<Instruction, Edges<Map<VariableDescriptor, VariableInitState>>> getVariableInitializers() {
|
||||||
if (variableInitializersMap == null) {
|
return getVariableInitializers(pseudocode);
|
||||||
variableInitializersMap = getVariableInitializers(pseudocode);
|
|
||||||
}
|
|
||||||
return variableInitializersMap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -248,15 +242,17 @@ public class PseudocodeVariablesData {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> getVariableUseStatusData() {
|
public Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> getVariableUseStatusData() {
|
||||||
if (variableStatusMap == null) {
|
|
||||||
Map<VariableDescriptor, VariableUseState> sinkInstructionData = Maps.newHashMap();
|
Map<VariableDescriptor, VariableUseState> sinkInstructionData = Maps.newHashMap();
|
||||||
for (VariableDescriptor usedVariable : usedVariablesForDeclaration.get(pseudocode)) {
|
for (VariableDescriptor usedVariable : getUsedVariables(pseudocode)) {
|
||||||
sinkInstructionData.put(usedVariable, VariableUseState.UNUSED);
|
sinkInstructionData.put(usedVariable, VariableUseState.UNUSED);
|
||||||
}
|
}
|
||||||
InstructionDataMergeStrategy<Map<VariableDescriptor, VariableUseState>> collectVariableUseStatusStrategy = new InstructionDataMergeStrategy<Map<VariableDescriptor, VariableUseState>>() {
|
InstructionDataMergeStrategy<Map<VariableDescriptor, VariableUseState>> collectVariableUseStatusStrategy =
|
||||||
|
new InstructionDataMergeStrategy<Map<VariableDescriptor, VariableUseState>>() {
|
||||||
@Override
|
@Override
|
||||||
public Edges<Map<VariableDescriptor, VariableUseState>> execute(@NotNull Instruction instruction,
|
public Edges<Map<VariableDescriptor, VariableUseState>> execute(
|
||||||
@NotNull Collection<Map<VariableDescriptor, VariableUseState>> incomingEdgesData) {
|
@NotNull Instruction instruction,
|
||||||
|
@NotNull Collection<Map<VariableDescriptor, VariableUseState>> incomingEdgesData
|
||||||
|
) {
|
||||||
|
|
||||||
Map<VariableDescriptor, VariableUseState> enterResult = Maps.newHashMap();
|
Map<VariableDescriptor, VariableUseState> enterResult = Maps.newHashMap();
|
||||||
for (Map<VariableDescriptor, VariableUseState> edgeData : incomingEdgesData) {
|
for (Map<VariableDescriptor, VariableUseState> edgeData : incomingEdgesData) {
|
||||||
@@ -294,12 +290,10 @@ public class PseudocodeVariablesData {
|
|||||||
return Edges.create(enterResult, exitResult);
|
return Edges.create(enterResult, exitResult);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS,
|
return PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS,
|
||||||
Collections.<VariableDescriptor, VariableUseState>emptyMap(),
|
Collections.<VariableDescriptor, VariableUseState>emptyMap(),
|
||||||
sinkInstructionData, collectVariableUseStatusStrategy);
|
sinkInstructionData, collectVariableUseStatusStrategy);
|
||||||
}
|
}
|
||||||
return variableStatusMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class VariableInitState {
|
public static class VariableInitState {
|
||||||
public final boolean isInitialized;
|
public final boolean isInitialized;
|
||||||
|
|||||||
Reference in New Issue
Block a user