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
@@ -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 */