source: EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/value.h@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 6.5 KB
Line 
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 */
15MRB_BEGIN_DECL
16
17typedef uint32_t mrb_sym;
18typedef uint8_t mrb_bool;
19struct 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
66MRB_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>
78MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
79MRB_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)
88static 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
94enum 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 */
137typedef 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)
169MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
170
171/*
172 * Returns a float in Ruby.
173 */
174MRB_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
182static inline mrb_value
183mrb_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 */
194MRB_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
201static inline mrb_value
202mrb_symbol_value(mrb_sym i)
203{
204 mrb_value v;
205 SET_SYM_VALUE(v, i);
206 return v;
207}
208
209static inline mrb_value
210mrb_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 */
226MRB_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 */
236MRB_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 */
246MRB_INLINE mrb_value mrb_true_value(void)
247{
248 mrb_value v;
249 SET_TRUE_VALUE(v);
250 return v;
251}
252
253static inline mrb_value
254mrb_bool_value(mrb_bool boolean)
255{
256 mrb_value v;
257 SET_BOOL_VALUE(v, boolean);
258 return v;
259}
260
261static inline mrb_value
262mrb_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>
272static inline mrb_bool
273mrb_ro_data_p(const char *p)
274{
275 return (const char*)get_etext() < p && p < (const char*)get_edata();
276}
277#else
278extern char _etext[];
279#ifdef MRB_NO_INIT_ARRAY_START
280extern char _edata[];
281
282static inline mrb_bool
283mrb_ro_data_p(const char *p)
284{
285 return _etext < p && p < _edata;
286}
287#else
288extern char __init_array_start[];
289
290static inline mrb_bool
291mrb_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
301MRB_END_DECL
302
303#endif /* MRUBY_VALUE_H */
Note: See TracBrowser for help on using the repository browser.