From c27427434fadd3477d8fb9c236406d4324793d70 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 14 May 2013 20:58:16 +0400 Subject: [PATCH] changes from pull request: Improved flow analysis performance for variable initialization by Spasi --- .../jet/lang/cfg/PseudocodeVariablesData.java | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) 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 e8a200f7d81..1896f51b129 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java @@ -45,6 +45,8 @@ public class PseudocodeVariablesData { private final Map> declaredVariablesForDeclaration = Maps.newHashMap(); private final Map> usedVariablesForDeclaration = Maps.newHashMap(); + private Map>> variableInitializers; + public PseudocodeVariablesData(@NotNull Pseudocode pseudocode, @NotNull BindingContext bindingContext) { this.pseudocode = pseudocode; this.bindingContext = bindingContext; @@ -121,7 +123,11 @@ public class PseudocodeVariablesData { @NotNull public Map>> getVariableInitializers() { - return getVariableInitializers(pseudocode); + if (variableInitializers == null) { + variableInitializers = getVariableInitializers(pseudocode); + } + + return variableInitializers; } @NotNull @@ -164,7 +170,7 @@ public class PseudocodeVariablesData { } @NotNull - private Map prepareInitializersMapForStartInstruction( + private static Map prepareInitializersMapForStartInstruction( @NotNull Collection usedVariables, @NotNull Collection declaredVariables) { @@ -184,7 +190,7 @@ public class PseudocodeVariablesData { } @NotNull - private Map mergeIncomingEdgesDataForInitializers( + private static Map mergeIncomingEdgesDataForInitializers( @NotNull Collection> incomingEdgesData) { Set variablesInScope = Sets.newHashSet(); @@ -194,14 +200,20 @@ public class PseudocodeVariablesData { Map enterInstructionData = Maps.newHashMap(); for (VariableDescriptor variable : variablesInScope) { - Set edgesDataForVariable = Sets.newHashSet(); + boolean isInitialized = true; + boolean isDeclared = true; for (Map edgeData : incomingEdgesData) { VariableInitState initState = edgeData.get(variable); if (initState != null) { - edgesDataForVariable.add(initState); + if (!initState.isInitialized) { + isInitialized = false; + } + if (!initState.isDeclared) { + isDeclared = false; + } } } - enterInstructionData.put(variable, VariableInitState.create(edgesDataForVariable)); + enterInstructionData.put(variable, VariableInitState.create(isInitialized, isDeclared)); } return enterInstructionData; } @@ -323,20 +335,6 @@ public class PseudocodeVariablesData { private static VariableInitState create(boolean isDeclaredHere, @Nullable VariableInitState mergedEdgesData) { return create(true, isDeclaredHere || (mergedEdgesData != null && mergedEdgesData.isDeclared)); } - - private static VariableInitState create(@NotNull Set edgesData) { - boolean isInitialized = true; - boolean isDeclared = true; - for (VariableInitState edgeData : edgesData) { - if (!edgeData.isInitialized) { - isInitialized = false; - } - if (!edgeData.isDeclared) { - isDeclared = false; - } - } - return create(isInitialized, isDeclared); - } } public static enum VariableUseState {