From a9639dae2ce81661175fb40b060ae883a8bda6fa Mon Sep 17 00:00:00 2001 From: Marcel Hlopko Date: Thu, 24 Nov 2016 14:21:37 +0000 Subject: Improve memory footprint of CcToolchainFeatures.Variables. -- MOS_MIGRATED_REVID=140131142 --- .../build/lib/rules/cpp/CcToolchainFeatures.java | 50 +++++++++++++--------- 1 file changed, 30 insertions(+), 20 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java index 694f4e6e53..83bcf05325 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java @@ -29,7 +29,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; -import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariableValue; import com.google.devtools.build.lib.util.Pair; @@ -972,17 +971,13 @@ public class CcToolchainFeatures implements Serializable { @Immutable private static final class StringSequence implements VariableValue { - private final Iterable values; + private final ImmutableList values; public StringSequence(ImmutableList values) { Preconditions.checkNotNull(values, "Cannot create StringSequence from null"); this.values = values; } - StringSequence(NestedSet values) { - this.values = values; - } - @Override public Iterable getSequenceValue(String variableName) { final ImmutableList.Builder sequences = ImmutableList.builder(); @@ -1149,30 +1144,27 @@ public class CcToolchainFeatures implements Serializable { */ public static class Builder { private final Map variablesMap = new LinkedHashMap<>(); + private final Map stringVariablesMap = new LinkedHashMap<>(); /** Add a variable that expands {@code name} to {@code value}. */ public Builder addStringVariable(String name, String value) { Preconditions.checkArgument( !variablesMap.containsKey(name), "Cannot overwrite variable '%s'", name); + Preconditions.checkArgument( + !stringVariablesMap.containsKey(name), "Cannot overwrite variable '%s'", name); Preconditions.checkNotNull( value, "Cannot set null as a value for variable '%s'", name); - variablesMap.put(name, new StringValue(value)); + stringVariablesMap.put(name, value); return this; } /** Add a sequence variable that expands {@code name} to {@code values}. */ - public Builder addStringSequenceVariable(String name, ImmutableList values) { + public Builder addStringSequenceVariable(String name, Iterable values) { Preconditions.checkArgument( !variablesMap.containsKey(name), "Cannot overwrite variable '%s'", name); - variablesMap.put(name, new StringSequence(values)); - return this; - } - - /** Add a sequence variable that expands {@code name} to {@code values}. */ - public Builder addStringSequenceVariable(String name, NestedSet values) { - Preconditions.checkArgument( - !variablesMap.containsKey(name), "Cannot overwrite variable '%s'", name); - variablesMap.put(name, new StringSequence(values)); + ImmutableList.Builder builder = ImmutableList.builder(); + builder.addAll(values); + variablesMap.put(name, new StringSequence(builder.build())); return this; } @@ -1196,8 +1188,10 @@ public class CcToolchainFeatures implements Serializable { for (String name : variables.keySet()) { Preconditions.checkArgument( !variablesMap.containsKey(name), "Cannot overwrite variable '%s'", name); - variablesMap.put(name, new StringValue(variables.get(name))); + Preconditions.checkArgument( + !stringVariablesMap.containsKey(name), "Cannot overwrite variable '%s'", name); } + stringVariablesMap.putAll(variables); return this; } @@ -1205,9 +1199,15 @@ public class CcToolchainFeatures implements Serializable { public Builder addAll(Variables variables) { SetView intersection = Sets.intersection(variables.variablesMap.keySet(), variablesMap.keySet()); + SetView stringIntersection = + Sets.intersection(variables.stringVariablesMap.keySet(), stringVariablesMap.keySet()); Preconditions.checkArgument( intersection.isEmpty(), "Cannot overwrite existing variables: %s", intersection); + Preconditions.checkArgument( + stringIntersection.isEmpty(), + "Cannot overwrite existing variables: %s", stringIntersection); this.variablesMap.putAll(variables.variablesMap); + this.stringVariablesMap.putAll(variables.stringVariablesMap); return this; } @@ -1218,6 +1218,7 @@ public class CcToolchainFeatures implements Serializable { */ Builder addAndOverwriteAll(Variables overwrittenVariables) { this.variablesMap.putAll(overwrittenVariables.variablesMap); + this.stringVariablesMap.putAll(overwrittenVariables.stringVariablesMap); return this; } @@ -1225,7 +1226,8 @@ public class CcToolchainFeatures implements Serializable { * @return a new {@Variables} object. */ Variables build() { - return new Variables(ImmutableMap.copyOf(variablesMap)); + return new Variables( + ImmutableMap.copyOf(variablesMap), ImmutableMap.copyOf(stringVariablesMap)); } } @@ -1238,10 +1240,14 @@ public class CcToolchainFeatures implements Serializable { } private final ImmutableMap variablesMap; + private final ImmutableMap stringVariablesMap; private final Variables parent; - private Variables(ImmutableMap variablesMap) { + private Variables( + ImmutableMap variablesMap, + ImmutableMap stringVariablesMap) { this.variablesMap = variablesMap; + this.stringVariablesMap = stringVariablesMap; this.parent = null; } @@ -1251,6 +1257,7 @@ public class CcToolchainFeatures implements Serializable { */ private Variables(Variables parent, String name, VariableValue value) { this.variablesMap = ImmutableMap.of(name, value); + this.stringVariablesMap = ImmutableMap.of(); this.parent = parent; } @@ -1302,6 +1309,9 @@ public class CcToolchainFeatures implements Serializable { if (variablesMap.containsKey(name)) { return Pair.of(variablesMap.get(name), null); } + if (stringVariablesMap.containsKey(name)) { + return Pair.of(new StringValue(stringVariablesMap.get(name)), null); + } if (parent != null) { return parent.getNonStructuredVariable(name); -- cgit v1.2.3