webruby 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/config.rb +4 -9
  3. data/lib/webruby/rake/files.rake +2 -2
  4. data/modules/emscripten/AUTHORS +9 -1
  5. data/modules/emscripten/CONTRIBUTING.markdown +5 -0
  6. data/modules/emscripten/ChangeLog +435 -0
  7. data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
  9. data/modules/emscripten/em++ +0 -2
  10. data/modules/emscripten/emcc +92 -32
  11. data/modules/emscripten/emlink.py +16 -13
  12. data/modules/emscripten/emmake +1 -1
  13. data/modules/emscripten/emrun +918 -0
  14. data/modules/emscripten/emrun.bat +2 -0
  15. data/modules/emscripten/emscripten.py +545 -20
  16. data/modules/emscripten/src/analyzer.js +6 -1
  17. data/modules/emscripten/src/compiler.js +25 -16
  18. data/modules/emscripten/src/emrun_postjs.js +20 -0
  19. data/modules/emscripten/{tests → src}/hello_world.js +0 -0
  20. data/modules/emscripten/src/intertyper.js +45 -16
  21. data/modules/emscripten/src/jsifier.js +78 -48
  22. data/modules/emscripten/src/library.js +381 -96
  23. data/modules/emscripten/src/library_browser.js +50 -53
  24. data/modules/emscripten/src/library_egl.js +66 -24
  25. data/modules/emscripten/src/library_fs.js +122 -90
  26. data/modules/emscripten/src/library_gl.js +739 -353
  27. data/modules/emscripten/src/library_glfw.js +9 -3
  28. data/modules/emscripten/src/library_glut.js +10 -5
  29. data/modules/emscripten/src/library_idbfs.js +14 -14
  30. data/modules/emscripten/src/library_memfs.js +65 -41
  31. data/modules/emscripten/src/library_nodefs.js +61 -9
  32. data/modules/emscripten/src/library_openal.js +4 -4
  33. data/modules/emscripten/src/library_path.js +9 -13
  34. data/modules/emscripten/src/library_sdl.js +301 -64
  35. data/modules/emscripten/src/library_sockfs.js +7 -5
  36. data/modules/emscripten/src/modules.js +62 -22
  37. data/modules/emscripten/src/parseTools.js +135 -102
  38. data/modules/emscripten/src/postamble.js +3 -4
  39. data/modules/emscripten/src/preamble.js +49 -29
  40. data/modules/emscripten/src/proxyClient.js +1 -1
  41. data/modules/emscripten/src/proxyWorker.js +10 -10
  42. data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
  43. data/modules/emscripten/src/runtime.js +32 -8
  44. data/modules/emscripten/src/settings.js +25 -8
  45. data/modules/emscripten/src/shell.html +6 -3
  46. data/modules/emscripten/src/shell.js +13 -11
  47. data/modules/emscripten/src/simd.js +602 -432
  48. data/modules/emscripten/src/struct_info.json +22 -2
  49. data/modules/emscripten/src/utility.js +32 -17
  50. data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
  51. data/modules/emscripten/system/include/compat/ctype.h +17 -0
  52. data/modules/emscripten/system/include/compat/wchar.h +23 -0
  53. data/modules/emscripten/system/include/compat/wctype.h +23 -0
  54. data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
  55. data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
  56. data/modules/emscripten/system/include/emscripten/vector.h +29 -1
  57. data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
  58. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
  59. data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
  60. data/modules/emscripten/system/include/libcxx/__config +95 -17
  61. data/modules/emscripten/system/include/libcxx/__debug +25 -4
  62. data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
  63. data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
  64. data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
  65. data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
  66. data/modules/emscripten/system/include/libcxx/__locale +21 -19
  67. data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
  68. data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
  69. data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
  70. data/modules/emscripten/system/include/libcxx/__tree +35 -26
  71. data/modules/emscripten/system/include/libcxx/__tuple +15 -15
  72. data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
  73. data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
  74. data/modules/emscripten/system/include/libcxx/algorithm +121 -110
  75. data/modules/emscripten/system/include/libcxx/array +15 -15
  76. data/modules/emscripten/system/include/libcxx/bitset +4 -4
  77. data/modules/emscripten/system/include/libcxx/chrono +51 -17
  78. data/modules/emscripten/system/include/libcxx/cmath +25 -23
  79. data/modules/emscripten/system/include/libcxx/codecvt +21 -18
  80. data/modules/emscripten/system/include/libcxx/complex +48 -7
  81. data/modules/emscripten/system/include/libcxx/cstddef +1 -1
  82. data/modules/emscripten/system/include/libcxx/cstdio +8 -1
  83. data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
  84. data/modules/emscripten/system/include/libcxx/cwchar +1 -1
  85. data/modules/emscripten/system/include/libcxx/deque +26 -12
  86. data/modules/emscripten/system/include/libcxx/dynarray +311 -0
  87. data/modules/emscripten/system/include/libcxx/exception +4 -4
  88. data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
  89. data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
  90. data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
  91. data/modules/emscripten/system/include/libcxx/forward_list +33 -7
  92. data/modules/emscripten/system/include/libcxx/fstream +4 -4
  93. data/modules/emscripten/system/include/libcxx/functional +200 -170
  94. data/modules/emscripten/system/include/libcxx/future +83 -39
  95. data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
  96. data/modules/emscripten/system/include/libcxx/iomanip +147 -0
  97. data/modules/emscripten/system/include/libcxx/ios +24 -16
  98. data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
  99. data/modules/emscripten/system/include/libcxx/istream +13 -8
  100. data/modules/emscripten/system/include/libcxx/iterator +108 -417
  101. data/modules/emscripten/system/include/libcxx/limits +8 -4
  102. data/modules/emscripten/system/include/libcxx/list +28 -8
  103. data/modules/emscripten/system/include/libcxx/locale +153 -390
  104. data/modules/emscripten/system/include/libcxx/map +280 -100
  105. data/modules/emscripten/system/include/libcxx/memory +49 -97
  106. data/modules/emscripten/system/include/libcxx/mutex +2 -2
  107. data/modules/emscripten/system/include/libcxx/new +43 -14
  108. data/modules/emscripten/system/include/libcxx/numeric +2 -2
  109. data/modules/emscripten/system/include/libcxx/optional +697 -0
  110. data/modules/emscripten/system/include/libcxx/ostream +17 -8
  111. data/modules/emscripten/system/include/libcxx/queue +5 -5
  112. data/modules/emscripten/system/include/libcxx/random +53 -51
  113. data/modules/emscripten/system/include/libcxx/ratio +11 -11
  114. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  115. data/modules/emscripten/system/include/libcxx/regex +23 -20
  116. data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
  117. data/modules/emscripten/system/include/libcxx/set +166 -2
  118. data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
  119. data/modules/emscripten/system/include/libcxx/sstream +4 -4
  120. data/modules/emscripten/system/include/libcxx/stack +3 -3
  121. data/modules/emscripten/system/include/libcxx/streambuf +5 -5
  122. data/modules/emscripten/system/include/libcxx/string +372 -324
  123. data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
  124. data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
  125. data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
  126. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
  127. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
  128. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
  129. data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
  130. data/modules/emscripten/system/include/libcxx/system_error +14 -8
  131. data/modules/emscripten/system/include/libcxx/thread +7 -8
  132. data/modules/emscripten/system/include/libcxx/tuple +29 -88
  133. data/modules/emscripten/system/include/libcxx/type_traits +253 -209
  134. data/modules/emscripten/system/include/libcxx/typeindex +3 -3
  135. data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
  136. data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
  137. data/modules/emscripten/system/include/libcxx/utility +20 -20
  138. data/modules/emscripten/system/include/libcxx/valarray +23 -23
  139. data/modules/emscripten/system/include/libcxx/vector +114 -91
  140. data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
  141. data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
  142. data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
  143. data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
  144. data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
  145. data/modules/emscripten/system/lib/libcextra.symbols +7 -0
  146. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
  147. data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
  148. data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
  149. data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
  150. data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
  151. data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
  152. data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
  153. data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
  154. data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
  155. data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
  156. data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
  157. data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
  158. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  159. data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
  160. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
  161. data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
  162. data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
  163. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
  164. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
  165. data/modules/emscripten/system/lib/libcxx/symbols +187 -168
  166. data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
  167. data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
  168. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
  169. data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
  170. data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
  171. data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
  172. data/modules/emscripten/tools/cache.py +5 -7
  173. data/modules/emscripten/tools/cache.pyc +0 -0
  174. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
  175. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
  176. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
  177. data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
  178. data/modules/emscripten/tools/file_packager.py +93 -50
  179. data/modules/emscripten/tools/js-optimizer.js +98 -48
  180. data/modules/emscripten/tools/js_optimizer.py +4 -4
  181. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  182. data/modules/emscripten/tools/jsrun.py +1 -1
  183. data/modules/emscripten/tools/jsrun.pyc +0 -0
  184. data/modules/emscripten/tools/response_file.py +6 -0
  185. data/modules/emscripten/tools/response_file.pyc +0 -0
  186. data/modules/emscripten/tools/settings_template_readonly.py +2 -0
  187. data/modules/emscripten/tools/shared.py +88 -34
  188. data/modules/emscripten/tools/shared.pyc +0 -0
  189. data/modules/emscripten/tools/split.py +21 -13
  190. data/modules/mruby/build_config.rb +7 -1
  191. data/modules/mruby/doc/compile/README.md +5 -9
  192. data/modules/mruby/include/mrbconf.h +5 -2
  193. data/modules/mruby/include/mruby/array.h +1 -0
  194. data/modules/mruby/include/mruby/compile.h +2 -4
  195. data/modules/mruby/include/mruby/dump.h +7 -16
  196. data/modules/mruby/include/mruby/hash.h +1 -1
  197. data/modules/mruby/include/mruby/irep.h +14 -2
  198. data/modules/mruby/include/mruby/khash.h +8 -7
  199. data/modules/mruby/include/mruby/string.h +1 -0
  200. data/modules/mruby/include/mruby/value.h +5 -2
  201. data/modules/mruby/include/mruby.h +12 -13
  202. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
  203. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
  204. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
  205. data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
  206. data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
  207. data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
  208. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
  209. data/modules/mruby/mrblib/numeric.rb +99 -33
  210. data/modules/mruby/src/array.c +11 -4
  211. data/modules/mruby/src/backtrace.c +2 -2
  212. data/modules/mruby/src/class.c +49 -30
  213. data/modules/mruby/src/codegen.c +131 -79
  214. data/modules/mruby/src/debug.c +1 -1
  215. data/modules/mruby/src/dump.c +213 -163
  216. data/modules/mruby/src/error.c +17 -17
  217. data/modules/mruby/src/error.h +1 -1
  218. data/modules/mruby/src/etc.c +10 -0
  219. data/modules/mruby/src/gc.c +35 -17
  220. data/modules/mruby/src/hash.c +5 -5
  221. data/modules/mruby/src/kernel.c +36 -14
  222. data/modules/mruby/src/load.c +238 -296
  223. data/modules/mruby/src/numeric.c +18 -98
  224. data/modules/mruby/src/object.c +3 -5
  225. data/modules/mruby/src/parse.y +63 -56
  226. data/modules/mruby/src/proc.c +8 -5
  227. data/modules/mruby/src/re.h +0 -1
  228. data/modules/mruby/src/state.c +65 -27
  229. data/modules/mruby/src/string.c +3 -31
  230. data/modules/mruby/src/symbol.c +3 -3
  231. data/modules/mruby/src/variable.c +12 -5
  232. data/modules/mruby/src/vm.c +90 -72
  233. data/modules/mruby/tasks/mruby_build.rake +10 -1
  234. data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
  235. data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
  236. data/modules/mruby/test/driver.c +3 -3
  237. data/modules/mruby/test/t/array.rb +5 -5
  238. data/modules/mruby/test/t/class.rb +14 -1
  239. data/modules/mruby/test/t/kernel.rb +4 -0
  240. data/modules/mruby/test/t/module.rb +4 -4
  241. data/modules/mruby/test/t/nameerror.rb +1 -1
  242. data/modules/mruby/tools/mrbc/mrbc.c +23 -17
  243. data/modules/mruby/travis_config.rb +10 -1
  244. metadata +28 -5
  245. data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -9,7 +9,7 @@
