webruby 0.2.4 → 0.2.5
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 +4 -4
- data/lib/webruby/environment.rb +4 -0
- data/lib/webruby/rake/files.rake +2 -1
- data/lib/webruby/rake/mruby.rake +4 -2
- data/modules/emscripten/AUTHORS +1 -0
- data/modules/emscripten/cmake/Platform/Emscripten.cmake +2 -0
- data/modules/emscripten/emcc +96 -40
- data/modules/emscripten/emrun +301 -136
- data/modules/emscripten/emscripten.py +5 -45
- data/modules/emscripten/src/analyzer.js +11 -1
- data/modules/emscripten/src/compiler.js +1 -1
- data/modules/emscripten/src/emrun_postjs.js +2 -2
- data/modules/emscripten/src/emrun_prejs.js +5 -0
- data/modules/emscripten/src/emscripten-source-map.min.js +31 -0
- data/modules/emscripten/src/library.js +187 -0
- data/modules/emscripten/src/library_egl.js +20 -0
- data/modules/emscripten/src/library_sdl.js +1 -0
- data/modules/emscripten/src/preamble.js +4 -0
- data/modules/emscripten/src/relooper/Relooper.cpp +33 -15
- data/modules/emscripten/src/relooper/Relooper.h +20 -14
- data/modules/emscripten/src/relooper/fuzzer.py +6 -0
- data/modules/emscripten/src/relooper/test.cpp +28 -0
- data/modules/emscripten/src/relooper/test.txt +211 -166
- data/modules/emscripten/src/relooper/test2.txt +20 -20
- data/modules/emscripten/src/relooper/test3.txt +41 -41
- data/modules/emscripten/src/relooper/test4.txt +26 -26
- data/modules/emscripten/src/relooper/test5.txt +52 -52
- data/modules/emscripten/src/relooper/test6.txt +19 -19
- data/modules/emscripten/src/relooper/test_dead.txt +1 -1
- data/modules/emscripten/src/relooper/test_debug.txt +31 -31
- data/modules/emscripten/src/relooper/test_fuzz1.txt +50 -50
- data/modules/emscripten/src/relooper/test_fuzz2.txt +21 -21
- data/modules/emscripten/src/relooper/test_fuzz3.txt +18 -18
- data/modules/emscripten/src/relooper/test_fuzz4.txt +28 -28
- data/modules/emscripten/src/relooper/test_fuzz5.txt +61 -61
- data/modules/emscripten/src/relooper/test_fuzz6.txt +179 -179
- data/modules/emscripten/src/relooper/test_inf.txt +846 -846
- data/modules/emscripten/src/relooper/testit.sh +15 -15
- data/modules/emscripten/system/include/emscripten/emscripten.h +64 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +8 -2
- data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
- data/modules/emscripten/tools/eliminator/eliminator-test-output.js +11 -0
- data/modules/emscripten/tools/eliminator/eliminator-test.js +16 -1
- data/modules/emscripten/tools/file_packager.py +59 -49
- data/modules/emscripten/tools/js-optimizer.js +47 -8
- data/modules/emscripten/tools/shared.py +3 -3
- data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +5 -3
- data/modules/emscripten/tools/test-js-optimizer-asm-pre.js +4 -0
- data/modules/mruby/INSTALL +11 -6
- data/modules/mruby/include/mrbconf.h +0 -3
- data/modules/mruby/include/mruby/khash.h +34 -36
- data/modules/mruby/include/mruby/string.h +3 -0
- data/modules/mruby/include/mruby.h +3 -3
- data/modules/mruby/mrblib/string.rb +3 -0
- data/modules/mruby/src/class.c +12 -12
- data/modules/mruby/src/codegen.c +18 -11
- data/modules/mruby/src/hash.c +12 -12
- data/modules/mruby/src/kernel.c +3 -3
- data/modules/mruby/src/load.c +29 -14
- data/modules/mruby/src/numeric.c +1 -1
- data/modules/mruby/src/object.c +14 -2
- data/modules/mruby/src/state.c +13 -10
- data/modules/mruby/src/string.c +1 -3
- data/modules/mruby/src/symbol.c +44 -18
- data/modules/mruby/src/variable.c +6 -6
- data/modules/mruby/test/t/class.rb +34 -0
- data/modules/mruby/test/t/module.rb +1 -1
- data/modules/mruby/test/t/syntax.rb +28 -0
- metadata +5 -13
- data/modules/emscripten/src/relooper.js +0 -11516
- data/modules/emscripten/src/relooper.js.raw.js +0 -11511
- data/modules/emscripten/tools/__init__.pyc +0 -0
- data/modules/emscripten/tools/cache.pyc +0 -0
- data/modules/emscripten/tools/gen_struct_info.pyc +0 -0
- data/modules/emscripten/tools/js_optimizer.pyc +0 -0
- data/modules/emscripten/tools/jsrun.pyc +0 -0
- data/modules/emscripten/tools/response_file.pyc +0 -0
- data/modules/emscripten/tools/shared.pyc +0 -0
- data/modules/emscripten/tools/tempfiles.pyc +0 -0
@@ -63,17 +63,16 @@ static const uint8_t __m_either[8] = {0x03, 0x0c, 0x30, 0xc0};
|
|
63
63
|
khval_t *vals; \
|
64
64
|
khint_t mask; \
|
65
65
|
khint_t inc; \
|
66
|
-
mrb_state *mrb; \
|
67
66
|
} kh_##name##_t; \
|
68
|
-
void kh_alloc_##name(kh_##name##_t *h);
|
67
|
+
void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h); \
|
69
68
|
kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size); \
|
70
69
|
kh_##name##_t *kh_init_##name(mrb_state *mrb); \
|
71
|
-
void kh_destroy_##name(kh_##name##_t *h);
|
72
|
-
void kh_clear_##name(kh_##name##_t *h);
|
73
|
-
khint_t kh_get_##name(kh_##name##_t *h, khkey_t key);
|
74
|
-
khint_t kh_put_##name(kh_##name##_t *h, khkey_t key);
|
75
|
-
void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets);
|
76
|
-
void kh_del_##name(kh_##name##_t *h, khint_t x);
|
70
|
+
void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h); \
|
71
|
+
void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h); \
|
72
|
+
khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \
|
73
|
+
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \
|
74
|
+
void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets); \
|
75
|
+
void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x); \
|
77
76
|
kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h);
|
78
77
|
|
79
78
|
static inline void
|
@@ -94,11 +93,11 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
94
93
|
__hash_equal: hash comparation function
|
95
94
|
*/
|
96
95
|
#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
|
97
|
-
void kh_alloc_##name(kh_##name##_t *h)
|
96
|
+
void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h) \
|
98
97
|
{ \
|
99
98
|
khint_t sz = h->n_buckets; \
|
100
99
|
int len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0); \
|
101
|
-
uint8_t *p = mrb_malloc(
|
100
|
+
uint8_t *p = mrb_malloc(mrb, sizeof(uint8_t)*sz/4+len*sz); \
|
102
101
|
h->size = h->n_occupied = 0; \
|
103
102
|
h->upper_bound = UPPER_BOUND(sz); \
|
104
103
|
h->keys = (khkey_t *)p; \
|
@@ -114,39 +113,38 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
114
113
|
size = KHASH_MIN_SIZE; \
|
115
114
|
khash_power2(size); \
|
116
115
|
h->n_buckets = size; \
|
117
|
-
|
118
|
-
kh_alloc_##name(h); \
|
116
|
+
kh_alloc_##name(mrb, h); \
|
119
117
|
return h; \
|
120
118
|
} \
|
121
119
|
kh_##name##_t *kh_init_##name(mrb_state *mrb){ \
|
122
120
|
return kh_init_##name##_size(mrb, KHASH_DEFAULT_SIZE); \
|
123
121
|
} \
|
124
|
-
void kh_destroy_##name(kh_##name##_t *h)
|
122
|
+
void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h) \
|
125
123
|
{ \
|
126
124
|
if (h) { \
|
127
|
-
mrb_free(
|
128
|
-
mrb_free(
|
125
|
+
mrb_free(mrb, h->keys); \
|
126
|
+
mrb_free(mrb, h); \
|
129
127
|
} \
|
130
128
|
} \
|
131
|
-
void kh_clear_##name(kh_##name##_t *h)
|
129
|
+
void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h) \
|
132
130
|
{ \
|
133
131
|
if (h && h->ed_flags) { \
|
134
132
|
kh_fill_flags(h->ed_flags, 0xaa, h->n_buckets/4); \
|
135
133
|
h->size = h->n_occupied = 0; \
|
136
134
|
} \
|
137
135
|
} \
|
138
|
-
khint_t kh_get_##name(kh_##name##_t *h, khkey_t key)
|
136
|
+
khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key) \
|
139
137
|
{ \
|
140
|
-
khint_t k = __hash_func(
|
138
|
+
khint_t k = __hash_func(mrb,key) & (h->mask); \
|
141
139
|
while (!__ac_isempty(h->ed_flags, k)) { \
|
142
140
|
if (!__ac_isdel(h->ed_flags, k)) { \
|
143
|
-
if (__hash_equal(
|
141
|
+
if (__hash_equal(mrb,h->keys[k], key)) return k; \
|
144
142
|
} \
|
145
143
|
k = (k+h->inc) & (h->mask); \
|
146
144
|
} \
|
147
145
|
return h->n_buckets; \
|
148
146
|
} \
|
149
|
-
void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets)
|
147
|
+
void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets) \
|
150
148
|
{ \
|
151
149
|
if (new_n_buckets < KHASH_MIN_SIZE) \
|
152
150
|
new_n_buckets = KHASH_MIN_SIZE; \
|
@@ -158,26 +156,26 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
158
156
|
khint_t old_n_buckets = h->n_buckets; \
|
159
157
|
khint_t i; \
|
160
158
|
h->n_buckets = new_n_buckets; \
|
161
|
-
kh_alloc_##name(h);
|
159
|
+
kh_alloc_##name(mrb, h); \
|
162
160
|
/* relocate */ \
|
163
161
|
for (i=0 ; i<old_n_buckets ; i++) { \
|
164
162
|
if (!__ac_iseither(old_ed_flags, i)) { \
|
165
|
-
khint_t k = kh_put_##name(h, old_keys[i]);
|
166
|
-
if (kh_is_map) kh_value(h,k) = old_vals[i];
|
163
|
+
khint_t k = kh_put_##name(mrb, h, old_keys[i]); \
|
164
|
+
if (kh_is_map) kh_value(h,k) = old_vals[i]; \
|
167
165
|
} \
|
168
166
|
} \
|
169
|
-
mrb_free(
|
167
|
+
mrb_free(mrb, old_keys); \
|
170
168
|
} \
|
171
169
|
} \
|
172
|
-
khint_t kh_put_##name(kh_##name##_t *h, khkey_t key)
|
170
|
+
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key) \
|
173
171
|
{ \
|
174
172
|
khint_t k; \
|
175
173
|
if (h->n_occupied >= h->upper_bound) { \
|
176
|
-
kh_resize_##name(h, h->n_buckets*2);
|
174
|
+
kh_resize_##name(mrb, h, h->n_buckets*2); \
|
177
175
|
} \
|
178
|
-
k = __hash_func(
|
176
|
+
k = __hash_func(mrb,key) & (h->mask); \
|
179
177
|
while (!__ac_iseither(h->ed_flags, k)) { \
|
180
|
-
if (__hash_equal(
|
178
|
+
if (__hash_equal(mrb,h->keys[k], key)) break; \
|
181
179
|
k = (k+h->inc) & (h->mask); \
|
182
180
|
} \
|
183
181
|
if (__ac_isempty(h->ed_flags, k)) { \
|
@@ -194,7 +192,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
194
192
|
} \
|
195
193
|
return k; \
|
196
194
|
} \
|
197
|
-
void kh_del_##name(kh_##name##_t *h, khint_t x)
|
195
|
+
void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x) \
|
198
196
|
{ \
|
199
197
|
h->ed_flags[x/4] |= __m_del[x%4]; \
|
200
198
|
h->size--; \
|
@@ -207,7 +205,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
207
205
|
h2 = kh_init_##name(mrb); \
|
208
206
|
for (k = kh_begin(h); k != kh_end(h); k++) { \
|
209
207
|
if (kh_exist(h, k)) { \
|
210
|
-
k2 = kh_put_##name(h2, kh_key(h, k));
|
208
|
+
k2 = kh_put_##name(mrb, h2, kh_key(h, k)); \
|
211
209
|
if(kh_is_map) kh_value(h2, k2) = kh_value(h, k); \
|
212
210
|
} \
|
213
211
|
} \
|
@@ -219,12 +217,12 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
219
217
|
|
220
218
|
#define kh_init_size(name,mrb,size) kh_init_##name##_size(mrb,size)
|
221
219
|
#define kh_init(name,mrb) kh_init_##name(mrb)
|
222
|
-
#define kh_destroy(name, h) kh_destroy_##name(h)
|
223
|
-
#define kh_clear(name, h) kh_clear_##name(h)
|
224
|
-
#define kh_resize(name, h, s) kh_resize_##name(h, s)
|
225
|
-
#define kh_put(name, h, k) kh_put_##name(h, k)
|
226
|
-
#define kh_get(name, h, k) kh_get_##name(h, k)
|
227
|
-
#define kh_del(name, h, k) kh_del_##name(h, k)
|
220
|
+
#define kh_destroy(name, mrb, h) kh_destroy_##name(mrb, h)
|
221
|
+
#define kh_clear(name, mrb, h) kh_clear_##name(mrb, h)
|
222
|
+
#define kh_resize(name, mrb, h, s) kh_resize_##name(mrb, h, s)
|
223
|
+
#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k)
|
224
|
+
#define kh_get(name, mrb, h, k) kh_get_##name(mrb, h, k)
|
225
|
+
#define kh_del(name, mrb, h, k) kh_del_##name(mrb, h, k)
|
228
226
|
#define kh_copy(name, mrb, h) kh_copy_##name(mrb, h)
|
229
227
|
|
230
228
|
#define kh_exist(h, x) (!__ac_iseither((h)->ed_flags, (x)))
|
@@ -32,6 +32,9 @@ struct RString {
|
|
32
32
|
#define RSTRING_CAPA(s) (RSTRING(s)->aux.capa)
|
33
33
|
#define RSTRING_END(s) (RSTRING(s)->ptr + RSTRING(s)->len)
|
34
34
|
|
35
|
+
#define MRB_STR_SHARED 1
|
36
|
+
#define MRB_STR_NOFREE 2
|
37
|
+
|
35
38
|
void mrb_gc_free_str(mrb_state*, struct RString*);
|
36
39
|
void mrb_str_modify(mrb_state*, struct RString*);
|
37
40
|
mrb_value mrb_str_literal(mrb_state*, mrb_value);
|
@@ -188,7 +188,7 @@ struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const
|
|
188
188
|
|
189
189
|
mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
|
190
190
|
mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);
|
191
|
-
mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid);
|
191
|
+
mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid);
|
192
192
|
struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super);
|
193
193
|
struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
194
194
|
|
@@ -230,6 +230,8 @@ mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, int, mrb_value*);
|
|
230
230
|
mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, int, mrb_value*, mrb_value);
|
231
231
|
mrb_sym mrb_intern_cstr(mrb_state*,const char*);
|
232
232
|
mrb_sym mrb_intern(mrb_state*,const char*,size_t);
|
233
|
+
mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
|
234
|
+
#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, (lit), sizeof(lit) - 1)
|
233
235
|
mrb_sym mrb_intern_str(mrb_state*,mrb_value);
|
234
236
|
mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
|
235
237
|
mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
|
@@ -239,8 +241,6 @@ const char *mrb_sym2name_len(mrb_state*,mrb_sym,size_t*);
|
|
239
241
|
mrb_value mrb_sym2str(mrb_state*,mrb_sym);
|
240
242
|
mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value);
|
241
243
|
|
242
|
-
#define mrb_intern_lit(mrb, lit) mrb_intern(mrb, (lit), sizeof(lit) - 1)
|
243
|
-
|
244
244
|
void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
|
245
245
|
void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
|
246
246
|
void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */
|
data/modules/mruby/src/class.c
CHANGED
@@ -46,7 +46,7 @@ mrb_gc_mark_mt_size(mrb_state *mrb, struct RClass *c)
|
|
46
46
|
void
|
47
47
|
mrb_gc_free_mt(mrb_state *mrb, struct RClass *c)
|
48
48
|
{
|
49
|
-
kh_destroy(mt, c->mt);
|
49
|
+
kh_destroy(mt, mrb, c->mt);
|
50
50
|
}
|
51
51
|
|
52
52
|
void
|
@@ -297,7 +297,7 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RPro
|
|
297
297
|
khiter_t k;
|
298
298
|
|
299
299
|
if (!h) h = c->mt = kh_init(mt, mrb);
|
300
|
-
k = kh_put(mt, h, mid);
|
300
|
+
k = kh_put(mt, mrb, h, mid);
|
301
301
|
kh_value(h, k) = p;
|
302
302
|
if (p) {
|
303
303
|
mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
|
@@ -330,7 +330,7 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b
|
|
330
330
|
struct RProc *p;
|
331
331
|
|
332
332
|
if (!h) h = c->mt = kh_init(mt, mrb);
|
333
|
-
k = kh_put(mt, h, name);
|
333
|
+
k = kh_put(mt, mrb, h, name);
|
334
334
|
p = mrb_proc_ptr(body);
|
335
335
|
kh_value(h, k) = p;
|
336
336
|
if (p) {
|
@@ -995,7 +995,7 @@ mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
|
|
995
995
|
khash_t(mt) *h = c->mt;
|
996
996
|
|
997
997
|
if (h) {
|
998
|
-
k = kh_get(mt, h, mid);
|
998
|
+
k = kh_get(mt, mrb, h, mid);
|
999
999
|
if (k != kh_end(h)) {
|
1000
1000
|
m = kh_value(h, k);
|
1001
1001
|
if (!m) break;
|
@@ -1180,7 +1180,7 @@ mrb_bob_missing(mrb_state *mrb, mrb_value mod)
|
|
1180
1180
|
}
|
1181
1181
|
|
1182
1182
|
mrb_bool
|
1183
|
-
mrb_obj_respond_to(struct RClass* c, mrb_sym mid)
|
1183
|
+
mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid)
|
1184
1184
|
{
|
1185
1185
|
khiter_t k;
|
1186
1186
|
|
@@ -1188,7 +1188,7 @@ mrb_obj_respond_to(struct RClass* c, mrb_sym mid)
|
|
1188
1188
|
khash_t(mt) *h = c->mt;
|
1189
1189
|
|
1190
1190
|
if (h) {
|
1191
|
-
k = kh_get(mt, h, mid);
|
1191
|
+
k = kh_get(mt, mrb, h, mid);
|
1192
1192
|
if (k != kh_end(h)) {
|
1193
1193
|
if (kh_value(h, k)) {
|
1194
1194
|
return TRUE; /* method exists */
|
@@ -1206,7 +1206,7 @@ mrb_obj_respond_to(struct RClass* c, mrb_sym mid)
|
|
1206
1206
|
mrb_bool
|
1207
1207
|
mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid)
|
1208
1208
|
{
|
1209
|
-
return mrb_obj_respond_to(mrb_class(mrb, obj), mid);
|
1209
|
+
return mrb_obj_respond_to(mrb, mrb_class(mrb, obj), mid);
|
1210
1210
|
}
|
1211
1211
|
|
1212
1212
|
mrb_value
|
@@ -1442,7 +1442,7 @@ undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
|
|
1442
1442
|
{
|
1443
1443
|
mrb_value m;
|
1444
1444
|
|
1445
|
-
if (!mrb_obj_respond_to(c, a)) {
|
1445
|
+
if (!mrb_obj_respond_to(mrb, c, a)) {
|
1446
1446
|
mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
|
1447
1447
|
}
|
1448
1448
|
else {
|
@@ -1713,7 +1713,7 @@ mrb_mod_method_defined(mrb_state *mrb, mrb_value mod)
|
|
1713
1713
|
|
1714
1714
|
id = get_sym_or_str_arg(mrb);
|
1715
1715
|
if (mrb_symbol_p(id)) {
|
1716
|
-
method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(id));
|
1716
|
+
method_defined_p = mrb_obj_respond_to(mrb, mrb_class_ptr(mod), mrb_symbol(id));
|
1717
1717
|
}
|
1718
1718
|
else {
|
1719
1719
|
mrb_value sym = mrb_check_intern_str(mrb, id);
|
@@ -1721,7 +1721,7 @@ mrb_mod_method_defined(mrb_state *mrb, mrb_value mod)
|
|
1721
1721
|
method_defined_p = FALSE;
|
1722
1722
|
}
|
1723
1723
|
else {
|
1724
|
-
method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(sym));
|
1724
|
+
method_defined_p = mrb_obj_respond_to(mrb, mrb_class_ptr(mod), mrb_symbol(sym));
|
1725
1725
|
}
|
1726
1726
|
}
|
1727
1727
|
return mrb_bool_value(method_defined_p);
|
@@ -1735,9 +1735,9 @@ remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid)
|
|
1735
1735
|
khiter_t k;
|
1736
1736
|
|
1737
1737
|
if (h) {
|
1738
|
-
k = kh_get(mt, h, mid);
|
1738
|
+
k = kh_get(mt, mrb, h, mid);
|
1739
1739
|
if (k != kh_end(h)) {
|
1740
|
-
kh_del(mt, h, k);
|
1740
|
+
kh_del(mt, mrb, h, k);
|
1741
1741
|
return;
|
1742
1742
|
}
|
1743
1743
|
}
|
data/modules/mruby/src/codegen.c
CHANGED
@@ -657,23 +657,24 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
657
657
|
}
|
658
658
|
|
659
659
|
static int
|
660
|
-
scope_body(codegen_scope *s, node *tree)
|
660
|
+
scope_body(codegen_scope *s, node *tree, int val)
|
661
661
|
{
|
662
662
|
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
|
663
663
|
|
664
|
-
codegen(scope, tree->cdr,
|
664
|
+
codegen(scope, tree->cdr, val);
|
665
665
|
if (!s->iseq) {
|
666
666
|
genop(scope, MKOP_A(OP_STOP, 0));
|
667
667
|
}
|
668
|
+
else if (!val) {
|
669
|
+
genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
670
|
+
}
|
668
671
|
else {
|
669
672
|
if (scope->nregs == 0) {
|
670
673
|
genop(scope, MKOP_A(OP_LOADNIL, 0));
|
671
674
|
genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
672
675
|
}
|
673
676
|
else {
|
674
|
-
|
675
|
-
genop_peep(scope, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
|
676
|
-
push();
|
677
|
+
genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp-1, OP_R_NORMAL), NOVAL);
|
677
678
|
}
|
678
679
|
}
|
679
680
|
scope_finish(scope);
|
@@ -1235,7 +1236,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1235
1236
|
genop(s, MKOP_Bx(OP_EPUSH, 0));
|
1236
1237
|
s->ensure_level++;
|
1237
1238
|
codegen(s, tree->car, val);
|
1238
|
-
idx = scope_body(s, tree->cdr);
|
1239
|
+
idx = scope_body(s, tree->cdr, NOVAL);
|
1239
1240
|
s->iseq[epush] = MKOP_Bx(OP_EPUSH, idx);
|
1240
1241
|
s->ensure_level--;
|
1241
1242
|
genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL);
|
@@ -1409,15 +1410,21 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1409
1410
|
tree = tree->cdr;
|
1410
1411
|
}
|
1411
1412
|
if (val) {
|
1413
|
+
int pos = cursp();
|
1412
1414
|
genop(s, MKOP_A(OP_LOADNIL, cursp()));
|
1415
|
+
if (pos3) dispatch_linked(s, pos3);
|
1416
|
+
pop();
|
1417
|
+
genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
|
1413
1418
|
push();
|
1414
1419
|
}
|
1415
|
-
if (pos3)
|
1420
|
+
else if (pos3) {
|
1421
|
+
dispatch_linked(s, pos3);
|
1422
|
+
}
|
1416
1423
|
}
|
1417
1424
|
break;
|
1418
1425
|
|
1419
1426
|
case NODE_SCOPE:
|
1420
|
-
scope_body(s, tree);
|
1427
|
+
scope_body(s, tree, NOVAL);
|
1421
1428
|
break;
|
1422
1429
|
|
1423
1430
|
case NODE_FCALL:
|
@@ -2277,7 +2284,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2277
2284
|
pop(); pop();
|
2278
2285
|
idx = new_msym(s, sym(tree->car->cdr));
|
2279
2286
|
genop(s, MKOP_AB(OP_CLASS, cursp(), idx));
|
2280
|
-
idx = scope_body(s, tree->cdr->cdr->car);
|
2287
|
+
idx = scope_body(s, tree->cdr->cdr->car, val);
|
2281
2288
|
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
|
2282
2289
|
if (val) {
|
2283
2290
|
push();
|
@@ -2303,7 +2310,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2303
2310
|
pop();
|
2304
2311
|
idx = new_msym(s, sym(tree->car->cdr));
|
2305
2312
|
genop(s, MKOP_AB(OP_MODULE, cursp(), idx));
|
2306
|
-
idx = scope_body(s, tree->cdr->car);
|
2313
|
+
idx = scope_body(s, tree->cdr->car, val);
|
2307
2314
|
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
|
2308
2315
|
if (val) {
|
2309
2316
|
push();
|
@@ -2318,7 +2325,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2318
2325
|
codegen(s, tree->car, VAL);
|
2319
2326
|
pop();
|
2320
2327
|
genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
|
2321
|
-
idx = scope_body(s, tree->cdr->car);
|
2328
|
+
idx = scope_body(s, tree->cdr->car, val);
|
2322
2329
|
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
|
2323
2330
|
if (val) {
|
2324
2331
|
push();
|
data/modules/mruby/src/hash.c
CHANGED
@@ -73,7 +73,7 @@ mrb_gc_mark_hash_size(mrb_state *mrb, struct RHash *hash)
|
|
73
73
|
void
|
74
74
|
mrb_gc_free_hash(mrb_state *mrb, struct RHash *hash)
|
75
75
|
{
|
76
|
-
if (hash->ht) kh_destroy(ht, hash->ht);
|
76
|
+
if (hash->ht) kh_destroy(ht, mrb, hash->ht);
|
77
77
|
}
|
78
78
|
|
79
79
|
|
@@ -85,7 +85,7 @@ mrb_hash_new_capa(mrb_state *mrb, int capa)
|
|
85
85
|
h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
|
86
86
|
h->ht = kh_init(ht, mrb);
|
87
87
|
if (capa > 0) {
|
88
|
-
kh_resize(ht, h->ht, capa);
|
88
|
+
kh_resize(ht, mrb, h->ht, capa);
|
89
89
|
}
|
90
90
|
h->iv = 0;
|
91
91
|
return mrb_obj_value(h);
|
@@ -104,7 +104,7 @@ mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)
|
|
104
104
|
khiter_t k;
|
105
105
|
|
106
106
|
if (h) {
|
107
|
-
k = kh_get(ht, h, key);
|
107
|
+
k = kh_get(ht, mrb, h, key);
|
108
108
|
if (k != kh_end(h))
|
109
109
|
return kh_value(h, k);
|
110
110
|
}
|
@@ -123,7 +123,7 @@ mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def)
|
|
123
123
|
khiter_t k;
|
124
124
|
|
125
125
|
if (h) {
|
126
|
-
k = kh_get(ht, h, key);
|
126
|
+
k = kh_get(ht, mrb, h, key);
|
127
127
|
if (k != kh_end(h))
|
128
128
|
return kh_value(h, k);
|
129
129
|
}
|
@@ -142,11 +142,11 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mr
|
|
142
142
|
h = RHASH_TBL(hash);
|
143
143
|
|
144
144
|
if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb);
|
145
|
-
k = kh_get(ht, h, key);
|
145
|
+
k = kh_get(ht, mrb, h, key);
|
146
146
|
if (k == kh_end(h)) {
|
147
147
|
/* expand */
|
148
148
|
int ai = mrb_gc_arena_save(mrb);
|
149
|
-
k = kh_put(ht, h, KEY(key));
|
149
|
+
k = kh_put(ht, mrb, h, KEY(key));
|
150
150
|
mrb_gc_arena_restore(mrb, ai);
|
151
151
|
}
|
152
152
|
|
@@ -172,7 +172,7 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash)
|
|
172
172
|
for (k = kh_begin(h); k != kh_end(h); k++) {
|
173
173
|
if (kh_exist(h,k)) {
|
174
174
|
int ai = mrb_gc_arena_save(mrb);
|
175
|
-
ret_k = kh_put(ht, ret_h, KEY(kh_key(h,k)));
|
175
|
+
ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h,k)));
|
176
176
|
mrb_gc_arena_restore(mrb, ai);
|
177
177
|
kh_val(ret_h, ret_k) = kh_val(h,k);
|
178
178
|
}
|
@@ -490,10 +490,10 @@ mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key)
|
|
490
490
|
mrb_value delVal;
|
491
491
|
|
492
492
|
if (h) {
|
493
|
-
k = kh_get(ht, h, key);
|
493
|
+
k = kh_get(ht, mrb, h, key);
|
494
494
|
if (k != kh_end(h)) {
|
495
495
|
delVal = kh_value(h, k);
|
496
|
-
kh_del(ht, h, k);
|
496
|
+
kh_del(ht, mrb, h, k);
|
497
497
|
return delVal;
|
498
498
|
}
|
499
499
|
}
|
@@ -660,7 +660,7 @@ mrb_hash_clear(mrb_state *mrb, mrb_value hash)
|
|
660
660
|
{
|
661
661
|
khash_t(ht) *h = RHASH_TBL(hash);
|
662
662
|
|
663
|
-
if (h) kh_clear(ht, h);
|
663
|
+
if (h) kh_clear(ht, mrb, h);
|
664
664
|
return hash;
|
665
665
|
}
|
666
666
|
|
@@ -920,7 +920,7 @@ mrb_hash_has_keyWithKey(mrb_state *mrb, mrb_value hash, mrb_value key)
|
|
920
920
|
khiter_t k;
|
921
921
|
|
922
922
|
if (h) {
|
923
|
-
k = kh_get(ht, h, key);
|
923
|
+
k = kh_get(ht, mrb, h, key);
|
924
924
|
return mrb_bool_value(k != kh_end(h));
|
925
925
|
}
|
926
926
|
return mrb_false_value();
|
@@ -1026,7 +1026,7 @@ hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql)
|
|
1026
1026
|
for (k1 = kh_begin(h1); k1 != kh_end(h1); k1++) {
|
1027
1027
|
if (!kh_exist(h1, k1)) continue;
|
1028
1028
|
key = kh_key(h1,k1);
|
1029
|
-
k2 = kh_get(ht, h2, key);
|
1029
|
+
k2 = kh_get(ht, mrb, h2, key);
|
1030
1030
|
if (k2 != kh_end(h2)) {
|
1031
1031
|
if (mrb_equal(mrb, kh_value(h1,k1), kh_value(h2,k2))) {
|
1032
1032
|
continue; /* next key */
|
data/modules/mruby/src/kernel.c
CHANGED
@@ -733,7 +733,7 @@ method_entry_loop(mrb_state *mrb, struct RClass* klass, khash_t(st)* set)
|
|
733
733
|
if (!h) return;
|
734
734
|
for (i=0;i<kh_end(h);i++) {
|
735
735
|
if (kh_exist(h, i)) {
|
736
|
-
kh_put(st, set, kh_key(h,i));
|
736
|
+
kh_put(st, mrb, set, kh_key(h,i));
|
737
737
|
}
|
738
738
|
}
|
739
739
|
}
|
@@ -765,7 +765,7 @@ class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass,
|
|
765
765
|
mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set,i)));
|
766
766
|
}
|
767
767
|
}
|
768
|
-
kh_destroy(st, set);
|
768
|
+
kh_destroy(st, mrb, set);
|
769
769
|
|
770
770
|
return ary;
|
771
771
|
}
|
@@ -797,7 +797,7 @@ mrb_obj_singleton_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj)
|
|
797
797
|
mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set,i)));
|
798
798
|
}
|
799
799
|
}
|
800
|
-
kh_destroy(st, set);
|
800
|
+
kh_destroy(st, mrb, set);
|
801
801
|
|
802
802
|
return ary;
|
803
803
|
}
|
data/modules/mruby/src/load.c
CHANGED
@@ -38,7 +38,7 @@ offset_crc_body(void)
|
|
38
38
|
}
|
39
39
|
|
40
40
|
static mrb_irep*
|
41
|
-
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
41
|
+
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len, mrb_bool alloc)
|
42
42
|
{
|
43
43
|
size_t i;
|
44
44
|
const uint8_t *src = bin;
|
@@ -98,7 +98,12 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
98
98
|
tt = *src++; //pool TT
|
99
99
|
pool_data_len = bin_to_uint16(src); //pool data length
|
100
100
|
src += sizeof(uint16_t);
|
101
|
-
|
101
|
+
if (alloc) {
|
102
|
+
s = mrb_str_new(mrb, (char *)src, pool_data_len);
|
103
|
+
}
|
104
|
+
else {
|
105
|
+
s = mrb_str_new_static(mrb, (char *)src, pool_data_len);
|
106
|
+
}
|
102
107
|
src += pool_data_len;
|
103
108
|
switch (tt) { //pool data
|
104
109
|
case IREP_TT_FIXNUM:
|
@@ -144,7 +149,12 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
144
149
|
continue;
|
145
150
|
}
|
146
151
|
|
147
|
-
|
152
|
+
if (alloc) {
|
153
|
+
irep->syms[i] = mrb_intern(mrb, (char *)src, snl);
|
154
|
+
}
|
155
|
+
else {
|
156
|
+
irep->syms[i] = mrb_intern_static(mrb, (char *)src, snl);
|
157
|
+
}
|
148
158
|
src += snl + 1;
|
149
159
|
|
150
160
|
mrb_gc_arena_restore(mrb, ai);
|
@@ -158,16 +168,16 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
158
168
|
}
|
159
169
|
|
160
170
|
static mrb_irep*
|
161
|
-
read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
171
|
+
read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len, mrb_bool alloc)
|
162
172
|
{
|
163
|
-
mrb_irep *irep = read_irep_record_1(mrb, bin, len);
|
173
|
+
mrb_irep *irep = read_irep_record_1(mrb, bin, len, alloc);
|
164
174
|
size_t i;
|
165
175
|
|
166
176
|
bin += *len;
|
167
177
|
for (i=0; i<irep->rlen; i++) {
|
168
178
|
uint32_t rlen;
|
169
179
|
|
170
|
-
irep->reps[i] = read_irep_record(mrb, bin, &rlen);
|
180
|
+
irep->reps[i] = read_irep_record(mrb, bin, &rlen, alloc);
|
171
181
|
bin += rlen;
|
172
182
|
*len += rlen;
|
173
183
|
}
|
@@ -175,12 +185,12 @@ read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
175
185
|
}
|
176
186
|
|
177
187
|
static mrb_irep*
|
178
|
-
read_section_irep(mrb_state *mrb, const uint8_t *bin)
|
188
|
+
read_section_irep(mrb_state *mrb, const uint8_t *bin, mrb_bool alloc)
|
179
189
|
{
|
180
190
|
uint32_t len;
|
181
191
|
|
182
192
|
bin += sizeof(struct rite_section_irep_header);
|
183
|
-
return read_irep_record(mrb, bin, &len);
|
193
|
+
return read_irep_record(mrb, bin, &len, alloc);
|
184
194
|
}
|
185
195
|
|
186
196
|
static int
|
@@ -344,7 +354,7 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, uint32_t
|
|
344
354
|
}
|
345
355
|
|
346
356
|
static int
|
347
|
-
read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep)
|
357
|
+
read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, mrb_bool alloc)
|
348
358
|
{
|
349
359
|
const uint8_t *bin;
|
350
360
|
struct rite_section_debug_header *header;
|
@@ -364,7 +374,12 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep)
|
|
364
374
|
for(i = 0; i < filenames_len; ++i) {
|
365
375
|
uint16_t f_len = bin_to_uint16(bin);
|
366
376
|
bin += sizeof(uint16_t);
|
367
|
-
|
377
|
+
if (alloc) {
|
378
|
+
filenames[i] = mrb_intern(mrb, (const char *)bin, f_len);
|
379
|
+
}
|
380
|
+
else {
|
381
|
+
filenames[i] = mrb_intern_static(mrb, (const char *)bin, f_len);
|
382
|
+
}
|
368
383
|
bin += f_len;
|
369
384
|
}
|
370
385
|
|
@@ -430,7 +445,7 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
|
|
430
445
|
do {
|
431
446
|
section_header = (const struct rite_section_header *)bin;
|
432
447
|
if (memcmp(section_header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
|
433
|
-
irep = read_section_irep(mrb, bin);
|
448
|
+
irep = read_section_irep(mrb, bin, FALSE);
|
434
449
|
if (!irep) return NULL;
|
435
450
|
}
|
436
451
|
else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
|
@@ -442,7 +457,7 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
|
|
442
457
|
}
|
443
458
|
else if (memcmp(section_header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
|
444
459
|
if (!irep) return NULL; /* corrupted data */
|
445
|
-
result = read_section_debug(mrb, bin, irep);
|
460
|
+
result = read_section_debug(mrb, bin, irep, FALSE);
|
446
461
|
if (result < MRB_DUMP_OK) {
|
447
462
|
return NULL;
|
448
463
|
}
|
@@ -561,7 +576,7 @@ read_irep_record_file(mrb_state *mrb, FILE *fp)
|
|
561
576
|
if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
|
562
577
|
return NULL;
|
563
578
|
}
|
564
|
-
irep = read_irep_record_1(mrb, buf, &len);
|
579
|
+
irep = read_irep_record_1(mrb, buf, &len, TRUE);
|
565
580
|
mrb_free(mrb, ptr);
|
566
581
|
if (!irep) return NULL;
|
567
582
|
for (i=0; i<irep->rlen; i++) {
|
@@ -669,7 +684,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
|
669
684
|
mrb_free(mrb, bin);
|
670
685
|
return NULL;
|
671
686
|
}
|
672
|
-
result = read_section_debug(mrb, bin, irep);
|
687
|
+
result = read_section_debug(mrb, bin, irep, TRUE);
|
673
688
|
mrb_free(mrb, bin);
|
674
689
|
}
|
675
690
|
if (result < MRB_DUMP_OK) return NULL;
|
data/modules/mruby/src/numeric.c
CHANGED