38#ifndef USE_TRANSIENT_HEAP
39# define USE_TRANSIENT_HEAP 1
42#define RARRAY(obj) RBIMPL_CAST((struct RArray *)(obj))
43#define RARRAY_EMBED_FLAG RARRAY_EMBED_FLAG
44#define RARRAY_EMBED_LEN_MASK RARRAY_EMBED_LEN_MASK
45#define RARRAY_EMBED_LEN_MAX RARRAY_EMBED_LEN_MAX
46#define RARRAY_EMBED_LEN_SHIFT RARRAY_EMBED_LEN_SHIFT
48# define RARRAY_TRANSIENT_FLAG RARRAY_TRANSIENT_FLAG
50# define RARRAY_TRANSIENT_FLAG 0
52#define RARRAY_LEN rb_array_len
53#define RARRAY_CONST_PTR rb_array_const_ptr
54#define RARRAY_CONST_PTR_TRANSIENT rb_array_const_ptr_transient
57#if defined(__fcc__) || defined(__fcc_version) || \
58 defined(__FCC__) || defined(__FCC_VERSION)
60# define FIX_CONST_VALUE_PTR(x) ((const VALUE *)(x))
62# define FIX_CONST_VALUE_PTR(x) (x)
65#define RARRAY_EMBED_LEN RARRAY_EMBED_LEN
66#define RARRAY_LENINT RARRAY_LENINT
67#define RARRAY_TRANSIENT_P RARRAY_TRANSIENT_P
68#define RARRAY_ASET RARRAY_ASET
69#define RARRAY_PTR RARRAY_PTR
94#if defined(__clang__) || \
95 !defined(__cplusplus) || \
96 (__cplusplus > 199711L)
110#if USE_TRANSIENT_HEAP
118RARRAY_EMBED_LEN(
VALUE ary)
126 return RBIMPL_CAST((
long)
f);
136 return RARRAY_EMBED_LEN(a);
139 return RARRAY(a)->as.heap.len;
145RARRAY_LENINT(
VALUE ary)
153RARRAY_TRANSIENT_P(
VALUE ary)
157#if USE_TRANSIENT_HEAP
167rb_array_const_ptr_transient(
VALUE a)
179#if ! USE_TRANSIENT_HEAP
183static inline const VALUE *
184rb_array_const_ptr(
VALUE a)
188#if USE_TRANSIENT_HEAP
189 if (RARRAY_TRANSIENT_P(a)) {
193 return rb_array_const_ptr_transient(a);
198rb_array_ptr_use_start(
VALUE a,
204#if USE_TRANSIENT_HEAP
205 if (!allow_transient) {
206 if (RARRAY_TRANSIENT_P(a)) {
217rb_array_ptr_use_end(
VALUE a,
225#define RBIMPL_RARRAY_STMT(flag, ary, var, expr) do { \
226 RBIMPL_ASSERT_TYPE((ary), RUBY_T_ARRAY); \
227 const VALUE rbimpl_ary = (ary); \
228 VALUE *var = rb_array_ptr_use_start(rbimpl_ary, (flag)); \
230 rb_array_ptr_use_end(rbimpl_ary, (flag)); \
233#define RARRAY_PTR_USE_START(a) rb_array_ptr_use_start(a, 0)
234#define RARRAY_PTR_USE_END(a) rb_array_ptr_use_end(a, 0)
235#define RARRAY_PTR_USE(ary, ptr_name, expr) \
236 RBIMPL_RARRAY_STMT(0, ary, ptr_name, expr)
238#define RARRAY_PTR_USE_START_TRANSIENT(a) rb_array_ptr_use_start(a, 1)
239#define RARRAY_PTR_USE_END_TRANSIENT(a) rb_array_ptr_use_end(a, 1)
240#define RARRAY_PTR_USE_TRANSIENT(ary, ptr_name, expr) \
241 RBIMPL_RARRAY_STMT(1, ary, ptr_name, expr)
268#define RARRAY_AREF(a, i) RARRAY_CONST_PTR_TRANSIENT(a)[i]
void rb_ary_detransient(VALUE ary)
Defines RBIMPL_ATTR_ARTIFICIAL.
#define RBIMPL_ATTR_ARTIFICIAL()
Wraps (or simulates) __attribute__((artificial))
#define RBIMPL_ASSERT_OR_ASSUME(expr)
This is either RUBY_ASSERT or RBIMPL_ASSUME, depending on RUBY_DEBUG.
#define FIX_CONST_VALUE_PTR(x)
Tewaking visibility of C variables/functions.
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Defines enum ruby_fl_type.
Arithmetic conversion between C's long and Ruby's.
Defines RBIMPL_ATTR_MAYBE_UNUSED.
#define RBIMPL_ATTR_MAYBE_UNUSED()
Wraps (or simulates) [[maybe_unused]]
Defines RBIMPL_ATTR_PURE.
#define RBIMPL_ATTR_PURE_UNLESS_DEBUG()
Enables RBIMPL_ATTR_PURE iff.
#define RARRAY_EMBED_FLAG
#define RARRAY_TRANSIENT_FLAG
void rb_ary_ptr_use_end(VALUE a)
VALUE * rb_ary_ptr_use_start(VALUE ary)
#define RARRAY_EMBED_LEN_SHIFT
#define RARRAY_EMBED_LEN_MAX
#define RARRAY_EMBED_LEN_MASK
#define RARRAY_PTR_USE_TRANSIENT(ary, ptr_name, expr)
RGENGC write-barrier APIs.
#define RB_OBJ_WRITE(a, slot, b)
WB for new reference from ‘a’ to ‘b’.
#define RB_OBJ_WB_UNPROTECT_FOR(type, obj)
Defines enum ruby_value_type.