diff options
Diffstat (limited to 'object.c')
-rw-r--r-- | object.c | 32 |
1 files changed, 8 insertions, 24 deletions
@@ -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 |