portable_mruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +195 -0
  3. data/exe/portable-mruby +6 -0
  4. data/lib/portable_mruby/binary_manager.rb +225 -0
  5. data/lib/portable_mruby/builder.rb +97 -0
  6. data/lib/portable_mruby/bytecode_compiler.rb +19 -0
  7. data/lib/portable_mruby/c_generator.rb +94 -0
  8. data/lib/portable_mruby/cli.rb +136 -0
  9. data/lib/portable_mruby/version.rb +6 -0
  10. data/lib/portable_mruby.rb +15 -0
  11. data/vendor/mruby/bin/mrbc.com +0 -0
  12. data/vendor/mruby/include/mrbconf.h +230 -0
  13. data/vendor/mruby/include/mruby/array.h +303 -0
  14. data/vendor/mruby/include/mruby/boxing_nan.h +169 -0
  15. data/vendor/mruby/include/mruby/boxing_no.h +59 -0
  16. data/vendor/mruby/include/mruby/boxing_word.h +251 -0
  17. data/vendor/mruby/include/mruby/class.h +104 -0
  18. data/vendor/mruby/include/mruby/common.h +118 -0
  19. data/vendor/mruby/include/mruby/compile.h +185 -0
  20. data/vendor/mruby/include/mruby/data.h +76 -0
  21. data/vendor/mruby/include/mruby/debug.h +75 -0
  22. data/vendor/mruby/include/mruby/dump.h +159 -0
  23. data/vendor/mruby/include/mruby/endian.h +44 -0
  24. data/vendor/mruby/include/mruby/error.h +132 -0
  25. data/vendor/mruby/include/mruby/gc.h +72 -0
  26. data/vendor/mruby/include/mruby/gems/mruby-dir/include/dir_hal.h +79 -0
  27. data/vendor/mruby/include/mruby/gems/mruby-io/include/io_hal.h +451 -0
  28. data/vendor/mruby/include/mruby/gems/mruby-io/include/mruby/ext/io.h +76 -0
  29. data/vendor/mruby/include/mruby/gems/mruby-socket/include/socket_hal.h +83 -0
  30. data/vendor/mruby/include/mruby/gems/mruby-time/include/mruby/time.h +27 -0
  31. data/vendor/mruby/include/mruby/hash.h +234 -0
  32. data/vendor/mruby/include/mruby/internal.h +274 -0
  33. data/vendor/mruby/include/mruby/irep.h +142 -0
  34. data/vendor/mruby/include/mruby/istruct.h +50 -0
  35. data/vendor/mruby/include/mruby/khash.h +455 -0
  36. data/vendor/mruby/include/mruby/mempool.h +19 -0
  37. data/vendor/mruby/include/mruby/numeric.h +174 -0
  38. data/vendor/mruby/include/mruby/object.h +45 -0
  39. data/vendor/mruby/include/mruby/opcode.h +69 -0
  40. data/vendor/mruby/include/mruby/ops.h +120 -0
  41. data/vendor/mruby/include/mruby/presym/disable.h +72 -0
  42. data/vendor/mruby/include/mruby/presym/enable.h +39 -0
  43. data/vendor/mruby/include/mruby/presym/id.h +1423 -0
  44. data/vendor/mruby/include/mruby/presym/scanning.h +81 -0
  45. data/vendor/mruby/include/mruby/presym/table.h +2847 -0
  46. data/vendor/mruby/include/mruby/presym.h +41 -0
  47. data/vendor/mruby/include/mruby/proc.h +186 -0
  48. data/vendor/mruby/include/mruby/range.h +77 -0
  49. data/vendor/mruby/include/mruby/re.h +16 -0
  50. data/vendor/mruby/include/mruby/string.h +428 -0
  51. data/vendor/mruby/include/mruby/throw.h +57 -0
  52. data/vendor/mruby/include/mruby/value.h +471 -0
  53. data/vendor/mruby/include/mruby/variable.h +108 -0
  54. data/vendor/mruby/include/mruby/version.h +143 -0
  55. data/vendor/mruby/include/mruby.h +1614 -0
  56. data/vendor/mruby/lib/libmruby.a +0 -0
  57. metadata +102 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ ** @file mruby/boxing_nan.h - nan boxing mrb_value definition
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifndef MRUBY_BOXING_NAN_H
8
+ #define MRUBY_BOXING_NAN_H
9
+
10
+ #ifdef MRB_USE_FLOAT32
11
+ # error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT32 conflict <<----
12
+ #endif
13
+
14
+ #ifdef MRB_NO_FLOAT
15
+ # error ---->> MRB_NAN_BOXING and MRB_NO_FLOAT conflict <<----
16
+ #endif
17
+
18
+ #define MRB_FIXNUM_MIN INT32_MIN
19
+ #define MRB_FIXNUM_MAX INT32_MAX
20
+
21
+ enum mrb_nanbox_tt_inline {
22
+ MRB_NANBOX_TT_OBJECT = 0,
23
+ MRB_NANBOX_TT_INTEGER = 1,
24
+ MRB_NANBOX_TT_MISC = 2,
25
+ MRB_NANBOX_TT_CPTR = 3,
26
+ };
27
+
28
+ /* value representation by nan-boxing:
29
+ * float : SEEEEEEE EEEEFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
30
+ * +/-inf: S1111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
31
+ * nan : 01111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000
32
+ * int : 01111111 11111001 00000000 00000000 IIIIIIII IIIIIIII IIIIIIII IIIIIIII
33
+ * sym : 01111111 11111110 00000000 00TTTTTT SSSSSSSS SSSSSSSS SSSSSSSS SSSSSSSS
34
+ * misc : 01111111 11111110 00000000 00TTTTTT 00000000 00000000 00000000 0000MMMM
35
+ * object: 01111111 11111100 PPPPPPPP PPPPPPPP PPPPPPPP PPPPPPPP PPPPPPPP PPPPPP00
36
+ * cptr : 01111111 11111111 PPPPPPPP PPPPPPPP PPPPPPPP PPPPPPPP PPPPPPPP PPPPPPPP
37
+ * Stored as O = R + 0x8004000000000000, retrieved as R = O - 0x8004000000000000.
38
+ * This makes pointers have all zeros in the top 32 bits.
39
+ */
40
+ typedef struct mrb_value {
41
+ uint64_t u;
42
+ } mrb_value;
43
+
44
+ static inline mrb_float
45
+ mrb_nan_boxing_value_float(mrb_value v)
46
+ {
47
+ union {
48
+ mrb_float f;
49
+ uint64_t u;
50
+ } x;
51
+ x.u = v.u - 0x8004000000000000;
52
+ return x.f;
53
+ }
54
+
55
+ #define SET_FLOAT_VALUE(mrb,r,f) do { \
56
+ union { \
57
+ mrb_float f; \
58
+ uint64_t u; \
59
+ } float_uint_union; \
60
+ if ((f) != (f)) { /* NaN */ \
61
+ float_uint_union.u = 0x7ff8000000000000UL; \
62
+ } \
63
+ else { \
64
+ float_uint_union.f = (f); \
65
+ } \
66
+ r.u = float_uint_union.u + 0x8004000000000000; \
67
+ } while(0)
68
+
69
+ #define mrb_float_p(o) (((uint64_t)((o).u)&0xfffc000000000000) != 0)
70
+
71
+ struct RInteger {
72
+ MRB_OBJECT_HEADER;
73
+ mrb_int i;
74
+ };
75
+
76
+ #define mrb_nb_tt(o) ((enum mrb_nanbox_tt_inline)((uint32_t)((o).u>>48)&3))
77
+
78
+ MRB_INLINE enum mrb_vtype
79
+ mrb_type(mrb_value o)
80
+ {
81
+ if (mrb_float_p(o)) return MRB_TT_FLOAT;
82
+
83
+ int64_t u = o.u;
84
+ switch (mrb_nb_tt(o)) {
85
+ case MRB_NANBOX_TT_OBJECT: {
86
+ if (u == 0) return MRB_TT_FALSE;
87
+ return ((struct RBasic*)(uintptr_t)u)->tt;
88
+ }
89
+ case MRB_NANBOX_TT_INTEGER:
90
+ return MRB_TT_INTEGER;
91
+ case MRB_NANBOX_TT_MISC:
92
+ return (enum mrb_vtype)((uint32_t)(o.u >> 32) & 0x1f);
93
+ case MRB_NANBOX_TT_CPTR:
94
+ return MRB_TT_CPTR;
95
+ default:
96
+ /* never happen */
97
+ return MRB_TT_FLOAT;
98
+ }
99
+ }
100
+
101
+ MRB_INLINE enum mrb_vtype
102
+ mrb_unboxed_type(mrb_value o)
103
+ {
104
+ if (!mrb_float_p(o) && mrb_nb_tt(o) == MRB_NANBOX_TT_OBJECT && o.u != 0) {
105
+ return ((struct RBasic*)(uintptr_t)o.u)->tt;
106
+ } else {
107
+ return MRB_TT_FALSE;
108
+ }
109
+ }
110
+
111
+ #define NANBOX_SET_MISC_VALUE(r,t,i) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_MISC, ((uint64_t)(t)<<32) | (i))
112
+
113
+ #define mrb_float(o) mrb_nan_boxing_value_float(o)
114
+ #ifdef MRB_INT64
115
+ /*
116
+ #ifdef MRB_32BIT
117
+ #define mrb_fixnum(o) ((mrb_int)((intptr_t)0xffffffffffff&((o).u))|(((o).u & 0x800000000000)?0xffff000000000000:0))
118
+ #else
119
+ #define mrb_fixnum(o) ((mrb_int)(int32_t)((o).u))
120
+ #endif
121
+ */
122
+
123
+ #define mrb_fixnum(o) ((mrb_int)(int32_t)((o).u))
124
+
125
+ static inline mrb_int
126
+ mrb_nan_boxing_value_int(mrb_value v)
127
+ {
128
+ uint64_t u = v.u;
129
+ if (mrb_nb_tt(v)==MRB_NANBOX_TT_OBJECT) {
130
+ struct RInteger *p = (struct RInteger*)(uintptr_t)u;
131
+ return p->i;
132
+ }
133
+ return mrb_fixnum(v);
134
+ }
135
+ #define mrb_integer(o) mrb_nan_boxing_value_int(o)
136
+ #else
137
+ #define mrb_fixnum(o) ((mrb_int)(((uintptr_t)0xffffffff)&((o).u)))
138
+ #define mrb_integer(o) mrb_fixnum(o)
139
+ #endif
140
+ #define mrb_symbol(o) ((mrb_sym)((uintptr_t)0xffffffff)&((o).u))
141
+ #define mrb_ptr(o) ((void*)(uintptr_t)(o).u)
142
+ #define mrb_cptr(o) ((void*)(uintptr_t)(0xffffffffffffULL&(o).u))
143
+
144
+ #define NANBOX_SET_VALUE(o, tt, v) do { \
145
+ (o).u = ((uint64_t)(tt)<<48) | ((uint64_t)(v)); \
146
+ } while (0)
147
+
148
+ #define SET_NIL_VALUE(r) ((r).u = 0)
149
+ #define SET_FALSE_VALUE(r) NANBOX_SET_MISC_VALUE(r, MRB_TT_FALSE, 1)
150
+ #define SET_TRUE_VALUE(r) NANBOX_SET_MISC_VALUE(r, MRB_TT_TRUE, 1)
151
+ #define SET_BOOL_VALUE(r,b) NANBOX_SET_MISC_VALUE(r, (b) ? MRB_TT_TRUE : MRB_TT_FALSE, 1)
152
+ #ifdef MRB_INT64
153
+ MRB_API mrb_value mrb_boxing_int_value(struct mrb_state*, mrb_int);
154
+ #define SET_INT_VALUE(mrb, r, n) ((r) = mrb_boxing_int_value(mrb, n))
155
+ #else
156
+ #define SET_INT_VALUE(mrb, r, n) SET_FIXNUM_VALUE(r, n)
157
+ #endif
158
+ #define SET_FIXNUM_VALUE(r,n) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_INTEGER, (uint32_t)(n))
159
+ #define SET_SYM_VALUE(r,v) NANBOX_SET_MISC_VALUE(r, MRB_TT_SYMBOL, (uint32_t)(v))
160
+ #define SET_OBJ_VALUE(r,v) do {(r).u = (uint64_t)(uintptr_t)(v);} while (0)
161
+ #define SET_CPTR_VALUE(mrb,r,v) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_CPTR, (uint64_t)(uintptr_t)(v) & 0x0000ffffffffffffULL)
162
+ #define SET_UNDEF_VALUE(r) NANBOX_SET_MISC_VALUE(r, MRB_TT_UNDEF, 4)
163
+
164
+ #define mrb_immediate_p(o) ((mrb_float_p(o) || mrb_nb_tt(o) != MRB_NANBOX_TT_OBJECT) || (o).u == 0)
165
+ #define mrb_nil_p(o) ((o).u == 0)
166
+ #define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE || (o).u == 0)
167
+ #define mrb_fixnum_p(o) (!mrb_float_p(o) && mrb_nb_tt(o)==MRB_NANBOX_TT_INTEGER)
168
+
169
+ #endif /* MRUBY_BOXING_NAN_H */
@@ -0,0 +1,59 @@
1
+ /**
2
+ ** @file mruby/boxing_no.h - unboxed mrb_value definition
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifndef MRUBY_BOXING_NO_H
8
+ #define MRUBY_BOXING_NO_H
9
+
10
+ #define MRB_FIXNUM_SHIFT 0
11
+ #define MRB_SYMBOL_SHIFT 0
12
+ #define MRB_FIXNUM_MIN MRB_INT_MIN
13
+ #define MRB_FIXNUM_MAX MRB_INT_MAX
14
+
15
+ union mrb_value_union {
16
+ #ifndef MRB_NO_FLOAT
17
+ mrb_float f;
18
+ #endif
19
+ void *p;
20
+ mrb_int i;
21
+ mrb_sym sym;
22
+ };
23
+
24
+ typedef struct mrb_value {
25
+ union mrb_value_union value;
26
+ enum mrb_vtype tt;
27
+ } mrb_value;
28
+
29
+ #define mrb_ptr(o) (o).value.p
30
+ #define mrb_cptr(o) mrb_ptr(o)
31
+ #ifndef MRB_NO_FLOAT
32
+ #define mrb_float(o) (o).value.f
33
+ #endif
34
+ #define mrb_fixnum(o) (o).value.i
35
+ #define mrb_integer(o) mrb_fixnum(o)
36
+ #define mrb_symbol(o) (o).value.sym
37
+ #define mrb_type(o) (o).tt
38
+ #define mrb_unboxed_type(o) (o).tt
39
+
40
+ #define BOXNO_SET_VALUE(o, ttt, attr, v) do {\
41
+ (o).tt = ttt;\
42
+ (o).attr = v;\
43
+ } while (0)
44
+
45
+ #define SET_NIL_VALUE(r) BOXNO_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
46
+ #define SET_FALSE_VALUE(r) BOXNO_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
47
+ #define SET_TRUE_VALUE(r) BOXNO_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
48
+ #define SET_BOOL_VALUE(r,b) BOXNO_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
49
+ #define SET_INT_VALUE(mrb,r,n) BOXNO_SET_VALUE(r, MRB_TT_INTEGER, value.i, (n))
50
+ #define SET_FIXNUM_VALUE(r,n) BOXNO_SET_VALUE(r, MRB_TT_INTEGER, value.i, (n))
51
+ #ifndef MRB_NO_FLOAT
52
+ #define SET_FLOAT_VALUE(mrb,r,v) BOXNO_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v))
53
+ #endif
54
+ #define SET_SYM_VALUE(r,v) BOXNO_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
55
+ #define SET_OBJ_VALUE(r,v) BOXNO_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
56
+ #define SET_CPTR_VALUE(mrb,r,v) BOXNO_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
57
+ #define SET_UNDEF_VALUE(r) BOXNO_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
58
+
59
+ #endif /* MRUBY_BOXING_NO_H */
@@ -0,0 +1,251 @@
1
+ /**
2
+ ** @file mruby/boxing_word.h - word boxing mrb_value definition
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifndef MRUBY_BOXING_WORD_H
8
+ #define MRUBY_BOXING_WORD_H
9
+
10
+ #if defined(MRB_32BIT) && !defined(MRB_USE_FLOAT32) && !defined(MRB_WORDBOX_NO_FLOAT_TRUNCATE)
11
+ # define MRB_WORDBOX_NO_FLOAT_TRUNCATE
12
+ #endif
13
+
14
+ #if !defined(MRB_NO_FLOAT) && defined(MRB_WORDBOX_NO_FLOAT_TRUNCATE)
15
+ struct RFloat {
16
+ MRB_OBJECT_HEADER;
17
+ mrb_float f;
18
+ };
19
+ #endif
20
+
21
+ struct RInteger {
22
+ MRB_OBJECT_HEADER;
23
+ mrb_int i;
24
+ };
25
+
26
+ enum mrb_special_consts {
27
+ MRB_Qnil = 0,
28
+ MRB_Qfalse = 4,
29
+ MRB_Qtrue = 12,
30
+ MRB_Qundef = 20,
31
+ };
32
+
33
+ #if defined(MRB_64BIT) && defined(MRB_INT32)
34
+ #define MRB_FIXNUM_SHIFT 0
35
+ #else
36
+ #define MRB_FIXNUM_SHIFT WORDBOX_FIXNUM_SHIFT
37
+ #endif
38
+ #define MRB_SYMBOL_SHIFT WORDBOX_SYMBOL_SHIFT
39
+
40
+ #if defined(MRB_64BIT) && defined(MRB_INT64)
41
+ # define MRB_FIXNUM_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
42
+ # define MRB_FIXNUM_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
43
+ #else
44
+ # define MRB_FIXNUM_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
45
+ # define MRB_FIXNUM_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
46
+ #endif
47
+
48
+ #define WORDBOX_FIXNUM_BIT_POS 1
49
+ #define WORDBOX_FIXNUM_SHIFT WORDBOX_FIXNUM_BIT_POS
50
+ #define WORDBOX_FIXNUM_FLAG (1 << (WORDBOX_FIXNUM_BIT_POS - 1))
51
+ #define WORDBOX_FIXNUM_MASK ((1 << WORDBOX_FIXNUM_BIT_POS) - 1)
52
+
53
+ #if defined(MRB_WORDBOX_NO_FLOAT_TRUNCATE) || defined(MRB_NO_FLOAT)
54
+ /* floats are allocated in heaps */
55
+ #define WORDBOX_IMMEDIATE_MASK 0x03
56
+ #define WORDBOX_SYMBOL_BIT_POS 2
57
+ #define WORDBOX_SYMBOL_SHIFT WORDBOX_SYMBOL_BIT_POS
58
+ #define WORDBOX_SYMBOL_FLAG (1 << (WORDBOX_SYMBOL_BIT_POS - 1))
59
+ #define WORDBOX_SYMBOL_MASK ((1 << WORDBOX_SYMBOL_BIT_POS) - 1)
60
+ #else
61
+ #define WORDBOX_FLOAT_FLAG 2
62
+ #define WORDBOX_FLOAT_MASK 3
63
+ #if defined(MRB_64BIT)
64
+ #define WORDBOX_SYMBOL_SHIFT 32
65
+ #else /* MRB_32BIT */
66
+ #define WORDBOX_SYMBOL_SHIFT 5
67
+ #endif
68
+ #define WORDBOX_SYMBOL_FLAG 0x1c
69
+ #define WORDBOX_SYMBOL_MASK 0x1f
70
+ #endif
71
+
72
+ #ifndef WORDBOX_IMMEDIATE_MASK
73
+ #define WORDBOX_IMMEDIATE_MASK 0x07
74
+ #endif
75
+
76
+ #define WORDBOX_SET_SHIFT_VALUE(o,n,v) \
77
+ ((o).w = (((uintptr_t)(v)) << WORDBOX_##n##_SHIFT) | WORDBOX_##n##_FLAG)
78
+ #define WORDBOX_SHIFT_VALUE_P(o,n) \
79
+ (((o).w & WORDBOX_##n##_MASK) == WORDBOX_##n##_FLAG)
80
+ #define WORDBOX_OBJ_TYPE_P(o,n) \
81
+ (!mrb_immediate_p(o) && mrb_val_union(o).bp->tt == MRB_TT_##n)
82
+
83
+ /*
84
+ * mrb_value representation:
85
+ *
86
+ * 64-bit word with inline float:
87
+ * nil : ...0000 0000 (all bits are 0)
88
+ * false : ...0000 0100 (mrb_fixnum(v) != 0)
89
+ * true : ...0000 1100
90
+ * undef : ...0001 0100
91
+ * symbol: ...0001 1100 (use only upper 32-bit as symbol value with MRB_64BIT)
92
+ * fixnum: ...IIII III1
93
+ * float : ...FFFF FF10 (51 bit significands; require MRB_64BIT)
94
+ * object: ...PPPP P000
95
+ *
96
+ * 32-bit word with inline float:
97
+ * nil : ...0000 0000 (all bits are 0)
98
+ * false : ...0000 0100 (mrb_fixnum(v) != 0)
99
+ * true : ...0000 1100
100
+ * undef : ...0001 0100
101
+ * symbol: ...SSS1 0100 (symbol occupies 20bits)
102
+ * fixnum: ...IIII III1
103
+ * float : ...FFFF FF10 (22 bit significands; require MRB_64BIT)
104
+ * object: ...PPPP P000
105
+ *
106
+ * and word boxing without inline float (MRB_WORDBOX_NO_FLOAT_TRUNCATE):
107
+ * nil : ...0000 0000 (all bits are 0)
108
+ * false : ...0000 0100 (mrb_fixnum(v) != 0)
109
+ * true : ...0000 1100
110
+ * undef : ...0001 0100
111
+ * fixnum: ...IIII III1
112
+ * symbol: ...SSSS SS10
113
+ * object: ...PPPP PP00 (any bits are 1)
114
+ */
115
+ typedef struct mrb_value {
116
+ uintptr_t w;
117
+ } mrb_value;
118
+
119
+ union mrb_value_ {
120
+ void *p;
121
+ struct RBasic *bp;
122
+ #ifndef MRB_NO_FLOAT
123
+ #ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
124
+ mrb_float f;
125
+ #else
126
+ struct RFloat *fp;
127
+ #endif
128
+ #endif
129
+ struct RInteger *ip;
130
+ struct RCptr *vp;
131
+ uintptr_t w;
132
+ mrb_value value;
133
+ };
134
+
135
+ mrb_static_assert(sizeof(mrb_value) == sizeof(union mrb_value_));
136
+
137
+ static inline union mrb_value_
138
+ mrb_val_union(mrb_value v)
139
+ {
140
+ union mrb_value_ x;
141
+ x.value = v;
142
+ return x;
143
+ }
144
+
145
+ MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*);
146
+ #ifndef MRB_NO_FLOAT
147
+ MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
148
+ #endif
149
+ MRB_API mrb_value mrb_boxing_int_value(struct mrb_state*, mrb_int);
150
+
151
+ #if WORDBOX_IMMEDIATE_MASK == 0x3
152
+ #define mrb_immediate_p(o) ((o).w & WORDBOX_IMMEDIATE_MASK || (o).w <= MRB_Qundef)
153
+ #else
154
+ #define mrb_immediate_p(o) ((o).w & WORDBOX_IMMEDIATE_MASK || (o).w == MRB_Qnil)
155
+ #endif
156
+
157
+ #define mrb_ptr(o) mrb_val_union(o).p
158
+ #define mrb_cptr(o) mrb_val_union(o).vp->p
159
+ #ifndef MRB_NO_FLOAT
160
+ #ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
161
+ MRB_API mrb_float mrb_word_boxing_value_float(mrb_value v);
162
+ #define mrb_float(o) mrb_word_boxing_value_float(o)
163
+ #else
164
+ #define mrb_float(o) mrb_val_union(o).fp->f
165
+ #endif
166
+ #endif
167
+ #define mrb_fixnum(o) (mrb_int)(((intptr_t)(o).w) >> WORDBOX_FIXNUM_SHIFT)
168
+ MRB_INLINE mrb_int
169
+ mrb_integer_func(mrb_value o) {
170
+ if (mrb_immediate_p(o)) return mrb_fixnum(o);
171
+ return mrb_val_union(o).ip->i;
172
+ }
173
+ #define mrb_integer(o) mrb_integer_func(o)
174
+ #define mrb_symbol(o) (mrb_sym)(((o).w) >> WORDBOX_SYMBOL_SHIFT)
175
+ #define mrb_bool(o) (((o).w & ~(uintptr_t)MRB_Qfalse) != 0)
176
+
177
+ #define mrb_fixnum_p(o) WORDBOX_SHIFT_VALUE_P(o, FIXNUM)
178
+ #define mrb_integer_p(o) (WORDBOX_SHIFT_VALUE_P(o, FIXNUM)||WORDBOX_OBJ_TYPE_P(o, INTEGER))
179
+ #define mrb_symbol_p(o) WORDBOX_SHIFT_VALUE_P(o, SYMBOL)
180
+ #define mrb_undef_p(o) ((o).w == MRB_Qundef)
181
+ #define mrb_nil_p(o) ((o).w == MRB_Qnil)
182
+ #define mrb_false_p(o) ((o).w == MRB_Qfalse)
183
+ #define mrb_true_p(o) ((o).w == MRB_Qtrue)
184
+ #ifndef MRB_NO_FLOAT
185
+ #ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
186
+ #define mrb_float_p(o) WORDBOX_SHIFT_VALUE_P(o, FLOAT)
187
+ #else
188
+ #define mrb_float_p(o) WORDBOX_OBJ_TYPE_P(o, FLOAT)
189
+ #endif
190
+ #else
191
+ #define mrb_float_p(o) FALSE
192
+ #endif
193
+ #define mrb_array_p(o) WORDBOX_OBJ_TYPE_P(o, ARRAY)
194
+ #define mrb_string_p(o) WORDBOX_OBJ_TYPE_P(o, STRING)
195
+ #define mrb_hash_p(o) WORDBOX_OBJ_TYPE_P(o, HASH)
196
+ #define mrb_cptr_p(o) WORDBOX_OBJ_TYPE_P(o, CPTR)
197
+ #define mrb_exception_p(o) WORDBOX_OBJ_TYPE_P(o, EXCEPTION)
198
+ #define mrb_free_p(o) WORDBOX_OBJ_TYPE_P(o, FREE)
199
+ #define mrb_object_p(o) WORDBOX_OBJ_TYPE_P(o, OBJECT)
200
+ #define mrb_class_p(o) WORDBOX_OBJ_TYPE_P(o, CLASS)
201
+ #define mrb_module_p(o) WORDBOX_OBJ_TYPE_P(o, MODULE)
202
+ #define mrb_iclass_p(o) WORDBOX_OBJ_TYPE_P(o, ICLASS)
203
+ #define mrb_sclass_p(o) WORDBOX_OBJ_TYPE_P(o, SCLASS)
204
+ #define mrb_proc_p(o) WORDBOX_OBJ_TYPE_P(o, PROC)
205
+ #define mrb_range_p(o) WORDBOX_OBJ_TYPE_P(o, RANGE)
206
+ #define mrb_env_p(o) WORDBOX_OBJ_TYPE_P(o, ENV)
207
+ #define mrb_data_p(o) WORDBOX_OBJ_TYPE_P(o, DATA)
208
+ #define mrb_fiber_p(o) WORDBOX_OBJ_TYPE_P(o, FIBER)
209
+ #define mrb_istruct_p(o) WORDBOX_OBJ_TYPE_P(o, ISTRUCT)
210
+ #define mrb_break_p(o) WORDBOX_OBJ_TYPE_P(o, BREAK)
211
+
212
+ #ifndef MRB_NO_FLOAT
213
+ #define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v))
214
+ #endif
215
+ #define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_word_boxing_cptr_value(mrb, v))
216
+ #define SET_UNDEF_VALUE(r) ((r).w = MRB_Qundef)
217
+ #define SET_NIL_VALUE(r) ((r).w = MRB_Qnil)
218
+ #define SET_FALSE_VALUE(r) ((r).w = MRB_Qfalse)
219
+ #define SET_TRUE_VALUE(r) ((r).w = MRB_Qtrue)
220
+ #define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r))
221
+ #define SET_INT_VALUE(mrb,r,n) ((r) = mrb_boxing_int_value(mrb, n))
222
+ #define SET_FIXNUM_VALUE(r,n) WORDBOX_SET_SHIFT_VALUE(r, FIXNUM, n)
223
+ #define SET_SYM_VALUE(r,n) WORDBOX_SET_SHIFT_VALUE(r, SYMBOL, n)
224
+ #define SET_OBJ_VALUE(r,v) ((r).w = (uintptr_t)(v))
225
+
226
+ MRB_INLINE enum mrb_vtype
227
+ mrb_type(mrb_value o)
228
+ {
229
+ return !mrb_bool(o) ? MRB_TT_FALSE :
230
+ mrb_true_p(o) ? MRB_TT_TRUE :
231
+ mrb_fixnum_p(o) ? MRB_TT_INTEGER :
232
+ mrb_symbol_p(o) ? MRB_TT_SYMBOL :
233
+ mrb_undef_p(o) ? MRB_TT_UNDEF :
234
+ mrb_float_p(o) ? MRB_TT_FLOAT :
235
+ mrb_val_union(o).bp->tt;
236
+ }
237
+
238
+ MRB_INLINE enum mrb_vtype
239
+ mrb_unboxed_type(mrb_value o)
240
+ {
241
+ if (mrb_nil_p(o)) {
242
+ return MRB_TT_FALSE;
243
+ } else if ((o.w & WORDBOX_IMMEDIATE_MASK) == 0) {
244
+ return mrb_val_union(o).bp->tt;
245
+ } else {
246
+ return MRB_TT_FALSE;
247
+ }
248
+ }
249
+
250
+
251
+ #endif /* MRUBY_BOXING_WORD_H */
@@ -0,0 +1,104 @@
1
+ /**
2
+ ** @file mruby/class.h - Class class
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifndef MRUBY_CLASS_H
8
+ #define MRUBY_CLASS_H
9
+
10
+ #include "common.h"
11
+
12
+ /**
13
+ * Class class
14
+ */
15
+ MRB_BEGIN_DECL
16
+
17
+ struct RClass {
18
+ MRB_OBJECT_HEADER;
19
+ struct iv_tbl *iv;
20
+ struct mt_tbl *mt;
21
+ struct RClass *super;
22
+ };
23
+
24
+ #define mrb_class_ptr(v) ((struct RClass*)(mrb_ptr(v)))
25
+
26
+ MRB_INLINE struct RClass*
27
+ mrb_class(mrb_state *mrb, mrb_value v)
28
+ {
29
+ if (!mrb_immediate_p(v)) {
30
+ return mrb_obj_ptr(v)->c;
31
+ }
32
+
33
+ switch (mrb_type(v)) {
34
+ case MRB_TT_FALSE:
35
+ if (mrb_fixnum(v))
36
+ return mrb->false_class;
37
+ return mrb->nil_class;
38
+ case MRB_TT_TRUE:
39
+ return mrb->true_class;
40
+ case MRB_TT_SYMBOL:
41
+ return mrb->symbol_class;
42
+ case MRB_TT_INTEGER:
43
+ return mrb->integer_class;
44
+ #ifndef MRB_NO_FLOAT
45
+ case MRB_TT_FLOAT:
46
+ return mrb->float_class;
47
+ #endif
48
+ case MRB_TT_CPTR:
49
+ return mrb->object_class;
50
+ default:
51
+ return NULL;
52
+ }
53
+ }
54
+
55
+ /* flags:
56
+ 20: frozen
57
+ 19: is_prepended
58
+ 18: is_origin
59
+ 17: is_inherited (used by method cache)
60
+ 7-16: unused
61
+ 6: prohibit Class#allocate
62
+ 0-5: instance type
63
+ */
64
+ #define MRB_FL_CLASS_IS_PREPENDED (1 << 19)
65
+ #define MRB_FL_CLASS_IS_ORIGIN (1 << 18)
66
+ #define MRB_CLASS_ORIGIN(c) do {\
67
+ if ((c)->flags & MRB_FL_CLASS_IS_PREPENDED) {\
68
+ (c) = (c)->super;\
69
+ while (!((c)->flags & MRB_FL_CLASS_IS_ORIGIN)) {\
70
+ (c) = (c)->super;\
71
+ }\
72
+ }\
73
+ } while (0)
74
+ #define MRB_FL_CLASS_IS_INHERITED (1 << 17)
75
+ #define MRB_INSTANCE_TT_MASK (0x1F)
76
+ #define MRB_SET_INSTANCE_TT(c, tt) ((c)->flags = (((c)->flags & ~MRB_INSTANCE_TT_MASK) | (char)(tt)))
77
+ #define MRB_INSTANCE_TT(c) (enum mrb_vtype)((c)->flags & MRB_INSTANCE_TT_MASK)
78
+ #define MRB_FL_UNDEF_ALLOCATE (1 << 6)
79
+ #define MRB_UNDEF_ALLOCATOR(c) (mrb_assert((c)->tt == MRB_TT_CLASS), (c)->flags |= MRB_FL_UNDEF_ALLOCATE)
80
+ #define MRB_UNDEF_ALLOCATOR_P(c) ((c)->flags & MRB_FL_UNDEF_ALLOCATE)
81
+ #define MRB_DEFINE_ALLOCATOR(c) ((c)->flags &= ~MRB_FL_UNDEF_ALLOCATE)
82
+
83
+ MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, mrb_method_t);
84
+ MRB_API void mrb_alias_method(mrb_state*, struct RClass *c, mrb_sym a, mrb_sym b);
85
+ MRB_API void mrb_remove_method(mrb_state *mrb, struct RClass *c, mrb_sym sym);
86
+
87
+ MRB_API mrb_method_t mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym);
88
+ MRB_API mrb_method_t mrb_method_search(mrb_state*, struct RClass*, mrb_sym);
89
+
90
+ MRB_API struct RClass* mrb_class_real(struct RClass* cl);
91
+
92
+ #ifndef MRB_NO_METHOD_CACHE
93
+ void mrb_mc_clear_by_class(mrb_state *mrb, struct RClass* c);
94
+ #else
95
+ #define mrb_mc_clear_by_class(mrb,c)
96
+ #endif
97
+
98
+ /* return non zero to break the loop */
99
+ typedef int (mrb_mt_foreach_func)(mrb_state*,mrb_sym,mrb_method_t,void*);
100
+ MRB_API void mrb_mt_foreach(mrb_state*, struct RClass*, mrb_mt_foreach_func*, void*);
101
+
102
+ MRB_END_DECL
103
+
104
+ #endif /* MRUBY_CLASS_H */
@@ -0,0 +1,118 @@
1
+ /**
2
+ ** @file common.h - mruby common platform definition"
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifndef MRUBY_COMMON_H
8
+ #define MRUBY_COMMON_H
9
+
10
+ #ifdef __APPLE__
11
+ #ifndef __TARGETCONDITIONALS__
12
+ #include "TargetConditionals.h"
13
+ #endif
14
+ #endif
15
+
16
+ #ifdef __cplusplus
17
+ #ifdef MRB_USE_CXX_ABI
18
+ #define MRB_BEGIN_DECL
19
+ #define MRB_END_DECL
20
+ #else
21
+ # define MRB_BEGIN_DECL extern "C" {
22
+ # define MRB_END_DECL }
23
+ #endif
24
+ #else
25
+ /** Start declarations in C mode */
26
+ # define MRB_BEGIN_DECL
27
+ /** End declarations in C mode */
28
+ # define MRB_END_DECL
29
+ #endif
30
+
31
+ #include <sys/types.h>
32
+ #if defined _MSC_VER
33
+ #include <BaseTsd.h>
34
+ typedef SSIZE_T ssize_t;
35
+ #endif
36
+
37
+ /**
38
+ * Shared compiler macros
39
+ */
40
+ MRB_BEGIN_DECL
41
+
42
+ /** Declare a function that never returns. */
43
+ #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L
44
+ # define mrb_noreturn _Noreturn
45
+ #elif defined __GNUC__ && !defined __STRICT_ANSI__
46
+ # define mrb_noreturn __attribute__((noreturn))
47
+ #elif defined _MSC_VER
48
+ # define mrb_noreturn __declspec(noreturn)
49
+ #else
50
+ # define mrb_noreturn
51
+ #endif
52
+
53
+ /** Mark a function as deprecated. */
54
+ #if defined __GNUC__ && !defined __STRICT_ANSI__
55
+ # define mrb_deprecated __attribute__((deprecated))
56
+ #elif defined _MSC_VER
57
+ # define mrb_deprecated __declspec(deprecated)
58
+ #else
59
+ # define mrb_deprecated
60
+ #endif
61
+
62
+ /** Declare a type or object as an alignment requirement. */
63
+ #ifndef mrb_alignas
64
+ # if defined(__cplusplus) && __cplusplus >= 201103L
65
+ # // https://en.cppreference.com/w/cpp/language/alignas
66
+ # define mrb_alignas(n) alignas(n)
67
+ # elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
68
+ # // https://en.cppreference.com/w/c/language/_Alignas
69
+ # define mrb_alignas(n) _Alignas(n)
70
+ # elif defined(_MSC_VER) || defined(__INTEL_COMPILER)
71
+ # // https://learn.microsoft.com/en-us/cpp/cpp/align-cpp?view=msvc-170
72
+ # define mrb_alignas(n) __declspec(align(n))
73
+ # elif defined(__GNUC__) || defined(__clang__)
74
+ # // https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute
75
+ # define mrb_alignas(n) __attribute__((aligned(n)))
76
+ # else
77
+ # // `mrb_alignas` defined as dummy. If necessary, send issues to https://github.com/mruby/mruby .
78
+ # define mrb_alignas(n)
79
+ # endif
80
+ #endif
81
+
82
+ /** Declare a function as always inlined. */
83
+ #if defined _MSC_VER && _MSC_VER < 1900
84
+ # ifndef __cplusplus
85
+ # define inline __inline
86
+ # endif
87
+ #endif
88
+ #define MRB_INLINE static inline
89
+
90
+ /** Declare a public mruby API function. */
91
+ #ifndef MRB_API
92
+ #if defined(MRB_BUILD_AS_DLL)
93
+ #if defined(MRB_CORE) || defined(MRB_LIB)
94
+ # define MRB_API __declspec(dllexport)
95
+ #else
96
+ # define MRB_API __declspec(dllimport)
97
+ #endif
98
+ #else
99
+ # define MRB_API extern
100
+ #endif
101
+ #endif
102
+
103
+ /** Declare mingw versions */
104
+ #if defined(__MINGW32__) || defined(__MINGW64__)
105
+ # include <_mingw.h>
106
+ # if defined(__MINGW64_VERSION_MAJOR)
107
+ # define MRB_MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR)
108
+ # elif defined(__MINGW32_MAJOR_VERSION)
109
+ # define MRB_MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 1000 + __MINGW32_MINOR_VERSION)
110
+ # endif
111
+ # if defined(__MINGW32__) && !defined(__MINGW64__)
112
+ # define MRB_MINGW32_LEGACY
113
+ # endif
114
+ #endif
115
+
116
+ MRB_END_DECL
117
+
118
+ #endif /* MRUBY_COMMON_H */