From 026321c5b976c5e95731046b94555b1226198be4 Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Fri, 17 Feb 2023 15:51:16 +0000 Subject: [PATCH] [Feature #19474] Refactor NEWOBJ macros NEWOBJ_OF is now our canonical newobj macro. It takes an optional ec --- array.c | 20 ++++++++++---------- bignum.c | 3 ++- class.c | 2 +- complex.c | 3 ++- gc.c | 9 +-------- hash.c | 2 +- internal/gc.h | 29 +++++++++++++---------------- io.c | 2 +- numeric.c | 2 +- rational.c | 3 ++- re.c | 4 ++-- shape.c | 2 ++ string.c | 16 ++++++++-------- struct.c | 2 +- 14 files changed, 47 insertions(+), 52 deletions(-) diff --git a/array.c b/array.c index 89048e6bca..1221b43923 100644 --- a/array.c +++ b/array.c @@ -778,9 +778,9 @@ ary_alloc_embed(VALUE klass, long capa) { size_t size = ary_embed_size(capa); assert(rb_gc_size_allocatable_p(size)); - RVARGC_NEWOBJ_OF(ary, struct RArray, klass, + NEWOBJ_OF(ary, struct RArray, klass, T_ARRAY | RARRAY_EMBED_FLAG | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0), - size); + size, 0); /* Created array is: * FL_SET_EMBED((VALUE)ary); * ARY_SET_EMBED_LEN((VALUE)ary, 0); @@ -791,9 +791,9 @@ ary_alloc_embed(VALUE klass, long capa) static VALUE ary_alloc_heap(VALUE klass) { - RVARGC_NEWOBJ_OF(ary, struct RArray, klass, + NEWOBJ_OF(ary, struct RArray, klass, T_ARRAY | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0), - sizeof(struct RArray)); + sizeof(struct RArray), 0); return (VALUE)ary; } @@ -890,9 +890,9 @@ ec_ary_alloc_embed(rb_execution_context_t *ec, VALUE klass, long capa) { size_t size = ary_embed_size(capa); assert(rb_gc_size_allocatable_p(size)); - RB_RVARGC_EC_NEWOBJ_OF(ec, ary, struct RArray, klass, - T_ARRAY | RARRAY_EMBED_FLAG | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0), - size); + NEWOBJ_OF(ary, struct RArray, klass, + T_ARRAY | RARRAY_EMBED_FLAG | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0), + size, ec); /* Created array is: * FL_SET_EMBED((VALUE)ary); * ARY_SET_EMBED_LEN((VALUE)ary, 0); @@ -903,9 +903,9 @@ ec_ary_alloc_embed(rb_execution_context_t *ec, VALUE klass, long capa) static VALUE ec_ary_alloc_heap(rb_execution_context_t *ec, VALUE klass) { - RB_RVARGC_EC_NEWOBJ_OF(ec, ary, struct RArray, klass, - T_ARRAY | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0), - sizeof(struct RArray)); + NEWOBJ_OF(ary, struct RArray, klass, + T_ARRAY | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0), + sizeof(struct RArray), ec); return (VALUE)ary; } diff --git a/bignum.c b/bignum.c index 466b21abc0..bef92f5a33 100644 --- a/bignum.c +++ b/bignum.c @@ -3023,7 +3023,8 @@ rb_big_resize(VALUE big, size_t len) static VALUE bignew_1(VALUE klass, size_t len, int sign) { - NEWOBJ_OF(big, struct RBignum, klass, T_BIGNUM | (RGENGC_WB_PROTECTED_BIGNUM ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(big, struct RBignum, klass, + T_BIGNUM | (RGENGC_WB_PROTECTED_BIGNUM ? FL_WB_PROTECTED : 0), sizeof(struct RBignum), 0); VALUE bigv = (VALUE)big; BIGNUM_SET_SIGN(bigv, sign); if (len <= BIGNUM_EMBED_LEN_MAX) { diff --git a/class.c b/class.c index e4c1905ae0..7e0099944a 100644 --- a/class.c +++ b/class.c @@ -202,7 +202,7 @@ class_alloc(VALUE flags, VALUE klass) flags &= T_MASK; flags |= FL_PROMOTED1 /* start from age == 2 */; if (RGENGC_WB_PROTECTED_CLASS) flags |= FL_WB_PROTECTED; - RVARGC_NEWOBJ_OF(obj, struct RClass, klass, flags, alloc_size); + NEWOBJ_OF(obj, struct RClass, klass, flags, alloc_size, 0); #if RCLASS_EXT_EMBEDDED memset(RCLASS_EXT(obj), 0, sizeof(rb_classext_t)); diff --git a/complex.c b/complex.c index 686114b292..c9272778bb 100644 --- a/complex.c +++ b/complex.c @@ -391,7 +391,8 @@ k_numeric_p(VALUE x) inline static VALUE nucomp_s_new_internal(VALUE klass, VALUE real, VALUE imag) { - NEWOBJ_OF(obj, struct RComplex, klass, T_COMPLEX | (RGENGC_WB_PROTECTED_COMPLEX ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(obj, struct RComplex, klass, + T_COMPLEX | (RGENGC_WB_PROTECTED_COMPLEX ? FL_WB_PROTECTED : 0), sizeof(struct RComplex), 0); RCOMPLEX_SET_REAL(obj, real); RCOMPLEX_SET_IMAG(obj, imag); diff --git a/gc.c b/gc.c index 576c2371ae..f84d27d810 100644 --- a/gc.c +++ b/gc.c @@ -2909,14 +2909,7 @@ rb_wb_unprotected_newobj_of(VALUE klass, VALUE flags, size_t size) } VALUE -rb_wb_protected_newobj_of(VALUE klass, VALUE flags, size_t size) -{ - GC_ASSERT((flags & FL_WB_PROTECTED) == 0); - return newobj_of(GET_RACTOR(), klass, flags, 0, 0, 0, TRUE, size); -} - -VALUE -rb_ec_wb_protected_newobj_of(rb_execution_context_t *ec, VALUE klass, VALUE flags, size_t size) +rb_wb_protected_newobj_of(rb_execution_context_t *ec, VALUE klass, VALUE flags, size_t size) { GC_ASSERT((flags & FL_WB_PROTECTED) == 0); return newobj_of(rb_ec_ractor_ptr(ec), klass, flags, 0, 0, 0, TRUE, size); diff --git a/hash.c b/hash.c index 3d58bd9770..fc214cce54 100644 --- a/hash.c +++ b/hash.c @@ -1498,7 +1498,7 @@ static VALUE hash_alloc_flags(VALUE klass, VALUE flags, VALUE ifnone) { const VALUE wb = (RGENGC_WB_PROTECTED_HASH ? FL_WB_PROTECTED : 0); - NEWOBJ_OF(hash, struct RHash, klass, T_HASH | wb | flags); + NEWOBJ_OF(hash, struct RHash, klass, T_HASH | wb | flags, sizeof(struct RHash), 0); RHASH_SET_IFNONE((VALUE)hash, ifnone); diff --git a/internal/gc.h b/internal/gc.h index 6ca49303e4..86f3f4ae17 100644 --- a/internal/gc.h +++ b/internal/gc.h @@ -14,6 +14,7 @@ #include "internal/compilers.h" /* for __has_attribute */ #include "ruby/ruby.h" /* for rb_event_flag_t */ +#include "vm_core.h" /* for GET_EC() */ #if defined(__x86_64__) && !defined(_ILP32) && defined(__GNUC__) #define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movq\t%%rsp, %0" : "=r" (*(p))) @@ -132,23 +133,20 @@ struct rb_objspace; /* in vm_core.h */ # undef RB_NEWOBJ_OF #endif -#define RB_RVARGC_NEWOBJ_OF(var, T, c, f, s) \ - T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ - rb_wb_protected_newobj_of((c), (f) & ~FL_WB_PROTECTED, s) : \ - rb_wb_unprotected_newobj_of((c), (f), s)) +#define NEWOBJ_OF_0(var, T, c, f, s, ec) \ + T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ + rb_wb_protected_newobj_of(GET_EC(), (c), (f) & ~FL_WB_PROTECTED, s) : \ + rb_wb_unprotected_newobj_of((c), (f), s)) +#define NEWOBJ_OF_ec(var, T, c, f, s, ec) \ + T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ + rb_wb_protected_newobj_of((ec), (c), (f) & ~FL_WB_PROTECTED, s) : \ + rb_wb_unprotected_newobj_of((c), (f), s)) -#define RB_RVARGC_EC_NEWOBJ_OF(ec, var, T, c, f, s) \ - T *(var) = (T *)(((f) & FL_WB_PROTECTED) ? \ - rb_ec_wb_protected_newobj_of((ec), (c), (f) & ~FL_WB_PROTECTED, s) : \ - rb_wb_unprotected_newobj_of((c), (f), s)) +#define NEWOBJ_OF(var, T, c, f, s, ec) \ + NEWOBJ_OF_HELPER(ec)(var, T, c, f, s, ec) -/* optimized version of NEWOBJ() */ -#define RB_NEWOBJ_OF(var, T, c, f) RB_RVARGC_NEWOBJ_OF(var, T, c, f, RVALUE_SIZE) +#define NEWOBJ_OF_HELPER(ec) NEWOBJ_OF_ ## ec -#define RB_EC_NEWOBJ_OF(ec, var, T, c, f) RB_RVARGC_EC_NEWOBJ_OF(ec, var, T, c, f, RVALUE_SIZE) - -#define NEWOBJ_OF(var, T, c, f) RB_NEWOBJ_OF((var), T, (c), (f)) -#define RVARGC_NEWOBJ_OF(var, T, c, f, s) RB_RVARGC_NEWOBJ_OF((var), T, (c), (f), (s)) #define RB_OBJ_GC_FLAGS_MAX 6 /* used in ext/objspace */ #ifndef USE_UNALIGNED_MEMBER_ACCESS @@ -272,9 +270,8 @@ VALUE rb_gc_disable_no_rest(void); /* gc.c (export) */ const char *rb_objspace_data_type_name(VALUE obj); -VALUE rb_wb_protected_newobj_of(VALUE, VALUE, size_t); +VALUE rb_wb_protected_newobj_of(struct rb_execution_context_struct *, VALUE, VALUE, size_t); VALUE rb_wb_unprotected_newobj_of(VALUE, VALUE, size_t); -VALUE rb_ec_wb_protected_newobj_of(struct rb_execution_context_struct *ec, VALUE klass, VALUE flags, size_t); size_t rb_obj_memsize_of(VALUE); void rb_gc_verify_internal_consistency(void); size_t rb_obj_gc_flags(VALUE, ID[], size_t); diff --git a/io.c b/io.c index be5d479099..1b7cdc86f5 100644 --- a/io.c +++ b/io.c @@ -1091,7 +1091,7 @@ ruby_dup(int orig) static VALUE io_alloc(VALUE klass) { - NEWOBJ_OF(io, struct RFile, klass, T_FILE); + NEWOBJ_OF(io, struct RFile, klass, T_FILE, sizeof(struct RFile), 0); io->fptr = 0; diff --git a/numeric.c b/numeric.c index ab8dde52f4..224b5c7dc2 100644 --- a/numeric.c +++ b/numeric.c @@ -1018,7 +1018,7 @@ num_negative_p(VALUE num) VALUE rb_float_new_in_heap(double d) { - NEWOBJ_OF(flt, struct RFloat, rb_cFloat, T_FLOAT | (RGENGC_WB_PROTECTED_FLOAT ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(flt, struct RFloat, rb_cFloat, T_FLOAT | (RGENGC_WB_PROTECTED_FLOAT ? FL_WB_PROTECTED : 0), sizeof(struct RFloat), 0); #if SIZEOF_DOUBLE <= SIZEOF_VALUE flt->float_value = d; diff --git a/rational.c b/rational.c index 58786b58ba..c5ad7598f7 100644 --- a/rational.c +++ b/rational.c @@ -413,7 +413,8 @@ f_lcm(VALUE x, VALUE y) inline static VALUE nurat_s_new_internal(VALUE klass, VALUE num, VALUE den) { - NEWOBJ_OF(obj, struct RRational, klass, T_RATIONAL | (RGENGC_WB_PROTECTED_RATIONAL ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(obj, struct RRational, klass, T_RATIONAL | (RGENGC_WB_PROTECTED_RATIONAL ? FL_WB_PROTECTED : 0), + sizeof(struct RRational), 0); RATIONAL_SET_NUM((VALUE)obj, num); RATIONAL_SET_DEN((VALUE)obj, den); diff --git a/re.c b/re.c index aee0b741bd..c097c0f378 100644 --- a/re.c +++ b/re.c @@ -961,7 +961,7 @@ VALUE rb_cMatch; static VALUE match_alloc(VALUE klass) { - NEWOBJ_OF(match, struct RMatch, klass, T_MATCH | (RGENGC_WB_PROTECTED_MATCH ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(match, struct RMatch, klass, T_MATCH | (RGENGC_WB_PROTECTED_MATCH ? FL_WB_PROTECTED : 0), sizeof(struct RMatch), 0); match->str = Qfalse; match->rmatch = 0; @@ -3270,7 +3270,7 @@ rb_reg_initialize_str(VALUE obj, VALUE str, int options, onig_errmsg_buffer err, static VALUE rb_reg_s_alloc(VALUE klass) { - NEWOBJ_OF(re, struct RRegexp, klass, T_REGEXP | (RGENGC_WB_PROTECTED_REGEXP ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(re, struct RRegexp, klass, T_REGEXP | (RGENGC_WB_PROTECTED_REGEXP ? FL_WB_PROTECTED : 0), sizeof(struct RRegexp), 0); re->ptr = 0; RB_OBJ_WRITE(re, &re->src, 0); diff --git a/shape.c b/shape.c index 6c158b2c8e..36d1adb7d9 100644 --- a/shape.c +++ b/shape.c @@ -777,7 +777,9 @@ rb_shape_find_by_id(VALUE mod, VALUE id) } #endif +#ifdef HAVE_MMAP #include +#endif void Init_default_shapes(void) diff --git a/string.c b/string.c index 426cb34ca0..f3b1406665 100644 --- a/string.c +++ b/string.c @@ -872,8 +872,8 @@ str_alloc_embed(VALUE klass, size_t capa) assert(size > 0); assert(rb_gc_size_allocatable_p(size)); - RVARGC_NEWOBJ_OF(str, struct RString, klass, - T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size); + NEWOBJ_OF(str, struct RString, klass, + T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size, 0); return (VALUE)str; } @@ -881,8 +881,8 @@ str_alloc_embed(VALUE klass, size_t capa) static inline VALUE str_alloc_heap(VALUE klass) { - RVARGC_NEWOBJ_OF(str, struct RString, klass, - T_STRING | STR_NOEMBED | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), sizeof(struct RString)); + NEWOBJ_OF(str, struct RString, klass, + T_STRING | STR_NOEMBED | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), sizeof(struct RString), 0); return (VALUE)str; } @@ -1695,8 +1695,8 @@ ec_str_alloc_embed(struct rb_execution_context_struct *ec, VALUE klass, size_t c assert(size > 0); assert(rb_gc_size_allocatable_p(size)); - RB_RVARGC_EC_NEWOBJ_OF(ec, str, struct RString, klass, - T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size); + NEWOBJ_OF(str, struct RString, klass, + T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size, ec); return (VALUE)str; } @@ -1704,8 +1704,8 @@ ec_str_alloc_embed(struct rb_execution_context_struct *ec, VALUE klass, size_t c static inline VALUE ec_str_alloc_heap(struct rb_execution_context_struct *ec, VALUE klass) { - RB_RVARGC_EC_NEWOBJ_OF(ec, str, struct RString, klass, - T_STRING | STR_NOEMBED | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), sizeof(struct RString)); + NEWOBJ_OF(str, struct RString, klass, + T_STRING | STR_NOEMBED | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), sizeof(struct RString), ec); return (VALUE)str; } diff --git a/struct.c b/struct.c index efdf63f56e..819f1a8258 100644 --- a/struct.c +++ b/struct.c @@ -839,7 +839,7 @@ static VALUE struct_alloc(VALUE klass) { long n; - NEWOBJ_OF(st, struct RStruct, klass, T_STRUCT | (RGENGC_WB_PROTECTED_STRUCT ? FL_WB_PROTECTED : 0)); + NEWOBJ_OF(st, struct RStruct, klass, T_STRUCT | (RGENGC_WB_PROTECTED_STRUCT ? FL_WB_PROTECTED : 0), sizeof(struct RStruct), 0); n = num_members(klass);