Apply PIE to nghttpx
[platform/upstream/nghttp2.git] / third-party / mruby / include / mruby / value.h
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 #ifndef MRB_WITHOUT_FLOAT
67 MRB_API double mrb_float_read(const char*, char**);
68 #ifdef MRB_USE_FLOAT
69   typedef float mrb_float;
70 #else
71   typedef double mrb_float;
72 #endif
73 #endif
74
75 #if defined _MSC_VER && _MSC_VER < 1900
76 # ifndef __cplusplus
77 #  define inline __inline
78 # endif
79 # include <stdarg.h>
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
85 #  include <float.h>
86 #  define isfinite(n) _finite(n)
87 #  define isnan _isnan
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))
93 # endif
94 #endif
95
96 enum mrb_vtype {
97   MRB_TT_FALSE = 0,   /*   0 */
98   MRB_TT_FREE,        /*   1 */
99   MRB_TT_TRUE,        /*   2 */
100   MRB_TT_FIXNUM,      /*   3 */
101   MRB_TT_SYMBOL,      /*   4 */
102   MRB_TT_UNDEF,       /*   5 */
103   MRB_TT_FLOAT,       /*   6 */
104   MRB_TT_CPTR,        /*   7 */
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 */
117   MRB_TT_ENV,         /*  20 */
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 */
123 };
124
125 #include <mruby/object.h>
126
127 #ifdef MRB_DOCUMENTATION_BLOCK
128
129 /**
130  * @abstract
131  * MRuby value boxing.
132  *
133  * Actual implementation depends on configured boxing type.
134  *
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
138  */
139 typedef void mrb_value;
140
141 #endif
142
143 #if defined(MRB_NAN_BOXING)
144 #include "boxing_nan.h"
145 #elif defined(MRB_WORD_BOXING)
146 #include "boxing_word.h"
147 #else
148 #include "boxing_no.h"
149 #endif
150
151 #ifndef mrb_fixnum_p
152 #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
153 #endif
154 #ifndef mrb_undef_p
155 #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
156 #endif
157 #ifndef mrb_nil_p
158 #define mrb_nil_p(o)  (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
159 #endif
160 #ifndef mrb_bool
161 #define mrb_bool(o)   (mrb_type(o) != MRB_TT_FALSE)
162 #endif
163 #if !defined(MRB_SYMBOL_BITSIZE)
164 #define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
165 #define MRB_SYMBOL_MAX      UINT32_MAX
166 #endif
167 #ifndef MRB_WITHOUT_FLOAT
168 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
169 #endif
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);
178
179 /*
180  * Returns a float in Ruby.
181  */
182 #ifndef MRB_WITHOUT_FLOAT
183 MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
184 {
185   mrb_value v;
186   (void) mrb;
187   SET_FLOAT_VALUE(mrb, v, f);
188   return v;
189 }
190 #endif
191
192 static inline mrb_value
193 mrb_cptr_value(struct mrb_state *mrb, void *p)
194 {
195   mrb_value v;
196   (void) mrb;
197   SET_CPTR_VALUE(mrb,v,p);
198   return v;
199 }
200
201 /*
202  * Returns a fixnum in Ruby.
203  */
204 MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i)
205 {
206   mrb_value v;
207   SET_INT_VALUE(v, i);
208   return v;
209 }
210
211 static inline mrb_value
212 mrb_symbol_value(mrb_sym i)
213 {
214   mrb_value v;
215   SET_SYM_VALUE(v, i);
216   return v;
217 }
218
219 static inline mrb_value
220 mrb_obj_value(void *p)
221 {
222   mrb_value v;
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));
226   return v;
227 }
228
229
230 /*
231  * Get a nil mrb_value object.
232  *
233  * @return
234  *      nil mrb_value object reference.
235  */
236 MRB_INLINE mrb_value mrb_nil_value(void)
237 {
238   mrb_value v;
239   SET_NIL_VALUE(v);
240   return v;
241 }
242
243 /*
244  * Returns false in Ruby.
245  */
246 MRB_INLINE mrb_value mrb_false_value(void)
247 {
248   mrb_value v;
249   SET_FALSE_VALUE(v);
250   return v;
251 }
252
253 /*
254  * Returns true in Ruby.
255  */
256 MRB_INLINE mrb_value mrb_true_value(void)
257 {
258   mrb_value v;
259   SET_TRUE_VALUE(v);
260   return v;
261 }
262
263 static inline mrb_value
264 mrb_bool_value(mrb_bool boolean)
265 {
266   mrb_value v;
267   SET_BOOL_VALUE(v, boolean);
268   return v;
269 }
270
271 static inline mrb_value
272 mrb_undef_value(void)
273 {
274   mrb_value v;
275   SET_UNDEF_VALUE(v);
276   return v;
277 }
278
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)
284 {
285   return (const char*)get_etext() < p && p < (const char*)get_edata();
286 }
287 #else
288 extern char _etext[];
289 #ifdef MRB_NO_INIT_ARRAY_START
290 extern char _edata[];
291
292 static inline mrb_bool
293 mrb_ro_data_p(const char *p)
294 {
295   return _etext < p && p < _edata;
296 }
297 #else
298 extern char __init_array_start[];
299
300 static inline mrb_bool
301 mrb_ro_data_p(const char *p)
302 {
303   return _etext < p && p < (char*)&__init_array_start;
304 }
305 #endif
306 #endif
307 #else
308 # define mrb_ro_data_p(p) FALSE
309 #endif
310
311 MRB_END_DECL
312
313 #endif  /* MRUBY_VALUE_H */