9
9
  #include <string.h>
10
10
  #include "mruby.h"
11
11
  #include "mruby/compile.h"
12
- #include "mruby/irep.h"
12
+ #include "mruby/proc.h"
13
13
  #include "mruby/numeric.h"
14
14
  #include "mruby/string.h"
15
15
  #include "mruby/debug.h"
@@ -61,14 +61,13 @@ typedef struct scope {
61
61
 
62
62
  mrb_irep *irep;
63
63
  size_t pcapa;
64
- int scapa;
64
+ size_t scapa;
65
+ size_t rcapa;
65
66
 
66
67
  int nlocals;
67
68
  int nregs;
68
69
  int ai;
69
70
 
70
- int idx;
71
-
72
71
  int debug_start_pos;
73
72
  uint16_t filename_index;
74
73
  parser_state* parser;
@@ -90,10 +89,10 @@ codegen_error(codegen_scope *s, const char *message)
90
89
  {
91
90
  if (!s) return;
92
91
  while (s->prev) {
92
+ codegen_scope *tmp = s->prev;
93
93
  mrb_pool_close(s->mpool);
94
- s = s->prev;
94
+ s = tmp;
95
95
  }
96
- mrb_pool_close(s->mpool);
97
96
  #ifdef ENABLE_STDIO
98
97
  if (s->filename && s->lineno) {
99
98
  fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
@@ -114,19 +113,19 @@ codegen_palloc(codegen_scope *s, size_t len)
114
113
  return p;
115
114
  }
116
115
 
117
- void*
116
+ static void*
118
117
  codegen_malloc(codegen_scope *s, size_t len)
119
118
  {
120
- void *p = mrb_malloc(s->mrb, len);
119
+ void *p = mrb_malloc_simple(s->mrb, len);
121
120
 
122
121
  if (!p) codegen_error(s, "mrb_malloc");
123
122
  return p;
124
123
  }
125
124
 
126
- void*
125
+ static void*
127
126
  codegen_realloc(codegen_scope *s, void *p, size_t len)
128
127
  {
129
- p = mrb_realloc(s->mrb, p, len);
128
+ p = mrb_realloc_simple(s->mrb, p, len);
130
129
 
131
130
  if (!p && len > 0) codegen_error(s, "mrb_realloc");
132
131
  return p;
@@ -398,34 +397,65 @@ static inline int
398
397
  new_lit(codegen_scope *s, mrb_value val)
399
398
  {
400
399
  size_t i;
400
+ mrb_value *pv;
401
401
 
402
402
  switch (mrb_type(val)) {
403
403
  case MRB_TT_STRING:
404
404
  for (i=0; i<s->irep->plen; i++) {
405
- mrb_value pv = s->irep->pool[i];
406
405
  mrb_int len;
406
+ pv = &s->irep->pool[i];
407
407
 
408
- if (mrb_type(pv) != MRB_TT_STRING) continue;
409
- if ((len = RSTRING_LEN(pv)) != RSTRING_LEN(val)) continue;
410
- if (memcmp(RSTRING_PTR(pv), RSTRING_PTR(val), len) == 0)
408
+ if (mrb_type(*pv) != MRB_TT_STRING) continue;
409
+ if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
410
+ if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
411
411
  return i;
412
412
  }
413
413
  break;
414
414
  case MRB_TT_FLOAT:
415
- default:
416
415
  for (i=0; i<s->irep->plen; i++) {
417
- if (mrb_obj_equal(s->mrb, s->irep->pool[i], val)) return i;
416
+ pv = &s->irep->pool[i];
417
+ if (mrb_type(*pv) != MRB_TT_FLOAT) continue;
418
+ if (mrb_float(*pv) == mrb_float(val)) return i;
418
419
  }
419
420
  break;
421
+ case MRB_TT_FIXNUM:
422
+ for (i=0; i<s->irep->plen; i++) {
423
+ pv = &s->irep->pool[i];
424
+ if (mrb_type(*pv) != MRB_TT_FIXNUM) continue;
425
+ if (mrb_fixnum(*pv) == mrb_fixnum(val)) return i;
426
+ }
427
+ break;
428
+ default:
429
+ /* should not happen */
430
+ return 0;
420
431
  }
421
432
 
422
433
  if (s->irep->plen == s->pcapa) {
423
434
  s->pcapa *= 2;
424
435
  s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa);
425
436
  }
426
- s->irep->pool[s->irep->plen] = val;
437
+
438
+ pv = &s->irep->pool[s->irep->plen];
427
439
  i = s->irep->plen++;
428
440
 
441
+ switch (mrb_type(val)) {
442
+ case MRB_TT_STRING:
443
+ *pv = mrb_str_pool(s->mrb, val);
444
+ break;
445
+
446
+ case MRB_TT_FLOAT:
447
+ #ifdef MRB_WORD_BOXING
448
+ *pv = mrb_float_pool(s->mrb, mrb_float(val));
449
+ break;
450
+ #endif
451
+ case MRB_TT_FIXNUM:
452
+ *pv = val;
453
+ break;
454
+
455
+ default:
456
+ /* should not happen */
457
+ break;
458
+ }
429
459
  return i;
430
460
  }
431
461
 
@@ -500,7 +530,7 @@ static void
500
530
  for_body(codegen_scope *s, node *tree)
501
531
  {
502
532
  codegen_scope *prev = s;
503
- int idx, base = s->idx;
533
+ int idx;
504
534
  struct loopinfo *lp;
505
535
  node *n2;
506
536
  mrb_code c;
@@ -509,7 +539,6 @@ for_body(codegen_scope *s, node *tree)
509
539
  codegen(s, tree->cdr->car, VAL);
510
540
  // generate loop-block
511
541
  s = scope_new(s->mrb, s, tree->car);
512
- idx = s->idx;
513
542
 
514
543
  lp = loop_push(s, LOOP_FOR);
515
544
  lp->pc1 = new_label(s);
@@ -534,20 +563,18 @@ for_body(codegen_scope *s, node *tree)
534
563
  loop_pop(s, NOVAL);
535
564
  scope_finish(s);
536
565
  s = prev;
537
- genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx - base, OP_L_BLOCK));
566
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK));
538
567
  pop();
