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