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
@@ -30,31 +30,6 @@
30
30
  # error This code assumes CHAR_BIT == 8
31
31
  #endif
32
32
 
33
- static void
34
- irep_free(size_t sirep, mrb_state *mrb)
35
- {
36
- size_t i;
37
- void *p;
38
-
39
- for (i = sirep; i < mrb->irep_len; i++) {
40
- if (mrb->irep[i]) {
41
- p = mrb->irep[i]->iseq;
42
- if (p)
43
- mrb_free(mrb, p);
44
-
45
- p = mrb->irep[i]->pool;
46
- if (p)
47
- mrb_free(mrb, p);
48
-
49
- p = mrb->irep[i]->syms;
50
- if (p)
51
- mrb_free(mrb, p);
52
-
53
- mrb_free(mrb, mrb->irep[i]);
54
- }
55
- }
56
- }
57
-
58
33
  static size_t
59
34
  offset_crc_body(void)
60
35
  {
@@ -62,10 +37,9 @@ offset_crc_body(void)
62
37
  return ((uint8_t *)header.binary_crc - (uint8_t *)&header) + sizeof(header.binary_crc);
63
38
  }
64
39
 
65
- static int
66
- read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
40
+ static mrb_irep*
41
+ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
67
42
  {
68
- int ret;
69
43
  size_t i;
70
44
  const uint8_t *src = bin;
71
45
  uint16_t tt, pool_data_len, snl;
@@ -84,19 +58,21 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
84
58
  irep->nregs = bin_to_uint16(src);
85
59
  src += sizeof(uint16_t);
86
60
 
61
+ // number of child irep
62
+ irep->rlen = bin_to_uint16(src);
63
+ src += sizeof(uint16_t);
64
+
87
65
  // Binary Data Section
88
66
  // ISEQ BLOCK
89
67
  irep->ilen = bin_to_uint32(src);
90
68
  src += sizeof(uint32_t);
91
69
  if (irep->ilen > 0) {
92
70
  if (SIZE_ERROR_MUL(sizeof(mrb_code), irep->ilen)) {
93
- ret = MRB_DUMP_GENERAL_FAILURE;
94
- goto error_exit;
71
+ return NULL;
95
72
  }
96
73
  irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen);
97
74
  if (irep->iseq == NULL) {
98
- ret = MRB_DUMP_GENERAL_FAILURE;
99
- goto error_exit;
75
+ return NULL;
100
76
  }
101
77
  for (i = 0; i < irep->ilen; i++) {
102
78
  irep->iseq[i] = bin_to_uint32(src); //iseq
@@ -109,36 +85,36 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
109
85
  src += sizeof(uint32_t);
110
86
  if (plen > 0) {
111
87
  if (SIZE_ERROR_MUL(sizeof(mrb_value), plen)) {
112
- ret = MRB_DUMP_GENERAL_FAILURE;
113
- goto error_exit;
88
+ return NULL;
114
89
  }
115
- irep->pool = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value) * plen);
90
+ irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * plen);
116
91
  if (irep->pool == NULL) {
117
- ret = MRB_DUMP_GENERAL_FAILURE;
118
- goto error_exit;
92
+ return NULL;
119
93
  }
120
94
 
121
95
  for (i = 0; i < plen; i++) {
122
96
  mrb_value s;
97
+
123
98
  tt = *src++; //pool TT
124
99
  pool_data_len = bin_to_uint16(src); //pool data length
125
100
  src += sizeof(uint16_t);
126
101
  s = mrb_str_new(mrb, (char *)src, pool_data_len);
127
102
  src += pool_data_len;
128
103
  switch (tt) { //pool data
129
- case MRB_TT_FIXNUM:
104
+ case IREP_TT_FIXNUM:
130
105
  irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE);
131
106
  break;
132
107
 
133
- case MRB_TT_FLOAT:
134
- irep->pool[i] = mrb_float_value(mrb, mrb_str_to_dbl(mrb, s, FALSE));
108
+ case IREP_TT_FLOAT:
109
+ irep->pool[i] = mrb_float_pool(mrb, mrb_str_to_dbl(mrb, s, FALSE));
135
110
  break;
136
111
 
137
- case MRB_TT_STRING:
138
- irep->pool[i] = s;
112
+ case IREP_TT_STRING:
113
+ irep->pool[i] = mrb_str_pool(mrb, s);
139
114
  break;
140
115
 
141
116
  default:
117
+ /* should not happen */
142
118
  irep->pool[i] = mrb_nil_value();
143
119
  break;
144
120
  }