539
- idx = new_msym(s, mrb_intern2(s->mrb, "each", 4));
568
+ idx = new_msym(s, mrb_intern_lit(s->mrb, "each"));
540
569
  genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
541
570
  }
542
571
 
543
572
  static int
544
573
  lambda_body(codegen_scope *s, node *tree, int blk)
545
574
  {
546
- int idx, base = s->idx;
547
575
  mrb_code c;
548
-
576
+ codegen_scope *parent = s;
549
577
  s = scope_new(s->mrb, s, tree->car);
550
- idx = s->idx;
551
578
  s->mscope = !blk;
552
579
 
553
580
  if (blk) {
@@ -626,15 +653,13 @@ lambda_body(codegen_scope *s, node *tree, int blk)
626
653
  loop_pop(s, NOVAL);
627
654
  }
628
655
  scope_finish(s);
629
-
630
- return idx - base;
656
+ return parent->irep->rlen - 1;
631
657
  }
632
658
 
633
659
  static int
634
660
  scope_body(codegen_scope *s, node *tree)
635
661
  {
636
662
  codegen_scope *scope = scope_new(s->mrb, s, tree->car);
637
- int idx = scope->idx;
638
663
 
639
664
  codegen(scope, tree->cdr, VAL);
640
665
  if (!s->iseq) {
@@ -646,12 +671,17 @@ scope_body(codegen_scope *s, node *tree)
646
671
  genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
647
672
  }
648
673
  else {
649
- genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL), NOVAL);
674
+ pop();
675
+ genop_peep(scope, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
676
+ push();
650
677
  }
