2 ** mruby/value.h - mruby value definitions
4 ** See Copyright Notice in mruby.h
13 * MRuby Value definition functions and macros.
17 typedef uint32_t mrb_sym;
18 typedef uint8_t mrb_bool;
21 #if defined(MRB_INT16) && defined(MRB_INT64)
22 # error "You can't define MRB_INT16 and MRB_INT64 at the same time."
25 #if defined _MSC_VER && _MSC_VER < 1800
36 # include <inttypes.h>
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
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
66 #ifndef MRB_WITHOUT_FLOAT
67 MRB_API double mrb_float_read(const char*, char**);
69 typedef float mrb_float;
71 typedef double mrb_float;
75 #if defined _MSC_VER && _MSC_VER < 1900
77 # define inline __inline
80 MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
81 MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
82 # define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
83 # define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
84 # if _MSC_VER < 1800 && !defined MRB_WITHOUT_FLOAT
86 # define isfinite(n) _finite(n)
88 # define isinf(n) (!_finite(n) && !_isnan(n))
89 # define signbit(n) (_copysign(1.0, (n)) < 0.0)
90 static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
91 # define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
92 # define NAN ((float)(INFINITY - INFINITY))
97 MRB_TT_FALSE = 0, /* 0 */
100 MRB_TT_FIXNUM, /* 3 */
101 MRB_TT_SYMBOL, /* 4 */
102 MRB_TT_UNDEF, /* 5 */
103 MRB_TT_FLOAT, /* 6 */
105 MRB_TT_OBJECT, /* 8 */
106 MRB_TT_CLASS, /* 9 */
107 MRB_TT_MODULE, /* 10 */
108 MRB_TT_ICLASS, /* 11 */
109 MRB_TT_SCLASS, /* 12 */
110 MRB_TT_PROC, /* 13 */
111 MRB_TT_ARRAY, /* 14 */
112 MRB_TT_HASH, /* 15 */
113 MRB_TT_STRING, /* 16 */
114 MRB_TT_RANGE, /* 17 */
115 MRB_TT_EXCEPTION, /* 18 */
116 MRB_TT_FILE, /* 19 */
118 MRB_TT_DATA, /* 21 */
119 MRB_TT_FIBER, /* 22 */
120 MRB_TT_ISTRUCT, /* 23 */
121 MRB_TT_BREAK, /* 24 */
122 MRB_TT_MAXDEFINE /* 25 */
125 #include <mruby/object.h>
127 #ifdef MRB_DOCUMENTATION_BLOCK
131 * MRuby value boxing.
133 * Actual implementation depends on configured boxing type.
135 * @see mruby/boxing_no.h Default boxing representation
136 * @see mruby/boxing_word.h Word representation
137 * @see mruby/boxing_nan.h Boxed double representation
139 typedef void mrb_value;
143 #if defined(MRB_NAN_BOXING)
144 #include "boxing_nan.h"
145 #elif defined(MRB_WORD_BOXING)
146 #include "boxing_word.h"
148 #include "boxing_no.h"
152 #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
155 #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
158 #define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
161 #define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
163 #if !defined(MRB_SYMBOL_BITSIZE)
164 #define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
165 #define MRB_SYMBOL_MAX UINT32_MAX
167 #ifndef MRB_WITHOUT_FLOAT
168 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
170 #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
171 #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
172 #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
173 #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
174 #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
175 #define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
176 #define mrb_test(o) mrb_bool(o)
177 MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
180 * Returns a float in Ruby.
182 #ifndef MRB_WITHOUT_FLOAT
183 MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
187 SET_FLOAT_VALUE(mrb, v, f);
192 static inline mrb_value
193 mrb_cptr_value(struct mrb_state *mrb, void *p)
197 SET_CPTR_VALUE(mrb,v,p);
202 * Returns a fixnum in Ruby.
204 MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i)
211 static inline mrb_value
212 mrb_symbol_value(mrb_sym i)
219 static inline mrb_value
220 mrb_obj_value(void *p)
223 SET_OBJ_VALUE(v, (struct RBasic*)p);
224 mrb_assert(p == mrb_ptr(v));
225 mrb_assert(((struct RBasic*)p)->tt == mrb_type(v));
231 * Get a nil mrb_value object.
234 * nil mrb_value object reference.
236 MRB_INLINE mrb_value mrb_nil_value(void)
244 * Returns false in Ruby.
246 MRB_INLINE mrb_value mrb_false_value(void)
254 * Returns true in Ruby.
256 MRB_INLINE mrb_value mrb_true_value(void)
263 static inline mrb_value
264 mrb_bool_value(mrb_bool boolean)
267 SET_BOOL_VALUE(v, boolean);
271 static inline mrb_value
272 mrb_undef_value(void)
279 #ifdef MRB_USE_ETEXT_EDATA
280 #if (defined(__APPLE__) && defined(__MACH__))
281 #include <mach-o/getsect.h>
282 static inline mrb_bool
283 mrb_ro_data_p(const char *p)
285 return (const char*)get_etext() < p && p < (const char*)get_edata();
288 extern char _etext[];
289 #ifdef MRB_NO_INIT_ARRAY_START
290 extern char _edata[];
292 static inline mrb_bool
293 mrb_ro_data_p(const char *p)
295 return _etext < p && p < _edata;
298 extern char __init_array_start[];
300 static inline mrb_bool
301 mrb_ro_data_p(const char *p)
303 return _etext < p && p < (char*)&__init_array_start;
308 # define mrb_ro_data_p(p) FALSE
313 #endif /* MRUBY_VALUE_H */