On Wed, 30 Oct 2024 19:07:50 GMT, Jiangli Zhou <jian...@openjdk.org> wrote:
>> I don't think I understand. The whole point is to make sure the runtime >> cache instances are the same as archive cache instances, right? Using both >> archived and runtime caches leads to identity inconsistencies: if we `==` >> compare the archived `Integer` box and the runtime `Integer` box of the same >> value in [-128; 127], they should equal each other. So we have to make sure >> we use the parts we have already committed to use (from the archive), and >> add whatever cache elements are missing at runtime. I don't see how it works >> otherwise. > > The runtime cache would only store the additional boxed Integers not in the > archived cache, without affecting the archived boxed Integers. Something like > the following would work (I didn't test all corner cases): > > > static final int archivedSize; > ... > archivedSize = archivedCache == null ? 0 : archivedCache.length; > if (archivedCache == null || size > archivedCache.length) { > int runtimeCacheSize = size - archivedSize; > Integer[] c = new Integer[runtimeCacheSize]; > int j = low + archivedSize; > for(int i = 0; i < runtimeCacheSize; i++) { > c[i] = new Integer(j++); > } > > cache = c; > if (archivedCache == null) { > archivedCache = c; > } > } else { > cache = null; > } > > > `Integer.valueOf()` would retrieve the cached boxed Integer either from the > archived cache or the runtime created cache, if the value is within the > runtime [low, high]. > > > public static Integer valueOf(int i) { > if (i >= IntegerCache.low && i <= IntegerCache.high) { > int index = i + (-IntegerCache.low); > if (IntegerCache.archivedSize != 0 && IntegerCache.archivedSize > >= index) { > return IntegerCache.archivedCache[index]; > } else { > return IntegerCache.cache[index - IntegerCache.archivedSize]; > } > } > return new Integer(i); > } Ah, I see. I don't think we want to do this, though. I vaguely remember `Integer.valueOf` code shape being important for things like C2 optimizations around EA and autoboxing elimination. The beauty of staying within a single array is avoiding a whole class of these issues. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/21737#discussion_r1823971473