34#if defined(__cplusplus) || (defined(__bool_true_false_are_defined) && __bool_true_false_are_defined)
44# if __STDC_VERSION__ >= 199901L
60#if defined _MSC_VER && _MSC_VER < 1800
78 typedef int64_t mrb_int;
79 typedef uint64_t mrb_uint;
80# define MRB_INT_BIT 64
81# define MRB_INT_MIN INT64_MIN
82# define MRB_INT_MAX INT64_MAX
83# define MRB_PRIo PRIo64
84# define MRB_PRId PRId64
85# define MRB_PRIx PRIx64
87 typedef int32_t mrb_int;
88 typedef uint32_t mrb_uint;
89# define MRB_INT_BIT 32
90# define MRB_INT_MIN INT32_MIN
91# define MRB_INT_MAX INT32_MAX
92# define MRB_PRIo PRIo32
93# define MRB_PRId PRId32
94# define MRB_PRIx PRIx32
98# define MRB_ENDIAN_LOHI(a,b) a b
100# define MRB_ENDIAN_LOHI(a,b) b a
103MRB_API mrb_bool mrb_read_int(
const char *p,
const char *e,
char **endp, mrb_int *np);
105MRB_API mrb_int mrb_int_read(
const char*,
const char*,
char**);
107MRB_API mrb_bool mrb_read_float(
const char *p,
char **endp,
double *fp);
109MRB_API double mrb_float_read(
const char *p,
char **endp);
110#ifdef MRB_USE_FLOAT32
111 typedef float mrb_float;
113 typedef double mrb_float;
117#if defined _MSC_VER && _MSC_VER < 1900
118MRB_API int mrb_msvc_vsnprintf(
char *s,
size_t n,
const char *format, va_list arg);
119MRB_API int mrb_msvc_snprintf(
char *s,
size_t n,
const char *format, ...);
120# define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
121# define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
122# if _MSC_VER < 1800 && !defined MRB_NO_FLOAT
123# define isfinite(n) _finite(n)
125# define isinf(n) (!_finite(n) && !_isnan(n))
126# define signbit(n) (_copysign(1.0, (n)) < 0.0)
127static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
128# define INFINITY (*(float*)&IEEE754_INFINITY_BITS_SINGLE)
129# define NAN ((float)(INFINITY - INFINITY))
133#define MRB_VTYPE_FOREACH(f) \
135 f(MRB_TT_FALSE, void, "false") \
136 f(MRB_TT_TRUE, void, "true") \
137 f(MRB_TT_SYMBOL, void, "Symbol") \
138 f(MRB_TT_UNDEF, void, "undefined") \
139 f(MRB_TT_FREE, void, "free") \
140 f(MRB_TT_FLOAT, struct RFloat, "Float") \
141 f(MRB_TT_INTEGER, struct RInteger, "Integer") \
142 f(MRB_TT_CPTR, struct RCptr, "cptr") \
143 f(MRB_TT_OBJECT, struct RObject, "Object") \
144 f(MRB_TT_CLASS, struct RClass, "Class") \
145 f(MRB_TT_MODULE, struct RClass, "Module") \
146 f(MRB_TT_ICLASS, struct RClass, "iClass") \
147 f(MRB_TT_SCLASS, struct RClass, "SClass") \
148 f(MRB_TT_PROC, struct RProc, "Proc") \
149 f(MRB_TT_ARRAY, struct RArray, "Array") \
150 f(MRB_TT_HASH, struct RHash, "Hash") \
151 f(MRB_TT_STRING, struct RString, "String") \
152 f(MRB_TT_RANGE, struct RRange, "Range") \
153 f(MRB_TT_EXCEPTION, struct RException, "Exception") \
154 f(MRB_TT_ENV, struct REnv, "env") \
155 f(MRB_TT_CDATA, struct RData, "C data") \
156 f(MRB_TT_FIBER, struct RFiber, "Fiber") \
157 f(MRB_TT_STRUCT, struct RArray, "Struct") \
158 f(MRB_TT_ISTRUCT, struct RIStruct, "istruct") \
159 f(MRB_TT_BREAK, struct RBreak, "break") \
160 f(MRB_TT_COMPLEX, struct RComplex, "Complex") \
161 f(MRB_TT_RATIONAL, struct RRational, "Rational") \
162 f(MRB_TT_BIGINT, struct RBigint, "Integer")
165#define MRB_VTYPE_DEFINE(tt, type, name) tt,
166 MRB_VTYPE_FOREACH(MRB_VTYPE_DEFINE)
167#undef MRB_VTYPE_DEFINE
172#define MRB_TT_DATA MRB_TT_CDATA
174#define MRB_VTYPE_TYPEOF(tt) MRB_TYPEOF_##tt
176#define MRB_VTYPE_TYPEDEF(tt, type, name) typedef type MRB_VTYPE_TYPEOF(tt);
177MRB_VTYPE_FOREACH(MRB_VTYPE_TYPEDEF)
178#undef MRB_VTYPE_TYPEDEF
181#define MRB_TT_FIXNUM MRB_TT_INTEGER
185#ifdef MRB_DOCUMENTATION_BLOCK
201#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT))
208#if defined(MRB_NAN_BOXING)
210#elif defined(MRB_WORD_BOXING)
216#if INTPTR_MAX < MRB_INT_MAX
217 typedef intptr_t mrb_ssize;
218# define MRB_SSIZE_MAX INTPTR_MAX
220 typedef mrb_int mrb_ssize;
221# define MRB_SSIZE_MAX MRB_INT_MAX
224#ifndef mrb_immediate_p
225#define mrb_immediate_p(o) (mrb_type(o) <= MRB_TT_CPTR)
228#define mrb_integer_p(o) (mrb_type(o) == MRB_TT_INTEGER)
231#define mrb_fixnum_p(o) mrb_integer_p(o)
234#define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
237#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
240#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
243#define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE && !!mrb_fixnum(o))
246#define mrb_true_p(o) (mrb_type(o) == MRB_TT_TRUE)
250#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
252#define mrb_float_p(o) FALSE
256#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
259#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
262#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
265#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
267#ifndef mrb_exception_p
268#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
271#define mrb_free_p(o) (mrb_type(o) == MRB_TT_FREE)
274#define mrb_object_p(o) (mrb_type(o) == MRB_TT_OBJECT)
277#define mrb_class_p(o) (mrb_type(o) == MRB_TT_CLASS)
280#define mrb_module_p(o) (mrb_type(o) == MRB_TT_MODULE)
283#define mrb_iclass_p(o) (mrb_type(o) == MRB_TT_ICLASS)
286#define mrb_sclass_p(o) (mrb_type(o) == MRB_TT_SCLASS)
289#define mrb_proc_p(o) (mrb_type(o) == MRB_TT_PROC)
292#define mrb_range_p(o) (mrb_type(o) == MRB_TT_RANGE)
295#define mrb_env_p(o) (mrb_type(o) == MRB_TT_ENV)
298#define mrb_data_p(o) (mrb_type(o) == MRB_TT_CDATA)
301#define mrb_fiber_p(o) (mrb_type(o) == MRB_TT_FIBER)
304#define mrb_istruct_p(o) (mrb_type(o) == MRB_TT_ISTRUCT)
307#define mrb_break_p(o) (mrb_type(o) == MRB_TT_BREAK)
310#define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
312#define mrb_test(o) mrb_bool(o)
314#define mrb_bigint_p(o) (mrb_type(o) == MRB_TT_BIGINT)
327 SET_FLOAT_VALUE(mrb, v, f);
333mrb_cptr_value(
struct mrb_state *mrb,
void *p)
337 SET_CPTR_VALUE(mrb,v,p);
347 SET_INT_VALUE(mrb, v, i);
354 SET_FIXNUM_VALUE(v, i);
367mrb_obj_value(
void *p)
370 SET_OBJ_VALUE(v, (
struct RBasic*)p);
411 SET_BOOL_VALUE(v,
boolean);
423#if defined(MRB_USE_CUSTOM_RO_DATA_P)
425mrb_bool mrb_ro_data_p(
const char *p);
426#elif !defined(MRB_NO_DEFAULT_RO_DATA_P)
427#if defined(MRB_USE_ETEXT_RO_DATA_P)
428#define MRB_LINK_TIME_RO_DATA_P
429extern char etext, edata;
431mrb_ro_data_p(
const char *p)
433 return &etext < p && p < &edata;
435#elif defined(__APPLE__)
436#define MRB_LINK_TIME_RO_DATA_P
437#include <mach-o/getsect.h>
438#include <crt_externs.h>
440mrb_ro_data_p(
const char *p)
443 struct mach_header_64 *mhp;
445 struct mach_header *mhp;
447 mhp = _NSGetMachExecuteHeader();
448 unsigned long textsize, datasize;
449 char *text = (
char*)getsegmentdata(mhp, SEG_TEXT, &textsize);
450 char *data = (
char*)getsegmentdata(mhp, SEG_DATA, &datasize);
451 return text + textsize < p && p < data + datasize;
455#ifndef MRB_LINK_TIME_RO_DATA_P
456# define mrb_ro_data_p(p) FALSE
nan boxing mrb_value definition
unboxed mrb_value definition
word boxing mrb_value definition
mruby common platform definition"
#define MRB_INLINE
Declare a function as always inlined.
Definition common.h:68
#define MRB_END_DECL
End declarations in C mode.
Definition common.h:28
#define MRB_BEGIN_DECL
Start declarations in C mode.
Definition common.h:26
#define MRB_API
Declare a public mruby API function.
Definition common.h:79
Definition boxing_nan.h:40
static mrb_value mrb_true_value(void)
Returns true in Ruby.
Definition value.h:400
static mrb_value mrb_false_value(void)
Returns false in Ruby.
Definition value.h:390
static mrb_value mrb_nil_value(void)
Get a nil mrb_value object.
Definition value.h:380
static mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
Returns a float in Ruby.
Definition value.h:323
static mrb_value mrb_int_value(struct mrb_state *mrb, mrb_int i)
Returns an integer in Ruby.
Definition value.h:344