7#ifndef MRUBY_BOXING_NAN_H
8#define MRUBY_BOXING_NAN_H
11# error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT32 conflict <<----
15# error ---->> MRB_NAN_BOXING and MRB_NO_FLOAT conflict <<----
18#define MRB_FIXNUM_MIN INT32_MIN
19#define MRB_FIXNUM_MAX INT32_MAX
21enum mrb_nanbox_tt_inline {
22 MRB_NANBOX_TT_OBJECT = 0,
23 MRB_NANBOX_TT_INTEGER = 1,
24 MRB_NANBOX_TT_MISC = 2,
25 MRB_NANBOX_TT_CPTR = 3,
44static inline mrb_float
51 x.u = v.u - 0x8004000000000000;
55#define SET_FLOAT_VALUE(mrb,r,f) do { \
61 float_uint_union.u = 0x7ff8000000000000UL; \
64 float_uint_union.f = (f); \
66 r.u = float_uint_union.u + 0x8004000000000000; \
69#define mrb_float_p(o) (((uint64_t)((o).u)&0xfffc000000000000) != 0)
76#define mrb_nb_tt(o) ((enum mrb_nanbox_tt_inline)((uint32_t)((o).u>>48)&3))
81 if (mrb_float_p(o))
return MRB_TT_FLOAT;
84 switch (mrb_nb_tt(o)) {
85 case MRB_NANBOX_TT_OBJECT: {
86 if (u == 0)
return MRB_TT_FALSE;
87 return ((
struct RBasic*)(uintptr_t)u)->tt;
89 case MRB_NANBOX_TT_INTEGER:
90 return MRB_TT_INTEGER;
91 case MRB_NANBOX_TT_MISC:
92 return (
enum mrb_vtype)((uint32_t)(o.u >> 32) & 0x1f);
93 case MRB_NANBOX_TT_CPTR:
101#define NANBOX_SET_MISC_VALUE(r,t,i) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_MISC, ((uint64_t)(t)<<32) | (i))
103#define mrb_float(o) mrb_nan_boxing_value_float(o)
113#define mrb_fixnum(o) ((mrb_int)(int32_t)((o).u))
119 if (mrb_nb_tt(v)==MRB_NANBOX_TT_OBJECT) {
123 return mrb_fixnum(v);
125#define mrb_integer(o) mrb_nan_boxing_value_int(o)
127#define mrb_fixnum(o) ((mrb_int)(((uintptr_t)0xffffffff)&((o).u)))
128#define mrb_integer(o) mrb_fixnum(o)
130#define mrb_symbol(o) ((mrb_sym)((uintptr_t)0xffffffff)&((o).u))
131#define mrb_ptr(o) ((void*)(uintptr_t)(o).u)
132#define mrb_cptr(o) ((void*)(uintptr_t)(0xffffffffffffULL&(o).u))
134#define NANBOX_SET_VALUE(o, tt, v) do { \
135 (o).u = ((uint64_t)(tt)<<48) | ((uint64_t)(v)); \
138#define SET_NIL_VALUE(r) ((r).u = 0)
139#define SET_FALSE_VALUE(r) NANBOX_SET_MISC_VALUE(r, MRB_TT_FALSE, 1)
140#define SET_TRUE_VALUE(r) NANBOX_SET_MISC_VALUE(r, MRB_TT_TRUE, 1)
141#define SET_BOOL_VALUE(r,b) NANBOX_SET_MISC_VALUE(r, (b) ? MRB_TT_TRUE : MRB_TT_FALSE, 1)
144#define SET_INT_VALUE(mrb, r, n) ((r) = mrb_boxing_int_value(mrb, n))
146#define SET_INT_VALUE(mrb, r, n) SET_FIXNUM_VALUE(r, n)
148#define SET_FIXNUM_VALUE(r,n) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_INTEGER, (uint32_t)(n))
149#define SET_SYM_VALUE(r,v) NANBOX_SET_MISC_VALUE(r, MRB_TT_SYMBOL, (uint32_t)(v))
150#define SET_OBJ_VALUE(r,v) do {(r).u = (uint64_t)(uintptr_t)(v);} while (0)
151#define SET_CPTR_VALUE(mrb,r,v) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_CPTR, (uint64_t)(uintptr_t)(v) & 0x0000ffffffffffffULL)
152#define SET_UNDEF_VALUE(r) NANBOX_SET_MISC_VALUE(r, MRB_TT_UNDEF, 4)
154#define mrb_immediate_p(o) ((mrb_float_p(o) || mrb_nb_tt(o) != MRB_NANBOX_TT_OBJECT) || (o).u == 0)
155#define mrb_nil_p(o) ((o).u == 0)
156#define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE || (o).u == 0)
157#define mrb_fixnum_p(o) (!mrb_float_p(o) && mrb_nb_tt(o)==MRB_NANBOX_TT_INTEGER)
#define MRB_INLINE
Declare a function as always inlined.
Definition common.h:68
#define MRB_API
Declare a public mruby API function.
Definition common.h:79
Definition boxing_nan.h:71
Definition boxing_nan.h:40