diff options
author | Peter Zhu <peter@peterzhu.ca> | 2022-07-11 10:09:39 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2022-07-15 09:21:07 -0400 |
commit | 7424ea184f9d67c1c7f3ee97494ed3bd1aa60833 (patch) | |
tree | 822838e39d81cd2785c970cb45a86854823af6fe /variable.c | |
parent | 7fda741f6e67b809b08423f0d4e903c078da2eed (diff) |
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.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6117
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 8 |
1 files changed, 7 insertions, 1 deletions
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; } |