651
678
  }
652
679
  scope_finish(scope);
653
-
654
- return idx - s->idx;
680
+ if (!s->irep) {
681
+ /* should not happen */
682
+ return 0;
683
+ }
684
+ return s->irep->rlen - 1;
655
685
  }
656
686
 
657
687
  static mrb_bool
@@ -677,7 +707,7 @@ attrsym(codegen_scope *s, mrb_sym a)
677
707
  name2[len] = '=';
678
708
  name2[len+1] = '\0';
679
709
 
680
- return mrb_intern2(s->mrb, name2, len+1);
710
+ return mrb_intern(s->mrb, name2, len+1);
681
711
  }
682
712
 
683
713
  static int
@@ -946,7 +976,7 @@ static void
946
976
  gen_send_intern(codegen_scope *s)
947
977
  {
948
978
  pop();
949
- genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "intern", 6)), 0));
979
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));
950
980
  push();
951
981
  }
952
982
  static void
@@ -1146,12 +1176,12 @@ codegen(codegen_scope *s, node *tree, int val)
1146
1176
  codegen(s, n4->car, VAL);
1147
1177
  }
1148
1178
  else {
1149
- genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern2(s->mrb, "StandardError", 13))));
1179
+ genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
1150
1180
  push();
1151
1181
  }
