mruby/c VM Source Code release 3.4
Loading...
Searching...
No Matches
value.h
Go to the documentation of this file.
1
13
14#ifndef MRBC_SRC_VALUE_H_
15#define MRBC_SRC_VALUE_H_
16
17/***** Feature test switches ************************************************/
18/***** System headers *******************************************************/
19//@cond
20#include <stdint.h>
21#include <assert.h>
22#include "vm_config.h"
23//@endcond
24
25/***** Local headers ********************************************************/
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31/***** Constant values ******************************************************/
32/***** Typedefs *************************************************************/
33// pre define of some struct
34struct VM;
35struct RObject;
36
37// mrbc types
38#if defined(MRBC_INT16)
39typedef int16_t mrbc_int_t;
40typedef uint16_t mrbc_uint_t;
41#elif defined(MRBC_INT64)
42typedef int64_t mrbc_int_t;
43typedef uint64_t mrbc_uint_t;
44#else
45typedef int32_t mrbc_int_t;
46typedef uint32_t mrbc_uint_t;
47#endif
49
50#if MRBC_USE_FLOAT == 1
51typedef float mrbc_float_t;
52#elif MRBC_USE_FLOAT == 2
53typedef double mrbc_float_t;
54#endif
55#if MRBC_USE_FLOAT != 0
57#endif
58
59typedef int16_t mrbc_sym;
60typedef void (*mrbc_func_t)(struct VM *vm, struct RObject *v, int argc);
61
62
63//================================================================
66typedef enum {
67 /* (note) Must be same order as mrbc_class_tbl[], mrbc_delfunc[]. */
68
69 /* internal use */
70 MRBC_TT_JMPUW = -5, // use in OP_JMPUW...
75
76 /* primitive */
80 // (note) true/false threshold. see op_jmpif
81
89 // (note) inc/dec ref threshold.
90
91 /* non-primitive */
100#define MRBC_TT_INC_DEC_THRESHOLD MRBC_TT_MODULE
101#define MRBC_TT_MAXVAL MRBC_TT_EXCEPTION
102
103
104//================================================================
127
128
129//================================================================
130/* Define the object structure having reference counter.
131*/
132#if defined(MRBC_DEBUG)
133#define MRBC_OBJECT_HEADER uint8_t obj_mark_[2]; uint16_t ref_count
134#else
135#define MRBC_OBJECT_HEADER uint16_t ref_count
136#endif
137
138//================================================================
145
146
147//================================================================
151struct RObject {
153 union {
154 mrbc_int_t i; // MRBC_TT_INTEGER
155#if MRBC_USE_FLOAT
156 mrbc_float_t d; // MRBC_TT_FLOAT
157#endif
158 mrbc_sym sym_id; // MRBC_TT_SYMBOL
159 struct RBasic *obj; // use inc/dec ref only.
160 struct RClass *cls; // MRBC_TT_CLASS, MRBC_TT_MODULE
161 struct RInstance *instance; // MRBC_TT_OBJECT
162 struct RProc *proc; // MRBC_TT_PROC
163 struct RArray *array; // MRBC_TT_ARRAY
164 struct RString *string; // MRBC_TT_STRING
165 struct RRange *range; // MRBC_TT_RANGE
166 struct RHash *hash; // MRBC_TT_HASH
167 struct RException *exception; // MRBC_TT_EXCEPTION
168 void *handle; // internal use only.
169 };
170};
171typedef struct RObject mrb_object; // not recommended.
172typedef struct RObject mrb_value; // not recommended.
173typedef struct RObject mrbc_object;
174typedef struct RObject mrbc_value;
175
176
177/***** Macros ***************************************************************/
178
179// getters
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)
197
198// setters
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)
206
207// make immediate values.
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)})
215
216// (for mruby compatible)
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)
228
229// (for mruby/c 2 compatibility)
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)
235
236
237
238// for C call
261#define SET_RETURN(n) do { \
262 mrbc_value nnn = (n); \
263 mrbc_decref(v); \
264 v[0] = nnn; \
265 } while(0)
266#define SET_NIL_RETURN() do { \
267 mrbc_decref(v); \
268 v[0].tt = MRBC_TT_NIL; \
269 } while(0)
270#define SET_FALSE_RETURN() do { \
271 mrbc_decref(v); \
272 v[0].tt = MRBC_TT_FALSE; \
273 } while(0)
274#define SET_TRUE_RETURN() do { \
275 mrbc_decref(v); \
276 v[0].tt = MRBC_TT_TRUE; \
277 } while(0)
278#define SET_BOOL_RETURN(n) do { \
279 int tt = (n) ? MRBC_TT_TRUE : MRBC_TT_FALSE; \
280 mrbc_decref(v); \
281 v[0].tt = tt; \
282 } while(0)
283#define SET_INT_RETURN(n) do { \
284 mrbc_int_t nnn = (n); \
285 mrbc_decref(v); \
286 v[0].tt = MRBC_TT_INTEGER; \
287 v[0].i = nnn; \
288 } while(0)
289#define SET_FLOAT_RETURN(n) do {\
290 mrbc_float_t nnn = (n); \
291 mrbc_decref(v); \
292 v[0].tt = MRBC_TT_FLOAT; \
293 v[0].d = nnn; \
294} while(0)
295
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)
302
303
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]
306#else
307#define MRBC_INIT_OBJECT_HEADER(p, t) (p)->ref_count = 1
308#endif
309
310
311// for Numeric values.
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
330
331
332//================================================================
333// mrbc_value accessors
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__)
367
368
369//================================================================
370// mrbc_value converters.
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)
384
385
386//================================================================
387// Method argument getters.
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__)
442//@cond
443#define MRBC_arg_choice(a1,a2,a3,...) a3
444//@endcond
445
446
447//================================================================
448// for keyword arguments
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__ ) \
475 }
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));
478
479#define MRBC_KW_DICT(dict) \
480 mrbc_value 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); }
483
484#define MRBC_KW_ISVALID(kw) (kw.tt != MRBC_TT_EMPTY)
485
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))&&
490
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)
494
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);
498
499//@cond
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__)
538//@endcond
539
540
545#if defined(UINTPTR_MAX)
546#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(uintptr_t)(p))
547#else
548#define MRBC_PTR_TO_UINT32(p) ((uint32_t)(p))
549#endif
550
551
552/***** Global variables *****************************************************/
553extern void (* const mrbc_delfunc[])(mrbc_value *);
554
555
556/***** Function prototypes **************************************************/
557//@cond
558int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2);
559mrbc_int_t mrbc_atoi(const char *s, int base);
560int mrbc_strcpy(char *dest, int destsize, const char *src);
561mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val);
562mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value);
563double mrbc_val_f(struct VM *vm, const mrbc_value *val);
564double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value);
565const char *mrbc_val_s(struct VM *vm, const mrbc_value *val);
566const char *mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value);
567mrbc_int_t mrbc_to_i(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
568mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
569char *mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val);
570mrbc_value *mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n);
571mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n);
572mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value);
573mrbc_float_t mrbc_arg_f(struct VM *vm, mrbc_value v[], int argc, int n);
574mrbc_float_t mrbc_arg_f2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_float_t default_value);
575const char *mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n);
576const char *mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value);
577int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n);
578int mrbc_arg_b2(struct VM *vm, mrbc_value v[], int argc, int n, int default_value);
579//@endcond
580
581
582/***** Inline functions *****************************************************/
583
584//================================================================
589static inline void mrbc_incref(mrbc_value *v)
590{
591 if( v->tt <= MRBC_TT_INC_DEC_THRESHOLD ) return;
592
593 assert( v->obj->ref_count != 0 );
594 assert( v->obj->ref_count != 0xff ); // check max value.
595 v->obj->ref_count++;
596}
597
598
599//================================================================
604static inline void mrbc_decref(mrbc_value *v)
605{
606 if( v->tt <= MRBC_TT_INC_DEC_THRESHOLD ) return;
607
608 assert( v->obj->ref_count != 0 );
609 assert( v->obj->ref_count != 0xffff ); // check broken data.
610
611 if( --v->obj->ref_count != 0 ) return;
612
613 (*mrbc_delfunc[v->tt])(v);
614}
615
616
617//================================================================
622static inline void mrbc_decref_empty(mrbc_value *v)
623{
624 mrbc_decref(v);
625 v->tt = MRBC_TT_EMPTY;
626}
627
628
629//================================================================
634static inline void mrbc_delete(mrbc_value *v)
635{
637}
638
639
640//================================================================
646static inline uint16_t bin_to_uint16( const void *s )
647{
648#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
649 // Little endian, no alignment.
650 uint16_t x = *((uint16_t *)s);
651 x = (x << 8) | (x >> 8);
652
653#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
654 // Big endian, no alignment.
655 uint16_t x = *((uint16_t *)s);
656
657#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
658 // 32bit alignment required.
659 uint8_t *p = (uint8_t *)s;
660 uint16_t x = *p++;
661 x <<= 8;
662 x |= *p;
663
664#else
665 #error "Specify MRBC_BIG_ENDIAN or MRBC_LITTLE_ENDIAN"
666#endif
667
668 return x;
669}
670
671
672//================================================================
678static inline uint32_t bin_to_uint32( const void *s )
679{
680#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
681 // Little endian, no alignment.
682 uint32_t x = *((uint32_t *)s);
683 x = (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
684
685#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
686 // Big endian, no alignment.
687 uint32_t x = *((uint32_t *)s);
688
689#elif defined(MRBC_REQUIRE_32BIT_ALIGNMENT)
690 // 32bit alignment required.
691 uint8_t *p = (uint8_t *)s;
692 uint32_t x = *p++;
693 x <<= 8;
694 x |= *p++;
695 x <<= 8;
696 x |= *p++;
697 x <<= 8;
698 x |= *p;
699
700#endif
701
702 return x;
703}
704
705
706#if defined(MRBC_INT64)
707//================================================================
713static inline int64_t bin_to_int64( const void *s )
714{
715#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
716 // Little endian, no 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;
725 y |= (x >> 56);
726 return y;
727
728#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
729 // Big endian, no alignment.
730 return *((uint64_t *)s);
731
732#elif defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
733 // 64bit alignment required.
734 uint8_t *p = (uint8_t *)s;
735 uint64_t x = *p++;
736 x <<= 8;
737 x |= *p++;
738 x <<= 8;
739 x |= *p++;
740 x <<= 8;
741 x |= *p++;
742 x <<= 8;
743 x |= *p++;
744 x <<= 8;
745 x |= *p++;
746 x <<= 8;
747 x |= *p++;
748 x <<= 8;
749 x |= *p;
750 return x;
751
752#endif
753
754}
755#endif
756
757
758//================================================================
764static inline double bin_to_double64( const void *s )
765{
766#if defined(MRBC_LITTLE_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
767 // Little endian, no alignment.
768 return *((double *)s);
769
770#elif defined(MRBC_BIG_ENDIAN) && !defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
771 // Big endian, no alignment.
772 double x;
773 uint8_t *p1 = (uint8_t*)s;
774 uint8_t *p2 = (uint8_t*)&x + 7;
775 int i;
776 for( i = 7; i >= 0; i-- ) {
777 *p2-- = *p1++;
778 }
779 return x;
780
781#elif defined(MRBC_LITTLE_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
782 // Little endian, 64bit alignment required.
783 double x;
784 uint8_t *p1 = (uint8_t*)s;
785 uint8_t *p2 = (uint8_t*)&x;
786 int i;
787 for( i = 7; i >= 0; i-- ) {
788 *p2++ = *p1++;
789 }
790 return x;
791
792#elif defined(MRBC_BIG_ENDIAN) && defined(MRBC_REQUIRE_64BIT_ALIGNMENT)
793 // Big endian, 64bit alignment required.
794 double x;
795 uint8_t *p1 = (uint8_t*)s;
796 uint8_t *p2 = (uint8_t*)&x + 7;
797 int i;
798 for( i = 7; i >= 0; i-- ) {
799 *p2-- = *p1++;
800 }
801 return x;
802
803#endif
804}
805
806
807//================================================================
813static inline void uint32_to_bin( uint32_t v, void *d )
814{
815 uint8_t *p = (uint8_t *)d + 3;
816 *p-- = 0xff & v;
817 v >>= 8;
818 *p-- = 0xff & v;
819 v >>= 8;
820 *p-- = 0xff & v;
821 v >>= 8;
822 *p = 0xff & v;
823}
824
825
826//================================================================
832static inline void uint16_to_bin( uint16_t v, void *d )
833{
834 uint8_t *p = (uint8_t *)d;
835 *p++ = (v >> 8);
836 *p = 0xff & v;
837}
838
839
840#ifdef __cplusplus
841}
842#endif
843#endif
Array object.
Definition c_array.h:40
Base class for some objects.
Definition value.h:142
MRBC_OBJECT_HEADER
Definition value.h:143
Class object.
Definition class.h:83
Exception object.
Definition error.h:47
Hash object.
Definition c_hash.h:40
Instance object.
Definition class.h:155
Value object.
Definition value.h:151
struct RString * string
Definition value.h:164
struct RProc * proc
Definition value.h:162
struct RException * exception
Definition value.h:167
struct RInstance * instance
Definition value.h:161
mrbc_sym sym_id
Definition value.h:158
struct RHash * hash
Definition value.h:166
void * handle
Definition value.h:168
mrbc_float_t d
Definition value.h:156
mrbc_vtype tt
Definition value.h:152
struct RBasic * obj
Definition value.h:159
struct RClass * cls
Definition value.h:160
mrbc_int_t i
Definition value.h:154
struct RArray * array
Definition value.h:163
struct RRange * range
Definition value.h:165
Proc object.
Definition c_proc.h:40
Range object.
Definition c_range.h:40
String object.
Definition c_string.h:47
Virtual Machine.
Definition vm.h:140
int mrbc_arg_b2(struct VM *vm, mrbc_value v[], int argc, int n, int default_value)
Definition value.c:759
char * mrbc_to_s(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:492
const char * mrbc_val_s2(struct VM *vm, const mrbc_value *val, const char *default_value)
Definition value.c:390
void(*const mrbc_delfunc[])(mrbc_value *)
Definition value.c:37
mrbc_int_t mrbc_to_i(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:410
mrbc_int_t mrbc_val_i(struct VM *vm, const mrbc_value *val)
Definition value.c:264
const char * mrbc_val_s(struct VM *vm, const mrbc_value *val)
Definition value.c:362
mrbc_value * mrbc_arg(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:530
double mrbc_val_f2(struct VM *vm, const mrbc_value *val, double default_value)
Definition value.c:344
const char * mrbc_arg_s(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:668
int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2)
Definition value.c:66
mrbc_float_t mrbc_arg_f(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:611
mrbc_int_t mrbc_arg_i2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_int_t default_value)
Definition value.c:591
int mrbc_arg_b(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:722
mrbc_int_t mrbc_val_i2(struct VM *vm, const mrbc_value *val, mrbc_int_t default_value)
Definition value.c:295
mrbc_float_t mrbc_to_f(struct VM *vm, mrbc_value v[], int argc, mrbc_value *val)
Definition value.c:451
int mrbc_strcpy(char *dest, int destsize, const char *src)
Definition value.c:239
mrbc_int_t mrbc_atoi(const char *s, int base)
Definition value.c:186
mrbc_float_t mrbc_arg_f2(struct VM *vm, mrbc_value v[], int argc, int n, mrbc_float_t default_value)
Definition value.c:648
const char * mrbc_arg_s2(struct VM *vm, mrbc_value v[], int argc, int n, const char *default_value)
Definition value.c:702
mrbc_int_t mrbc_arg_i(struct VM *vm, mrbc_value v[], int argc, int n)
Definition value.c:554
double mrbc_val_f(struct VM *vm, const mrbc_value *val)
Definition value.c:313
float mrbc_float_t
Definition value.h:51
int32_t mrbc_int_t
Definition value.h:45
static void mrbc_decref(mrbc_value *v)
Definition value.h:604
#define mrb_float(o)
Definition value.h:219
struct RObject mrb_value
Definition value.h:172
static void mrbc_decref_empty(mrbc_value *v)
Definition value.h:622
static uint32_t bin_to_uint32(const void *s)
Definition value.h:678
void(* mrbc_func_t)(struct VM *vm, struct RObject *v, int argc)
Definition value.h:60
#define MRBC_TT_INC_DEC_THRESHOLD
Definition value.h:100
static double bin_to_double64(const void *s)
Definition value.h:764
mrbc_int_t mrb_int
Definition value.h:48
static void mrbc_incref(mrbc_value *v)
Definition value.h:589
mrbc_error_code
Definition value.h:107
@ E_SYNTAX_ERROR
Definition value.h:117
@ E_INDEX_ERROR
Definition value.h:112
@ E_SCRIPT_ERROR
Definition value.h:116
@ E_BYTECODE_ERROR
Definition value.h:125
@ E_NOMETHOD_ERROR
Definition value.h:115
@ E_TYPE_ERROR
Definition value.h:110
@ E_NOTIMP_ERROR
Definition value.h:120
@ E_NAME_ERROR
Definition value.h:114
@ E_RANGE_ERROR
Definition value.h:113
@ E_REGEXP_ERROR
Definition value.h:119
@ E_KEY_ERROR
Definition value.h:122
@ E_NOMEMORY_ERROR
Definition value.h:108
@ E_RUNTIME_ERROR
Definition value.h:109
@ E_ARGUMENT_ERROR
Definition value.h:111
@ E_FLOATDOMAIN_ERROR
Definition value.h:121
@ E_LOCALJUMP_ERROR
Definition value.h:118
int16_t mrbc_sym
mruby/c symbol ID
Definition value.h:59
static void uint16_to_bin(uint16_t v, void *d)
Definition value.h:832
mrbc_vtype
Definition value.h:66
@ MRBC_TT_FALSE
FalseClass.
Definition value.h:79
@ MRBC_TT_HANDLE
Definition value.h:74
@ MRBC_TT_SYMBOL
Symbol.
Definition value.h:86
@ MRBC_TT_STRING
String.
Definition value.h:95
@ MRBC_TT_FLOAT
Float.
Definition value.h:85
@ MRBC_TT_INTEGER
Integer.
Definition value.h:83
@ MRBC_TT_RETURN
Definition value.h:73
@ MRBC_TT_EXCEPTION
Exception.
Definition value.h:98
@ MRBC_TT_EMPTY
Definition value.h:77
@ MRBC_TT_PROC
Proc.
Definition value.h:93
@ MRBC_TT_JMPUW
Definition value.h:70
@ MRBC_TT_RANGE
Range.
Definition value.h:96
@ MRBC_TT_OBJECT
General instance.
Definition value.h:92
@ MRBC_TT_BREAK
Definition value.h:71
@ MRBC_TT_FIXNUM
Definition value.h:84
@ MRBC_TT_ARRAY
Array.
Definition value.h:94
@ MRBC_TT_MODULE
Module.
Definition value.h:88
@ MRBC_TT_TRUE
TrueClass.
Definition value.h:82
@ MRBC_TT_NIL
NilClass.
Definition value.h:78
@ MRBC_TT_RETURN_BLK
Definition value.h:72
@ MRBC_TT_HASH
Hash.
Definition value.h:97
@ MRBC_TT_CLASS
Class.
Definition value.h:87
struct RObject mrbc_value
Definition value.h:174
struct RObject mrb_object
Definition value.h:171
uint32_t mrbc_uint_t
Definition value.h:46
static void uint32_to_bin(uint32_t v, void *d)
Definition value.h:813
static uint16_t bin_to_uint16(const void *s)
Definition value.h:646
struct RObject mrbc_object
Definition value.h:173
static void mrbc_delete(mrbc_value *v)
Definition value.h:634
Global configuration of mruby/c VM's.