mruby/c VM Source Code release 4.0.0
Loading...
Searching...
No Matches
value.h
Go to the documentation of this file.
1
14
15#ifndef MRBC_SRC_VALUE_H_
16#define MRBC_SRC_VALUE_H_
17
18/***** Feature test switches ************************************************/
19/***** System headers *******************************************************/
20//@cond
21#include <stdint.h>
22#include <assert.h>
23#include "vm_config.h"
24//@endcond
25
26/***** Local headers ********************************************************/
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32/***** Constant values ******************************************************/
33/***** Typedefs *************************************************************/
34// pre define of some struct
35struct VM;
36struct RClass;
37struct RObject;
38
39// mrbc types
40#if defined(MRBC_INT16)
41typedef int16_t mrbc_int_t;
42typedef uint16_t mrbc_uint_t;
43#elif defined(MRBC_INT64)
44typedef int64_t mrbc_int_t;
45typedef uint64_t mrbc_uint_t;
46#else
47typedef int32_t mrbc_int_t;
48typedef uint32_t mrbc_uint_t;
49#endif
50
51#if MRBC_USE_FLOAT == 1
52typedef float mrbc_float_t;
53#else
54typedef double mrbc_float_t;
55#endif
56
57//@cond
58typedef mrbc_int_t mrb_int;
59typedef mrbc_float_t mrb_float;
60//@endcond
61
62typedef int16_t mrbc_sym;
63typedef void (*mrbc_func_t)(struct VM *vm, struct RObject *v, int argc);
64
65
66//================================================================
69typedef enum {
70 /* (note) Must be same order as mrbc_class_tbl[], mrbc_delfunc[]. */
71
72 /* internal use */
73 MRBC_TT_JMPUW = -5, // use in OP_JMPUW...
78
79 /* primitive */
83 // (note) true/false threshold. see op_jmpif
84
92 // (note) inc/dec ref threshold.
93
94 /* non-primitive */
102} mrbc_vtype;
103#define MRBC_TT_INC_DEC_THRESHOLD MRBC_TT_MODULE
104#define MRBC_TT_MAXVAL MRBC_TT_EXCEPTION
105
106
107//================================================================
130
131
132//================================================================
133/* Define the object structure having reference counter.
134*/
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]; \
139 (p)->ref_count = 1
140# define MRBC_INIT_OBJECT_HEADER_DI(t) \
141 .obj_mark_ = #t, \
142 .ref_count = 1,
143
144#else
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,
148#endif
149
150
151//================================================================
157
158
159//================================================================
160#if defined(MRBC_NAN_BOXING)
161# include "boxing_nan.h"
162#else // !defined(MRBC_NAN_BOXING)
163# include "boxing_no.h"
164#endif
165
166typedef struct RObject mrbc_object;
167//@cond
168typedef struct RObject mrb_object; // not recommended.
169typedef struct RObject mrb_value; // not recommended.
170//@endcond
171
172
173/***** Macros ***************************************************************/
174
175//@cond
176// (for mruby compatibility)
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)
188
189// (for mruby/c 2 compatibility)
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)
195//@endcond
196
197
198// for C call
221#define SET_RETURN(n) do { \
222 mrbc_value nnn = (n); \
223 mrbc_decref(v); \
224 v[0] = nnn; \
225 } while(0)
226#define SET_NIL_RETURN() do { \
227 mrbc_decref(v); \
228 mrbc_set_nil(v); \
229 } while(0)
230#define SET_FALSE_RETURN() do { \
231 mrbc_decref(v); \
232 mrbc_set_false(v); \
233 } while(0)
234#define SET_TRUE_RETURN() do { \
235 mrbc_decref(v); \
236 mrbc_set_true(v); \
237 } while(0)
238#define SET_BOOL_RETURN(n) do { \
239 int nnn = (n); \
240 mrbc_decref(v); \
241 mrbc_set_bool(v,nnn); \
242 } while(0)
243#define SET_INT_RETURN(n) do { \
244 mrbc_int_t nnn = (n); \
245 mrbc_decref(v); \
246 mrbc_set_integer(v,nnn); \
247 } while(0)
248#define SET_FLOAT_RETURN(n) do {\
249 mrbc_float_t nnn = (n); \
250 mrbc_decref(v); \
251 mrbc_set_float(v,nnn); \
252} while(0)
253
254
255#if !defined(MRBC_NOT_RECOMMEND_TO_USE)
256// GET_*_ARG; not recommend to use.
257// maybe delete for future.
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)
264
265// for Numeric values.
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
284
285#endif // !defined(MRBC_NOT_RECOMMEND_TO_USE)
286
287
288//================================================================
289// mrbc_value accessors
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__)
323
324
325//================================================================
326// mrbc_value converters.
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)
340
341
342//================================================================
343// Method argument getters.
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__)
398//@cond
399#define MRBC_arg_choice(a1,a2,a3,...) a3
400//@endcond
401
402
403//================================================================
404// for keyword arguments
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__ ) \
431 }
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));
434
435#define MRBC_KW_DICT(dict) \
436 mrbc_value 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); }
439
440#define MRBC_KW_ISVALID(kw) (mrbc_type(kw) != MRBC_TT_EMPTY)
441
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))&&
446
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)
450
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);
454
455//@cond
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__)
494//@endcond
495
496
501#if defined(UINTPTR_MAX)
502#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(uintptr_t)(p))
503#else
504#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(p))
505#endif
506
507
508/***** Global variables *****************************************************/
509extern void (* const mrbc_delfunc[])(mrbc_value *);
510
511
512/***** Function prototypes **************************************************/
513//@cond
514int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2);
515mrbc_int_t mrbc_atoi(const char *s, int base);
516int mrbc_strcpy(char *dest, int destsize, const char *src);
517void mrbc_format_float(char *buf, int bufsiz, mrbc_float_t flo);
518mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val);
519mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value);
520double mrbc_val_f(struct VM *vm, const mrbc_value *val);
521double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value);
522const char *mrbc_val_s(struct VM *vm, const mrbc_value *val);
523const char *mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value);
524mrbc_int_t mrbc_to_i(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
525mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
526char *mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
527mrbc_value *mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n);
528mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n);
529mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value);
530mrbc_float_t mrbc_arg_f(struct VM *vm, mrbc_value v[], int argc, int n);
531mrbc_float_t mrbc_arg_f2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_float_t default_value);
532const char *mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n);
533const char *mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value);
534int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n);
535int mrbc_arg_b2(struct VM *vm, mrbc_value v[], int argc, int n, int default_value);
536//@endcond
537
538
539/***** Inline functions *****************************************************/
540
541//================================================================
546static inline void mrbc_incref(mrbc_value *v)
547{
548 if( mrbc_type(*v) <= MRBC_TT_INC_DEC_THRESHOLD ) return;
549
550 assert( v->obj->ref_count != 0 );
551 assert( v->obj->ref_count != 0xffff ); // check max value.
552 v->obj->ref_count++;
553}
554
555
556//================================================================
561static inline void mrbc_decref(mrbc_value *v)
562{
563 if( mrbc_type(*v) <= MRBC_TT_INC_DEC_THRESHOLD ) return;
564
565 assert( v->obj->ref_count != 0 );
566 assert( v->obj->ref_count != 0xffff ); // check broken data.
567
568 if( --v->obj->ref_count != 0 ) return;
569
570 (*mrbc_delfunc[v->tt])(v);
571}
572
573
574//================================================================
579static inline void mrbc_decref_empty(mrbc_value *v)
580{
581 mrbc_decref(v);
583}
584
585
586//================================================================
591static inline void mrbc_delete(mrbc_value *v)
592{
594}
595
596
597//================================================================
603static inline uint16_t bin_to_uint16( const void *s )
604{
605#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
606 // Little endian, no alignment.
607 uint16_t x = *((uint16_t *)s);
608 x = (x << 8) | (x >> 8);
609
610#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
611 // Big endian, no alignment.
612 uint16_t x = *((uint16_t *)s);
613
614#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
615 // 32bit alignment required.
616 uint8_t *p = (uint8_t *)s;
617 uint16_t x = *p++;
618 x <<= 8;
619 x |= *p;
620
621#else
622 #error "Specify MRBC_BIG_ENDIAN or MRBC_LITTLE_ENDIAN"
623#endif
624
625 return x;
626}
627
628
629//================================================================
635static inline uint32_t bin_to_uint32( const void *s )
636{
637#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
638 // Little endian, no alignment.
639 uint32_t x = *((uint32_t *)s);
640 x = (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
641
642#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
643 // Big endian, no alignment.
644 uint32_t x = *((uint32_t *)s);
645
646#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
647 // 32bit alignment required.
648 uint8_t *p = (uint8_t *)s;
649 uint32_t x = *p++;
650 x <<= 8;
651 x |= *p++;
652 x <<= 8;
653 x |= *p++;
654 x <<= 8;
655 x |= *p;
656
657#endif
658
659 return x;
660}
661
662
663#if defined(MRBC_INT64)
664//================================================================
670static inline int64_t bin_to_int64( const void *s )
671{
672#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
673 // Little endian, no 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;
682 y |= (x >> 56);
683 return y;
684
685#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
686 // Big endian, no alignment.
687 return *((uint64_t *)s);
688
689#elif defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
690 // 64bit alignment required.
691 uint8_t *p = (uint8_t *)s;
692 uint64_t x = *p++;
693 x <<= 8;
694 x |= *p++;
695 x <<= 8;
696 x |= *p++;
697 x <<= 8;
698 x |= *p++;
699 x <<= 8;
700 x |= *p++;
701 x <<= 8;
702 x |= *p++;
703 x <<= 8;
704 x |= *p++;
705 x <<= 8;
706 x |= *p;
707 return x;
708
709#endif
710
711}
712#endif
713
714
715//================================================================
721static inline double bin_to_double64( const void *s )
722{
723#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
724 // Little endian, no alignment.
725 return *((double *)s);
726
727#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
728 // Big endian, no alignment.
729 double x;
730 uint8_t *p1 = (uint8_t*)s;
731 uint8_t *p2 = (uint8_t*)&x + 7;
732 int i;
733 for( i = 7; i >= 0; i-- ) {
734 *p2-- = *p1++;
735 }
736 return x;
737
738#elif defined(MRBC_LITTLE_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
739 // Little endian, 64bit alignment required.
740 double x;
741 uint8_t *p1 = (uint8_t*)s;
742 uint8_t *p2 = (uint8_t*)&x;
743 int i;
744 for( i = 7; i >= 0; i-- ) {
745 *p2++ = *p1++;
746 }
747 return x;
748
749#elif defined(MRBC_BIG_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
750 // Big endian, 64bit alignment required.
751 double x;
752 uint8_t *p1 = (uint8_t*)s;
753 uint8_t *p2 = (uint8_t*)&x + 7;
754 int i;
755 for( i = 7; i >= 0; i-- ) {
756 *p2-- = *p1++;
757 }
758 return x;
759
760#endif
761}
762
763
764//================================================================
770static inline void uint32_to_bin( uint32_t v, void *d )
771{
772 uint8_t *p = (uint8_t *)d + 3;
773 *p-- = 0xff & v;
774 v >>= 8;
775 *p-- = 0xff & v;
776 v >>= 8;
777 *p-- = 0xff & v;
778 v >>= 8;
779 *p = 0xff & v;
780}
781
782
783//================================================================
789static inline void uint16_to_bin( uint16_t v, void *d )
790{
791 uint8_t *p = (uint8_t *)d;
792 *p++ = (v >> 8);
793 *p = 0xff & v;
794}
795
796
797#ifdef __cplusplus
798}
799#endif
800#endif
mruby/c NaN boxing mrbc_value definition.
mruby/c mrbc_value definition.
static void mrbc_set_tt(mrbc_value *p, mrbc_vtype type)
Definition boxing_no.h:119
#define mrbc_type(o)
Definition boxing_no.h:57
struct RObject mrbc_value
Value object. Default version.
MRBC_OBJECT_HEADER
Definition value.h:155
Class object.
Definition class.h:87
Value object. Default version.
Definition boxing_no.h:19
mrbc_float_t d
Definition boxing_no.h:24
mrbc_vtype tt
Definition boxing_no.h:20
struct RBasic * obj
Definition boxing_no.h:27
mrbc_int_t i
Definition boxing_no.h:22
Virtual Machine.
Definition vm.h:150
int mrbc_arg_b2(struct VM *vm, mrbc_value v[], int argc, int n, int default_value)
Definition value.c:778
char * mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:511
const char * mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value)
Definition value.c:409
void(*const mrbc_delfunc[])(mrbc_value *)
Definition value.c:39
mrbc_int_t mrbc_to_i(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:429
mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val)
Definition value.c:283
const char * mrbc_val_s(struct VM *vm, const mrbc_value *val)
Definition value.c:381
mrbc_value * mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:549
double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value)
Definition value.c:363
const char * mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:687
int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2)
Definition value.c:68
mrbc_float_t mrbc_arg_f(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:630
mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value)
Definition value.c:610
int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:741
mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value)
Definition value.c:314
mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:470
int mrbc_strcpy(char *dest, int destsize, const char *src)
Definition value.c:241
mrbc_int_t mrbc_atoi(const char *s, int base)
Definition value.c:188
mrbc_float_t mrbc_arg_f2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_float_t default_value)
Definition value.c:667
const char * mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value)
Definition value.c:721
mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:573
void mrbc_format_float(char *buf, int bufsiz, mrbc_float_t flo)
Definition value.c:263
double mrbc_val_f(struct VM *vm, const mrbc_value *val)
Definition value.c:332
float mrbc_float_t
Definition value.h:52
int32_t mrbc_int_t
Definition value.h:47
static void mrbc_decref(mrbc_value *v)
Definition value.h:561
static void mrbc_decref_empty(mrbc_value *v)
Definition value.h:579
static uint32_t bin_to_uint32(const void *s)
Definition value.h:635
void(* mrbc_func_t)(struct VM *vm, struct RObject *v, int argc)
Definition value.h:63
#define MRBC_TT_INC_DEC_THRESHOLD
Definition value.h:103
static double bin_to_double64(const void *s)
Definition value.h:721
static void mrbc_incref(mrbc_value *v)
Definition value.h:546
mrbc_error_code
Definition value.h:110
@ E_SYNTAX_ERROR
Definition value.h:120
@ E_INDEX_ERROR
Definition value.h:115
@ E_SCRIPT_ERROR
Definition value.h:119
@ E_BYTECODE_ERROR
Definition value.h:128
@ E_NOMETHOD_ERROR
Definition value.h:118
@ E_TYPE_ERROR
Definition value.h:113
@ E_NOTIMP_ERROR
Definition value.h:123
@ E_NAME_ERROR
Definition value.h:117
@ E_RANGE_ERROR
Definition value.h:116
@ E_REGEXP_ERROR
Definition value.h:122
@ E_KEY_ERROR
Definition value.h:125
@ E_NOMEMORY_ERROR
Definition value.h:111
@ E_RUNTIME_ERROR
Definition value.h:112
@ E_ARGUMENT_ERROR
Definition value.h:114
@ E_FLOATDOMAIN_ERROR
Definition value.h:124
@ E_LOCALJUMP_ERROR
Definition value.h:121
int16_t mrbc_sym
mruby/c symbol ID
Definition value.h:62
static void uint16_to_bin(uint16_t v, void *d)
Definition value.h:789
mrbc_vtype
Definition value.h:69
@ MRBC_TT_FALSE
FalseClass.
Definition value.h:82
@ MRBC_TT_HANDLE
Definition value.h:77
@ MRBC_TT_SYMBOL
Symbol.
Definition value.h:89
@ MRBC_TT_STRING
String.
Definition value.h:98
@ MRBC_TT_FLOAT
Float.
Definition value.h:88
@ MRBC_TT_INTEGER
Integer.
Definition value.h:86
@ MRBC_TT_RETURN
Definition value.h:76
@ MRBC_TT_EXCEPTION
Exception.
Definition value.h:101
@ MRBC_TT_EMPTY
Definition value.h:80
@ MRBC_TT_PROC
Proc.
Definition value.h:96
@ MRBC_TT_JMPUW
Definition value.h:73
@ MRBC_TT_RANGE
Range.
Definition value.h:99
@ MRBC_TT_OBJECT
General instance.
Definition value.h:95
@ MRBC_TT_BREAK
Definition value.h:74
@ MRBC_TT_FIXNUM
Definition value.h:87
@ MRBC_TT_ARRAY
Array.
Definition value.h:97
@ MRBC_TT_MODULE
Module.
Definition value.h:91
@ MRBC_TT_TRUE
TrueClass.
Definition value.h:85
@ MRBC_TT_NIL
NilClass.
Definition value.h:81
@ MRBC_TT_RETURN_BLK
Definition value.h:75
@ MRBC_TT_HASH
Hash.
Definition value.h:100
@ MRBC_TT_CLASS
Class.
Definition value.h:90
uint32_t mrbc_uint_t
Definition value.h:48
static void uint32_to_bin(uint32_t v, void *d)
Definition value.h:770
static uint16_t bin_to_uint16(const void *s)
Definition value.h:603
struct RObject mrbc_object
Definition value.h:166
static void mrbc_delete(mrbc_value *v)
Definition value.h:591
Global configuration of mruby/c VM's.