mruby  2.0.1
mruby is the lightweight implementation of the Ruby language
value.h
Go to the documentation of this file.
1 
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  */
16 
23 typedef uint32_t mrb_sym;
24 
34 typedef uint8_t mrb_bool;
35 struct mrb_state;
36 
37 #if defined(MRB_INT16) && defined(MRB_INT64)
38 # error "You can't define MRB_INT16 and MRB_INT64 at the same time."
39 #endif
40 
41 #if defined _MSC_VER && _MSC_VER < 1800
42 # define PRIo64 "llo"
43 # define PRId64 "lld"
44 # define PRIx64 "llx"
45 # define PRIo16 "ho"
46 # define PRId16 "hd"
47 # define PRIx16 "hx"
48 # define PRIo32 "o"
49 # define PRId32 "d"
50 # define PRIx32 "x"
51 #else
52 # include <inttypes.h>
53 #endif
54 
55 #if defined(MRB_INT64)
56  typedef int64_t mrb_int;
57 # define MRB_INT_BIT 64
58 # define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
59 # define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
60 # define MRB_PRIo PRIo64
61 # define MRB_PRId PRId64
62 # define MRB_PRIx PRIx64
63 #elif defined(MRB_INT16)
64  typedef int16_t mrb_int;
65 # define MRB_INT_BIT 16
66 # define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
67 # define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
68 # define MRB_PRIo PRIo16
69 # define MRB_PRId PRId16
70 # define MRB_PRIx PRIx16
71 #else
72  typedef int32_t mrb_int;
73 # define MRB_INT_BIT 32
74 # define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
75 # define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
76 # define MRB_PRIo PRIo32
77 # define MRB_PRId PRId32
78 # define MRB_PRIx PRIx32
79 #endif
80 
81 
82 #ifndef MRB_WITHOUT_FLOAT
83 MRB_API double mrb_float_read(const char*, char**);
84 #ifdef MRB_USE_FLOAT
85  typedef float mrb_float;
86 #else
87  typedef double mrb_float;
88 #endif
89 #endif
90 
91 #if defined _MSC_VER && _MSC_VER < 1900
92 # include <stdarg.h>
93 MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
94 MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
95 # define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
96 # define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
97 # if _MSC_VER < 1800 && !defined MRB_WITHOUT_FLOAT
98 # include <float.h>
99 # define isfinite(n) _finite(n)
100 # define isnan _isnan
101 # define isinf(n) (!_finite(n) && !_isnan(n))
102 # define signbit(n) (_copysign(1.0, (n)) < 0.0)
103 static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
104 # define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
105 # define NAN ((float)(INFINITY - INFINITY))
106 # endif
107 #endif
108 
109 enum mrb_vtype {
110  MRB_TT_FALSE = 0, /* 0 */
111  MRB_TT_FREE, /* 1 */
112  MRB_TT_TRUE, /* 2 */
113  MRB_TT_FIXNUM, /* 3 */
114  MRB_TT_SYMBOL, /* 4 */
115  MRB_TT_UNDEF, /* 5 */
116  MRB_TT_FLOAT, /* 6 */
117  MRB_TT_CPTR, /* 7 */
118  MRB_TT_OBJECT, /* 8 */
119  MRB_TT_CLASS, /* 9 */
120  MRB_TT_MODULE, /* 10 */
121  MRB_TT_ICLASS, /* 11 */
122  MRB_TT_SCLASS, /* 12 */
123  MRB_TT_PROC, /* 13 */
124  MRB_TT_ARRAY, /* 14 */
125  MRB_TT_HASH, /* 15 */
126  MRB_TT_STRING, /* 16 */
127  MRB_TT_RANGE, /* 17 */
128  MRB_TT_EXCEPTION, /* 18 */
129  MRB_TT_FILE, /* 19 */
130  MRB_TT_ENV, /* 20 */
131  MRB_TT_DATA, /* 21 */
132  MRB_TT_FIBER, /* 22 */
133  MRB_TT_ISTRUCT, /* 23 */
134  MRB_TT_BREAK, /* 24 */
135  MRB_TT_MAXDEFINE /* 25 */
136 };
137 
138 #include <mruby/object.h>
139 
140 #ifdef MRB_DOCUMENTATION_BLOCK
141 
152 typedef void mrb_value;
153 
154 #endif
155 
156 #if defined(MRB_NAN_BOXING)
157 #include "boxing_nan.h"
158 #elif defined(MRB_WORD_BOXING)
159 #include "boxing_word.h"
160 #else
161 #include "boxing_no.h"
162 #endif
163 
164 #ifndef mrb_fixnum_p
165 #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
166 #endif
167 #ifndef mrb_undef_p
168 #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
169 #endif
170 #ifndef mrb_nil_p
171 #define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
172 #endif
173 #ifndef mrb_false_p
174 #define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE && !!mrb_fixnum(o))
175 #endif
176 #ifndef mrb_true_p
177 #define mrb_true_p(o) (mrb_type(o) == MRB_TT_TRUE)
178 #endif
179 #ifndef mrb_bool
180 #define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
181 #endif
182 #if !defined(MRB_SYMBOL_BITSIZE)
183 #define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
184 #define MRB_SYMBOL_MAX UINT32_MAX
185 #endif
186 #ifndef MRB_WITHOUT_FLOAT
187 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
188 #endif
189 #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
190 #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
191 #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
192 #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
193 #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
194 #define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
195 #define mrb_test(o) mrb_bool(o)
196 
202 #ifndef MRB_WITHOUT_FLOAT
204 {
205  mrb_value v;
206  (void) mrb;
207  SET_FLOAT_VALUE(mrb, v, f);
208  return v;
209 }
210 #endif
211 
213 mrb_cptr_value(struct mrb_state *mrb, void *p)
214 {
215  mrb_value v;
216  (void) mrb;
217  SET_CPTR_VALUE(mrb,v,p);
218  return v;
219 }
220 
227 {
228  mrb_value v;
229  SET_INT_VALUE(v, i);
230  return v;
231 }
232 
234 mrb_symbol_value(mrb_sym i)
235 {
236  mrb_value v;
237  SET_SYM_VALUE(v, i);
238  return v;
239 }
240 
242 mrb_obj_value(void *p)
243 {
244  mrb_value v;
245  SET_OBJ_VALUE(v, (struct RBasic*)p);
246  mrb_assert(p == mrb_ptr(v));
247  mrb_assert(((struct RBasic*)p)->tt == mrb_type(v));
248  return v;
249 }
250 
258 {
259  mrb_value v;
260  SET_NIL_VALUE(v);
261  return v;
262 }
263 
268 {
269  mrb_value v;
270  SET_FALSE_VALUE(v);
271  return v;
272 }
273 
278 {
279  mrb_value v;
280  SET_TRUE_VALUE(v);
281  return v;
282 }
283 
285 mrb_bool_value(mrb_bool boolean)
286 {
287  mrb_value v;
288  SET_BOOL_VALUE(v, boolean);
289  return v;
290 }
291 
293 mrb_undef_value(void)
294 {
295  mrb_value v;
296  SET_UNDEF_VALUE(v);
297  return v;
298 }
299 
300 #if defined(MRB_USE_CUSTOM_RO_DATA_P)
301 /* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */
302 mrb_bool mrb_ro_data_p(const char *p);
303 #elif defined(MRB_USE_ETEXT_EDATA)
304 #if (defined(__APPLE__) && defined(__MACH__))
305 #include <mach-o/getsect.h>
306 static inline mrb_bool
307 mrb_ro_data_p(const char *p)
308 {
309  return (const char*)get_etext() < p && p < (const char*)get_edata();
310 }
311 #else
312 extern char _etext[];
313 #ifdef MRB_NO_INIT_ARRAY_START
314 extern char _edata[];
315 
316 static inline mrb_bool
317 mrb_ro_data_p(const char *p)
318 {
319  return _etext < p && p < _edata;
320 }
321 #else
322 extern char __init_array_start[];
323 
324 static inline mrb_bool
325 mrb_ro_data_p(const char *p)
326 {
327  return _etext < p && p < (char*)&__init_array_start;
328 }
329 #endif
330 #endif
331 #else
332 # define mrb_ro_data_p(p) FALSE
333 #endif
334 
336 
337 #endif /* MRUBY_VALUE_H */
unboxed mrb_value definition
mruby Symbol.
mruby Boolean.
Definition: object.h:19
static mrb_value mrb_false_value(void)
Returns false in Ruby.
Definition: value.h:267
nan boxing mrb_value definition
#define MRB_BEGIN_DECL
Start declarations in C mode.
Definition: common.h:26
word boxing mrb_value definition
#define MRB_API
Declare a public MRuby API function.
Definition: common.h:73
mruby object definition
#define MRB_END_DECL
End declarations in C mode.
Definition: common.h:28
static mrb_value mrb_true_value(void)
Returns true in Ruby.
Definition: value.h:277
mruby common platform definition"
static mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
Returns a float in Ruby.
Definition: value.h:203
static mrb_value mrb_fixnum_value(mrb_int i)
Returns a fixnum in Ruby.
Definition: value.h:226
static mrb_value mrb_nil_value(void)
Get a nil mrb_value object.
Definition: value.h:257
Definition: boxing_nan.h:39
Definition: mruby.h:215
#define MRB_INLINE
Declare a function as always inlined.
Definition: common.h:62