diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java index 17dae1dd064c2c..73c82bced7d38b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java @@ -574,7 +574,7 @@ public StringSequenceBuilder addValue(String value) { /** Returns an immutable string sequence. */ @Override public StringSequence build() { - return new StringSequence(values.build()); + return StringSequence.of(values.build()); } } @@ -638,7 +638,7 @@ public StructureBuilder addField(String name, String value) { /** Adds a field to the structure. */ @CanIgnoreReturnValue public StructureBuilder addField(String name, ImmutableList values) { - fields.put(name, new StringSequence(values)); + fields.put(name, StringSequence.of(values)); return this; } @@ -892,7 +892,7 @@ public VariableValue getFieldValue( expandedObjectFiles.add(objectFile.getExecPathString()); } } - return new StringSequence(expandedObjectFiles.build()); + return StringSequence.of(expandedObjectFiles.build()); } return super.getFieldValue(variableName, field, expander, throwOnMissingVariable); @@ -983,10 +983,19 @@ public int hashCode() { */ @Immutable private static final class StringSequence extends VariableValueAdapter { - private final Iterable values; + static final Interner stringSequenceInterner = BlazeInterners.newWeakInterner(); + private final ImmutableList values; - StringSequence(Iterable values) { - this.values = Preconditions.checkNotNull(values); + static StringSequence of(Iterable values) { + return stringSequenceInterner.intern(new StringSequence(values)); + } + + private StringSequence(Iterable values) { + ImmutableList.Builder valuesBuilder = new ImmutableList.Builder<>(); + for (String value : values) { + valuesBuilder.add(value.intern()); + } + this.values = valuesBuilder.build(); } @Override @@ -1267,7 +1276,7 @@ public Builder addStringSequenceVariable(String name, ImmutableSet value Preconditions.checkNotNull(values, "Cannot set null as a value for variable '%s'", name); ImmutableList.Builder builder = ImmutableList.builder(); builder.addAll(values); - variablesMap.put(name, new StringSequence(builder.build())); + variablesMap.put(name, StringSequence.of(builder.build())); return this; } @@ -1296,7 +1305,7 @@ public Builder addStringSequenceVariable(String name, NestedSet values) public Builder addStringSequenceVariable(String name, Iterable values) { checkVariableNotPresentAlready(name); Preconditions.checkNotNull(values, "Cannot set null as a value for variable '%s'", name); - variablesMap.put(name, new StringSequence(values)); + variablesMap.put(name, StringSequence.of(values)); return this; }