1152
1182
  genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
1153
1183
  pop();
1154
- genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "===", 3)), 1));
1184
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
1155
1185
  tmp = new_label(s);
1156
1186
  genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
1157
1187
  pos2 = tmp;
@@ -1355,7 +1385,7 @@ codegen(codegen_scope *s, node *tree, int val)
1355
1385
  if (head) {
1356
1386
  genop(s, MKOP_AB(OP_MOVE, cursp(), head));
1357
1387
  pop();
1358
- genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "===", 3)), 1));
1388
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
1359
1389
  }
1360
1390
  else {
1361
1391
  pop();
@@ -1695,7 +1725,7 @@ codegen(codegen_scope *s, node *tree, int val)
1695
1725
  }
1696
1726
  pop_n(n+1);
1697
1727
  if (sendv) n = CALL_MAXARGS;
1698
- genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "call", 4)), n));
1728
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
1699
1729
  if (val) push();
1700
1730
  }
1701
1731
  break;
@@ -1965,7 +1995,7 @@ codegen(codegen_scope *s, node *tree, int val)
1965
1995
 
1966
1996
  default:
1967
1997
  {
1968
- int sym = new_msym(s, mrb_intern2(s->mrb, "-", 1));
1998
+ int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
1969
1999
 
1970
2000
  genop(s, MKOP_ABx(OP_LOADI, cursp(), 0));
1971
2001
  push();
@@ -2033,7 +2063,7 @@ codegen(codegen_scope *s, node *tree, int val)
2033
2063
  char *p = (char*)tree->car;
2034
2064
  size_t len = (intptr_t)tree->cdr;
2035
2065
  int ai = mrb_gc_arena_save(s->mrb);
2036
- int sym = new_sym(s, mrb_intern2(s->mrb, "Kernel", 6));
2066
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
2037
2067
  int off = new_lit(s, mrb_str_new(s->mrb, p, len));
2038
2068
 
2039
2069
  genop(s, MKOP_A(OP_OCLASS, cursp()));
@@ -2041,7 +2071,7 @@ codegen(codegen_scope *s, node *tree, int val)
2041
2071
  push();
2042
2072
  genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2043
2073
  pop();
2044
- sym = new_sym(s, mrb_intern2(s->mrb, "`", 1));
2074
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
2045
2075
  genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
2046
2076
  mrb_gc_arena_restore(s->mrb, ai);
2047
2077
  push();
@@ -2053,7 +2083,7 @@ codegen(codegen_scope *s, node *tree, int val)
2053
2083
  char *p1 = (char*)tree->car;
2054
2084
  char *p2 = (char*)tree->cdr;
2055
2085
  int ai = mrb_gc_arena_save(s->mrb);
2056
- int sym = new_sym(s, mrb_intern2(s->mrb, REGEXP_CLASS, REGEXP_CLASS_CSTR_LEN));
2086
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
2057
2087
  int off = new_lit(s, mrb_str_new(s->mrb, p1, strlen(p1)));
2058
2088
  int argc = 1;
2059
2089
 
@@ -2069,7 +2099,7 @@ codegen(codegen_scope *s, node *tree, int val)
2069
2099
  pop();
2070
2100
  }
