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);
}
}
}