@@ -152,13 +128,11 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
152
128
  src += sizeof(uint32_t);
153
129
  if (irep->slen > 0) {
154
130
  if (SIZE_ERROR_MUL(sizeof(mrb_sym), irep->slen)) {
155
- ret = MRB_DUMP_GENERAL_FAILURE;
156
- goto error_exit;
131
+ return NULL;
157
132
  }
158
133
  irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen);
159
134
  if (irep->syms == NULL) {
160
- ret = MRB_DUMP_GENERAL_FAILURE;
161
- goto error_exit;
135
+ return NULL;
162
136
  }
163
137
 
164
138
  for (i = 0; i < irep->slen; i++) {
@@ -170,53 +144,47 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
170
144
  continue;
171
145
  }
172
146
 
173
- irep->syms[i] = mrb_intern2(mrb, (char *)src, snl);
147
+ irep->syms[i] = mrb_intern(mrb, (char *)src, snl);
174
148
  src += snl + 1;
175
149
 
176
150
  mrb_gc_arena_restore(mrb, ai);
177
151
  }
178
152
  }
153
+
154
+ irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*irep->rlen);
179
155
  *len = src - bin;
180
156
 
181
- ret = MRB_DUMP_OK;
182
- error_exit:
183
- return ret;
157
+ return irep;
184
158
  }
185
159
 
