summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-12-24 17:46:43 -0500
committerPeter Zhu <[email protected]>2025-01-02 11:03:04 -0500
commit99ff0224a564b59df3ba8fbd7911dd41a7fdde34 ()
tree50119e2d938e21080f7950ab9f067a0f63b78ce3
parentb8c4af24f920a973cfa1f7b671825e8a5421368c (diff)
Move rbimpl_size_add_overflow from gc.c to memory.h
Notes: Merged: https://.com/ruby/ruby/pull/12459
-rw-r--r--gc.c40
-rw-r--r--include/ruby/internal/memory.h87
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.