2071
2101
  pop();
2072
- sym = new_sym(s, mrb_intern2(s->mrb, "compile", 7));
2102
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
2073
2103
  genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
2074
2104
  mrb_gc_arena_restore(s->mrb, ai);
2075
2105
  push();
@@ -2080,7 +2110,7 @@ codegen(codegen_scope *s, node *tree, int val)
2080
2110
  if (val) {
2081
2111
  node *n = tree->car;
2082
2112
  int ai = mrb_gc_arena_save(s->mrb);
2083
- int sym = new_sym(s, mrb_intern2(s->mrb, REGEXP_CLASS, REGEXP_CLASS_CSTR_LEN));
2113
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
2084
2114
  int argc = 1;
2085
2115
  int off;
2086
2116
  char *p;
@@ -2117,7 +2147,7 @@ codegen(codegen_scope *s, node *tree, int val)
2117
2147
  pop();
2118
2148
  }
2119
2149
  pop();
2120
- sym = new_sym(s, mrb_intern2(s->mrb, "compile", 7));
2150
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
2121
2151
  genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
2122
2152
  mrb_gc_arena_restore(s->mrb, ai);
2123
2153
  push();
@@ -2182,7 +2212,7 @@ codegen(codegen_scope *s, node *tree, int val)
2182
2212
  {
2183
2213
  int a = new_msym(s, sym(tree->car));
2184
2214
  int b = new_msym(s, sym(tree->cdr));
2185
- int c = new_msym(s, mrb_intern2(s->mrb, "alias_method", 12));
2215
+ int c = new_msym(s, mrb_intern_lit(s->mrb,"alias_method"));
2186
2216
 
2187
2217
  genop(s, MKOP_A(OP_TCLASS, cursp()));
2188
2218
  push();
@@ -2201,7 +2231,7 @@ codegen(codegen_scope *s, node *tree, int val)
2201
2231
 
2202
2232
  case NODE_UNDEF:
2203
2233
  {
2204
- int undef = new_msym(s, mrb_intern2(s->mrb, "undef_method", 12));
2234
+ int undef = new_msym(s, mrb_intern_lit(s->mrb, "undef_method"));
2205
2235
  int num = 0;
2206
2236
  node *t = tree;
2207
2237
 
@@ -2342,6 +2372,21 @@ codegen(codegen_scope *s, node *tree, int val)
2342
2372
  }
2343
2373
  }
