aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfleandro <3987005+flga@users.noreply.github.com>2025-01-03 15:33:34 +0000
committerfleandro <3987005+flga@users.noreply.github.com>2025-01-03 15:33:34 +0000
commite3de02eaa8b69ae615c3df1177f44f326ca5ac44 (patch)
treee8c5e9291f83584833c556f8b5b4f76dc45c00e6
parentfdd3b46c10dae9adbc1484a795ed119fbf4a0baa (diff)
runtime: map_cell_index_static produced wrong results when the number of elements per cell was a power of 2
-rw-r--r--base/runtime/dynamic_map_internal.odin10
-rw-r--r--tests/core/runtime/test_core_runtime.odin26
2 files changed, 30 insertions, 6 deletions
diff --git a/base/runtime/dynamic_map_internal.odin b/base/runtime/dynamic_map_internal.odin
index 3dded7716..281d4b88e 100644
--- a/base/runtime/dynamic_map_internal.odin
+++ b/base/runtime/dynamic_map_internal.odin
@@ -161,11 +161,11 @@ map_cell_index_static :: #force_inline proc "contextless" (cells: [^]Map_Cell($T
// Compute the integer log 2 of N, this is the shift amount to index the
// correct cell. Odin's intrinsics.count_leading_zeros does not produce a
// constant, hence this approach. We only need to check up to N = 64.
- SHIFT :: 1 when N < 2 else
- 2 when N < 4 else
- 3 when N < 8 else
- 4 when N < 16 else
- 5 when N < 32 else 6
+ SHIFT :: 1 when N == 2 else
+ 2 when N == 4 else
+ 3 when N == 8 else
+ 4 when N == 16 else
+ 5 when N == 32 else 6
#assert(SHIFT <= MAP_CACHE_LINE_LOG2)
// Unique case, no need to index data here since only one element.
when N == 1 {
diff --git a/tests/core/runtime/test_core_runtime.odin b/tests/core/runtime/test_core_runtime.odin
index 84fd044cf..bd641ab3a 100644
--- a/tests/core/runtime/test_core_runtime.odin
+++ b/tests/core/runtime/test_core_runtime.odin
@@ -63,4 +63,28 @@ test_init_cap_map_dynarray :: proc(t: ^testing.T) {
defer delete(d2)
testing.expect(t, cap(d2) == 0)
testing.expect(t, d2.allocator.procedure == ally.procedure)
-} \ No newline at end of file
+}
+
+@(test)
+test_map_get :: proc(t: ^testing.T) {
+ m := map[int][3]int{
+ 1 = {10, 100, 1000},
+ 2 = {20, 200, 2000},
+ 3 = {30, 300, 3000},
+ }
+
+ k1, v1, ok1 := runtime.map_get(m, 1)
+ testing.expect_value(t, k1, 1)
+ testing.expect_value(t, v1, [3]int{10, 100, 1000})
+ testing.expect_value(t, ok1, true)
+
+ k2, v2, ok2 := runtime.map_get(m, 2)
+ testing.expect_value(t, k2, 2)
+ testing.expect_value(t, v2, [3]int{20, 200, 2000})
+ testing.expect_value(t, ok2, true)
+
+ k3, v3, ok3 := runtime.map_get(m, 3)
+ testing.expect_value(t, k3, 3)
+ testing.expect_value(t, v3, [3]int{30, 300, 3000})
+ testing.expect_value(t, ok3, true)
+}