186
- static int
187
- read_rite_section_irep(mrb_state *mrb, const uint8_t *bin)
160
+ static mrb_irep*
161
+ read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
188
162
  {
189
- int result;
190
- size_t sirep;
191
- uint32_t len;
192
- uint16_t nirep;
193
- uint16_t n;
194
- const struct rite_section_irep_header *header;
195
-
196
- header = (const struct rite_section_irep_header*)bin;
197
- bin += sizeof(struct rite_section_irep_header);
163
+ mrb_irep *irep = read_irep_record_1(mrb, bin, len);
164
+ size_t i;
198
165
 
199
- sirep = mrb->irep_len;
200
- nirep = bin_to_uint16(header->nirep);
166
+ bin += *len;
167
+ for (i=0; i<irep->rlen; i++) {
168
+ uint32_t rlen;
201
169
 
202
- //Read Binary Data Section
203
- for (n = 0; n < nirep; n++) {
204
- result = read_rite_irep_record(mrb, bin, &len);
205
- if (result != MRB_DUMP_OK)
206
- goto error_exit;
207
- bin += len;
170
+ irep->reps[i] = read_irep_record(mrb, bin, &rlen);
171
+ bin += rlen;
172
+ *len += rlen;
208
173
  }
174
+ return irep;
175
+ }
209
176
 
210
- result = nirep;
211
- error_exit:
212
- if (result < MRB_DUMP_OK) {
213
- irep_free(sirep, mrb);
214
- }
215
- return result;
177
+ static mrb_irep*
178
+ read_section_irep(mrb_state *mrb, const uint8_t *bin)
179
+ {
180
+ uint32_t len;
181
+
182
+ bin += sizeof(struct rite_section_irep_header);
183
+ return read_irep_record(mrb, bin, &len);
216
184
  }
217
185
 
218
186
  static int
219
- read_rite_lineno_record(mrb_state *mrb, const uint8_t *bin, size_t irepno, uint32_t *len)
187
+ read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, uint32_t *len)
220
188
  {
221
189
  int ret;
222
190
  size_t i, fname_len, niseq;
@@ -231,13 +199,11 @@ read_rite_lineno_record(mrb_state *mrb, const uint8_t *bin, size_t irepno, uint3
231
199
  bin += sizeof(uint16_t);
232
200
  *len += sizeof(uint16_t);
233
201
  if (SIZE_ERROR(fname_len + 1)) {
234
- ret = MRB_DUMP_GENERAL_FAILURE;
235
- goto error_exit;
202
+ return MRB_DUMP_GENERAL_FAILURE;
236
203
  }
237
204
  fname = (char *)mrb_malloc(mrb, fname_len + 1);
238
205
  if (fname == NULL) {
239
- ret = MRB_DUMP_GENERAL_FAILURE;
240
- goto error_exit;
206
+ return MRB_DUMP_GENERAL_FAILURE;
241
207
  }
242
208
  memcpy(fname, bin, fname_len);
243
209
  fname[fname_len] = '\0';
@@ -249,63 +215,58 @@ read_rite_lineno_record(mrb_state *mrb, const uint8_t *bin, size_t irepno, uint3
249
215
  *len += sizeof(uint32_t);
250
216
 
251
217
  if (SIZE_ERROR_MUL(niseq, sizeof(uint16_t))) {
252
- ret = MRB_DUMP_GENERAL_FAILURE;
253
- goto error_exit;
218
+ return MRB_DUMP_GENERAL_FAILURE;
254
219
  }
255
220
  lines = (uint16_t *)mrb_malloc(mrb, niseq * sizeof(uint16_t));
256
221
  if (lines == NULL) {
257
- ret = MRB_DUMP_GENERAL_FAILURE;
258
- goto error_exit;
222
+ return MRB_DUMP_GENERAL_FAILURE;
259
223
  }
260
224
  for (i = 0; i < niseq; i++) {
261
225
  lines[i] = bin_to_uint16(bin);
262
226
  bin += sizeof(uint16_t); // niseq
263
227
  *len += sizeof(uint16_t);
264
- }
265
-
266
- mrb->irep[irepno]->filename = fname;
267
- mrb->irep[irepno]->lines = lines;
268
-
269
- error_exit:
228
+ }
270
229
 
230
+ irep->filename = fname;
231
+ irep->lines = lines;
271
232
  return ret;
272
233
  }
273
234
 
274
235
  static int
275
- read_rite_section_lineno(mrb_state *mrb, const uint8_t *bin, size_t sirep)
236
+ read_lineno_record(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, uint32_t *lenp)
276
237
  {
277
- int result;
238
+ int result = read_lineno_record_1(mrb, bin, irep, lenp);
278
239
  size_t i;
240
+
241
+ if (result != MRB_DUMP_OK) return result;
242
+ for (i = 0; i < irep->rlen; i++) {
243
+ uint32_t len;
244
+
245
+ result = read_lineno_record(mrb, bin, irep->reps[i], &len);
246
+ if (result != MRB_DUMP_OK) break;
247
+ bin += len;
248
+ *lenp += len;
249
+ }
250
+ return result;
251
+ }
252
+
253
+ static int
254
+ read_section_lineno(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep)
255
+ {
279
256
  uint32_t len;
280
- uint16_t nirep;
281
- uint16_t n;
282
- const struct rite_section_lineno_header *header;
283
257
 
284
258
  len = 0;
285
- header = (const struct rite_section_lineno_header*)bin;
286
259
  bin += sizeof(struct rite_section_lineno_header);
287
260
 
288
- nirep = bin_to_uint16(header->nirep);
289
-
290
261
  //Read Binary Data Section
291
- for (n = 0, i = sirep; n < nirep; n++, i++) {
292
- result = read_rite_lineno_record(mrb, bin, i, &len);
293
- if (result != MRB_DUMP_OK)
294
- goto error_exit;
295
- bin += len;
296
- }
297
-
298
- result = sirep + bin_to_uint16(header->sirep);
299
- error_exit:
300
- return result;
262
+ return read_lineno_record(mrb, bin, irep, &len);
301
263
  }
302
264
 
303
265
  static int
304
- read_rite_debug_record(mrb_state *mrb, const uint8_t *start, size_t irepno, uint32_t *len, const mrb_sym *filenames, size_t filenames_len)
266
+ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, uint32_t *len, const mrb_sym *filenames, size_t filenames_len)
305
267
  {
306
268
  const uint8_t *bin = start;
307
- mrb_irep *irep = mrb->irep[irepno];
308
- size_t record_size;
269
+ size_t record_size, i;
309
270
  uint16_t f_idx;
310
271
 
311
272
  if(irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
@@ -368,19 +329,28 @@ read_rite_debug_record(mrb_state *mrb, const uint8_t *start, size_t irepno, uint
368
329
  return MRB_DUMP_GENERAL_FAILURE;
369
330
  }
370
331
 
332
+ for (i = 0; i < irep->rlen; i++) {
333
+ uint32_t len;
334
+ int ret;
335
+
336
+ ret =read_debug_record(mrb, bin, irep->reps[i], &len, filenames, filenames_len);
337
+ if (ret != MRB_DUMP_OK) return ret;
338
+ bin += len;
339
+ }
340
+
371
341
  *len = bin - start;
372
342
 
373
343
  return MRB_DUMP_OK;
374
344
  }
375
345
 
376
346
  static int
377
- read_rite_section_debug(mrb_state *mrb, const uint8_t *start, size_t sirep)
347
+ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep)
378
348
  {
379
349
  const uint8_t *bin;
380
350
  struct rite_section_debug_header *header;
381
351
  uint16_t i;
352
+ uint32_t len = 0;
382
353
  int result;
383
- uint16_t nirep;
384
354
  size_t filenames_len;
385
355
  mrb_sym *filenames;
386
356
 
@@ -388,37 +358,31 @@ read_rite_section_debug(mrb_state *mrb, const uint8_t *start, size_t sirep)
388
358
  header = (struct rite_section_debug_header *)bin;
389
359
  bin += sizeof(struct rite_section_debug_header);
390
360
 
391
- nirep = bin_to_uint16(header->nirep);
392
-
393
361
  filenames_len = bin_to_uint16(bin);
394
362
  bin += sizeof(uint16_t);
395
- filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym*) * filenames_len);
363
+ filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * filenames_len);
396
364
  for(i = 0; i < filenames_len; ++i) {
397
365
  uint16_t f_len = bin_to_uint16(bin);
398
366
  bin += sizeof(uint16_t);
399
- filenames[i] = mrb_intern2(mrb, (const char *)bin, f_len);
367
+ filenames[i] = mrb_intern(mrb, (const char *)bin, f_len);
400
368
  bin += f_len;
401
369
  }
