From 80e64f5b586450d82b10e8444cc5ad67692b47a5 Mon Sep 17 00:00:00 2001 From: Prashant Singh <206828244+raj7-dev@users.noreply.github.com> Date: Sun, 16 Aug 2026 07:09:47 +1000 Subject: [PATCH] Fix null handling in putIfAbsent and computeIfAbsent --- drv/OpenHashMap.drv | 20 +++++++++++++++++-- .../objects/Object2ObjectOpenHashMapTest.java | 18 +++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/drv/OpenHashMap.drv b/drv/OpenHashMap.drv index 8c5a1ab1..695b099c 100644 --- a/drv/OpenHashMap.drv +++ b/drv/OpenHashMap.drv @@ -1110,7 +1110,15 @@ public class OPEN_HASH_MAP KEY_VALUE_GENERIC extends ABSTRACT_MAP KEY_VALUE_GENE @Override public VALUE_GENERIC_TYPE putIfAbsent(final KEY_GENERIC_TYPE k, final VALUE_GENERIC_TYPE v) { final int pos = find(k); - if (pos >= 0) return value[pos]; + if (pos >= 0) { + #if VALUES_REFERENCE + if (value[pos] == null) { + value[pos] = v; + return null; + } + #endif + return value[pos]; + } insert(-pos - 1, k, v); return defRetValue; } @@ -1186,7 +1194,15 @@ public class OPEN_HASH_MAP KEY_VALUE_GENERIC extends ABSTRACT_MAP KEY_VALUE_GENE public VALUE_GENERIC_TYPE computeIfAbsent(final KEY_GENERIC_TYPE key, final FUNCTION KEY_SUPER_GENERIC_VALUE_EXTENDS_GENERIC mappingFunction) { java.util.Objects.requireNonNull(mappingFunction); final int pos = find(key); - if (pos >= 0) return value[pos]; + if (pos >= 0) { + #if VALUES_REFERENCE + if (value[pos] == null) { + if (!mappingFunction.containsKey(key)) return defRetValue; + return value[pos] = mappingFunction.GET_VALUE(key); + } + #endif + return value[pos]; + } if (!mappingFunction.containsKey(key)) return defRetValue; final VALUE_GENERIC_TYPE newValue = mappingFunction.GET_VALUE(key); diff --git a/test/it/unimi/dsi/fastutil/objects/Object2ObjectOpenHashMapTest.java b/test/it/unimi/dsi/fastutil/objects/Object2ObjectOpenHashMapTest.java index 16595d95..55a0586f 100644 --- a/test/it/unimi/dsi/fastutil/objects/Object2ObjectOpenHashMapTest.java +++ b/test/it/unimi/dsi/fastutil/objects/Object2ObjectOpenHashMapTest.java @@ -59,4 +59,22 @@ public void testCombinationMethodsWithoutDefaultValue() { assertNull(map.computeIfPresent("def", (a, b) -> "four")); assertFalse(map.containsKey("def")); } + + @Test + public void testPutIfAbsentReplacesNullValue() { + final Object2ObjectOpenHashMap map = new Object2ObjectOpenHashMap<>(); + map.put("a", null); + + assertNull(map.putIfAbsent("a", "b")); + assertEquals("b", map.get("a")); + } + + @Test + public void testComputeIfAbsentReplacesNullValue() { + final Object2ObjectOpenHashMap map = new Object2ObjectOpenHashMap<>(); + map.put("a", null); + + assertEquals("b", map.computeIfAbsent("a", key -> "b")); + assertEquals("b", map.get("a")); + } }