2344
2374
 
2375
+ static void
2376
+ scope_add_irep(codegen_scope *s, mrb_irep *irep)
2377
+ {
2378
+ if (s->irep == NULL) {
2379
+ s->irep = irep;
2380
+ return;
2381
+ }
2382
+ if (s->irep->rlen == s->rcapa) {
2383
+ s->rcapa *= 2;
2384
+ s->irep->reps = (mrb_irep**)codegen_realloc(s, s->irep->reps, sizeof(mrb_irep*)*s->rcapa);
2385
+ }
2386
+ s->irep->reps[s->irep->rlen] = irep;
2387
+ s->irep->rlen++;
2388
+ }
2389
+
2345
2390
  static codegen_scope*
2346
2391
  scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
2347
2392
  {
@@ -2359,17 +2404,21 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
2359
2404
  p->mscope = 0;
2360
2405
 
2361
2406
  p->irep = mrb_add_irep(mrb);
2362
- p->idx = p->irep->idx;
2407
+ scope_add_irep(prev, p->irep);
2408
+
2409
+ p->rcapa = 8;
2410
+ p->irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*p->rcapa);
2363
2411
 
2364
2412
  p->icapa = 1024;
2365
2413
  p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
2414
+ p->irep->iseq = p->iseq;
2366
2415
 
2367
2416
  p->pcapa = 32;
2368
2417
  p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
2369
2418
  p->irep->plen = 0;
2370
2419
 
2371
2420
  p->scapa = 256;
2372
- p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*256);
2421
+ p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
2373
2422
  p->irep->slen = 0;
2374
2423
 
2375
2424
  p->lv = lv;
@@ -2418,8 +2467,9 @@ scope_finish(codegen_scope *s)
2418
2467
  irep->lines = 0;
2419
2468
  }
2420
2469
  }
2421
- irep->pool = (mrb_value *)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
2422
- irep->syms = (mrb_sym *)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
2470
+ irep->pool = (mrb_value*)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
2471
+ irep->syms = (mrb_sym*)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
2472
+ irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
2423
2473
  if (s->filename) {
2424
2474
  s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
2425
2475
  mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
@@ -2507,17 +2557,16 @@ loop_pop(codegen_scope *s, int val)
2507
2557
  }
2508
2558
 
2509
2559
  static void
2510
- codedump(mrb_state *mrb, int n)
2560
+ codedump(mrb_state *mrb, mrb_irep *irep)
2511
2561
  {
2512
2562
  #ifdef ENABLE_STDIO
2513
- mrb_irep *irep = mrb->irep[n];
2514
2563
  uint32_t i;
2515
2564
  int ai;
2516
2565
  mrb_code c;
2517
2566
 
2518
2567
  if (!irep) return;
2519
- printf("irep %d nregs=%d nlocals=%d pools=%d syms=%d\n", n,
2520
- irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen);
2568
+ printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d\n", irep,
2569
+ irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen);
2521
2570
  for (i=0; i<irep->ilen; i++) {
2522
2571
  ai = mrb_gc_arena_save(mrb);
2523
2572
  printf("%03d ", i);
@@ -2760,9 +2809,8 @@ codedump(mrb_state *mrb, int n)
2760
2809
  break;
2761
2810
  case OP_STRING:
2762
2811
  {
2763
- mrb_value s = irep->pool[GETARG_Bx(c)];
2764
-
2765
- s = mrb_str_dump(mrb, s);
2812
+ mrb_value v = irep->pool[GETARG_Bx(c)];
2813
+ mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
2766
2814
  printf("OP_STRING\tR%d\t%s\n", GETARG_A(c), RSTRING_PTR(s));
2767
2815
  }
2768
2816
  break;
@@ -2785,7 +2833,7 @@ codedump(mrb_state *mrb, int n)
2785
2833
  mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
2786
2834
  break;
2787
2835
  case OP_EXEC:
2788
- printf("OP_EXEC\tR%d\tI(%d)\n", GETARG_A(c), n+GETARG_Bx(c));
2836
+ printf("OP_EXEC\tR%d\tI(%+d)\n", GETARG_A(c), GETARG_Bx(c));
2789
2837
  break;
2790
2838
  case OP_SCLASS:
2791
2839
  printf("OP_SCLASS\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c));
@@ -2797,7 +2845,7 @@ codedump(mrb_state *mrb, int n)
2797
2845
  printf("OP_ERR\tL(%d)\n", GETARG_Bx(c));
2798
2846
  break;
2799
2847
  case OP_EPUSH:
2800
- printf("OP_EPUSH\t:I(%d)\n", n+GETARG_Bx(c));
2848
+ printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c));
2801
2849
  break;
