From 6374be5a8188ff5ed2c70b9f1d76672c87a0eda7 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 2 Aug 2021 14:22:47 -0400 Subject: [Feature #18239] Refactor RVARGC alloc functions The allocation functions no longer assume that one RVALUE needs to be allocated. --- class.c | 8 ++++---- gc.c | 4 +++- internal/gc.h | 11 ++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/class.c b/class.c index 5bfbe6445a..c997b0b172 100644 --- a/class.c +++ b/class.c @@ -167,16 +167,16 @@ rb_class_detach_module_subclasses(VALUE klass) static VALUE class_alloc(VALUE flags, VALUE klass) { - size_t payload_size = 0; + size_t alloc_size = sizeof(struct RClass); #if USE_RVARGC - payload_size = sizeof(rb_classext_t); + alloc_size += sizeof(rb_classext_t); #endif - RVARGC_NEWOBJ_OF(obj, struct RClass, klass, (flags & T_MASK) | FL_PROMOTED1 /* start from age == 2 */ | (RGENGC_WB_PROTECTED_CLASS ? FL_WB_PROTECTED : 0), payload_size); + RVARGC_NEWOBJ_OF(obj, struct RClass, klass, (flags & T_MASK) | FL_PROMOTED1 /* start from age == 2 */ | (RGENGC_WB_PROTECTED_CLASS ? FL_WB_PROTECTED : 0), alloc_size); #if USE_RVARGC - obj->ptr = (rb_classext_t *)rb_gc_rvargc_object_data((VALUE)obj); + obj->ptr = (rb_classext_t *)((char *)obj + sizeof(struct RClass)); #else obj->ptr = ZALLOC(rb_classext_t); #endif diff --git a/gc.c b/gc.c index 11d7bd91f6..04337e4440 100644 --- a/gc.c +++ b/gc.c @@ -4577,7 +4577,9 @@ obj_memsize_of(VALUE obj, int use_all_types) if (RCLASS_CC_TBL(obj)) { size += cc_table_memsize(RCLASS_CC_TBL(obj)); } +#if !USE_RVARGC size += sizeof(rb_classext_t); +#endif } break; case T_ICLASS: @@ -4666,7 +4668,7 @@ obj_memsize_of(VALUE obj, int use_all_types) BUILTIN_TYPE(obj), (void*)obj); } - return size + sizeof(RVALUE); + return size + GET_HEAP_PAGE(obj)->slot_size; } size_t diff --git a/internal/gc.h b/internal/gc.h index 36ed147bd3..233af1ce2c 100644 --- a/internal/gc.h +++ b/internal/gc.h @@ -28,16 +28,18 @@ struct rb_objspace; /* in vm_core.h */ # undef RB_OBJ_WRITE #endif +#define RVALUE_SIZE (sizeof(struct RBasic) + sizeof(VALUE[RBIMPL_RVALUE_EMBED_LEN_MAX])) + /* optimized version of NEWOBJ() */ #define RB_NEWOBJ_OF(var, T, c, f) \ T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ - rb_wb_protected_newobj_of((c), (f) & ~FL_WB_PROTECTED, 0) : \ - rb_wb_unprotected_newobj_of((c), (f), 0)) + rb_wb_protected_newobj_of((c), (f) & ~FL_WB_PROTECTED, RVALUE_SIZE) : \ + rb_wb_unprotected_newobj_of((c), (f), RVALUE_SIZE)) #define RB_EC_NEWOBJ_OF(ec, var, T, c, f) \ T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ - rb_ec_wb_protected_newobj_of((ec), (c), (f) & ~FL_WB_PROTECTED, 0) : \ - rb_wb_unprotected_newobj_of((c), (f), 0)) + rb_ec_wb_protected_newobj_of((ec), (c), (f) & ~FL_WB_PROTECTED, RVALUE_SIZE) : \ + rb_wb_unprotected_newobj_of((c), (f), RVALUE_SIZE)) #define RB_RVARGC_NEWOBJ_OF(var, T, c, f, s) \ T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ @@ -100,7 +102,6 @@ static inline void *ruby_sized_xrealloc2_inlined(void *ptr, size_t new_count, si static inline void ruby_sized_xfree_inlined(void *ptr, size_t size); VALUE rb_class_allocate_instance(VALUE klass); void rb_gc_ractor_newobj_cache_clear(rb_ractor_newobj_cache_t *newobj_cache); -void *rb_gc_rvargc_object_data(VALUE obj); RUBY_SYMBOL_EXPORT_BEGIN /* gc.c (export) */ -- cgit v1.2.1