402
370
 
403
- for(i = sirep; i < (sirep + nirep); ++i) {
404
- uint32_t len = 0;
405
- result = read_rite_debug_record(mrb, bin, i, &len, filenames, filenames_len);
406
- if (result != MRB_DUMP_OK) { goto debug_exit; }
407
- bin += len;
408
- }
371
+ result = read_debug_record(mrb, bin, irep, &len, filenames, filenames_len);
372
+ if (result != MRB_DUMP_OK) goto debug_exit;
409
373
 
374
+ bin += len;
410
375
  if ((bin - start) != bin_to_uint32(header->section_size)) {
411
- return MRB_DUMP_GENERAL_FAILURE;
376
+ result = MRB_DUMP_GENERAL_FAILURE;
412
377
  }
413
378
 
414
- result = sirep + bin_to_uint16(header->sirep);
415
379
  debug_exit:
416
380
  mrb_free(mrb, filenames);
417
381
  return result;
418
382
  }
419
383
 
420
384
  static int
421
- read_rite_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc)
385
+ read_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc)
422
386
  {
423
387
  const struct rite_binary_header *header = (const struct rite_binary_header *)bin;
424
388
 
@@ -438,226 +402,195 @@ read_rite_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc)
438
402
  return MRB_DUMP_OK;
439
403
  }
440
404
 
441
- int32_t
405
+ mrb_irep*
442
406
  mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
