FloatEntryImpl.equals() and DoubleEntryImpl.equals() used == for comparison, 
which returns false for NaN == NaN per IEEE 754. This caused two different 
FloatEntry/DoubleEntry objects holding NaN to not be considered equal, 
violating the equals/hashCode contract (same hashCode but equals returns false).

Similarly, SplitConstantPool.findFloatEntry() and findDoubleEntry() used == to 
match values, so NaN entries could never be found in the pool, causing every 
floatEntry(Float.NaN) or doubleEntry(Double.NaN) call to create a duplicate 
entry and bloat the constant pool.

Fix by using Float.floatToRawIntBits() and Double.doubleToRawLongBits() for 
bitwise comparison, which correctly handles NaN and also properly distinguishes 
+0.0 from -0.0.

-------------

Commit messages:
 - Add tests for Float/Double NaN constant pool equality and deduplication
 - Fix Float/Double NaN constant pool entry equality and deduplication

Changes: https://git.openjdk.org/jdk/pull/30196/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30196&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8379832
  Stats: 223 lines in 3 files changed: 219 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/30196.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/30196/head:pull/30196

PR: https://git.openjdk.org/jdk/pull/30196

Reply via email to