1 | /*
|
---|
2 | ** mruby/value.h - mruby value definitions
|
---|
3 | **
|
---|
4 | ** See Copyright Notice in mruby.h
|
---|
5 | */
|
---|
6 |
|
---|
7 | #ifndef MRUBY_VALUE_H
|
---|
8 | #define MRUBY_VALUE_H
|
---|
9 |
|
---|
10 | #include "common.h"
|
---|
11 |
|
---|
12 | /**
|
---|
13 | * MRuby Value definition functions and macros.
|
---|
14 | */
|
---|
15 | MRB_BEGIN_DECL
|
---|
16 |
|
---|
17 | typedef uint32_t mrb_sym;
|
---|
18 | typedef uint8_t mrb_bool;
|
---|
19 | struct mrb_state;
|
---|
20 |
|
---|
21 | #if defined(MRB_INT16) && defined(MRB_INT64)
|
---|
22 | # error "You can't define MRB_INT16 and MRB_INT64 at the same time."
|
---|
23 | #endif
|
---|
24 |
|
---|
25 | #if defined _MSC_VER && _MSC_VER < 1800
|
---|
26 | # define PRIo64 "llo"
|
---|
27 | # define PRId64 "lld"
|
---|
28 | # define PRIx64 "llx"
|
---|
29 | # define PRIo16 "ho"
|
---|
30 | # define PRId16 "hd"
|
---|
31 | # define PRIx16 "hx"
|
---|
32 | # define PRIo32 "o"
|
---|
33 | # define PRId32 "d"
|
---|
34 | # define PRIx32 "x"
|
---|
35 | #else
|
---|
36 | # include <inttypes.h>
|
---|
37 | #endif
|
---|
38 |
|
---|
39 | #if defined(MRB_INT64)
|
---|
40 | typedef int64_t mrb_int;
|
---|
41 | # define MRB_INT_BIT 64
|
---|
42 | # define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
|
---|
43 | # define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
|
---|
44 | # define MRB_PRIo PRIo64
|
---|
45 | # define MRB_PRId PRId64
|
---|
46 | # define MRB_PRIx PRIx64
|
---|
47 | #elif defined(MRB_INT16)
|
---|
48 | typedef int16_t mrb_int;
|
---|
49 | # define MRB_INT_BIT 16
|
---|
50 | # define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
|
---|
51 | # define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
|
---|
52 | # define MRB_PRIo PRIo16
|
---|
53 | # define MRB_PRId PRId16
|
---|
54 | # define MRB_PRIx PRIx16
|
---|
55 | #else
|
---|
56 | typedef int32_t mrb_int;
|
---|
57 | # define MRB_INT_BIT 32
|
---|
58 | # define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
|
---|
59 | # define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
|
---|
60 | # define MRB_PRIo PRIo32
|
---|
61 | # define MRB_PRId PRId32
|
---|
62 | # define MRB_PRIx PRIx32
|
---|
63 | #endif
|
---|
64 |
|
---|
65 |
|
---|
66 | MRB_API double mrb_float_read(const char*, char**);
|
---|
67 | #ifdef MRB_USE_FLOAT
|
---|
68 | typedef float mrb_float;
|
---|
69 | #else
|
---|
70 | typedef double mrb_float;
|
---|
71 | #endif
|
---|
72 |
|
---|
73 | #if defined _MSC_VER && _MSC_VER < 1900
|
---|
74 | # ifndef __cplusplus
|
---|
75 | # define inline __inline
|
---|
76 | # endif
|
---|
77 | # include <stdarg.h>
|
---|
78 | MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
|
---|
79 | MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
|
---|
80 | # define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
|
---|
81 | # define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
|
---|
82 | # if _MSC_VER < 1800
|
---|
83 | # include <float.h>
|
---|
84 | # define isfinite(n) _finite(n)
|
---|
85 | # define isnan _isnan
|
---|
86 | # define isinf(n) (!_finite(n) && !_isnan(n))
|
---|
87 | # define signbit(n) (_copysign(1.0, (n)) < 0.0)
|
---|
88 | static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
|
---|
89 | # define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
|
---|
90 | # define NAN ((float)(INFINITY - INFINITY))
|
---|
91 | # endif
|
---|
92 | #endif
|
---|
93 |
|
---|
94 | enum mrb_vtype {
|
---|
95 | MRB_TT_FALSE = 0, /* 0 */
|
---|
96 | MRB_TT_FREE, /* 1 */
|
---|
97 | MRB_TT_TRUE, /* 2 */
|
---|
98 | MRB_TT_FIXNUM, /* 3 */
|
---|
99 | MRB_TT_SYMBOL, /* 4 */
|
---|
100 | MRB_TT_UNDEF, /* 5 */
|
---|
101 | MRB_TT_FLOAT, /* 6 */
|
---|
102 | MRB_TT_CPTR, /* 7 */
|
---|
103 | MRB_TT_OBJECT, /* 8 */
|
---|
104 | MRB_TT_CLASS, /* 9 */
|
---|
105 | MRB_TT_MODULE, /* 10 */
|
---|
106 | MRB_TT_ICLASS, /* 11 */
|
---|
107 | MRB_TT_SCLASS, /* 12 */
|
---|
108 | MRB_TT_PROC, /* 13 */
|
---|
109 | MRB_TT_ARRAY, /* 14 */
|
---|
110 | MRB_TT_HASH, /* 15 */
|
---|
111 | MRB_TT_STRING, /* 16 */
|
---|
112 | MRB_TT_RANGE, /* 17 */
|
---|
113 | MRB_TT_EXCEPTION, /* 18 */
|
---|
114 | MRB_TT_FILE, /* 19 */
|
---|
115 | MRB_TT_ENV, /* 20 */
|
---|
116 | MRB_TT_DATA, /* 21 */
|
---|
117 | MRB_TT_FIBER, /* 22 */
|
---|
118 | MRB_TT_ISTRUCT, /* 23 */
|
---|
119 | MRB_TT_BREAK, /* 24 */
|
---|
120 | MRB_TT_MAXDEFINE /* 25 */
|
---|
121 | };
|
---|
122 |
|
---|
123 | #include <mruby/object.h>
|
---|
124 |
|
---|
125 | #ifdef MRB_DOCUMENTATION_BLOCK
|
---|
126 |
|
---|
127 | /**
|
---|
128 | * @abstract
|
---|
129 | * MRuby value boxing.
|
---|
130 | *
|
---|
131 | * Actual implementation depends on configured boxing type.
|
---|
132 | *
|
---|
133 | * @see mruby/boxing_no.h Default boxing representation
|
---|
134 | * @see mruby/boxing_word.h Word representation
|
---|
135 | * @see mruby/boxing_nan.h Boxed double representation
|
---|
136 | */
|
---|
137 | typedef void mrb_value;
|
---|
138 |
|
---|
139 | #endif
|
---|
140 |
|
---|
141 | #if defined(MRB_NAN_BOXING)
|
---|
142 | #include "boxing_nan.h"
|
---|
143 | #elif defined(MRB_WORD_BOXING)
|
---|
144 | #include "boxing_word.h"
|
---|
145 | #else
|
---|
146 | #include "boxing_no.h"
|
---|
147 | #endif
|
---|
148 |
|
---|
149 | #ifndef mrb_fixnum_p
|
---|
150 | #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
|
---|
151 | #endif
|
---|
152 | #ifndef mrb_undef_p
|
---|
153 | #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
|
---|
154 | #endif
|
---|
155 | #ifndef mrb_nil_p
|
---|
156 | #define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
|
---|
157 | #endif
|
---|
158 | #ifndef mrb_bool
|
---|
159 | #define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
|
---|
160 | #endif
|
---|
161 | #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
|
---|
162 | #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
|
---|
163 | #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
|
---|
164 | #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
|
---|
165 | #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
|
---|
166 | #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
|
---|
167 | #define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
|
---|
168 | #define mrb_test(o) mrb_bool(o)
|
---|
169 | MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
|
---|
170 |
|
---|
171 | /*
|
---|
172 | * Returns a float in Ruby.
|
---|
173 | */
|
---|
174 | MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
---|
175 | {
|
---|
176 | mrb_value v;
|
---|
177 | (void) mrb;
|
---|
178 | SET_FLOAT_VALUE(mrb, v, f);
|
---|
179 | return v;
|
---|
180 | }
|
---|
181 |
|
---|
182 | static inline mrb_value
|
---|
183 | mrb_cptr_value(struct mrb_state *mrb, void *p)
|
---|
184 | {
|
---|
185 | mrb_value v;
|
---|
186 | (void) mrb;
|
---|
187 | SET_CPTR_VALUE(mrb,v,p);
|
---|
188 | return v;
|
---|
189 | }
|
---|
190 |
|
---|
191 | /*
|
---|
192 | * Returns a fixnum in Ruby.
|
---|
193 | */
|
---|
194 | MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i)
|
---|
195 | {
|
---|
196 | mrb_value v;
|
---|
197 | SET_INT_VALUE(v, i);
|
---|
198 | return v;
|
---|
199 | }
|
---|
200 |
|
---|
201 | static inline mrb_value
|
---|
202 | mrb_symbol_value(mrb_sym i)
|
---|
203 | {
|
---|
204 | mrb_value v;
|
---|
205 | SET_SYM_VALUE(v, i);
|
---|
206 | return v;
|
---|
207 | }
|
---|
208 |
|
---|
209 | static inline mrb_value
|
---|
210 | mrb_obj_value(void *p)
|
---|
211 | {
|
---|
212 | mrb_value v;
|
---|
213 | SET_OBJ_VALUE(v, (struct RBasic*)p);
|
---|
214 | mrb_assert(p == mrb_ptr(v));
|
---|
215 | mrb_assert(((struct RBasic*)p)->tt == mrb_type(v));
|
---|
216 | return v;
|
---|
217 | }
|
---|
218 |
|
---|
219 |
|
---|
220 | /*
|
---|
221 | * Get a nil mrb_value object.
|
---|
222 | *
|
---|
223 | * @return
|
---|
224 | * nil mrb_value object reference.
|
---|
225 | */
|
---|
226 | MRB_INLINE mrb_value mrb_nil_value(void)
|
---|
227 | {
|
---|
228 | mrb_value v;
|
---|
229 | SET_NIL_VALUE(v);
|
---|
230 | return v;
|
---|
231 | }
|
---|
232 |
|
---|
233 | /*
|
---|
234 | * Returns false in Ruby.
|
---|
235 | */
|
---|
236 | MRB_INLINE mrb_value mrb_false_value(void)
|
---|
237 | {
|
---|
238 | mrb_value v;
|
---|
239 | SET_FALSE_VALUE(v);
|
---|
240 | return v;
|
---|
241 | }
|
---|
242 |
|
---|
243 | /*
|
---|
244 | * Returns true in Ruby.
|
---|
245 | */
|
---|
246 | MRB_INLINE mrb_value mrb_true_value(void)
|
---|
247 | {
|
---|
248 | mrb_value v;
|
---|
249 | SET_TRUE_VALUE(v);
|
---|
250 | return v;
|
---|
251 | }
|
---|
252 |
|
---|
253 | static inline mrb_value
|
---|
254 | mrb_bool_value(mrb_bool boolean)
|
---|
255 | {
|
---|
256 | mrb_value v;
|
---|
257 | SET_BOOL_VALUE(v, boolean);
|
---|
258 | return v;
|
---|
259 | }
|
---|
260 |
|
---|
261 | static inline mrb_value
|
---|
262 | mrb_undef_value(void)
|
---|
263 | {
|
---|
264 | mrb_value v;
|
---|
265 | SET_UNDEF_VALUE(v);
|
---|
266 | return v;
|
---|
267 | }
|
---|
268 |
|
---|
269 | #ifdef MRB_USE_ETEXT_EDATA
|
---|
270 | #if (defined(__APPLE__) && defined(__MACH__))
|
---|
271 | #include <mach-o/getsect.h>
|
---|
272 | static inline mrb_bool
|
---|
273 | mrb_ro_data_p(const char *p)
|
---|
274 | {
|
---|
275 | return (const char*)get_etext() < p && p < (const char*)get_edata();
|
---|
276 | }
|
---|
277 | #else
|
---|
278 | extern char _etext[];
|
---|
279 | #ifdef MRB_NO_INIT_ARRAY_START
|
---|
280 | extern char _edata[];
|
---|
281 |
|
---|
282 | static inline mrb_bool
|
---|
283 | mrb_ro_data_p(const char *p)
|
---|
284 | {
|
---|
285 | return _etext < p && p < _edata;
|
---|
286 | }
|
---|
287 | #else
|
---|
288 | extern char __init_array_start[];
|
---|
289 |
|
---|
290 | static inline mrb_bool
|
---|
291 | mrb_ro_data_p(const char *p)
|
---|
292 | {
|
---|
293 | return _etext < p && p < (char*)&__init_array_start;
|
---|
294 | }
|
---|
295 | #endif
|
---|
296 | #endif
|
---|
297 | #else
|
---|
298 | # define mrb_ro_data_p(p) FALSE
|
---|
299 | #endif
|
---|
300 |
|
---|
301 | MRB_END_DECL
|
---|
302 |
|
---|
303 | #endif /* MRUBY_VALUE_H */
|
---|