14#ifndef MRBC_SRC_VALUE_H_
15#define MRBC_SRC_VALUE_H_
38#if defined(MRBC_INT16)
41#elif defined(MRBC_INT64)
50#if MRBC_USE_FLOAT == 1
52#elif MRBC_USE_FLOAT == 2
55#if MRBC_USE_FLOAT != 0
100#define MRBC_TT_INC_DEC_THRESHOLD MRBC_TT_MODULE
101#define MRBC_TT_MAXVAL MRBC_TT_EXCEPTION
132#if defined(MRBC_DEBUG)
133#define MRBC_OBJECT_HEADER uint8_t obj_mark_[2]; uint16_t ref_count
135#define MRBC_OBJECT_HEADER uint16_t ref_count
193#define mrbc_type(o) ((o).tt)
194#define mrbc_integer(o) ((o).i)
195#define mrbc_float(o) ((o).d)
196#define mrbc_symbol(o) ((o).sym_id)
199#define mrbc_set_integer(p,n) (p)->tt = MRBC_TT_INTEGER; (p)->i = (n)
200#define mrbc_set_float(p,n) (p)->tt = MRBC_TT_FLOAT; (p)->d = (n)
201#define mrbc_set_nil(p) (p)->tt = MRBC_TT_NIL
202#define mrbc_set_true(p) (p)->tt = MRBC_TT_TRUE
203#define mrbc_set_false(p) (p)->tt = MRBC_TT_FALSE
204#define mrbc_set_bool(p,n) (p)->tt = (n)? MRBC_TT_TRUE: MRBC_TT_FALSE
205#define mrbc_set_symbol(p,n) (p)->tt = MRBC_TT_SYMBOL; (p)->sym_id = (n)
208#define mrbc_integer_value(n) ((mrbc_value){.tt = MRBC_TT_INTEGER, .i=(n)})
209#define mrbc_float_value(vm,n) ((mrbc_value){.tt = MRBC_TT_FLOAT, .d=(n)})
210#define mrbc_nil_value() ((mrbc_value){.tt = MRBC_TT_NIL})
211#define mrbc_true_value() ((mrbc_value){.tt = MRBC_TT_TRUE})
212#define mrbc_false_value() ((mrbc_value){.tt = MRBC_TT_FALSE})
213#define mrbc_bool_value(n) ((mrbc_value){.tt = (n)?MRBC_TT_TRUE:MRBC_TT_FALSE})
214#define mrbc_symbol_value(n) ((mrbc_value){.tt = MRBC_TT_SYMBOL, .sym_id=(n)})
217#define mrb_type(o) mrbc_type(o)
218#define mrb_integer(o) mrbc_integer(o)
219#define mrb_float(o) mrbc_float(o)
220#define mrb_symbol(o) mrbc_symbol(o)
221#define mrb_integer_value(n) mrbc_integer_value(n)
222#define mrb_float_value(vm,n) mrbc_float_value(vm,n)
223#define mrb_nil_value() mrbc_nil_value()
224#define mrb_true_value() mrbc_true_value()
225#define mrb_false_value() mrbc_false_value()
226#define mrb_bool_value(n) mrbc_bool_value(n)
227#define mrb_symbol_value(n) mrbc_symbol_value(n)
230#define mrbc_fixnum(o) mrbc_integer(o)
231#define mrbc_set_fixnum(p,n) mrbc_set_integer(p,n)
232#define mrbc_fixnum_value(n) mrbc_integer_value(n)
233#define mrb_fixnum(o) mrbc_integer(o)
234#define mrb_fixnum_value(n) mrbc_integer_value(n)
261#define SET_RETURN(n) do { \
262 mrbc_value nnn = (n); \
266#define SET_NIL_RETURN() do { \
268 v[0].tt = MRBC_TT_NIL; \
270#define SET_FALSE_RETURN() do { \
272 v[0].tt = MRBC_TT_FALSE; \
274#define SET_TRUE_RETURN() do { \
276 v[0].tt = MRBC_TT_TRUE; \
278#define SET_BOOL_RETURN(n) do { \
279 int tt = (n) ? MRBC_TT_TRUE : MRBC_TT_FALSE; \
283#define SET_INT_RETURN(n) do { \
284 mrbc_int_t nnn = (n); \
286 v[0].tt = MRBC_TT_INTEGER; \
289#define SET_FLOAT_RETURN(n) do {\
290 mrbc_float_t nnn = (n); \
292 v[0].tt = MRBC_TT_FLOAT; \
296#define GET_TT_ARG(n) (v[(n)].tt)
297#define GET_INT_ARG(n) (v[(n)].i)
298#define GET_ARY_ARG(n) (v[(n)])
299#define GET_ARG(n) (v[(n)])
300#define GET_FLOAT_ARG(n) (v[(n)].d)
301#define GET_STRING_ARG(n) (v[(n)].string->data)
304#if defined(MRBC_DEBUG)
305#define MRBC_INIT_OBJECT_HEADER(p, t) (p)->ref_count = 1; (p)->obj_mark_[0] = (t)[0]; (p)->obj_mark_[1] = (t)[1]
307#define MRBC_INIT_OBJECT_HEADER(p, t) (p)->ref_count = 1
322#define MRBC_ISNUMERIC(val) \
323 ((val).tt == MRBC_TT_INTEGER || (val).tt == MRBC_TT_FLOAT)
324#define MRBC_TO_INT(val) \
325 (val).tt == MRBC_TT_INTEGER ? (val).i : \
326 (val).tt == MRBC_TT_FLOAT ? (mrbc_int_t)(val).d : 0
327#define MRBC_TO_FLOAT(val) \
328 (val).tt == MRBC_TT_FLOAT ? (val).d : \
329 (val).tt == MRBC_TT_INTEGER ? (mrbc_float_t)(val).i : 0.0
364#define MRBC_VAL_I(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_i2, mrbc_val_i) (vm, __VA_ARGS__)
365#define MRBC_VAL_F(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_f2, mrbc_val_f) (vm, __VA_ARGS__)
366#define MRBC_VAL_S(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_s2, mrbc_val_s) (vm, __VA_ARGS__)
381#define MRBC_TO_I(val) mrbc_to_i(vm, v, argc, val)
382#define MRBC_TO_F(val) mrbc_to_f(vm, v, argc, val)
383#define MRBC_TO_S(val) mrbc_to_s(vm, v, argc, val)
437#define MRBC_ARG(n) mrbc_arg(vm, v, argc, (n))
438#define MRBC_ARG_I(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_i2, mrbc_arg_i) (vm,v,argc,__VA_ARGS__)
439#define MRBC_ARG_F(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_f2, mrbc_arg_f) (vm,v,argc,__VA_ARGS__)
440#define MRBC_ARG_S(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_s2, mrbc_arg_s) (vm,v,argc,__VA_ARGS__)
441#define MRBC_ARG_B(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_b2, mrbc_arg_b) (vm,v,argc,__VA_ARGS__)
443#define MRBC_arg_choice(a1,a2,a3,...) a3
471#define MRBC_KW_ARG(...) \
472 MRBC_each(__VA_ARGS__)( MRBC_KW_ARG_decl1, __VA_ARGS__ ) \
473 if( v[argc+1].tt == MRBC_TT_HASH ) { \
474 MRBC_each(__VA_ARGS__)( MRBC_KW_ARG_decl2, __VA_ARGS__ ) \
476#define MRBC_KW_ARG_decl1(kw) mrbc_value kw = {.tt = MRBC_TT_EMPTY};
477#define MRBC_KW_ARG_decl2(kw) kw = mrbc_hash_remove_by_id(&v[argc+1], mrbc_str_to_symid(#kw));
479#define MRBC_KW_DICT(dict) \
481 if( v[argc+1].tt == MRBC_TT_HASH ) { dict = v[argc+1]; v[argc+1].tt = MRBC_TT_EMPTY; } \
482 else { dict = mrbc_hash_new(vm, 0); }
484#define MRBC_KW_ISVALID(kw) (kw.tt != MRBC_TT_EMPTY)
486#define MRBC_KW_MANDATORY(...) \
487 (MRBC_each(__VA_ARGS__)( MRBC_KW_MANDATORY_decl1, __VA_ARGS__ ) 1)
488#define MRBC_KW_MANDATORY_decl1(kw) (MRBC_KW_ISVALID(kw)? 1 : \
489 (mrbc_raisef(vm, MRBC_CLASS(ArgumentError), "missing keyword: %s", #kw), 0))&&
491#define MRBC_KW_END() \
492 (((v[argc+1].tt == MRBC_TT_HASH) && mrbc_hash_size(&v[argc+1])) ? \
493 (mrbc_raise(vm, MRBC_CLASS(ArgumentError), "unknown keyword"), 0) : 1)
495#define MRBC_KW_DELETE(...) \
496 MRBC_each(__VA_ARGS__)( MRBC_KW_DELETE_decl, __VA_ARGS__ )
497#define MRBC_KW_DELETE_decl(kw) mrbc_decref(&kw);
500#define MRBC_each(...) MRBC_each_sel(__VA_ARGS__, \
501 MRBC_each30,MRBC_each29,MRBC_each28,MRBC_each27,MRBC_each26, \
502 MRBC_each25,MRBC_each24,MRBC_each23,MRBC_each22,MRBC_each21, \
503 MRBC_each20,MRBC_each19,MRBC_each18,MRBC_each17,MRBC_each16, \
504 MRBC_each15,MRBC_each14,MRBC_each13,MRBC_each12,MRBC_each11, \
505 MRBC_each10,MRBC_each9, MRBC_each8, MRBC_each7, MRBC_each6, \
506 MRBC_each5, MRBC_each4, MRBC_each3, MRBC_each2, MRBC_each1)
507#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
508#define MRBC_each1(func,arg) func(arg)
509#define MRBC_each2(func,arg, ...) func(arg) MRBC_each1(func,__VA_ARGS__)
510#define MRBC_each3(func,arg, ...) func(arg) MRBC_each2(func,__VA_ARGS__)
511#define MRBC_each4(func,arg, ...) func(arg) MRBC_each3(func,__VA_ARGS__)
512#define MRBC_each5(func,arg, ...) func(arg) MRBC_each4(func,__VA_ARGS__)
513#define MRBC_each6(func,arg, ...) func(arg) MRBC_each5(func,__VA_ARGS__)
514#define MRBC_each7(func,arg, ...) func(arg) MRBC_each6(func,__VA_ARGS__)
515#define MRBC_each8(func,arg, ...) func(arg) MRBC_each7(func,__VA_ARGS__)
516#define MRBC_each9(func,arg, ...) func(arg) MRBC_each8(func,__VA_ARGS__)
517#define MRBC_each10(func,arg, ...) func(arg) MRBC_each9(func,__VA_ARGS__)
518#define MRBC_each11(func,arg, ...) func(arg) MRBC_each10(func,__VA_ARGS__)
519#define MRBC_each12(func,arg, ...) func(arg) MRBC_each11(func,__VA_ARGS__)
520#define MRBC_each13(func,arg, ...) func(arg) MRBC_each12(func,__VA_ARGS__)
521#define MRBC_each14(func,arg, ...) func(arg) MRBC_each13(func,__VA_ARGS__)
522#define MRBC_each15(func,arg, ...) func(arg) MRBC_each14(func,__VA_ARGS__)
523#define MRBC_each16(func,arg, ...) func(arg) MRBC_each15(func,__VA_ARGS__)
524#define MRBC_each17(func,arg, ...) func(arg) MRBC_each16(func,__VA_ARGS__)
525#define MRBC_each18(func,arg, ...) func(arg) MRBC_each17(func,__VA_ARGS__)
526#define MRBC_each19(func,arg, ...) func(arg) MRBC_each18(func,__VA_ARGS__)
527#define MRBC_each20(func,arg, ...) func(arg) MRBC_each19(func,__VA_ARGS__)
528#define MRBC_each21(func,arg, ...) func(arg) MRBC_each20(func,__VA_ARGS__)
529#define MRBC_each22(func,arg, ...) func(arg) MRBC_each21(func,__VA_ARGS__)
530#define MRBC_each23(func,arg, ...) func(arg) MRBC_each22(func,__VA_ARGS__)
531#define MRBC_each24(func,arg, ...) func(arg) MRBC_each23(func,__VA_ARGS__)
532#define MRBC_each25(func,arg, ...) func(arg) MRBC_each24(func,__VA_ARGS__)
533#define MRBC_each26(func,arg, ...) func(arg) MRBC_each25(func,__VA_ARGS__)
534#define MRBC_each27(func,arg, ...) func(arg) MRBC_each26(func,__VA_ARGS__)
535#define MRBC_each28(func,arg, ...) func(arg) MRBC_each27(func,__VA_ARGS__)
536#define MRBC_each29(func,arg, ...) func(arg) MRBC_each28(func,__VA_ARGS__)
537#define MRBC_each30(func,arg, ...) func(arg) MRBC_each29(func,__VA_ARGS__)
545#if defined(UINTPTR_MAX)
546#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(uintptr_t)(p))
548#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(p))
560int mrbc_strcpy(
char *dest,
int destsize,
const char *src);
593 assert( v->
obj->ref_count != 0 );
594 assert( v->
obj->ref_count != 0xff );
608 assert( v->
obj->ref_count != 0 );
609 assert( v->
obj->ref_count != 0xffff );
611 if( --v->
obj->ref_count != 0 )
return;
648#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
650 uint16_t x = *((uint16_t *)s);
651 x = (x << 8) | (x >> 8);
653#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
655 uint16_t x = *((uint16_t *)s);
657#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
659 uint8_t *p = (uint8_t *)s;
665 #error "Specify MRBC_BIG_ENDIAN or MRBC_LITTLE_ENDIAN"
680#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
682 uint32_t x = *((uint32_t *)s);
683 x = (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
685#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
687 uint32_t x = *((uint32_t *)s);
689#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
691 uint8_t *p = (uint8_t *)s;
706#if defined(MRBC_INT64)
713static inline int64_t bin_to_int64(
const void *s )
715#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
717 uint64_t x = *((uint64_t *)s);
718 uint64_t y = (x << 56);
719 y |= ((uint64_t)(uint8_t)(x >> 8)) << 48;
720 y |= ((uint64_t)(uint8_t)(x >> 16)) << 40;
721 y |= ((uint64_t)(uint8_t)(x >> 24)) << 32;
722 y |= ((uint64_t)(uint8_t)(x >> 32)) << 24;
723 y |= ((uint64_t)(uint8_t)(x >> 40)) << 16;
724 y |= ((uint64_t)(uint8_t)(x >> 48)) << 8;
728#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
730 return *((uint64_t *)s);
732#elif defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
734 uint8_t *p = (uint8_t *)s;
766#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
768 return *((
double *)s);
770#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
773 uint8_t *p1 = (uint8_t*)s;
774 uint8_t *p2 = (uint8_t*)&x + 7;
776 for(
i = 7;
i >= 0;
i-- ) {
781#elif defined(MRBC_LITTLE_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
784 uint8_t *p1 = (uint8_t*)s;
785 uint8_t *p2 = (uint8_t*)&x;
787 for(
i = 7;
i >= 0;
i-- ) {
792#elif defined(MRBC_BIG_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
795 uint8_t *p1 = (uint8_t*)s;
796 uint8_t *p2 = (uint8_t*)&x + 7;
798 for(
i = 7;
i >= 0;
i-- ) {
815 uint8_t *p = (uint8_t *)
d + 3;
834 uint8_t *p = (uint8_t *)
d;
Base class for some objects.
struct RException * exception
struct RInstance * instance
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)
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.
struct RObject mrbc_value
struct RObject mrb_object
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.