diff options
author | Peter Zhu <[email protected]> | 2021-08-26 10:06:32 -0400 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2021-10-25 13:26:23 -0400 |
commit | a5b6598192c30187b19b892af3110a46f6a70d76 (patch) | |
tree | 4620f69a10659deb6f278b36c10ec7915194573e /internal/gc.h | |
parent | 6374be5a8188ff5ed2c70b9f1d76672c87a0eda7 (diff) |
[Feature #18239] Implement VWA for strings
This commit adds support for embedded strings with variable capacity and
uses Variable Width Allocation to allocate strings.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/4933
Diffstat (limited to 'internal/gc.h')
-rw-r--r-- | internal/gc.h | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/internal/gc.h b/internal/gc.h index 233af1ce2c..49b12db2df 100644 --- a/internal/gc.h +++ b/internal/gc.h @@ -18,10 +18,6 @@ struct rb_execution_context_struct; /* in vm_core.h */ struct rb_objspace; /* in vm_core.h */ -#ifndef USE_RVARGC -#define USE_RVARGC 0 -#endif - #ifdef NEWOBJ_OF # undef NEWOBJ_OF # undef RB_NEWOBJ_OF @@ -30,22 +26,21 @@ struct rb_objspace; /* in vm_core.h */ #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, 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, 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) ? \ rb_wb_protected_newobj_of((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)) + +/* optimized version of NEWOBJ() */ +#define RB_NEWOBJ_OF(var, T, c, f) RB_RVARGC_NEWOBJ_OF(var, T, c, f, RVALUE_SIZE) + +#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 */ @@ -102,6 +97,8 @@ 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); +size_t rb_gc_obj_slot_size(VALUE obj); +bool rb_gc_size_allocatable_p(size_t size); RUBY_SYMBOL_EXPORT_BEGIN /* gc.c (export) */ |