aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
diff options
context:
space:
mode:
authorGravatar dslomov <dslomov@google.com>2017-07-05 07:23:31 -0400
committerGravatar John Cater <jcater@google.com>2017-07-05 10:58:56 -0400
commitf6a7e5a39ee5669c0fdfce93032cab45d6c89358 (patch)
tree9905a5e85f19a94eb4cd0082d6a146d9e06a0c3b /src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
parent2843eadf4c1d9175c60d32ffd2cba2100256c1fd (diff)
Use the same data structure for native and Skylark providers.
The memory cost of adding Skylark provider is now the same as native. Skylark providers (declared and legacy) benefit from the same shape-sharing optimization as native providers. RELNOTES: None. PiperOrigin-RevId: 160944263
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java31
1 files changed, 10 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
index a6704b59e5..e990d20b21 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
@@ -62,15 +62,12 @@ import java.util.Map;
public final class SkylarkRuleConfiguredTargetBuilder {
/**
- * Create a Rule Configured Target from the ruleContext and the ruleImplementation. The
- * registeredProviderTypes map indicates which keys in structs returned by skylark rules
- * should be interpreted as native TransitiveInfoProvider instances of type (map value).
+ * Create a Rule Configured Target from the ruleContext and the ruleImplementation.
*/
public static ConfiguredTarget buildRule(
RuleContext ruleContext,
BaseFunction ruleImplementation,
- SkylarkSemanticsOptions skylarkSemantics,
- Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
+ SkylarkSemanticsOptions skylarkSemantics)
throws InterruptedException {
String expectFailure = ruleContext.attributes().get("expect_failure", Type.STRING);
SkylarkRuleContext skylarkRuleContext = null;
@@ -103,8 +100,7 @@ public final class SkylarkRuleConfiguredTargetBuilder {
ruleContext.ruleError("Expected failure not found: " + expectFailure);
return null;
}
- ConfiguredTarget configuredTarget =
- createTarget(ruleContext, target, registeredProviderTypes);
+ ConfiguredTarget configuredTarget = createTarget(ruleContext, target);
SkylarkProviderValidationUtil.checkOrphanArtifacts(ruleContext);
return configuredTarget;
} catch (EvalException e) {
@@ -149,10 +145,7 @@ public final class SkylarkRuleConfiguredTargetBuilder {
// TODO(bazel-team): this whole defaulting - overriding executable, runfiles and files_to_build
// is getting out of hand. Clean this whole mess up.
- private static ConfiguredTarget createTarget(
- RuleContext ruleContext,
- Object target,
- Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
+ private static ConfiguredTarget createTarget(RuleContext ruleContext, Object target)
throws EvalException {
Artifact executable = getExecutable(ruleContext, target);
RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
@@ -164,7 +157,7 @@ public final class SkylarkRuleConfiguredTargetBuilder {
}
builder.setFilesToBuild(filesToBuild.build());
return addStructFieldsAndBuild(
- ruleContext, builder, target, executable, registeredProviderTypes);
+ ruleContext, builder, target, executable);
}
private static Artifact getExecutable(RuleContext ruleContext, Object target)
@@ -238,15 +231,14 @@ public final class SkylarkRuleConfiguredTargetBuilder {
RuleContext ruleContext,
RuleConfiguredTargetBuilder builder,
Object target,
- Artifact executable,
- Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
+ Artifact executable)
throws EvalException {
Location loc = null;
Boolean isParsed = false;
if (target instanceof SkylarkClassObject) {
SkylarkClassObject struct = (SkylarkClassObject) target;
loc = struct.getCreationLoc();
- parseProviderKeys(struct, false, ruleContext, loc, executable, registeredProviderTypes,
+ parseProviderKeys(struct, false, ruleContext, loc, executable,
builder);
isParsed = true;
} else if (target instanceof Iterable) {
@@ -262,7 +254,7 @@ public final class SkylarkRuleConfiguredTargetBuilder {
if (declaredProvider.getConstructor().getKey().equals(
DefaultProvider.SKYLARK_CONSTRUCTOR.getKey())) {
parseProviderKeys(declaredProvider, true, ruleContext, loc, executable,
- registeredProviderTypes, builder);
+ builder);
isParsed = true;
} else {
Location creationLoc = declaredProvider.getCreationLocOrNull();
@@ -289,7 +281,6 @@ public final class SkylarkRuleConfiguredTargetBuilder {
RuleContext ruleContext,
Location loc,
Artifact executable,
- Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes,
RuleConfiguredTargetBuilder builder) throws EvalException {
Runfiles statelessRunfiles = null;
Runfiles dataRunfiles = null;
@@ -348,10 +339,8 @@ public final class SkylarkRuleConfiguredTargetBuilder {
InstrumentedFilesCollector.NO_METADATA_COLLECTOR,
Collections.<Artifact>emptySet());
builder.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider);
- } else if (registeredProviderTypes.containsKey(key) && !isDefaultProvider) {
- Class<? extends TransitiveInfoProvider> providerType = registeredProviderTypes.get(key);
- TransitiveInfoProvider providerField = cast(key, provider, providerType, loc);
- builder.addProvider(providerType, providerField);
+ } else if (provider.getValue(key) instanceof TransitiveInfoProvider.WithLegacySkylarkName) {
+ builder.addProvider((TransitiveInfoProvider) provider.getValue(key));
} else if (isDefaultProvider) {
// Custom keys are not allowed for default providers
throw new EvalException(loc, "Invalid key for default provider: " + key);