From 7424ea184f9d67c1c7f3ee97494ed3bd1aa60833 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 11 Jul 2022 10:09:39 -0400 Subject: Implement Objects on VWA This commit implements Objects on Variable Width Allocation. This allows Objects with more ivars to be embedded (i.e. contents directly follow the object header) which improves performance through better cache locality. --- object.c | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index 6a7b2cbf23..4baf7ffc56 100644 --- a/object.c +++ b/object.c @@ -267,34 +267,13 @@ rb_obj_singleton_class(VALUE obj) MJIT_FUNC_EXPORTED void rb_obj_copy_ivar(VALUE dest, VALUE obj) { - VALUE *dst_buf = 0; - VALUE *src_buf = 0; - uint32_t len = ROBJECT_EMBED_LEN_MAX; + 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 len = dest_len < src_len ? dest_len : src_len; - if (RBASIC(obj)->flags & ROBJECT_EMBED) { - src_buf = ROBJECT(obj)->as.ary; - - // embedded -> embedded - if (RBASIC(dest)->flags & ROBJECT_EMBED) { - dst_buf = ROBJECT(dest)->as.ary; - } - // embedded -> extended - else { - dst_buf = ROBJECT(dest)->as.heap.ivptr; - } - } - // extended -> extended - else { - RUBY_ASSERT(!(RBASIC(dest)->flags & ROBJECT_EMBED)); - uint32_t src_len = ROBJECT(obj)->as.heap.numiv; - uint32_t dst_len = ROBJECT(dest)->as.heap.numiv; - - len = src_len < dst_len ? src_len : dst_len; - dst_buf = ROBJECT(dest)->as.heap.ivptr; - src_buf = ROBJECT(obj)->as.heap.ivptr; - } - - MEMCPY(dst_buf, src_buf, VALUE, len); + MEMCPY(dest_buf, src_buf, VALUE, len); } static void -- cgit v1.2.1