12 # define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i)
13 # define str_to_mrb_float(buf) strtof(buf, NULL)
16 # define mrb_float_to_str(buf, i) sprintf(buf, "%.16e", i)
17 # define str_to_mrb_float(buf) strtod(buf, NULL)
20 #if defined(MRB_INT16) && defined(MRB_INT64)
21 # error "You can't define MRB_INT16 and MRB_INT64 at the same time."
24 #if defined(MRB_INT64)
25 # ifdef MRB_NAN_BOXING
26 # error Cannot use NaN boxing when mrb_int is 64bit
29 # define MRB_INT_MIN INT64_MIN
30 # define MRB_INT_MAX INT64_MAX
31 # define PRIdMRB_INT PRId64
32 # define PRIiMRB_INT PRIi64
33 # define PRIoMRB_INT PRIo64
34 # define PRIxMRB_INT PRIx64
35 # define PRIXMRB_INT PRIX64
37 #elif defined(MRB_INT16)
39 # define MRB_INT_MIN INT16_MIN
40 # define MRB_INT_MAX INT16_MAX
43 # define MRB_INT_MIN INT32_MIN
44 # define MRB_INT_MAX INT32_MAX
45 # define PRIdMRB_INT PRId32
46 # define PRIiMRB_INT PRIi32
47 # define PRIoMRB_INT PRIo32
48 # define PRIxMRB_INT PRIx32
49 # define PRIXMRB_INT PRIX32
55 # define inline __inline
57 # define snprintf _snprintf
61 # define isinf(n) (!_finite(n) && !_isnan(n))
62 # define strtoll _strtoi64
63 # define strtof (float)strtod
64 # define PRId32 "I32d"
65 # define PRIi32 "I32i"
66 # define PRIo32 "I32o"
67 # define PRIx32 "I32x"
68 # define PRIX32 "I32X"
69 # define PRId64 "I64d"
70 # define PRIi64 "I64i"
71 # define PRIo64 "I64o"
72 # define PRIx64 "I64x"
73 # define PRIX64 "I64X"
75 # include <inttypes.h>
78 # include <inttypes.h>
84 #if defined(MRB_NAN_BOXING)
87 # error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT conflict <<----
91 # error ---->> MRB_NAN_BOXING and MRB_INT64 conflict <<----
121 #define MRB_TT_HAS_BASIC MRB_TT_OBJECT
123 #ifdef MRB_ENDIAN_BIG
124 #define MRB_ENDIAN_LOHI(a,b) a b
126 #define MRB_ENDIAN_LOHI(a,b) b a
155 #define mrb_tt(o) (((o).value.ttt & 0xfc000)>>14)
156 #define mrb_mktt(tt) (0xfff00000|((tt)<<14))
157 #define mrb_type(o) ((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
158 #define mrb_ptr(o) ((void*)((((intptr_t)0x3fffffffffff)&((intptr_t)((o).value.p)))<<2))
159 #define mrb_float(o) (o).f
161 #define MRB_SET_VALUE(o, tt, attr, v) do {\
162 (o).value.ttt = mrb_mktt(tt);\
168 case MRB_TT_SYMBOL: (o).attr = (v); break;\
169 default: (o).value.i = 0; (o).value.p = (void*)((intptr_t)(o).value.p | (((intptr_t)(v))>>2)); break;\
179 v.
value.ttt = 0x7ff80000;
216 #if defined(MRB_WORD_BOXING)
218 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT
220 enum mrb_special_consts {
227 #define MRB_FIXNUM_FLAG 0x01
228 #define MRB_FIXNUM_SHIFT 1
229 #define MRB_SYMBOL_FLAG 0x0e
230 #define MRB_SPECIAL_SHIFT 8
236 unsigned int i_flag : MRB_FIXNUM_SHIFT;
240 unsigned int sym_flag : MRB_SPECIAL_SHIFT;
250 #define mrb_ptr(o) (o).value.p
251 #define mrb_float(o) (o).value.fp->f
253 #define MRB_SET_VALUE(o, ttt, attr, v) do {\
257 case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\
258 case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\
259 case MRB_TT_UNDEF: (o).w = MRB_Qundef; break;\
260 case MRB_TT_FIXNUM: (o).value.i_flag = MRB_FIXNUM_FLAG; break;\
261 case MRB_TT_SYMBOL: (o).value.sym_flag = MRB_SYMBOL_FLAG; break;\
262 default: if ((o).value.bp) (o).value.bp->tt = ttt; break;\
271 #define MRB_TT_HAS_BASIC MRB_TT_OBJECT
283 #define mrb_type(o) (o).tt
284 #define mrb_ptr(o) (o).value.p
285 #define mrb_float(o) (o).value.f
287 #define MRB_SET_VALUE(o, ttt, attr, v) do {\
306 #ifdef MRB_WORD_BOXING
308 #define mrb_cptr(o) (o).value.vp->p
309 #define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)
310 #define mrb_undef_p(o) ((o).w == MRB_Qundef)
311 #define mrb_nil_p(o) ((o).w == MRB_Qnil)
312 #define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
315 #define mrb_cptr(o) mrb_ptr(o)
316 #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
317 #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
318 #define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !(o).value.i)
319 #define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
323 #define mrb_fixnum(o) (o).value.i
324 #define mrb_symbol(o) (o).value.sym
325 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
326 #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
327 #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
328 #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
329 #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
330 #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
331 #define mrb_test(o) mrb_bool(o)
333 #define MRB_OBJECT_HEADER \
334 enum mrb_vtype tt:8;\
338 struct RBasic *gcnext
341 #define MRB_GC_GRAY 0
342 #define MRB_GC_WHITE_A 1
343 #define MRB_GC_WHITE_B (1 << 1)
344 #define MRB_GC_BLACK (1 << 2)
345 #define MRB_GC_WHITES (MRB_GC_WHITE_A | MRB_GC_WHITE_B)
346 #define MRB_GC_COLOR_MASK 7
348 #define paint_gray(o) ((o)->color = MRB_GC_GRAY)
349 #define paint_black(o) ((o)->color = MRB_GC_BLACK)
350 #define paint_white(o) ((o)->color = MRB_GC_WHITES)
351 #define paint_partial_white(s, o) ((o)->color = (s)->current_white_part)
352 #define is_gray(o) ((o)->color == MRB_GC_GRAY)
353 #define is_white(o) ((o)->color & MRB_GC_WHITES)
354 #define is_black(o) ((o)->color & MRB_GC_BLACK)
355 #define is_dead(s, o) (((o)->color & other_white_part(s) & MRB_GC_WHITES) || (o)->tt == MRB_TT_FREE)
356 #define flip_white_part(s) ((s)->current_white_part = other_white_part(s))
357 #define other_white_part(s) ((s)->current_white_part ^ MRB_GC_WHITES)
362 #define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
364 #define mrb_basic(v) mrb_basic_ptr(v)
370 #define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v)))
372 #define mrb_object(o) mrb_obj_ptr(o)
373 #define mrb_immediate_p(x) (mrb_type(x) <= MRB_TT_CPTR)
374 #define mrb_special_const_p(x) mrb_immediate_p(x)
381 #ifdef MRB_WORD_BOXING
404 if (o.
value.i_flag == MRB_FIXNUM_FLAG) {
407 if (o.
value.sym_flag == MRB_SYMBOL_FLAG) {
433 mrb_obj_value(
void *
p)
442 #ifdef MRB_WORD_BOXING
444 mrb_cptr_value(
struct mrb_state *mrb,
void *
p);
447 mrb_cptr_value(
struct mrb_state *mrb,
void *
p)
457 #define MRB_TT_VOIDP MRB_TT_CPTR
458 #define mrb_voidp_value(m,p) mrb_cptr_value((m),(p))
459 #define mrb_voidp(o) mrb_cptr(o)
460 #define mrb_voidp_p(o) mrb_cptr_p(o)
463 mrb_false_value(
void)
490 mrb_undef_value(
void)