webruby 0.2.4 → 0.2.5

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