[Feature #18239] Refactor RVARGC alloc functions
The allocation functions no longer assume that one RVALUE needs to be allocated.
This commit is contained in:
parent
46b66eb9e8
commit
6374be5a81
Notes:
git
2021-10-26 02:26:50 +09:00
8
class.c
8
class.c
@ -167,16 +167,16 @@ rb_class_detach_module_subclasses(VALUE klass)
|
|||||||
static VALUE
|
static VALUE
|
||||||
class_alloc(VALUE flags, VALUE klass)
|
class_alloc(VALUE flags, VALUE klass)
|
||||||
{
|
{
|
||||||
size_t payload_size = 0;
|
size_t alloc_size = sizeof(struct RClass);
|
||||||
|
|
||||||
#if USE_RVARGC
|
#if USE_RVARGC
|
||||||
payload_size = sizeof(rb_classext_t);
|
alloc_size += sizeof(rb_classext_t);
|
||||||
#endif
|
#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
|
#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
|
#else
|
||||||
obj->ptr = ZALLOC(rb_classext_t);
|
obj->ptr = ZALLOC(rb_classext_t);
|
||||||
#endif
|
#endif
|
||||||
|
4
gc.c
4
gc.c
@ -4577,7 +4577,9 @@ obj_memsize_of(VALUE obj, int use_all_types)
|
|||||||
if (RCLASS_CC_TBL(obj)) {
|
if (RCLASS_CC_TBL(obj)) {
|
||||||
size += cc_table_memsize(RCLASS_CC_TBL(obj));
|
size += cc_table_memsize(RCLASS_CC_TBL(obj));
|
||||||
}
|
}
|
||||||
|
#if !USE_RVARGC
|
||||||
size += sizeof(rb_classext_t);
|
size += sizeof(rb_classext_t);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case T_ICLASS:
|
case T_ICLASS:
|
||||||
@ -4666,7 +4668,7 @@ obj_memsize_of(VALUE obj, int use_all_types)
|
|||||||
BUILTIN_TYPE(obj), (void*)obj);
|
BUILTIN_TYPE(obj), (void*)obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return size + sizeof(RVALUE);
|
return size + GET_HEAP_PAGE(obj)->slot_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
|
@ -28,16 +28,18 @@ struct rb_objspace; /* in vm_core.h */
|
|||||||
# undef RB_OBJ_WRITE
|
# undef RB_OBJ_WRITE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define RVALUE_SIZE (sizeof(struct RBasic) + sizeof(VALUE[RBIMPL_RVALUE_EMBED_LEN_MAX]))
|
||||||
|
|
||||||
/* optimized version of NEWOBJ() */
|
/* optimized version of NEWOBJ() */
|
||||||
#define RB_NEWOBJ_OF(var, T, c, f) \
|
#define RB_NEWOBJ_OF(var, T, c, f) \
|
||||||
T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \
|
T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \
|
||||||
rb_wb_protected_newobj_of((c), (f) & ~FL_WB_PROTECTED, 0) : \
|
rb_wb_protected_newobj_of((c), (f) & ~FL_WB_PROTECTED, RVALUE_SIZE) : \
|
||||||
rb_wb_unprotected_newobj_of((c), (f), 0))
|
rb_wb_unprotected_newobj_of((c), (f), RVALUE_SIZE))
|
||||||
|
|
||||||
#define RB_EC_NEWOBJ_OF(ec, var, T, c, f) \
|
#define RB_EC_NEWOBJ_OF(ec, var, T, c, f) \
|
||||||
T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \
|
T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \
|
||||||
rb_ec_wb_protected_newobj_of((ec), (c), (f) & ~FL_WB_PROTECTED, 0) : \
|
rb_ec_wb_protected_newobj_of((ec), (c), (f) & ~FL_WB_PROTECTED, RVALUE_SIZE) : \
|
||||||
rb_wb_unprotected_newobj_of((c), (f), 0))
|
rb_wb_unprotected_newobj_of((c), (f), RVALUE_SIZE))
|
||||||
|
|
||||||
#define RB_RVARGC_NEWOBJ_OF(var, T, c, f, s) \
|
#define RB_RVARGC_NEWOBJ_OF(var, T, c, f, s) \
|
||||||
T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \
|
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);
|
static inline void ruby_sized_xfree_inlined(void *ptr, size_t size);
|
||||||
VALUE rb_class_allocate_instance(VALUE klass);
|
VALUE rb_class_allocate_instance(VALUE klass);
|
||||||
void rb_gc_ractor_newobj_cache_clear(rb_ractor_newobj_cache_t *newobj_cache);
|
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
|
RUBY_SYMBOL_EXPORT_BEGIN
|
||||||
/* gc.c (export) */
|
/* gc.c (export) */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user