443
407
  {
444
408
  int result;
445
- int32_t total_nirep = 0;
409
+ mrb_irep *irep = NULL;
446
410
  const struct rite_section_header *section_header;
447
411
  uint16_t crc;
448
412
  size_t bin_size = 0;
449
413
  size_t n;
450
- size_t sirep;
451
414
 
452
415
  if ((mrb == NULL) || (bin == NULL)) {
453
- return MRB_DUMP_INVALID_ARGUMENT;
416
+ return NULL;
454
417
  }
455
418
 
456
- result = read_rite_binary_header(bin, &bin_size, &crc);
419
+ result = read_binary_header(bin, &bin_size, &crc);
457
420
  if (result != MRB_DUMP_OK) {
458
- return result;
421
+ return NULL;
459
422
  }
460
423
 
461
424
  n = offset_crc_body();
462
425
  if (crc != calc_crc_16_ccitt(bin + n, bin_size - n, 0)) {
463
- return MRB_DUMP_INVALID_FILE_HEADER;
426
+ return NULL;
464
427
  }
465
428
 
466
429
  bin += sizeof(struct rite_binary_header);
467
- sirep = mrb->irep_len;
468
-
469
430
  do {
470
431
  section_header = (const struct rite_section_header *)bin;
471
432
  if (memcmp(section_header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
472
- result = read_rite_section_irep(mrb, bin);
473
- if (result < MRB_DUMP_OK) {
474
- return result;
475
- }
476
- total_nirep += result;
433
+ irep = read_section_irep(mrb, bin);
434
+ if (!irep) return NULL;
477
435
  }
478
436
  else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
479
- result = read_rite_section_lineno(mrb, bin, sirep);
437
+ if (!irep) return NULL; /* corrupted data */
438
+ result = read_section_lineno(mrb, bin, irep);
480
439
  if (result < MRB_DUMP_OK) {
481
- return result;
440
+ return NULL;
482
441
  }
483
442
  }
484
443
  else if (memcmp(section_header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
485
- result = read_rite_section_debug(mrb, bin, sirep);
444
+ if (!irep) return NULL; /* corrupted data */
445
+ result = read_section_debug(mrb, bin, irep);
486
446
  if (result < MRB_DUMP_OK) {
487
- return result;
447
+ return NULL;
488
448
  }
489
449
  }
490
450
  bin += bin_to_uint32(section_header->section_size);
491
451
  } while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0);
492
452
 
493
- return sirep;
453
+ return irep;
494
454
  }
495
455
 
496
456
  static void
497
- irep_error(mrb_state *mrb, int n)
457
+ irep_error(mrb_state *mrb)
498
458
  {
499
459
  static const char msg[] = "irep load error";
500
460
  mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1));
501
461
  }
502
462
 
503
463
  mrb_value