2802
2850
  case OP_ONERR:
2803
2851
  printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
@@ -2826,22 +2874,31 @@ codedump(mrb_state *mrb, int n)
2826
2874
  #endif
2827
2875
  }
2828
2876
 
2829
- void
2830
- codedump_all(mrb_state *mrb, int start)
2877
+ static void
2878
+ codedump_recur(mrb_state *mrb, mrb_irep *irep)
2831
2879
  {
2832
2880
  size_t i;
2833
2881
 
2834
- for (i=start; i<mrb->irep_len; i++) {
2835
- codedump(mrb, i);
2882
+ codedump(mrb, irep);
2883
+ for (i=0; i<irep->rlen; i++) {
2884
+ codedump_recur(mrb, irep->reps[i]);
2836
2885
  }
2837
2886
  }
2838
- static int
2839
- codegen_start(mrb_state *mrb, parser_state *p)
2887
+
2888
+ void
2889
+ codedump_all(mrb_state *mrb, struct RProc *proc)
2890
+ {
2891
+ return codedump_recur(mrb, proc->body.irep);
2892
+ }
2893
+
2894
+ struct RProc*
2895
+ mrb_generate_code(mrb_state *mrb, parser_state *p)
2840
2896
  {
2841
2897
  codegen_scope *scope = scope_new(mrb, 0, 0);
2898
+ struct RProc *proc;
2842
2899
 
2843
2900
  if (!scope) {
2844
- return -1;
2901
+ return NULL;
2845
2902
  }
2846
2903
  scope->mrb = mrb;
2847
2904
  scope->parser = p;
@@ -2850,22 +2907,17 @@ codegen_start(mrb_state *mrb, parser_state *p)
2850
2907
  if (setjmp(scope->jmp) == 0) {
2851
2908
  // prepare irep
2852
2909
  codegen(scope, p->tree, NOVAL);
2910
+ proc = mrb_proc_new(mrb, scope->irep);
2911
+ mrb_irep_decref(mrb, scope->irep);
2853
2912
  mrb_pool_close(scope->mpool);
2854
- return 0;
2913
+ return proc;
2855
2914
  }
2856
2915
  else {
2857
- return -1;
2916
+ if (scope->filename == scope->irep->filename) {
2917
+ scope->irep->filename = NULL;
2918
+ }
2919
+ mrb_irep_decref(mrb, scope->irep);
2920
+ mrb_pool_close(scope->mpool);
2921
+ return NULL;
2858
2922
  }
2859
2923
  }
2860
-
2861
- int
2862
- mrb_generate_code(mrb_state *mrb, parser_state *p)
2863
- {
2864
- int start = mrb->irep_len;
2865
- int n;
2866
-
2867
- n = codegen_start(mrb, p);
2868
- if (n < 0) return n;
2869
-
2870
- return start;
2871
- }
@@ -154,7 +154,7 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
154
154
  info->pc_count = end_pos;
155
155
 
156
156
  fn_len = strlen(irep->filename);
157
- ret->filename_sym = mrb_intern2(mrb, irep->filename, fn_len);
157
+ ret->filename_sym = mrb_intern(mrb, irep->filename, fn_len);
158
158
  len = 0;
159
159
  ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len);
160
160