Better @AutoCodec for TransitiveInfoProviderMapImpl: avoid having to serialize offset table at the cost of some overhead reconstructing the table. Also fewer code changes, although there is a serialization-only method added as a hack. PiperOrigin-RevId: 186808832
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 1e13d42..94edb16 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
@@ -33,8 +33,8 @@ @VisibleForSerialization @AutoCodec.Instantiator - TransitiveInfoProviderMapImpl(OffsetTable<Object> offsetTable, Object[] values) { - super(offsetTable, values); + TransitiveInfoProviderMapImpl(Object[] keys, Object[] values) { + super(keys, values); } static TransitiveInfoProviderMapImpl create(Map<Object, Object> map) { @@ -48,7 +48,7 @@ ++i; } Preconditions.checkArgument(keys.length == values.length); - return new TransitiveInfoProviderMapImpl(ImmutableSharedKeyMap.createOffsetTable(keys), values); + return new TransitiveInfoProviderMapImpl(keys, values); } @SuppressWarnings("unchecked")
diff --git a/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java b/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java index 42a7af8..65bb4a8 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java +++ b/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java
@@ -42,16 +42,11 @@ public class ImmutableSharedKeyMap<K, V> extends CompactImmutableMap<K, V> { private static final Interner<OffsetTable> offsetTables = BlazeInterners.newWeakInterner(); + private final OffsetTable<K> offsetTable; // Visible only for serialization. - protected final OffsetTable<K> offsetTable; protected final Object[] values; - /** - * Table storing {@code keys} compactly as an array, with an index lookup map for speed. - * - * <p>Only externally visible for serialization purposes. - */ - public static final class OffsetTable<K> { + private static final class OffsetTable<K> { private final Object[] keys; // Keep a map around to speed up get lookups for larger maps. // We make this value lazy to avoid computing for values that end up being thrown away @@ -104,14 +99,14 @@ } } - protected ImmutableSharedKeyMap(OffsetTable<K> offsetTable, Object[] values) { - Preconditions.checkArgument(offsetTable.keys.length == values.length); - this.offsetTable = offsetTable; + protected ImmutableSharedKeyMap(Object[] keys, Object[] values) { + Preconditions.checkArgument(keys.length == values.length); this.values = values; + this.offsetTable = createOffsetTable(keys); } @SuppressWarnings("unchecked") - protected static <K> OffsetTable<K> createOffsetTable(Object[] keys) { + private static <K> OffsetTable<K> createOffsetTable(Object[] keys) { OffsetTable<K> offsetTable = new OffsetTable<>(keys); OffsetTable<K> internedTable = (OffsetTable<K>) offsetTables.intern(offsetTable); internedTable.initIndexMap(); @@ -142,6 +137,12 @@ return (V) values[index]; } + /** Do not use! Present only for serialization. (Annotated as @Deprecated just to prevent use.) */ + @Deprecated + public Object[] getKeys() { + return offsetTable.keys; + } + @Override @SuppressWarnings("ReferenceEquality") public boolean equals(Object o) { @@ -187,7 +188,7 @@ keys[i] = entries.get(entryIndex++); values[i] = entries.get(entryIndex++); } - return new ImmutableSharedKeyMap<>(createOffsetTable(keys), values); + return new ImmutableSharedKeyMap<>(keys, values); } } }