1 #ifndef INTERNAL_IMEMO_H
2 #define INTERNAL_IMEMO_H
11 #include "ruby/internal/config.h"
13 #include "internal/array.h"
14 #include "internal/gc.h"
19 # define IMEMO_DEBUG 0
22 #define IMEMO_MASK 0x0f
25 #define IMEMO_FL_USHIFT (FL_USHIFT + 4)
26 #define IMEMO_FL_USER0 FL_USER4
27 #define IMEMO_FL_USER1 FL_USER5
28 #define IMEMO_FL_USER2 FL_USER6
29 #define IMEMO_FL_USER3 FL_USER7
30 #define IMEMO_FL_USER4 FL_USER8
31 #define IMEMO_FL_USER5 FL_USER9
44 imemo_parser_strterm = 10,
47 imemo_constcache = 13,
65 const VALUE throw_obj;
70 #define THROW_DATA_CONSUMED IMEMO_FL_USER0
75 #if SIZEOF_INT * 2 > SIZEOF_VALUE
119 #define THROW_DATA_P(err) imemo_throw_data_p((VALUE)err)
120 #define MEMO_CAST(m) ((struct MEMO *)(m))
121 #define MEMO_NEW(a, b, c) ((struct MEMO *)rb_imemo_new(imemo_memo, (VALUE)(a), (VALUE)(b), (VALUE)(c), 0))
122 #define MEMO_FOR(type, value) ((type *)RARRAY_PTR(value))
123 #define NEW_MEMO_FOR(type, value) \
124 ((value) = rb_ary_tmp_new_fill(type_roomof(type, VALUE)), MEMO_FOR(type, value))
125 #define NEW_PARTIAL_MEMO_FOR(type, value, member) \
126 ((value) = rb_ary_tmp_new_fill(type_roomof(type, VALUE)), \
127 rb_ary_set_len((value), offsetof(type, member) / sizeof(VALUE)), \
128 MEMO_FOR(type, value))
134 void rb_strterm_mark(
VALUE obj);
135 static inline enum imemo_type imemo_type(
VALUE imemo);
136 static inline int imemo_type_p(
VALUE imemo,
enum imemo_type imemo_type);
137 static inline bool imemo_throw_data_p(
VALUE imemo);
139 static inline VALUE rb_imemo_tmpbuf_auto_free_pointer(
void);
140 static inline void *RB_IMEMO_TMPBUF_PTR(
VALUE v);
141 static inline void *rb_imemo_tmpbuf_set_ptr(
VALUE v,
void *ptr);
142 static inline VALUE rb_imemo_tmpbuf_auto_free_pointer_new_from_an_RString(
VALUE str);
143 static inline void MEMO_V1_SET(
struct MEMO *m,
VALUE v);
144 static inline void MEMO_V2_SET(
struct MEMO *m,
VALUE v);
146 RUBY_SYMBOL_EXPORT_BEGIN
149 #define rb_imemo_new(type, v1, v2, v3, v0) rb_imemo_new_debug(type, v1, v2, v3, v0, __FILE__, __LINE__)
153 const char *rb_imemo_name(
enum imemo_type
type);
154 RUBY_SYMBOL_EXPORT_END
156 static inline enum imemo_type
157 imemo_type(
VALUE imemo)
163 imemo_type_p(
VALUE imemo,
enum imemo_type imemo_type)
170 return expected_type == (
RBASIC(imemo)->flags & mask);
177 #define IMEMO_TYPE_P(v, t) imemo_type_p((VALUE)v, t)
180 imemo_throw_data_p(
VALUE imemo)
192 rb_imemo_tmpbuf_auto_free_pointer(
void)
194 return rb_imemo_new(imemo_tmpbuf, 0, 0, 0, 0);
198 RB_IMEMO_TMPBUF_PTR(
VALUE v)
205 rb_imemo_tmpbuf_set_ptr(
VALUE v,
void *ptr)
211 rb_imemo_tmpbuf_auto_free_pointer_new_from_an_RString(
VALUE str)
221 imemo = rb_imemo_tmpbuf_auto_free_pointer();
226 memcpy(dst, src, len);
#define T_IMEMO
Old name of RUBY_T_IMEMO.
#define FL_USHIFT
Old name of RUBY_FL_USHIFT.
#define RB_OBJ_WRITE(old, slot, young)
Declaration of a "back" pointer.
#define UNLIMITED_ARGUMENTS
This macro is used in conjunction with rb_check_arity().
rb_block_call_func * rb_block_call_func_t
Shorthand type that represents an iterator-written-in-C function pointer.
VALUE type(ANYARGS)
ANYARGS-ed function type.
#define RBASIC(obj)
Convenient casting macro.
#define SafeStringValue(v)
static char * RSTRING_PTR(VALUE str)
Queries the contents pointer of the string.
static long RSTRING_LEN(VALUE str)
Queries the length of the string.
static bool RB_SPECIAL_CONST_P(VALUE obj)
Checks if the given object is of enum ruby_special_consts.
IFUNC (Internal FUNCtion)
const VALUE cref_or_me
class reference or rb_method_entry_t
#define SIZEOF_VALUE
Identical to sizeof(VALUE), except it is a macro that can also be used inside of preprocessor directi...
uintptr_t VALUE
Type that represents a Ruby object.
static bool RB_TYPE_P(VALUE obj, enum ruby_value_type t)
Queries if the given object is of given type.
@ RUBY_T_MASK
Bitmask of ruby_value_type.
void * ruby_xmalloc(size_t size)
Allocates a storage instance.