webruby 0.2.2 → 0.2.4

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 (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