diff options
author | Peter Zhu <[email protected]> | 2024-12-24 17:46:43 -0500 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2025-01-02 11:03:04 -0500 |
commit | 99ff0224a564b59df3ba8fbd7911dd41a7fdde34 () | |
tree | 50119e2d938e21080f7950ab9f067a0f63b78ce3 | |
parent | b8c4af24f920a973cfa1f7b671825e8a5421368c (diff) |
Move rbimpl_size_add_overflow from gc.c to memory.h
Notes: Merged: https://.com/ruby/ruby/pull/12459
-rw-r--r-- | gc.c | 40 | ||||
-rw-r--r-- | include/ruby/internal/memory.h | 87 |
2 files changed, 97 insertions, 30 deletions
@@ -481,38 +481,10 @@ rb_malloc_grow_capa(size_t current, size_t type_size) } static inline struct rbimpl_size_mul_overflow_tag -size_add_overflow(size_t x, size_t y) -{ - size_t z; - bool p; -#if 0 - -#elif defined(ckd_add) - p = ckd_add(&z, x, y); - -#elif __has_builtin(__builtin_add_overflow) - p = __builtin_add_overflow(x, y, &z); - -#elif defined(DSIZE_T) - RB_GNUC_EXTENSION DSIZE_T dx = x; - RB_GNUC_EXTENSION DSIZE_T dy = y; - RB_GNUC_EXTENSION DSIZE_T dz = dx + dy; - p = dz > SIZE_MAX; - z = (size_t)dz; - -#else - z = x + y; - p = z < y; - -#endif - return (struct rbimpl_size_mul_overflow_tag) { p, z, }; -} - -static inline struct rbimpl_size_mul_overflow_tag size_mul_add_overflow(size_t x, size_t y, size_t z) /* x * y + z */ { struct rbimpl_size_mul_overflow_tag t = rbimpl_size_mul_overflow(x, y); - struct rbimpl_size_mul_overflow_tag u = size_add_overflow(t.right, z); return (struct rbimpl_size_mul_overflow_tag) { t.left || u.left, u.right }; } @@ -521,7 +493,7 @@ size_mul_add_mul_overflow(size_t x, size_t y, size_t z, size_t w) /* x * y + z * { struct rbimpl_size_mul_overflow_tag t = rbimpl_size_mul_overflow(x, y); struct rbimpl_size_mul_overflow_tag u = rbimpl_size_mul_overflow(z, w); - struct rbimpl_size_mul_overflow_tag v = size_add_overflow(t.right, u.right); return (struct rbimpl_size_mul_overflow_tag) { t.left || u.left || v.left, v.right }; } @@ -4590,6 +4562,14 @@ ruby_malloc_size_overflow(size_t count, size_t elsize) count, elsize); } static void *ruby_xmalloc2_body(size_t n, size_t size); void * @@ -488,6 +488,18 @@ RBIMPL_ATTR_NORETURN() */ void ruby_malloc_size_overflow(size_t x, size_t y); #ifdef HAVE_RB_GC_GUARDED_PTR_VAL volatile VALUE *rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val); #endif @@ -635,6 +647,81 @@ rbimpl_size_mul_or_raise(size_t x, size_t y) } } /** * This is an implementation detail of #RB_ALLOCV_N(). People don't use this * directly. |