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.
- checksums.yaml +7 -0
- data/README.md +195 -0
- data/exe/portable-mruby +6 -0
- data/lib/portable_mruby/binary_manager.rb +225 -0
- data/lib/portable_mruby/builder.rb +97 -0
- data/lib/portable_mruby/bytecode_compiler.rb +19 -0
- data/lib/portable_mruby/c_generator.rb +94 -0
- data/lib/portable_mruby/cli.rb +136 -0
- data/lib/portable_mruby/version.rb +6 -0
- data/lib/portable_mruby.rb +15 -0
- data/vendor/mruby/bin/mrbc.com +0 -0
- data/vendor/mruby/include/mrbconf.h +230 -0
- data/vendor/mruby/include/mruby/array.h +303 -0
- data/vendor/mruby/include/mruby/boxing_nan.h +169 -0
- data/vendor/mruby/include/mruby/boxing_no.h +59 -0
- data/vendor/mruby/include/mruby/boxing_word.h +251 -0
- data/vendor/mruby/include/mruby/class.h +104 -0
- data/vendor/mruby/include/mruby/common.h +118 -0
- data/vendor/mruby/include/mruby/compile.h +185 -0
- data/vendor/mruby/include/mruby/data.h +76 -0
- data/vendor/mruby/include/mruby/debug.h +75 -0
- data/vendor/mruby/include/mruby/dump.h +159 -0
- data/vendor/mruby/include/mruby/endian.h +44 -0
- data/vendor/mruby/include/mruby/error.h +132 -0
- data/vendor/mruby/include/mruby/gc.h +72 -0
- data/vendor/mruby/include/mruby/gems/mruby-dir/include/dir_hal.h +79 -0
- data/vendor/mruby/include/mruby/gems/mruby-io/include/io_hal.h +451 -0
- data/vendor/mruby/include/mruby/gems/mruby-io/include/mruby/ext/io.h +76 -0
- data/vendor/mruby/include/mruby/gems/mruby-socket/include/socket_hal.h +83 -0
- data/vendor/mruby/include/mruby/gems/mruby-time/include/mruby/time.h +27 -0
- data/vendor/mruby/include/mruby/hash.h +234 -0
- data/vendor/mruby/include/mruby/internal.h +274 -0
- data/vendor/mruby/include/mruby/irep.h +142 -0
- data/vendor/mruby/include/mruby/istruct.h +50 -0
- data/vendor/mruby/include/mruby/khash.h +455 -0
- data/vendor/mruby/include/mruby/mempool.h +19 -0
- data/vendor/mruby/include/mruby/numeric.h +174 -0
- data/vendor/mruby/include/mruby/object.h +45 -0
- data/vendor/mruby/include/mruby/opcode.h +69 -0
- data/vendor/mruby/include/mruby/ops.h +120 -0
- data/vendor/mruby/include/mruby/presym/disable.h +72 -0
- data/vendor/mruby/include/mruby/presym/enable.h +39 -0
- data/vendor/mruby/include/mruby/presym/id.h +1423 -0
- data/vendor/mruby/include/mruby/presym/scanning.h +81 -0
- data/vendor/mruby/include/mruby/presym/table.h +2847 -0
- data/vendor/mruby/include/mruby/presym.h +41 -0
- data/vendor/mruby/include/mruby/proc.h +186 -0
- data/vendor/mruby/include/mruby/range.h +77 -0
- data/vendor/mruby/include/mruby/re.h +16 -0
- data/vendor/mruby/include/mruby/string.h +428 -0
- data/vendor/mruby/include/mruby/throw.h +57 -0
- data/vendor/mruby/include/mruby/value.h +471 -0
- data/vendor/mruby/include/mruby/variable.h +108 -0
- data/vendor/mruby/include/mruby/version.h +143 -0
- data/vendor/mruby/include/mruby.h +1614 -0
- data/vendor/mruby/lib/libmruby.a +0 -0
- 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 */
|