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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/environment.rb +4 -0
  3. data/lib/webruby/rake/files.rake +2 -1
  4. data/lib/webruby/rake/mruby.rake +4 -2
  5. data/modules/emscripten/AUTHORS +1 -0
  6. data/modules/emscripten/cmake/Platform/Emscripten.cmake +2 -0
  7. data/modules/emscripten/emcc +96 -40
  8. data/modules/emscripten/emrun +301 -136
  9. data/modules/emscripten/emscripten.py +5 -45
  10. data/modules/emscripten/src/analyzer.js +11 -1
  11. data/modules/emscripten/src/compiler.js +1 -1
  12. data/modules/emscripten/src/emrun_postjs.js +2 -2
  13. data/modules/emscripten/src/emrun_prejs.js +5 -0
  14. data/modules/emscripten/src/emscripten-source-map.min.js +31 -0
  15. data/modules/emscripten/src/library.js +187 -0
  16. data/modules/emscripten/src/library_egl.js +20 -0
  17. data/modules/emscripten/src/library_sdl.js +1 -0
  18. data/modules/emscripten/src/preamble.js +4 -0
  19. data/modules/emscripten/src/relooper/Relooper.cpp +33 -15
  20. data/modules/emscripten/src/relooper/Relooper.h +20 -14
  21. data/modules/emscripten/src/relooper/fuzzer.py +6 -0
  22. data/modules/emscripten/src/relooper/test.cpp +28 -0
  23. data/modules/emscripten/src/relooper/test.txt +211 -166
  24. data/modules/emscripten/src/relooper/test2.txt +20 -20
  25. data/modules/emscripten/src/relooper/test3.txt +41 -41
  26. data/modules/emscripten/src/relooper/test4.txt +26 -26
  27. data/modules/emscripten/src/relooper/test5.txt +52 -52
  28. data/modules/emscripten/src/relooper/test6.txt +19 -19
  29. data/modules/emscripten/src/relooper/test_dead.txt +1 -1
  30. data/modules/emscripten/src/relooper/test_debug.txt +31 -31
  31. data/modules/emscripten/src/relooper/test_fuzz1.txt +50 -50
  32. data/modules/emscripten/src/relooper/test_fuzz2.txt +21 -21
  33. data/modules/emscripten/src/relooper/test_fuzz3.txt +18 -18
  34. data/modules/emscripten/src/relooper/test_fuzz4.txt +28 -28
  35. data/modules/emscripten/src/relooper/test_fuzz5.txt +61 -61
  36. data/modules/emscripten/src/relooper/test_fuzz6.txt +179 -179
  37. data/modules/emscripten/src/relooper/test_inf.txt +846 -846
  38. data/modules/emscripten/src/relooper/testit.sh +15 -15
  39. data/modules/emscripten/system/include/emscripten/emscripten.h +64 -0
  40. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +8 -2
  41. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
  42. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +11 -0
  43. data/modules/emscripten/tools/eliminator/eliminator-test.js +16 -1
  44. data/modules/emscripten/tools/file_packager.py +59 -49
  45. data/modules/emscripten/tools/js-optimizer.js +47 -8
  46. data/modules/emscripten/tools/shared.py +3 -3
  47. data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +5 -3
  48. data/modules/emscripten/tools/test-js-optimizer-asm-pre.js +4 -0
  49. data/modules/mruby/INSTALL +11 -6
  50. data/modules/mruby/include/mrbconf.h +0 -3
  51. data/modules/mruby/include/mruby/khash.h +34 -36
  52. data/modules/mruby/include/mruby/string.h +3 -0
  53. data/modules/mruby/include/mruby.h +3 -3
  54. data/modules/mruby/mrblib/string.rb +3 -0
  55. data/modules/mruby/src/class.c +12 -12
  56. data/modules/mruby/src/codegen.c +18 -11
  57. data/modules/mruby/src/hash.c +12 -12
  58. data/modules/mruby/src/kernel.c +3 -3
  59. data/modules/mruby/src/load.c +29 -14
  60. data/modules/mruby/src/numeric.c +1 -1
  61. data/modules/mruby/src/object.c +14 -2
  62. data/modules/mruby/src/state.c +13 -10
  63. data/modules/mruby/src/string.c +1 -3
  64. data/modules/mruby/src/symbol.c +44 -18
  65. data/modules/mruby/src/variable.c +6 -6
  66. data/modules/mruby/test/t/class.rb +34 -0
  67. data/modules/mruby/test/t/module.rb +1 -1
  68. data/modules/mruby/test/t/syntax.rb +28 -0
  69. metadata +5 -13
  70. data/modules/emscripten/src/relooper.js +0 -11516
  71. data/modules/emscripten/src/relooper.js.raw.js +0 -11511
  72. data/modules/emscripten/tools/__init__.pyc +0 -0
  73. data/modules/emscripten/tools/cache.pyc +0 -0
  74. data/modules/emscripten/tools/gen_struct_info.pyc +0 -0
  75. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  76. data/modules/emscripten/tools/jsrun.pyc +0 -0
  77. data/modules/emscripten/tools/response_file.pyc +0 -0
  78. data/modules/emscripten/tools/shared.pyc +0 -0
  79. 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(h->mrb, sizeof(uint8_t)*sz/4+len*sz); \
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
- h->mrb = mrb; \
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(h->mrb, h->keys); \
128
- mrb_free(h->mrb, h); \
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(h->mrb,key) & (h->mask); \
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(h->mrb,h->keys[k], key)) return k; \
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(h->mrb, old_keys); \
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(h->mrb,key) & (h->mask); \
176
+ k = __hash_func(mrb,key) & (h->mask); \
179
177
  while (!__ac_iseither(h->ed_flags, k)) { \
180
- if (__hash_equal(h->mrb,h->keys[k], key)) break; \
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 */
@@ -137,6 +137,9 @@ class String
137
137
  ##
138
138
  # ISO 15.2.10.5.5
139
139
  def =~(re)
140
+ if re.respond_to? :to_str
141
+ raise TypeError, "type mismatch: String given"
142
+ end
140
143
  re =~ self
141
144
  end
142
145
 
@@ -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
  }
@@ -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, VAL);
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
- pop();
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) dispatch_linked(s, 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();
@@ -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 */
@@ -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
  }
@@ -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
- s = mrb_str_new(mrb, (char *)src, pool_data_len);
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
- irep->syms[i] = mrb_intern(mrb, (char *)src, snl);
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
- filenames[i] = mrb_intern(mrb, (const char *)bin, f_len);
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;
@@ -193,7 +193,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit)
193
193
  }
194
194
 
195
195
  if (exp >= 100) {
196
- mrb_raise(mrb, E_RANGE_ERROR, "Too large expornent.");
196
+ mrb_raise(mrb, E_RANGE_ERROR, "Too large exponent.");
197
197
  }
198
198
 
199
199
  *(c++) = '0' + exp / 10;