summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2021-08-02 14:22:47 -0400
committerPeter Zhu <peter@peterzhu.ca>2021-10-25 13:26:23 -0400
commit6374be5a8188ff5ed2c70b9f1d76672c87a0eda7 (patch)
tree6ac8436f9e29bede5bf7ad167625c47082e5291e
parent46b66eb9e8e6de2d5750591e532310e8f8599d90 (diff)
downloadruby-6374be5a8188ff5ed2c70b9f1d76672c87a0eda7.tar.gz
[Feature #18239] Refactor RVARGC alloc functions
The allocation functions no longer assume that one RVALUE needs to be allocated.
-rw-r--r--class.c8
-rw-r--r--gc.c4
-rw-r--r--internal/gc.h11
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) */