diff options
author | Jemma Issroff <jemmaissroff@gmail.com> | 2022-10-17 14:31:24 -0400 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2022-10-17 14:47:45 -0700 |
commit | b54c8ba8fc1a03446fa9ecfd7995ba8fafd20a3e (patch) | |
tree | 031d34556b34df9f297d291fe9d87cd70b278daa /object.c | |
parent | 1865ed4ab938a9979b3a310800a37c25e468c564 (diff) |
Simplified rb_obj_copy_ivar implementation
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6573
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 |