mruby/c VM Source Code release 4.0.0
Loading...
Searching...
No Matches
boxing_nan.h
Go to the documentation of this file.
1
14
15#if defined(MRBC_INT64) || defined(MRBC_INT16)
16# error "MRBC_NAN_BOXING and MRBC_INT64/16 are mutually exclusive."
17#endif
18
19//@cond
20#define MRBC_NAN_BITS 0xFFFF
21
22//================================================================
39#if defined(MRBC_LITTLE_ENDIAN)
40typedef struct RObject {
41 union {
42 struct {
43 // LSB 32bit
44 union {
45 int32_t i; // MRBC_TT_INTEGER
46 mrbc_sym sym_id; // MRBC_TT_SYMBOL
47
48 struct RBasic *obj; // use inc/dec ref only.
49 struct RClass *cls; // MRBC_TT_CLASS, MRBC_TT_MODULE
50 struct RInstance *instance; // MRBC_TT_OBJECT
51 struct RProc *proc; // MRBC_TT_PROC
52 struct RArray *array; // MRBC_TT_ARRAY
53 struct RString *string; // MRBC_TT_STRING
54 struct RRange *range; // MRBC_TT_RANGE
55 struct RHash *hash; // MRBC_TT_HASH
56 struct RException *exception; // MRBC_TT_EXCEPTION
57 void *handle; // internal use only.
58 };
59
60 // MSB 32bit
61 union {
62 struct {
63 int8_t tt; // valid if nan==0xffff
64 uint8_t pad;
65 uint16_t nan;
66 };
67 uint32_t tt2;
68 };
69 };
70
71 double d; // MRBC_TT_FLOAT
72 };
74
75#elif defined(MRBC_BIG_ENDIAN)
76typedef struct RObject {
77 union {
78 struct {
79 // MSB 32bit
80 union {
81 struct {
82 uint16_t nan;
83 uint8_t pad;
84 int8_t tt; // valid if nan==0xffff
85 };
86 uint32_t tt2;
87 };
88
89 // LSB 32bit
90 union {
91 int32_t i; // MRBC_TT_INTEGER
92 mrbc_sym sym_id; // MRBC_TT_SYMBOL
93
94 struct RBasic *obj; // use inc/dec ref only.
95 struct RClass *cls; // MRBC_TT_CLASS, MRBC_TT_MODULE
96 struct RInstance *instance; // MRBC_TT_OBJECT
97 struct RProc *proc; // MRBC_TT_PROC
98 struct RArray *array; // MRBC_TT_ARRAY
99 struct RString *string; // MRBC_TT_STRING
100 struct RRange *range; // MRBC_TT_RANGE
101 struct RHash *hash; // MRBC_TT_HASH
102 struct RException *exception; // MRBC_TT_EXCEPTION
103 void *handle; // internal use only.
104 };
105 };
106
107 double d; // MRBC_TT_FLOAT
108 };
109} mrbc_value;
110#endif
111
112
113//================================================================
114#define mrbc_type(v) ((v).nan == MRBC_NAN_BITS ? (v).tt : MRBC_TT_FLOAT)
115#define mrbc_integer(o) ((o).i)
116#define mrbc_float(o) ((o).d)
117#define mrbc_symbol(o) ((o).sym_id)
118
119
120// make immediate values.
121#define mrbc_integer_value(n) (mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_INTEGER, .i = (n)}
122#define mrbc_float_value(vm,n) (mrbc_value){.d=(n)}
123#define mrbc_nil_value() (mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_NIL}
124#define mrbc_true_value() (mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_TRUE}
125#define mrbc_false_value() (mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_FALSE}
126#define mrbc_bool_value(n) (mrbc_value){.tt2 = (n)? (MRBC_NAN_BITS << 16 | MRBC_TT_TRUE) : \
127 (MRBC_NAN_BITS << 16 | MRBC_TT_FALSE)}
128#define mrbc_symbol_value(n) (mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_SYMBOL, .sym_id=(n)}
129
130#define mrbc_immediate_value(...) MRBC_arg_choice(__VA_ARGS__, mrbc_immediate_value2, mrbc_immediate_value1) (__VA_ARGS__)
131#define mrbc_immediate_value1(type) \
132 ((mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | (type)}) // internal use only.
133#define mrbc_immediate_value2(type, content) \
134 ((mrbc_value){.tt2 = MRBC_NAN_BITS << 16 | (type), content}) // internal use only.
135
136
137
138//================================================================
139static inline void mrbc_set_integer(mrbc_value *p, mrbc_int_t n)
140{
141 p->tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_INTEGER;
142 p->i = n;
143}
144
145static inline void mrbc_set_float(mrbc_value *p, mrbc_float_t d)
146{
147 p->d = d;
148}
149
150static inline void mrbc_set_nil(mrbc_value *p)
151{
152 p->tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_NIL;
153}
154
155static inline void mrbc_set_true(mrbc_value *p)
156{
157 p->tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_TRUE;
158}
159
160static inline void mrbc_set_false(mrbc_value *p)
161{
162 p->tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_FALSE;
163}
164
165static inline void mrbc_set_bool(mrbc_value *p, int n)
166{
167 p->tt2 = n?
168 (MRBC_NAN_BITS << 16 | MRBC_TT_TRUE):
169 (MRBC_NAN_BITS << 16 | MRBC_TT_FALSE);
170}
171
172static inline void mrbc_set_symbol(mrbc_value *p, mrbc_sym sym_id)
173{
174 p->tt2 = MRBC_NAN_BITS << 16 | MRBC_TT_SYMBOL;
175 p->sym_id = sym_id;
176}
177
178static inline void mrbc_set_tt(mrbc_value *p, mrbc_vtype type)
179{
180 p->tt2 = MRBC_NAN_BITS << 16 | type;
181}
182
183//@endcond
static void mrbc_set_nil(mrbc_value *p)
Definition boxing_no.h:93
static void mrbc_set_symbol(mrbc_value *p, mrbc_sym sym_id)
Definition boxing_no.h:113
static void mrbc_set_tt(mrbc_value *p, mrbc_vtype type)
Definition boxing_no.h:119
static void mrbc_set_bool(mrbc_value *p, int n)
Definition boxing_no.h:108
static void mrbc_set_float(mrbc_value *p, mrbc_float_t d)
Definition boxing_no.h:87
struct RObject mrbc_value
Value object. Default version.
static void mrbc_set_true(mrbc_value *p)
Definition boxing_no.h:98
static void mrbc_set_false(mrbc_value *p)
Definition boxing_no.h:103
static void mrbc_set_integer(mrbc_value *p, mrbc_int_t n)
Definition boxing_no.h:81
Value object. Default version.
Definition boxing_no.h:19
struct RString * string
Definition boxing_no.h:32
struct RProc * proc
Definition boxing_no.h:30
struct RException * exception
Definition boxing_no.h:35
struct RInstance * instance
Definition boxing_no.h:29
mrbc_sym sym_id
Definition boxing_no.h:26
struct RHash * hash
Definition boxing_no.h:34
void * handle
Definition boxing_no.h:36
mrbc_float_t d
Definition boxing_no.h:24
mrbc_vtype tt
Definition boxing_no.h:20
struct RBasic * obj
Definition boxing_no.h:27
struct RClass * cls
Definition boxing_no.h:28
mrbc_int_t i
Definition boxing_no.h:22
struct RArray * array
Definition boxing_no.h:31
struct RRange * range
Definition boxing_no.h:33
float mrbc_float_t
Definition value.h:52
int32_t mrbc_int_t
Definition value.h:47
int16_t mrbc_sym
mruby/c symbol ID
Definition value.h:62
mrbc_vtype
Definition value.h:69
@ MRBC_TT_FALSE
FalseClass.
Definition value.h:82
@ MRBC_TT_SYMBOL
Symbol.
Definition value.h:89
@ MRBC_TT_INTEGER
Integer.
Definition value.h:86
@ MRBC_TT_TRUE
TrueClass.
Definition value.h:85
@ MRBC_TT_NIL
NilClass.
Definition value.h:81