webruby 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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