15#ifndef MRBC_SRC_VALUE_H_
16#define MRBC_SRC_VALUE_H_
40#if defined(MRBC_INT16)
43#elif defined(MRBC_INT64)
51#if MRBC_USE_FLOAT == 1
103#define MRBC_TT_INC_DEC_THRESHOLD MRBC_TT_MODULE
104#define MRBC_TT_MAXVAL MRBC_TT_EXCEPTION
135#if defined(MRBC_DEBUG)
136# define MRBC_OBJECT_HEADER uint8_t obj_mark_[2]; uint16_t ref_count
137# define MRBC_INIT_OBJECT_HEADER(p, t) (p)->obj_mark_[0] = (t)[0]; \
138 (p)->obj_mark_[1] = (t)[1]; \
140# define MRBC_INIT_OBJECT_HEADER_DI(t) \
145# define MRBC_OBJECT_HEADER uint16_t ref_count
146# define MRBC_INIT_OBJECT_HEADER(p, t) (p)->ref_count = 1
147# define MRBC_INIT_OBJECT_HEADER_DI(t) .ref_count = 1,
160#if defined(MRBC_NAN_BOXING)
168typedef struct RObject mrb_object;
169typedef struct RObject mrb_value;
177#define mrb_type(o) mrbc_type(o)
178#define mrb_integer(o) mrbc_integer(o)
179#define mrb_float(o) mrbc_float(o)
180#define mrb_symbol(o) mrbc_symbol(o)
181#define mrb_integer_value(n) mrbc_integer_value(n)
182#define mrb_float_value(vm,n) mrbc_float_value(vm,n)
183#define mrb_nil_value() mrbc_nil_value()
184#define mrb_true_value() mrbc_true_value()
185#define mrb_false_value() mrbc_false_value()
186#define mrb_bool_value(n) mrbc_bool_value(n)
187#define mrb_symbol_value(n) mrbc_symbol_value(n)
190#define mrbc_fixnum(o) mrbc_integer(o)
191#define mrbc_set_fixnum(p,n) mrbc_set_integer(p,n)
192#define mrbc_fixnum_value(n) mrbc_integer_value(n)
193#define mrb_fixnum(o) mrbc_integer(o)
194#define mrb_fixnum_value(n) mrbc_integer_value(n)
221#define SET_RETURN(n) do { \
222 mrbc_value nnn = (n); \
226#define SET_NIL_RETURN() do { \
230#define SET_FALSE_RETURN() do { \
234#define SET_TRUE_RETURN() do { \
238#define SET_BOOL_RETURN(n) do { \
241 mrbc_set_bool(v,nnn); \
243#define SET_INT_RETURN(n) do { \
244 mrbc_int_t nnn = (n); \
246 mrbc_set_integer(v,nnn); \
248#define SET_FLOAT_RETURN(n) do {\
249 mrbc_float_t nnn = (n); \
251 mrbc_set_float(v,nnn); \
255#if !defined(MRBC_NOT_RECOMMEND_TO_USE)
258#define GET_TT_ARG(n) (v[(n)].tt)
259#define GET_INT_ARG(n) (v[(n)].i)
260#define GET_ARY_ARG(n) (v[(n)])
261#define GET_ARG(n) (v[(n)])
262#define GET_FLOAT_ARG(n) (v[(n)].d)
263#define GET_STRING_ARG(n) (v[(n)].string->data)
276#define MRBC_ISNUMERIC(val) \
277 ((val).tt == MRBC_TT_INTEGER || (val).tt == MRBC_TT_FLOAT)
278#define MRBC_TO_INT(val) \
279 (val).tt == MRBC_TT_INTEGER ? (val).i : \
280 (val).tt == MRBC_TT_FLOAT ? (mrbc_int_t)(val).d : 0
281#define MRBC_TO_FLOAT(val) \
282 (val).tt == MRBC_TT_FLOAT ? (val).d : \
283 (val).tt == MRBC_TT_INTEGER ? (mrbc_float_t)(val).i : (mrbc_float_t)0
320#define MRBC_VAL_I(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_i2, mrbc_val_i) (vm, __VA_ARGS__)
321#define MRBC_VAL_F(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_f2, mrbc_val_f) (vm, __VA_ARGS__)
322#define MRBC_VAL_S(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_s2, mrbc_val_s) (vm, __VA_ARGS__)
337#define MRBC_TO_I(val) mrbc_to_i(vm, v, argc, val)
338#define MRBC_TO_F(val) mrbc_to_f(vm, v, argc, val)
339#define MRBC_TO_S(val) mrbc_to_s(vm, v, argc, val)
393#define MRBC_ARG(n) mrbc_arg(vm, v, argc, (n))
394#define MRBC_ARG_I(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_i2, mrbc_arg_i) (vm,v,argc,__VA_ARGS__)
395#define MRBC_ARG_F(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_f2, mrbc_arg_f) (vm,v,argc,__VA_ARGS__)
396#define MRBC_ARG_S(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_s2, mrbc_arg_s) (vm,v,argc,__VA_ARGS__)
397#define MRBC_ARG_B(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_b2, mrbc_arg_b) (vm,v,argc,__VA_ARGS__)
399#define MRBC_arg_choice(a1,a2,a3,...) a3
427#define MRBC_KW_ARG(...) \
428 MRBC_each(__VA_ARGS__)( MRBC_KW_ARG_decl1, __VA_ARGS__ ) \
429 if( mrbc_type(v[argc+1]) == MRBC_TT_HASH ) { \
430 MRBC_each(__VA_ARGS__)( MRBC_KW_ARG_decl2, __VA_ARGS__ ) \
432#define MRBC_KW_ARG_decl1(kw) mrbc_value kw = {.tt = MRBC_TT_EMPTY};
433#define MRBC_KW_ARG_decl2(kw) kw = mrbc_hash_remove_by_id(&v[argc+1], mrbc_str_to_symid(#kw));
435#define MRBC_KW_DICT(dict) \
437 if( mrbc_type(v[argc+1]) == MRBC_TT_HASH ) { dict = v[argc+1]; v[argc+1].tt = MRBC_TT_EMPTY; } \
438 else { dict = mrbc_hash_new(vm, 0); }
440#define MRBC_KW_ISVALID(kw) (mrbc_type(kw) != MRBC_TT_EMPTY)
442#define MRBC_KW_MANDATORY(...) \
443 (MRBC_each(__VA_ARGS__)( MRBC_KW_MANDATORY_decl1, __VA_ARGS__ ) 1)
444#define MRBC_KW_MANDATORY_decl1(kw) (MRBC_KW_ISVALID(kw)? 1 : \
445 (mrbc_raisef(vm, MRBC_CLASS(ArgumentError), "missing keyword: %s", #kw), 0))&&
447#define MRBC_KW_END() \
448 (((mrbc_type(v[argc+1]) == MRBC_TT_HASH) && mrbc_hash_size(&v[argc+1])) ? \
449 (mrbc_raise(vm, MRBC_CLASS(ArgumentError), "unknown keyword"), 0) : 1)
451#define MRBC_KW_DELETE(...) \
452 MRBC_each(__VA_ARGS__)( MRBC_KW_DELETE_decl, __VA_ARGS__ )
453#define MRBC_KW_DELETE_decl(kw) mrbc_decref(&kw);
456#define MRBC_each(...) MRBC_each_sel(__VA_ARGS__, \
457 MRBC_each30,MRBC_each29,MRBC_each28,MRBC_each27,MRBC_each26, \
458 MRBC_each25,MRBC_each24,MRBC_each23,MRBC_each22,MRBC_each21, \
459 MRBC_each20,MRBC_each19,MRBC_each18,MRBC_each17,MRBC_each16, \
460 MRBC_each15,MRBC_each14,MRBC_each13,MRBC_each12,MRBC_each11, \
461 MRBC_each10,MRBC_each9, MRBC_each8, MRBC_each7, MRBC_each6, \
462 MRBC_each5, MRBC_each4, MRBC_each3, MRBC_each2, MRBC_each1)
463#define MRBC_each_sel(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30, a31, ...) a31
464#define MRBC_each1(func,arg) func(arg)
465#define MRBC_each2(func,arg, ...) func(arg) MRBC_each1(func,__VA_ARGS__)
466#define MRBC_each3(func,arg, ...) func(arg) MRBC_each2(func,__VA_ARGS__)
467#define MRBC_each4(func,arg, ...) func(arg) MRBC_each3(func,__VA_ARGS__)
468#define MRBC_each5(func,arg, ...) func(arg) MRBC_each4(func,__VA_ARGS__)
469#define MRBC_each6(func,arg, ...) func(arg) MRBC_each5(func,__VA_ARGS__)
470#define MRBC_each7(func,arg, ...) func(arg) MRBC_each6(func,__VA_ARGS__)
471#define MRBC_each8(func,arg, ...) func(arg) MRBC_each7(func,__VA_ARGS__)
472#define MRBC_each9(func,arg, ...) func(arg) MRBC_each8(func,__VA_ARGS__)
473#define MRBC_each10(func,arg, ...) func(arg) MRBC_each9(func,__VA_ARGS__)
474#define MRBC_each11(func,arg, ...) func(arg) MRBC_each10(func,__VA_ARGS__)
475#define MRBC_each12(func,arg, ...) func(arg) MRBC_each11(func,__VA_ARGS__)
476#define MRBC_each13(func,arg, ...) func(arg) MRBC_each12(func,__VA_ARGS__)
477#define MRBC_each14(func,arg, ...) func(arg) MRBC_each13(func,__VA_ARGS__)
478#define MRBC_each15(func,arg, ...) func(arg) MRBC_each14(func,__VA_ARGS__)
479#define MRBC_each16(func,arg, ...) func(arg) MRBC_each15(func,__VA_ARGS__)
480#define MRBC_each17(func,arg, ...) func(arg) MRBC_each16(func,__VA_ARGS__)
481#define MRBC_each18(func,arg, ...) func(arg) MRBC_each17(func,__VA_ARGS__)
482#define MRBC_each19(func,arg, ...) func(arg) MRBC_each18(func,__VA_ARGS__)
483#define MRBC_each20(func,arg, ...) func(arg) MRBC_each19(func,__VA_ARGS__)
484#define MRBC_each21(func,arg, ...) func(arg) MRBC_each20(func,__VA_ARGS__)
485#define MRBC_each22(func,arg, ...) func(arg) MRBC_each21(func,__VA_ARGS__)
486#define MRBC_each23(func,arg, ...) func(arg) MRBC_each22(func,__VA_ARGS__)
487#define MRBC_each24(func,arg, ...) func(arg) MRBC_each23(func,__VA_ARGS__)
488#define MRBC_each25(func,arg, ...) func(arg) MRBC_each24(func,__VA_ARGS__)
489#define MRBC_each26(func,arg, ...) func(arg) MRBC_each25(func,__VA_ARGS__)
490#define MRBC_each27(func,arg, ...) func(arg) MRBC_each26(func,__VA_ARGS__)
491#define MRBC_each28(func,arg, ...) func(arg) MRBC_each27(func,__VA_ARGS__)
492#define MRBC_each29(func,arg, ...) func(arg) MRBC_each28(func,__VA_ARGS__)
493#define MRBC_each30(func,arg, ...) func(arg) MRBC_each29(func,__VA_ARGS__)
501#if defined(UINTPTR_MAX)
502#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(uintptr_t)(p))
504#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(p))
516int mrbc_strcpy(
char *dest,
int destsize,
const char *src);
550 assert( v->
obj->ref_count != 0 );
551 assert( v->
obj->ref_count != 0xffff );
565 assert( v->
obj->ref_count != 0 );
566 assert( v->
obj->ref_count != 0xffff );
568 if( --v->
obj->ref_count != 0 )
return;
605#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
607 uint16_t x = *((uint16_t *)s);
608 x = (x << 8) | (x >> 8);
610#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
612 uint16_t x = *((uint16_t *)s);
614#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
616 uint8_t *p = (uint8_t *)s;
622 #error "Specify MRBC_BIG_ENDIAN or MRBC_LITTLE_ENDIAN"
637#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
639 uint32_t x = *((uint32_t *)s);
640 x = (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
642#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
644 uint32_t x = *((uint32_t *)s);
646#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
648 uint8_t *p = (uint8_t *)s;
663#if defined(MRBC_INT64)
670static inline int64_t bin_to_int64(
const void *s )
672#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
674 uint64_t x = *((uint64_t *)s);
675 uint64_t y = (x << 56);
676 y |= ((uint64_t)(uint8_t)(x >> 8)) << 48;
677 y |= ((uint64_t)(uint8_t)(x >> 16)) << 40;
678 y |= ((uint64_t)(uint8_t)(x >> 24)) << 32;
679 y |= ((uint64_t)(uint8_t)(x >> 32)) << 24;
680 y |= ((uint64_t)(uint8_t)(x >> 40)) << 16;
681 y |= ((uint64_t)(uint8_t)(x >> 48)) << 8;
685#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
687 return *((uint64_t *)s);
689#elif defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
691 uint8_t *p = (uint8_t *)s;
723#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
725 return *((
double *)s);
727#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
730 uint8_t *p1 = (uint8_t*)s;
731 uint8_t *p2 = (uint8_t*)&x + 7;
733 for(
i = 7;
i >= 0;
i-- ) {
738#elif defined(MRBC_LITTLE_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
741 uint8_t *p1 = (uint8_t*)s;
742 uint8_t *p2 = (uint8_t*)&x;
744 for(
i = 7;
i >= 0;
i-- ) {
749#elif defined(MRBC_BIG_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
752 uint8_t *p1 = (uint8_t*)s;
753 uint8_t *p2 = (uint8_t*)&x + 7;
755 for(
i = 7;
i >= 0;
i-- ) {
772 uint8_t *p = (uint8_t *)
d + 3;
791 uint8_t *p = (uint8_t *)
d;
mruby/c NaN boxing mrbc_value definition.
mruby/c mrbc_value definition.
static void mrbc_set_tt(mrbc_value *p, mrbc_vtype type)
struct RObject mrbc_value
Value object. Default version.
Value object. Default version.
int mrbc_arg_b2(struct VM *vm, mrbc_value v[], int argc, int n, int default_value)
char * mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
const char * mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value)
void(*const mrbc_delfunc[])(mrbc_value *)
mrbc_int_t mrbc_to_i(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val)
const char * mrbc_val_s(struct VM *vm, const mrbc_value *val)
mrbc_value * mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n)
double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value)
const char * mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n)
int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2)
mrbc_float_t mrbc_arg_f(struct VM *vm, mrbc_value v[], int argc, int n)
mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value)
int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n)
mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value)
mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
int mrbc_strcpy(char *dest, int destsize, const char *src)
mrbc_int_t mrbc_atoi(const char *s, int base)
mrbc_float_t mrbc_arg_f2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_float_t default_value)
const char * mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value)
mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n)
void mrbc_format_float(char *buf, int bufsiz, mrbc_float_t flo)
double mrbc_val_f(struct VM *vm, const mrbc_value *val)
static void mrbc_decref(mrbc_value *v)
static void mrbc_decref_empty(mrbc_value *v)
static uint32_t bin_to_uint32(const void *s)
void(* mrbc_func_t)(struct VM *vm, struct RObject *v, int argc)
#define MRBC_TT_INC_DEC_THRESHOLD
static double bin_to_double64(const void *s)
static void mrbc_incref(mrbc_value *v)
int16_t mrbc_sym
mruby/c symbol ID
static void uint16_to_bin(uint16_t v, void *d)
@ MRBC_TT_FALSE
FalseClass.
@ MRBC_TT_INTEGER
Integer.
@ MRBC_TT_EXCEPTION
Exception.
@ MRBC_TT_OBJECT
General instance.
static void uint32_to_bin(uint32_t v, void *d)
static uint16_t bin_to_uint16(const void *s)
struct RObject mrbc_object
static void mrbc_delete(mrbc_value *v)
Global configuration of mruby/c VM's.