diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
2 files changed, 24 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java index 0c3bd38b48..7a5ed434d9 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java @@ -109,6 +109,6 @@ public class TransitiveInfoProviderMapBuilder { } public TransitiveInfoProviderMap build() { - return new TransitiveInfoProviderMapImpl(providers); + return TransitiveInfoProviderMapImpl.create(providers); } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java index b43129d902..1e13d4286f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java @@ -14,9 +14,12 @@ package com.google.devtools.build.lib.analysis; +import com.google.common.base.Preconditions; import com.google.devtools.build.lib.collect.ImmutableSharedKeyMap; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.Provider; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import java.util.Map; import javax.annotation.Nullable; @@ -24,12 +27,28 @@ import javax.annotation.Nullable; * Implementation of {@link TransitiveInfoProvider} that uses {@link ImmutableSharedKeyMap}. For * memory efficiency, inheritance is used instead of aggregation as an implementation detail. */ -class TransitiveInfoProviderMapImpl - extends ImmutableSharedKeyMap<Object, Object> +@AutoCodec +class TransitiveInfoProviderMapImpl extends ImmutableSharedKeyMap<Object, Object> implements TransitiveInfoProviderMap { - TransitiveInfoProviderMapImpl(Map<Object, Object> map) { - super(map); + @VisibleForSerialization + @AutoCodec.Instantiator + TransitiveInfoProviderMapImpl(OffsetTable<Object> offsetTable, Object[] values) { + super(offsetTable, values); + } + + static TransitiveInfoProviderMapImpl create(Map<Object, Object> map) { + int count = map.size(); + Object[] keys = new Object[count]; + Object[] values = new Object[count]; + int i = 0; + for (Map.Entry<Object, Object> entry : map.entrySet()) { + keys[i] = entry.getKey(); + values[i] = entry.getValue(); + ++i; + } + Preconditions.checkArgument(keys.length == values.length); + return new TransitiveInfoProviderMapImpl(ImmutableSharedKeyMap.createOffsetTable(keys), values); } @SuppressWarnings("unchecked") |