504
- mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
464
+ mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
505
465
  {
506
- int32_t n;
466
+ mrb_irep *irep = mrb_read_irep(mrb, bin);
467
+ mrb_value val;
468
+ struct RProc *proc;
507
469
 
508
- n = mrb_read_irep(mrb, bin);
509
- if (n < 0) {
510
- irep_error(mrb, n);
470
+ if (!irep) {
471
+ irep_error(mrb);
511
472
  return mrb_nil_value();
512
473
  }
513
- return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
474
+ proc = mrb_proc_new(mrb, irep);
475
+ mrb_irep_decref(mrb, irep);
476
+ if (c && c->no_exec) return mrb_obj_value(proc);
477
+ val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
478
+ return val;
479
+ }
480
+
481
+ mrb_value
482
+ mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
483
+ {
484
+ return mrb_load_irep_cxt(mrb, bin, NULL);
514
485
  }
515
486
 
516
487
  #ifdef ENABLE_STDIO
517
488
 
518
- static int32_t
519
- read_rite_section_lineno_file(mrb_state *mrb, FILE *fp, size_t sirep)
489
+ static int
490
+ read_lineno_record_file(mrb_state *mrb, FILE *fp, mrb_irep *irep)
520
491
  {
521
- int32_t result;
522
- size_t i;
523
- uint16_t nirep;
524
- uint16_t n;
525
- uint32_t len, buf_size;
526
- uint8_t *buf = NULL;
527
- const size_t record_header_size = 4;
492
+ uint8_t header[4];
493
+ const size_t record_header_size = sizeof(header);
494
+ int result;
495
+ size_t i, buf_size;
496
+ uint32_t len;
497
+ void *ptr;
498
+ uint8_t *buf;
528
499
 
529
- struct rite_section_lineno_header header;
530
- if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) {
500
+ if (fread(header, record_header_size, 1, fp) == 0) {
531
501
  return MRB_DUMP_READ_FAULT;
532
502
  }
533
-
534
- nirep = bin_to_uint16(header.nirep);
535
-
536
- buf_size = record_header_size;
537
- /* We don't need to check buf_size. As it is enough small. */
538
- buf = (uint8_t *)mrb_malloc(mrb, buf_size);
539
- if (!buf) {
540
- result = MRB_DUMP_GENERAL_FAILURE;
541
- goto error_exit;
503
+ buf_size = bin_to_uint32(&header[0]);
504
+ if (SIZE_ERROR(buf_size)) {
505
+ return MRB_DUMP_GENERAL_FAILURE;
542
506
  }
543
-
544
- //Read Binary Data Section
545
- for (n = 0, i = sirep; n < nirep; n++, i++) {
546
- void *ptr;
547
-
548
- if (fread(buf, record_header_size, 1, fp) == 0) {
549
- result = MRB_DUMP_READ_FAULT;
550
- goto error_exit;
551
- }
552
- buf_size = bin_to_uint32(&buf[0]);
553
- if (SIZE_ERROR(buf_size)) {
554
- result = MRB_DUMP_GENERAL_FAILURE;
555
- goto error_exit;
556
- }
557
- ptr = mrb_realloc(mrb, buf, buf_size);
558
- if (!ptr) {
559
- result = MRB_DUMP_GENERAL_FAILURE;
560
- goto error_exit;
561
- }
562
- buf = (uint8_t *)ptr;
563
-
564
- if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
565
- result = MRB_DUMP_READ_FAULT;
566
- goto error_exit;
567
- }
568
- result = read_rite_lineno_record(mrb, buf, i, &len);
569
- if (result != MRB_DUMP_OK)
570
- goto error_exit;
507
+ ptr = mrb_malloc(mrb, buf_size);
508
+ if (!ptr) {
509
+ return MRB_DUMP_GENERAL_FAILURE;
571
510
  }
511
+ buf = (uint8_t *)ptr;
572
512
 
573
- result = sirep + bin_to_uint16(header.sirep);
574
- error_exit:
575
- if (buf) {
576
- mrb_free(mrb, buf);
513
+ if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
514
+ return MRB_DUMP_READ_FAULT;
577
515
  }
578
- if (result < MRB_DUMP_OK) {
579
- irep_free(sirep, mrb);
516
+ result = read_lineno_record_1(mrb, buf, irep, &len);
517
+ mrb_free(mrb, ptr);
518
+ if (result != MRB_DUMP_OK) return result;
519
+ for (i = 0; i < irep->rlen; i++) {
520
+ result = read_lineno_record_file(mrb, fp, irep->reps[i]);
521
+ if (result != MRB_DUMP_OK) break;
580
522
  }
581
523
  return result;
582
524
  }
583
525
 
584
526
  static int32_t
585
- read_rite_section_irep_file(mrb_state *mrb, FILE *fp)
527
+ read_section_lineno_file(mrb_state *mrb, FILE *fp, mrb_irep *irep)
586
528
  {
587
- int32_t result;
588
- size_t sirep;
589
- uint16_t nirep;
590
- uint16_t n;
591
- uint32_t len, buf_size;
592
- uint8_t *buf = NULL;
593
- const size_t record_header_size = 1 + 4;
594
- struct rite_section_irep_header header;
529
+ struct rite_section_lineno_header header;
595
530
 
596
- if (fread(&header, sizeof(struct rite_section_irep_header), 1, fp) == 0) {
531
+ if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) {
597
532
  return MRB_DUMP_READ_FAULT;
598
533
  }
599
534
 
600
- sirep = mrb->irep_len;
601
- nirep = bin_to_uint16(header.nirep);
602
-
603
- buf_size = record_header_size;
604
- /* You don't need use SIZE_ERROR as buf_size is enough small. */
605
- buf = (uint8_t *)mrb_malloc(mrb, buf_size);
606
- if (!buf) {
607
- result = MRB_DUMP_GENERAL_FAILURE;
608
- goto error_exit;
609
- }
610
-
611
535
  //Read Binary Data Section
612
- for (n = 0; n < nirep; n++) {
613
- void *ptr;
536
+ return read_lineno_record_file(mrb, fp, irep);
537
+ }
614
538
 
615
- if (fread(buf, record_header_size, 1, fp) == 0) {
616
- result = MRB_DUMP_READ_FAULT;
617
- goto error_exit;
618
- }
619
- buf_size = bin_to_uint32(&buf[0]);
620
- if (SIZE_ERROR(buf_size)) {
621
- result = MRB_DUMP_GENERAL_FAILURE;
622
- goto error_exit;
623
- }
624
- ptr = mrb_realloc(mrb, buf, buf_size);
625
- if (!ptr) {
626
- result = MRB_DUMP_GENERAL_FAILURE;
627
- goto error_exit;
628
- }
629
- buf = (uint8_t *)ptr;
539
+ static mrb_irep*
540
+ read_irep_record_file(mrb_state *mrb, FILE *fp)
541
+ {
542
+ uint8_t header[1 + 4];
543
+ const size_t record_header_size = sizeof(header);
544
+ size_t buf_size, i;
545
+ uint32_t len;
546
+ mrb_irep *irep = NULL;
547
+ void *ptr;
548
+ uint8_t *buf;
630
549
 
631
- if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
632
- result = MRB_DUMP_READ_FAULT;
633
- goto error_exit;
634
- }
635
- result = read_rite_irep_record(mrb, buf, &len);
636
- if (result != MRB_DUMP_OK)
637
- goto error_exit;
550
+ if (fread(header, record_header_size, 1, fp) == 0) {
551
+ return NULL;
638
552
  }
639
-
640
- result = nirep;
641
- error_exit:
642
- if (buf) {
643
- mrb_free(mrb, buf);
553
+ buf_size = bin_to_uint32(&header[0]);
554
+ if (SIZE_ERROR(buf_size)) {
555
+ return NULL;
644
556
  }
645
- if (result < MRB_DUMP_OK) {
646
- irep_free(sirep, mrb);
557
+ ptr = mrb_malloc(mrb, buf_size);
558
+ if (!ptr) return NULL;
559
+ buf = (uint8_t *)ptr;
560
+ memcpy(buf, header, record_header_size);
561
+ if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
562
+ return NULL;
647
563
  }
648
- return result;
564
+ irep = read_irep_record_1(mrb, buf, &len);
565
+ mrb_free(mrb, ptr);
566
+ if (!irep) return NULL;
567
+ for (i=0; i<irep->rlen; i++) {
568
+ irep->reps[i] = read_irep_record_file(mrb, fp);
569
+ if (!irep->reps[i]) return NULL;
570
+ }
571
+ return irep;
649
572
  }
650
573
 
651
- int32_t
574
+ static mrb_irep*
575
+ read_section_irep_file(mrb_state *mrb, FILE *fp)
576
+ {
577
+ struct rite_section_irep_header header;
578
+
579
+ if (fread(&header, sizeof(struct rite_section_irep_header), 1, fp) == 0) {
580
+ return NULL;
581
+ }
582
+ return read_irep_record_file(mrb, fp);
583
+ }
584
+
585
+ mrb_irep*
652
586
  mrb_read_irep_file(mrb_state *mrb, FILE* fp)
653
587
  {
588
+ mrb_irep *irep = NULL;
654
589
  int result;
655
- int32_t total_nirep = 0;
656
590
  uint8_t *buf;
657
591
  uint16_t crc, crcwk = 0;
658
592
  uint32_t section_size = 0;
659
593
  size_t nbytes;
660
- size_t sirep;
661
594
  struct rite_section_header section_header;
662
595
  long fpos;
663
596
  size_t block_size = 1 << 14;
@@ -666,22 +599,22 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
666
599
  const size_t buf_size = sizeof(struct rite_binary_header);
667
600
 
668
601
  if ((mrb == NULL) || (fp == NULL)) {
669
- return MRB_DUMP_INVALID_ARGUMENT;
602
+ return NULL;
670
603
  }
671
604
 
672
605
  /* You don't need use SIZE_ERROR as buf_size is enough small. */
673
606
  buf = mrb_malloc(mrb, buf_size);
674
607
  if (!buf) {
675
- return MRB_DUMP_GENERAL_FAILURE;
608
+ return NULL;
676
609
  }
677
610
  if (fread(buf, buf_size, 1, fp) == 0) {
678
611
  mrb_free(mrb, buf);
679
- return MRB_DUMP_READ_FAULT;
612
+ return NULL;
680
613
  }
681
- result = read_rite_binary_header(buf, NULL, &crc);
614
+ result = read_binary_header(buf, NULL, &crc);
682
615
  mrb_free(mrb, buf);
683
616
  if (result != MRB_DUMP_OK) {
684
- return result;
617
+ return NULL;
685
618
  }
686
619
 
687
620
  /* verify CRC */
@@ -692,7 +625,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
692
625
  if (buf) break;
693
626
  }
694
627
  if (!buf) {
695
- return MRB_DUMP_GENERAL_FAILURE;
628
+ return NULL;
696
629
  }
697
630
  fseek(fp, offset_crc_body(), SEEK_SET);
698
631
  while ((nbytes = fread(buf, 1, block_size, fp)) > 0) {
@@ -700,66 +633,75 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
700
633
  }
701
634
  mrb_free(mrb, buf);
702
635
  if (nbytes == 0 && ferror(fp)) {
703
- return MRB_DUMP_READ_FAULT;
636
+ return NULL;
704
637
  }
705
638
  if (crcwk != crc) {
706
- return MRB_DUMP_INVALID_FILE_HEADER;
639
+ return NULL;
707
640
  }
708
641
  fseek(fp, fpos + section_size, SEEK_SET);
709
- sirep = mrb->irep_len;
710
642
 
711
643
  // read sections
712
644
  do {
713
645
  fpos = ftell(fp);
714
646
  if (fread(&section_header, sizeof(struct rite_section_header), 1, fp) == 0) {
715
- return MRB_DUMP_READ_FAULT;
647
+ return NULL;
716
648
  }
717
649
  section_size = bin_to_uint32(section_header.section_size);
718
650
 
719
651
  if (memcmp(section_header.section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header.section_identify)) == 0) {
720
652
  fseek(fp, fpos, SEEK_SET);
721
- result = read_rite_section_irep_file(mrb, fp);
722
- if (result < MRB_DUMP_OK) {
723
- return result;
724
- }
725
- total_nirep += result;
653
+ irep = read_section_irep_file(mrb, fp);
654
+ if (!irep) return NULL;
726
655
  }
727
656
  else if (memcmp(section_header.section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header.section_identify)) == 0) {
657
+ if (!irep) return NULL; /* corrupted data */
728
658
  fseek(fp, fpos, SEEK_SET);
729
- result = read_rite_section_lineno_file(mrb, fp, sirep);
730
- if (result < MRB_DUMP_OK) {
731
- return result;
732
- }
659
+ result = read_section_lineno_file(mrb, fp, irep);
660
+ if (result < MRB_DUMP_OK) return NULL;
733
661
  }
734
662
  else if (memcmp(section_header.section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header.section_identify)) == 0) {
735
- uint8_t* const bin = mrb_malloc(mrb, section_size);
736
- fseek(fp, fpos, SEEK_SET);
737
- if(fread((char*)bin, section_size, 1, fp) != 1) {
663
+ if (!irep) return NULL; /* corrupted data */
664
+ else {
665
+ uint8_t* const bin = mrb_malloc(mrb, section_size);
666
+
667
+ fseek(fp, fpos, SEEK_SET);
668
+ if(fread((char*)bin, section_size, 1, fp) != 1) {
669
+ mrb_free(mrb, bin);
670
+ return NULL;
671
+ }
672
+ result = read_section_debug(mrb, bin, irep);
738
673
  mrb_free(mrb, bin);
739
- return MRB_DUMP_READ_FAULT;
740
- }
741
- result = read_rite_section_debug(mrb, bin, sirep);
742
- mrb_free(mrb, bin);
743
- if (result < MRB_DUMP_OK) {
744
- return result;
745
674
  }
675
+ if (result < MRB_DUMP_OK) return NULL;
746
676
  }
747
677
 
748
678
  fseek(fp, fpos + section_size, SEEK_SET);
749
679
  } while (memcmp(section_header.section_identify, RITE_BINARY_EOF, sizeof(section_header.section_identify)) != 0);
750
680
 
751
- return sirep;
681
+ return irep;
752
682
  }
753
683
 
754
684
  mrb_value
755
- mrb_load_irep_file(mrb_state *mrb, FILE* fp)
685
+ mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c)
756
686
  {
757
- int n = mrb_read_irep_file(mrb, fp);
687
+ mrb_irep *irep = mrb_read_irep_file(mrb, fp);
688
+ mrb_value val;
689
+ struct RProc *proc;
758
690
 
759
- if (n < 0) {
760
- irep_error(mrb, n);
691
+ if (!irep) {
692
+ irep_error(mrb);
761
693
  return mrb_nil_value();
762
694
  }
763
- return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
695
+ proc = mrb_proc_new(mrb, irep);
696
+ mrb_irep_decref(mrb, irep);
697
+ if (c && c->no_exec) return mrb_obj_value(proc);
698
+ val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
699
+ return val;
700
+ }
701
+
702
+ mrb_value
703
+ mrb_load_irep_file(mrb_state *mrb, FILE* fp)
704
+ {
705
+ return mrb_load_irep_file_cxt(mrb, fp, NULL);
764
706
  }
765
707
  #endif /* ENABLE_STDIO */