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. --- variable.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'variable.c') diff --git a/variable.c b/variable.c index def997d201..81258cb47b 100644 --- a/variable.c +++ b/variable.c @@ -1467,6 +1467,8 @@ void rb_obj_transient_heap_evacuate(VALUE obj, int promote) { if (ROBJ_TRANSIENT_P(obj)) { + assert(!RB_FL_TEST_RAW(obj, ROBJECT_EMBED)); + uint32_t len = ROBJECT_NUMIV(obj); const VALUE *old_ptr = ROBJECT_IVPTR(obj); VALUE *new_ptr; @@ -1493,7 +1495,7 @@ init_iv_list(VALUE obj, uint32_t len, uint32_t newsize, st_table *index_tbl) if (RBASIC(obj)->flags & ROBJECT_EMBED) { newptr = obj_ivar_heap_alloc(obj, newsize); MEMCPY(newptr, ptr, VALUE, len); - RBASIC(obj)->flags &= ~ROBJECT_EMBED; + RB_FL_UNSET_RAW(obj, ROBJECT_EMBED); ROBJECT(obj)->as.heap.ivptr = newptr; } else { @@ -1503,7 +1505,11 @@ init_iv_list(VALUE obj, uint32_t len, uint32_t newsize, st_table *index_tbl) for (; len < newsize; len++) { newptr[len] = Qundef; } +#if USE_RVARGC + ROBJECT(obj)->numiv = newsize; +#else ROBJECT(obj)->as.heap.numiv = newsize; +#endif ROBJECT(obj)->as.heap.iv_index_tbl = index_tbl; } -- cgit v1.2.3