mruby/c VM Source Code master (2026/08/06)
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#if MRBC_USE_FLOAT
277#define MRBC_ISNUMERIC(val) \
278 ((val).tt == MRBC_TT_INTEGER || (val).tt == MRBC_TT_FLOAT)
279#define MRBC_TO_INT(val) \
280 (val).tt == MRBC_TT_INTEGER ? (val).i : \
281 (val).tt == MRBC_TT_FLOAT ? (mrbc_int_t)(val).d : 0
282#define MRBC_TO_FLOAT(val) \
283 (val).tt == MRBC_TT_FLOAT ? (val).d : \
284 (val).tt == MRBC_TT_INTEGER ? (mrbc_float_t)(val).i : (mrbc_float_t)0
285#else
286#define MRBC_ISNUMERIC(val) \
287 ((val).tt == MRBC_TT_INTEGER)
288#define MRBC_TO_INT(val) \
289 (val).tt == MRBC_TT_INTEGER ? (val).i : 0
290#define MRBC_TO_FLOAT(val) \
291 (val).tt == MRBC_TT_INTEGER ? (mrbc_float_t)(val).i : (mrbc_float_t)0
292#endif
293
294#endif // !defined(MRBC_NOT_RECOMMEND_TO_USE)
295
296
297//================================================================
298// mrbc_value accessors
329#define MRBC_VAL_I(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_i2, mrbc_val_i) (vm, __VA_ARGS__)
330#define MRBC_VAL_F(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_f2, mrbc_val_f) (vm, __VA_ARGS__)
331#define MRBC_VAL_S(...) MRBC_arg_choice(__VA_ARGS__, mrbc_val_s2, mrbc_val_s) (vm, __VA_ARGS__)
332
333
334//================================================================
335// mrbc_value converters.
346#define MRBC_TO_I(val) mrbc_to_i(vm, v, argc, val)
347#define MRBC_TO_F(val) mrbc_to_f(vm, v, argc, val)
348#define MRBC_TO_S(val) mrbc_to_s(vm, v, argc, val)
349
350
351//================================================================
352// Method argument getters.
402#define MRBC_ARG(n) mrbc_arg(vm, v, argc, (n))
403#define MRBC_ARG_I(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_i2, mrbc_arg_i) (vm,v,argc,__VA_ARGS__)
404#define MRBC_ARG_F(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_f2, mrbc_arg_f) (vm,v,argc,__VA_ARGS__)
405#define MRBC_ARG_S(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_s2, mrbc_arg_s) (vm,v,argc,__VA_ARGS__)
406#define MRBC_ARG_B(...) MRBC_arg_choice(__VA_ARGS__, mrbc_arg_b2, mrbc_arg_b) (vm,v,argc,__VA_ARGS__)
407//@cond
408#define MRBC_arg_choice(a1,a2,a3,...) a3
409//@endcond
410
411
412//================================================================
413// for keyword arguments
436#define MRBC_KW_ARG(...) \
437 MRBC_each(__VA_ARGS__)( MRBC_KW_ARG_decl1, __VA_ARGS__ ) \
438 if( mrbc_type(v[argc+1]) == MRBC_TT_HASH ) { \
439 MRBC_each(__VA_ARGS__)( MRBC_KW_ARG_decl2, __VA_ARGS__ ) \
440 }
441#define MRBC_KW_ARG_decl1(kw) mrbc_value kw = {.tt = MRBC_TT_EMPTY};
442#define MRBC_KW_ARG_decl2(kw) kw = mrbc_hash_remove_by_id(&v[argc+1], mrbc_str_to_symid(#kw));
443
444#define MRBC_KW_DICT(dict) \
445 mrbc_value dict; \
446 if( mrbc_type(v[argc+1]) == MRBC_TT_HASH ) { dict = v[argc+1]; v[argc+1].tt = MRBC_TT_EMPTY; } \
447 else { dict = mrbc_hash_new(vm, 0); }
448
449#define MRBC_KW_ISVALID(kw) (mrbc_type(kw) != MRBC_TT_EMPTY)
450
451#define MRBC_KW_MANDATORY(...) \
452 (MRBC_each(__VA_ARGS__)( MRBC_KW_MANDATORY_decl1, __VA_ARGS__ ) 1)
453#define MRBC_KW_MANDATORY_decl1(kw) (MRBC_KW_ISVALID(kw)? 1 : \
454 (mrbc_raisef(vm, MRBC_CLASS(ArgumentError), "missing keyword: %s", #kw), 0))&&
455
456#define MRBC_KW_END() \
457 (((mrbc_type(v[argc+1]) == MRBC_TT_HASH) && mrbc_hash_size(&v[argc+1])) ? \
458 (mrbc_raise(vm, MRBC_CLASS(ArgumentError), "unknown keyword"), 0) : 1)
459
460#define MRBC_KW_DELETE(...) \
461 MRBC_each(__VA_ARGS__)( MRBC_KW_DELETE_decl, __VA_ARGS__ )
462#define MRBC_KW_DELETE_decl(kw) mrbc_decref(&kw);
463
464//@cond
465#define MRBC_each(...) MRBC_each_sel(__VA_ARGS__, \
466 MRBC_each30,MRBC_each29,MRBC_each28,MRBC_each27,MRBC_each26, \
467 MRBC_each25,MRBC_each24,MRBC_each23,MRBC_each22,MRBC_each21, \
468 MRBC_each20,MRBC_each19,MRBC_each18,MRBC_each17,MRBC_each16, \
469 MRBC_each15,MRBC_each14,MRBC_each13,MRBC_each12,MRBC_each11, \
470 MRBC_each10,MRBC_each9, MRBC_each8, MRBC_each7, MRBC_each6, \
471 MRBC_each5, MRBC_each4, MRBC_each3, MRBC_each2, MRBC_each1)
472#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
473#define MRBC_each1(func,arg) func(arg)
474#define MRBC_each2(func,arg, ...) func(arg) MRBC_each1(func,__VA_ARGS__)
475#define MRBC_each3(func,arg, ...) func(arg) MRBC_each2(func,__VA_ARGS__)
476#define MRBC_each4(func,arg, ...) func(arg) MRBC_each3(func,__VA_ARGS__)
477#define MRBC_each5(func,arg, ...) func(arg) MRBC_each4(func,__VA_ARGS__)
478#define MRBC_each6(func,arg, ...) func(arg) MRBC_each5(func,__VA_ARGS__)
479#define MRBC_each7(func,arg, ...) func(arg) MRBC_each6(func,__VA_ARGS__)
480#define MRBC_each8(func,arg, ...) func(arg) MRBC_each7(func,__VA_ARGS__)
481#define MRBC_each9(func,arg, ...) func(arg) MRBC_each8(func,__VA_ARGS__)
482#define MRBC_each10(func,arg, ...) func(arg) MRBC_each9(func,__VA_ARGS__)
483#define MRBC_each11(func,arg, ...) func(arg) MRBC_each10(func,__VA_ARGS__)
484#define MRBC_each12(func,arg, ...) func(arg) MRBC_each11(func,__VA_ARGS__)
485#define MRBC_each13(func,arg, ...) func(arg) MRBC_each12(func,__VA_ARGS__)
486#define MRBC_each14(func,arg, ...) func(arg) MRBC_each13(func,__VA_ARGS__)
487#define MRBC_each15(func,arg, ...) func(arg) MRBC_each14(func,__VA_ARGS__)
488#define MRBC_each16(func,arg, ...) func(arg) MRBC_each15(func,__VA_ARGS__)
489#define MRBC_each17(func,arg, ...) func(arg) MRBC_each16(func,__VA_ARGS__)
490#define MRBC_each18(func,arg, ...) func(arg) MRBC_each17(func,__VA_ARGS__)
491#define MRBC_each19(func,arg, ...) func(arg) MRBC_each18(func,__VA_ARGS__)
492#define MRBC_each20(func,arg, ...) func(arg) MRBC_each19(func,__VA_ARGS__)
493#define MRBC_each21(func,arg, ...) func(arg) MRBC_each20(func,__VA_ARGS__)
494#define MRBC_each22(func,arg, ...) func(arg) MRBC_each21(func,__VA_ARGS__)
495#define MRBC_each23(func,arg, ...) func(arg) MRBC_each22(func,__VA_ARGS__)
496#define MRBC_each24(func,arg, ...) func(arg) MRBC_each23(func,__VA_ARGS__)
497#define MRBC_each25(func,arg, ...) func(arg) MRBC_each24(func,__VA_ARGS__)
498#define MRBC_each26(func,arg, ...) func(arg) MRBC_each25(func,__VA_ARGS__)
499#define MRBC_each27(func,arg, ...) func(arg) MRBC_each26(func,__VA_ARGS__)
500#define MRBC_each28(func,arg, ...) func(arg) MRBC_each27(func,__VA_ARGS__)
501#define MRBC_each29(func,arg, ...) func(arg) MRBC_each28(func,__VA_ARGS__)
502#define MRBC_each30(func,arg, ...) func(arg) MRBC_each29(func,__VA_ARGS__)
503//@endcond
504
505
510#if defined(UINTPTR_MAX)
511#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(uintptr_t)(p))
512#else
513#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(p))
514#endif
515
516
517/***** Global variables *****************************************************/
518extern void (* const mrbc_delfunc[])(mrbc_value *);
519
520
521/***** Function prototypes **************************************************/
522//@cond
523int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2);
524mrbc_int_t mrbc_atoi(const char *s, int base);
525int mrbc_strcpy(char *dest, int destsize, const char *src);
526#if MRBC_USE_FLOAT
527void mrbc_format_float(char *buf, int bufsiz, mrbc_float_t flo);
528#endif
529mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val);
530mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value);
531double mrbc_val_f(struct VM *vm, const mrbc_value *val);
532double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value);
533const char *mrbc_val_s(struct VM *vm, const mrbc_value *val);
534const char *mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value);
535mrbc_int_t mrbc_to_i(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
536mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
537char *mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
538mrbc_value *mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n);
539mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n);
540mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value);
541mrbc_float_t mrbc_arg_f(struct VM *vm, mrbc_value v[], int argc, int n);
542mrbc_float_t mrbc_arg_f2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_float_t default_value);
543const char *mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n);
544const char *mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value);
545int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n);
546int mrbc_arg_b2(struct VM *vm, mrbc_value v[], int argc, int n, int default_value);
547//@endcond
548
549
550/***** Inline functions *****************************************************/
551
552//================================================================
557static inline void mrbc_incref(mrbc_value *v)
558{
559 if( mrbc_type(*v) <= MRBC_TT_INC_DEC_THRESHOLD ) return;
560
561 assert( v->obj->ref_count != 0 );
562 assert( v->obj->ref_count != 0xffff ); // check max value.
563 v->obj->ref_count++;
564}
565
566
567//================================================================
572static inline void mrbc_decref(mrbc_value *v)
573{
574 if( mrbc_type(*v) <= MRBC_TT_INC_DEC_THRESHOLD ) return;
575
576 assert( v->obj->ref_count != 0 );
577 assert( v->obj->ref_count != 0xffff ); // check broken data.
578
579 if( --v->obj->ref_count != 0 ) return;
580
581 (*mrbc_delfunc[v->tt])(v);
582}
583
584
585//================================================================
590static inline void mrbc_decref_empty(mrbc_value *v)
591{
592 mrbc_decref(v);
594}
595
596
597//================================================================
602static inline void mrbc_delete(mrbc_value *v)
603{
605}
606
607
608//================================================================
614static inline uint16_t bin_to_uint16( const void *s )
615{
616#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
617 // Little endian, no alignment.
618 uint16_t x = *((uint16_t *)s);
619 x = (x << 8) | (x >> 8);
620
621#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
622 // Big endian, no alignment.
623 uint16_t x = *((uint16_t *)s);
624
625#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
626 // 32bit alignment required.
627 uint8_t *p = (uint8_t *)s;
628 uint16_t x = *p++;
629 x <<= 8;
630 x |= *p;
631
632#else
633 #error "Specify MRBC_BIG_ENDIAN or MRBC_LITTLE_ENDIAN"
634#endif
635
636 return x;
637}
638
639
640//================================================================
646static inline uint32_t bin_to_uint32( const void *s )
647{
648#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
649 // Little endian, no alignment.
650 uint32_t x = *((uint32_t *)s);
651 x = (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
652
653#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
654 // Big endian, no alignment.
655 uint32_t x = *((uint32_t *)s);
656
657#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
658 // 32bit alignment required.
659 uint8_t *p = (uint8_t *)s;
660 uint32_t x = *p++;
661 x <<= 8;
662 x |= *p++;
663 x <<= 8;
664 x |= *p++;
665 x <<= 8;
666 x |= *p;
667
668#endif
669
670 return x;
671}
672
673
674#if defined(MRBC_INT64)
675//================================================================
681static inline int64_t bin_to_int64( const void *s )
682{
683#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
684 // Little endian, no alignment.
685 uint64_t x = *((uint64_t *)s);
686 uint64_t y = (x << 56);
687 y |= ((uint64_t)(uint8_t)(x >> 8)) << 48;
688 y |= ((uint64_t)(uint8_t)(x >> 16)) << 40;
689 y |= ((uint64_t)(uint8_t)(x >> 24)) << 32;
690 y |= ((uint64_t)(uint8_t)(x >> 32)) << 24;
691 y |= ((uint64_t)(uint8_t)(x >> 40)) << 16;
692 y |= ((uint64_t)(uint8_t)(x >> 48)) << 8;
693 y |= (x >> 56);
694 return y;
695
696#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
697 // Big endian, no alignment.
698 return *((uint64_t *)s);
699
700#elif defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
701 // 64bit alignment required.
702 uint8_t *p = (uint8_t *)s;
703 uint64_t x = *p++;
704 x <<= 8;
705 x |= *p++;
706 x <<= 8;
707 x |= *p++;
708 x <<= 8;
709 x |= *p++;
710 x <<= 8;
711 x |= *p++;
712 x <<= 8;
713 x |= *p++;
714 x <<= 8;
715 x |= *p++;
716 x <<= 8;
717 x |= *p;
718 return x;
719
720#endif
721
722}
723#endif
724
725
726//================================================================
732static inline double bin_to_double64( const void *s )
733{
734#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
735 // Little endian, no alignment.
736 return *((double *)s);
737
738#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
739 // Big endian, no alignment.
740 double x;
741 uint8_t *p1 = (uint8_t*)s;
742 uint8_t *p2 = (uint8_t*)&x + 7;
743 int i;
744 for( i = 7; i >= 0; i-- ) {
745 *p2-- = *p1++;
746 }
747 return x;
748
749#elif defined(MRBC_LITTLE_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
750 // Little endian, 64bit alignment required.
751 double x;
752 uint8_t *p1 = (uint8_t*)s;
753 uint8_t *p2 = (uint8_t*)&x;
754 int i;
755 for( i = 7; i >= 0; i-- ) {
756 *p2++ = *p1++;
757 }
758 return x;
759
760#elif defined(MRBC_BIG_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
761 // Big endian, 64bit alignment required.
762 double x;
763 uint8_t *p1 = (uint8_t*)s;
764 uint8_t *p2 = (uint8_t*)&x + 7;
765 int i;
766 for( i = 7; i >= 0; i-- ) {
767 *p2-- = *p1++;
768 }
769 return x;
770
771#endif
772}
773
774
775//================================================================
781static inline void uint32_to_bin( uint32_t v, void *d )
782{
783 uint8_t *p = (uint8_t *)d + 3;
784 *p-- = 0xff & v;
785 v >>= 8;
786 *p-- = 0xff & v;
787 v >>= 8;
788 *p-- = 0xff & v;
789 v >>= 8;
790 *p = 0xff & v;
791}
792
793
794//================================================================
800static inline void uint16_to_bin( uint16_t v, void *d )
801{
802 uint8_t *p = (uint8_t *)d;
803 *p++ = (v >> 8);
804 *p = 0xff & v;
805}
806
807
808#ifdef __cplusplus
809}
810#endif
811#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:125
#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:792
char * mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:521
const char * mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value)
Definition value.c:415
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:435
mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val)
Definition value.c:285
const char * mrbc_val_s(struct VM *vm, const mrbc_value *val)
Definition value.c:387
mrbc_value * mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:559
double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value)
Definition value.c:369
const char * mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:701
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:642
mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value)
Definition value.c:622
int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:755
mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value)
Definition value.c:318
mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:479
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:681
const char * mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value)
Definition value.c:735
mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:583
void mrbc_format_float(char *buf, int bufsiz, mrbc_float_t flo)
Definition value.c:264
double mrbc_val_f(struct VM *vm, const mrbc_value *val)
Definition value.c:336
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:572
static void mrbc_decref_empty(mrbc_value *v)
Definition value.h:590
static uint32_t bin_to_uint32(const void *s)
Definition value.h:646
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:732
static void mrbc_incref(mrbc_value *v)
Definition value.h:557
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:800
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:781
static uint16_t bin_to_uint16(const void *s)
Definition value.h:614
struct RObject mrbc_object
Definition value.h:166
static void mrbc_delete(mrbc_value *v)
Definition value.h:602
Global configuration of mruby/c VM's.