summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
authorJemma Issroff <jemmaissroff@gmail.com>2022-10-17 14:31:24 -0400
committerAaron Patterson <aaron.patterson@gmail.com>2022-10-17 14:47:45 -0700
commitb54c8ba8fc1a03446fa9ecfd7995ba8fafd20a3e (patch)
tree031d34556b34df9f297d291fe9d87cd70b278daa /object.c
parent1865ed4ab938a9979b3a310800a37c25e468c564 (diff)
downloadruby-b54c8ba8fc1a03446fa9ecfd7995ba8fafd20a3e.tar.gz
Simplified rb_obj_copy_ivar implementation
Diffstat (limited to 'object.c')
-rw-r--r--object.c32
1 files changed, 8 insertions, 24 deletions
diff --git a/object.c b/object.c
index 929968c4cb..d0c0e34f82 100644
--- a/object.c
+++ b/object.c
@@ -268,37 +268,21 @@ rb_obj_singleton_class(VALUE obj)
MJIT_FUNC_EXPORTED void
rb_obj_copy_ivar(VALUE dest, VALUE obj)
{
- VALUE *dest_buf = ROBJECT_IVPTR(dest);
- VALUE *src_buf = ROBJECT_IVPTR(obj);
uint32_t dest_len = ROBJECT_NUMIV(dest);
uint32_t src_len = ROBJECT_NUMIV(obj);
- uint32_t max_len = dest_len < src_len ? src_len : dest_len;
- rb_ensure_iv_list_size(dest, dest_len, max_len);
-
- dest_len = ROBJECT_NUMIV(dest);
- uint32_t min_len = dest_len > src_len ? src_len : dest_len;
-
- if (RBASIC(obj)->flags & ROBJECT_EMBED) {
- src_buf = ROBJECT(obj)->as.ary;
-
- // embedded -> embedded
- if (RBASIC(dest)->flags & ROBJECT_EMBED) {
- dest_buf = ROBJECT(dest)->as.ary;
- }
- // embedded -> extended
- else {
- dest_buf = ROBJECT(dest)->as.heap.ivptr;
- }
+ if (dest_len < src_len) {
+ rb_ensure_iv_list_size(dest, dest_len, src_len);
+ RUBY_ASSERT(!(RBASIC(dest)->flags & ROBJECT_EMBED));
}
- // extended -> extended
else {
- RUBY_ASSERT(!(RBASIC(dest)->flags & ROBJECT_EMBED));
- dest_buf = ROBJECT(dest)->as.heap.ivptr;
- src_buf = ROBJECT(obj)->as.heap.ivptr;
+ RUBY_ASSERT((RBASIC(dest)->flags & ROBJECT_EMBED));
}
- MEMCPY(dest_buf, src_buf, VALUE, min_len);
+ VALUE * dest_buf = ROBJECT_IVPTR(dest);
+ VALUE * src_buf = ROBJECT_IVPTR(obj);
+
+ MEMCPY(dest_buf, src_buf, VALUE, ROBJECT_IV_COUNT(obj));
}
static void