Try to avoid cloning BuildOptions in StarlarkTransition#validate.
PiperOrigin-RevId: 243370634
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java
index a3a03b2..25ec1ed 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java
@@ -180,12 +180,12 @@
}
});
- // verify changed settings were changed to something reasonable for their type and filter out
+ // Verify changed settings were changed to something reasonable for their type and filter out
// default values.
Set<BuildOptions> cleanedOptionList = new LinkedHashSet<>(toOptions.size());
for (BuildOptions options : toOptions) {
- BuildOptions.Builder cleanedOptions = options.toBuilder();
- boolean cleaned = false;
+ // Lazily initialized to optimize for the common case where we don't modify anything.
+ BuildOptions.Builder cleanedOptions = null;
for (Map.Entry<Label, Rule> changedSettingWithRule : changedSettingToRule.entrySet()) {
Label setting = changedSettingWithRule.getKey();
Rule rule = changedSettingWithRule.getValue();
@@ -199,12 +199,14 @@
}
if (convertedValue.equals(
rule.getAttributeContainer().getAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME))) {
+ if (cleanedOptions == null) {
+ cleanedOptions = options.toBuilder();
+ }
cleanedOptions.removeStarlarkOption(setting);
- cleaned = true;
}
}
// Keep the same instance if we didn't do anything to maintain reference equality later on.
- cleanedOptionList.add(cleaned ? cleanedOptions.build() : options);
+ cleanedOptionList.add(cleanedOptions != null ? cleanedOptions.build() : options);
}
return ImmutableList.copyOf(cleanedOptionList);
}