script_core 0.2.7 → 0.3.0

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 (283) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Gemfile +2 -2
  4. data/ext/enterprise_script_service/Rakefile +1 -1
  5. data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +117 -74
  6. data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +41 -37
  7. data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
  8. data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
  9. data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
  10. data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
  11. data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
  12. data/ext/enterprise_script_service/mruby/.travis.yml +2 -2
  13. data/ext/enterprise_script_service/mruby/.yamllint +8 -0
  14. data/ext/enterprise_script_service/mruby/AUTHORS +3 -0
  15. data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
  16. data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
  17. data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
  18. data/ext/enterprise_script_service/mruby/LICENSE +1 -1
  19. data/ext/enterprise_script_service/mruby/Makefile +1 -1
  20. data/ext/enterprise_script_service/mruby/README.md +4 -14
  21. data/ext/enterprise_script_service/mruby/Rakefile +18 -108
  22. data/ext/enterprise_script_service/mruby/TODO.md +17 -0
  23. data/ext/enterprise_script_service/mruby/appveyor.yml +31 -25
  24. data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
  25. data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
  26. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +2 -19
  27. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +2 -2
  28. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +1 -18
  29. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +2 -19
  30. data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
  31. data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
  32. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_android_armeabi_v7a_neon_hard.rb → build_config/android_armeabi_v7a_neon_hard.rb} +0 -15
  33. data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
  34. data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
  35. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +2 -19
  36. data/ext/enterprise_script_service/mruby/{travis_config.rb → build_config/ci/gcc-clang.rb} +10 -10
  37. data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
  38. data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
  39. data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
  40. data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
  41. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_dreamcast_shelf.rb → build_config/dreamcast_shelf.rb} +5 -19
  42. data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
  43. data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
  44. data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
  45. data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
  46. data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
  47. data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
  48. data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
  49. data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
  50. data/ext/enterprise_script_service/mruby/doc/guides/compile.md +138 -49
  51. data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
  52. data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
  53. data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +49 -22
  54. data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
  55. data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
  56. data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
  57. data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
  58. data/ext/enterprise_script_service/mruby/doc/opcode.md +93 -107
  59. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
  60. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
  61. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
  62. data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
  63. data/ext/enterprise_script_service/mruby/include/mrbconf.h +81 -62
  64. data/ext/enterprise_script_service/mruby/include/mruby.h +137 -96
  65. data/ext/enterprise_script_service/mruby/include/mruby/array.h +23 -6
  66. data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +73 -48
  67. data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
  68. data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +79 -48
  69. data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
  70. data/ext/enterprise_script_service/mruby/include/mruby/common.h +4 -1
  71. data/ext/enterprise_script_service/mruby/include/mruby/compile.h +13 -7
  72. data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
  73. data/ext/enterprise_script_service/mruby/include/mruby/dump.h +17 -35
  74. data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
  75. data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
  76. data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
  77. data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
  78. data/ext/enterprise_script_service/mruby/include/mruby/irep.h +64 -14
  79. data/ext/enterprise_script_service/mruby/include/mruby/khash.h +6 -14
  80. data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +36 -63
  81. data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
  82. data/ext/enterprise_script_service/mruby/include/mruby/ops.h +27 -23
  83. data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
  84. data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
  85. data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
  86. data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
  87. data/ext/enterprise_script_service/mruby/include/mruby/proc.h +80 -13
  88. data/ext/enterprise_script_service/mruby/include/mruby/string.h +10 -15
  89. data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
  90. data/ext/enterprise_script_service/mruby/include/mruby/value.h +29 -19
  91. data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
  92. data/ext/enterprise_script_service/mruby/include/mruby/version.h +26 -7
  93. data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -44
  94. data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +55 -37
  95. data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
  96. data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
  97. data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +75 -32
  98. data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
  99. data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
  100. data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
  101. data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
  102. data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -88
  103. data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
  104. data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
  105. data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
  106. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -1
  107. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +5 -4
  108. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +28 -19
  109. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
  110. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
  111. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
  112. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
  113. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
  114. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -3
  115. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
  116. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -4
  117. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
  118. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
  119. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +41 -34
  120. data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
  121. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
  122. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +19 -9
  123. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
  124. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
  125. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +22 -6
  126. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
  127. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +2 -2
  128. data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  129. data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
  130. data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +2 -1
  131. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +430 -399
  132. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
  133. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
  134. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +559 -217
  135. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +4774 -4193
  136. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +18 -19
  137. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +1 -1
  138. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +8 -7
  139. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
  140. data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
  141. data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
  142. data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
  143. data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +17 -25
  144. data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +18 -13
  145. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +30 -2
  146. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
  147. data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +2 -2
  148. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
  149. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +2 -2
  150. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
  151. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +2 -2
  152. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +55 -52
  153. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +4 -2
  154. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +99 -87
  155. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +2 -0
  156. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +2 -3
  157. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +1 -1
  158. data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +7 -6
  159. data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
  160. data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
  161. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +43 -58
  162. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +4 -4
  163. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
  164. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +77 -74
  165. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
  166. data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
  167. data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +5 -4
  168. data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -12
  169. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  170. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
  171. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  172. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
  173. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +38 -88
  174. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
  175. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +62 -26
  176. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +32 -19
  177. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
  178. data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
  179. data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
  180. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
  181. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +20 -40
  182. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
  183. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +11 -17
  184. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
  185. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
  186. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
  187. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +4 -4
  188. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
  189. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
  190. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +102 -71
  191. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +4 -2
  192. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
  193. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +13 -9
  194. data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
  195. data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +18 -25
  196. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +6 -5
  197. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
  198. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
  199. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
  200. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +16 -44
  201. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
  202. data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +27 -27
  203. data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
  204. data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
  205. data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
  206. data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
  207. data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
  208. data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
  209. data/ext/enterprise_script_service/mruby/mrblib/hash.rb +0 -20
  210. data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
  211. data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
  212. data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
  213. data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
  214. data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
  215. data/ext/enterprise_script_service/mruby/src/array.c +43 -80
  216. data/ext/enterprise_script_service/mruby/src/backtrace.c +16 -17
  217. data/ext/enterprise_script_service/mruby/src/class.c +774 -182
  218. data/ext/enterprise_script_service/mruby/src/codedump.c +223 -198
  219. data/ext/enterprise_script_service/mruby/src/debug.c +6 -6
  220. data/ext/enterprise_script_service/mruby/src/dump.c +466 -141
  221. data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
  222. data/ext/enterprise_script_service/mruby/src/error.c +36 -13
  223. data/ext/enterprise_script_service/mruby/src/etc.c +43 -34
  224. data/ext/enterprise_script_service/mruby/src/fmt_fp.c +5 -6
  225. data/ext/enterprise_script_service/mruby/src/gc.c +73 -71
  226. data/ext/enterprise_script_service/mruby/src/hash.c +1050 -707
  227. data/ext/enterprise_script_service/mruby/src/kernel.c +75 -220
  228. data/ext/enterprise_script_service/mruby/src/load.c +196 -166
  229. data/ext/enterprise_script_service/mruby/src/numeric.c +352 -314
  230. data/ext/enterprise_script_service/mruby/src/object.c +97 -90
  231. data/ext/enterprise_script_service/mruby/src/print.c +4 -3
  232. data/ext/enterprise_script_service/mruby/src/proc.c +48 -56
  233. data/ext/enterprise_script_service/mruby/src/range.c +45 -21
  234. data/ext/enterprise_script_service/mruby/src/state.c +25 -32
  235. data/ext/enterprise_script_service/mruby/src/string.c +59 -101
  236. data/ext/enterprise_script_service/mruby/src/symbol.c +121 -56
  237. data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
  238. data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
  239. data/ext/enterprise_script_service/mruby/src/vm.c +617 -602
  240. data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
  241. data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
  242. data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
  243. data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
  244. data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +83 -77
  245. data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
  246. data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
  247. data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
  248. data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
  249. data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
  250. data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +6 -5
  251. data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +10 -14
  252. data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +17 -21
  253. data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
  254. data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
  255. data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
  256. data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
  257. data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
  258. data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
  259. data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
  260. data/ext/enterprise_script_service/mruby/test/t/kernel.rb +1 -1
  261. data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
  262. data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
  263. data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
  264. data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
  265. data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
  266. data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
  267. data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
  268. data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
  269. data/ext/enterprise_script_service/mruby_config.rb +2 -5
  270. data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
  271. data/lib/script_core/version.rb +1 -1
  272. data/spec/script_core_spec.rb +13 -0
  273. metadata +61 -23
  274. data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +0 -24
  275. data/ext/enterprise_script_service/mruby/TODO +0 -8
  276. data/ext/enterprise_script_service/mruby/appveyor_config.rb +0 -46
  277. data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
  278. data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
  279. data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
  280. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
  281. data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
  282. data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
  283. data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
@@ -51,12 +51,12 @@ select_line_type(const uint16_t *lines, size_t lines_len)
51
51
  }
52
52
 
53
53
  MRB_API char const*
54
- mrb_debug_get_filename(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc)
54
+ mrb_debug_get_filename(mrb_state *mrb, const mrb_irep *irep, uint32_t pc)
55
55
  {
56
- if (irep && pc >= 0 && pc < irep->ilen) {
56
+ if (irep && pc < irep->ilen) {
57
57
  mrb_irep_debug_info_file* f = NULL;
58
58
  if (!irep->debug_info) return NULL;
59
- else if ((f = get_file(irep->debug_info, (uint32_t)pc))) {
59
+ else if ((f = get_file(irep->debug_info, pc))) {
60
60
  return mrb_sym_name_len(mrb, f->filename_sym, NULL);
61
61
  }
62
62
  }
@@ -64,14 +64,14 @@ mrb_debug_get_filename(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc)
64
64
  }
65
65
 
66
66
  MRB_API int32_t
67
- mrb_debug_get_line(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc)
67
+ mrb_debug_get_line(mrb_state *mrb, const mrb_irep *irep, uint32_t pc)
68
68
  {
69
- if (irep && pc >= 0 && pc < irep->ilen) {
69
+ if (irep && pc < irep->ilen) {
70
70
  mrb_irep_debug_info_file* f = NULL;
71
71
  if (!irep->debug_info) {
72
72
  return -1;
73
73
  }
74
- else if ((f = get_file(irep->debug_info, (uint32_t)pc))) {
74
+ else if ((f = get_file(irep->debug_info, pc))) {
75
75
  switch (f->line_type) {
76
76
  case mrb_debug_line_ary:
77
77
  mrb_assert(f->start_pos <= pc && pc < (f->start_pos + f->line_entry_count));
@@ -10,33 +10,57 @@
10
10
  #include <mruby/dump.h>
11
11
  #include <mruby/string.h>
12
12
  #include <mruby/irep.h>
13
- #include <mruby/numeric.h>
14
13
  #include <mruby/debug.h>
15
14
 
16
- #ifndef MRB_WITHOUT_FLOAT
17
- #ifdef MRB_USE_FLOAT
18
- #define MRB_FLOAT_FMT "%.9g"
19
- #else
15
+ #ifndef MRB_NO_FLOAT
16
+ #include <mruby/endian.h>
20
17
  #define MRB_FLOAT_FMT "%.17g"
21
18
  #endif
22
- #endif
23
19
 
24
- static size_t get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep);
20
+ static size_t get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep);
25
21
 
26
22
  #if UINT32_MAX > SIZE_MAX
27
23
  # error This code cannot be built on your environment.
28
24
  #endif
29
25
 
30
- static size_t
31
- write_padding(uint8_t *buf)
32
- {
33
- const size_t align = MRB_DUMP_ALIGNMENT;
34
- size_t pad_len = -(intptr_t)buf & (align-1);
35
- if (pad_len > 0) {
36
- memset(buf, 0, pad_len);
37
- }
38
- return pad_len;
39
- }
26
+ #define OPERATOR_SYMBOL(sym_name, name) {name, sym_name, sizeof(sym_name)-1}
27
+ struct operator_symbol {
28
+ const char *name;
29
+ const char *sym_name;
30
+ uint16_t sym_name_len;
31
+ };
32
+ static const struct operator_symbol operator_table[] = {
33
+ OPERATOR_SYMBOL("!", "not"),
34
+ OPERATOR_SYMBOL("%", "mod"),
35
+ OPERATOR_SYMBOL("&", "and"),
36
+ OPERATOR_SYMBOL("*", "mul"),
37
+ OPERATOR_SYMBOL("+", "add"),
38
+ OPERATOR_SYMBOL("-", "sub"),
39
+ OPERATOR_SYMBOL("/", "div"),
40
+ OPERATOR_SYMBOL("<", "lt"),
41
+ OPERATOR_SYMBOL(">", "gt"),
42
+ OPERATOR_SYMBOL("^", "xor"),
43
+ OPERATOR_SYMBOL("`", "tick"),
44
+ OPERATOR_SYMBOL("|", "or"),
45
+ OPERATOR_SYMBOL("~", "neg"),
46
+ OPERATOR_SYMBOL("!=", "neq"),
47
+ OPERATOR_SYMBOL("!~", "nmatch"),
48
+ OPERATOR_SYMBOL("&&", "andand"),
49
+ OPERATOR_SYMBOL("**", "pow"),
50
+ OPERATOR_SYMBOL("+@", "plus"),
51
+ OPERATOR_SYMBOL("-@", "minus"),
52
+ OPERATOR_SYMBOL("<<", "lshift"),
53
+ OPERATOR_SYMBOL("<=", "le"),
54
+ OPERATOR_SYMBOL("==", "eq"),
55
+ OPERATOR_SYMBOL("=~", "match"),
56
+ OPERATOR_SYMBOL(">=", "ge"),
57
+ OPERATOR_SYMBOL(">>", "rshift"),
58
+ OPERATOR_SYMBOL("[]", "aref"),
59
+ OPERATOR_SYMBOL("||", "oror"),
60
+ OPERATOR_SYMBOL("<=>", "cmp"),
61
+ OPERATOR_SYMBOL("===", "eqq"),
62
+ OPERATOR_SYMBOL("[]=", "aset"),
63
+ };
40
64
 
41
65
  static size_t
42
66
  get_irep_header_size(mrb_state *mrb)
@@ -50,7 +74,7 @@ get_irep_header_size(mrb_state *mrb)
50
74
  }
51
75
 
52
76
  static ptrdiff_t
53
- write_irep_header(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
77
+ write_irep_header(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
54
78
  {
55
79
  uint8_t *cur = buf;
56
80
 
@@ -62,89 +86,104 @@ write_irep_header(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
62
86
  return cur - buf;
63
87
  }
64
88
 
65
-
66
89
  static size_t
67
- get_iseq_block_size(mrb_state *mrb, mrb_irep *irep)
90
+ get_iseq_block_size(mrb_state *mrb, const mrb_irep *irep)
68
91
  {
69
92
  size_t size = 0;
70
93
 
71
- size += sizeof(uint32_t); /* ilen */
72
- size += sizeof(uint32_t); /* max padding */
73
- size += sizeof(uint32_t) * irep->ilen; /* iseq(n) */
94
+ size += sizeof(uint16_t); /* clen */
95
+ size += sizeof(uint16_t); /* ilen */
96
+ size += irep->ilen * sizeof(mrb_code); /* iseq(n) */
97
+ size += irep->clen * sizeof(struct mrb_irep_catch_handler);
74
98
 
75
99
  return size;
76
100
  }
77
101
 
78
102
  static ptrdiff_t
79
- write_iseq_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf, uint8_t flags)
103
+ write_iseq_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf, uint8_t flags)
80
104
  {
81
105
  uint8_t *cur = buf;
106
+ size_t seqlen = irep->ilen * sizeof(mrb_code) +
107
+ irep->clen * sizeof(struct mrb_irep_catch_handler);
82
108
 
83
- cur += uint32_to_bin(irep->ilen, cur); /* number of opcode */
84
- cur += write_padding(cur);
85
- memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code));
86
- cur += irep->ilen * sizeof(mrb_code);
109
+ cur += uint16_to_bin(irep->clen, cur); /* number of catch handlers */
110
+ cur += uint16_to_bin(irep->ilen, cur); /* number of opcode */
111
+ memcpy(cur, irep->iseq, seqlen);
112
+ cur += seqlen;
87
113
 
88
114
  return cur - buf;
89
115
  }
90
116
 
91
- #ifndef MRB_WITHOUT_FLOAT
92
- static mrb_value
93
- float_to_str(mrb_state *mrb, mrb_value flt)
117
+ #ifndef MRB_NO_FLOAT
118
+ static void
119
+ dump_float(mrb_state *mrb, uint8_t *buf, mrb_float f)
94
120
  {
95
- mrb_float f = mrb_float(flt);
121
+ /* dump IEEE754 binary in little endian */
122
+ union {
123
+ double f;
124
+ char s[sizeof(double)];
125
+ } u = {.f = (double)f};
126
+
127
+ if (littleendian) {
128
+ memcpy(buf, u.s, sizeof(double));
129
+ }
130
+ else {
131
+ size_t i;
96
132
 
97
- if (isinf(f)) {
98
- return f < 0 ? mrb_str_new_lit(mrb, "I") : mrb_str_new_lit(mrb, "i");
133
+ for (i=0; i<sizeof(double); i++) {
134
+ buf[i] = u.s[sizeof(double)-i-1];
135
+ }
99
136
  }
100
- return mrb_float_to_str(mrb, flt, MRB_FLOAT_FMT);
101
137
  }
102
138
  #endif
103
139
 
104
140
  static size_t
105
- get_pool_block_size(mrb_state *mrb, mrb_irep *irep)
141
+ get_pool_block_size(mrb_state *mrb, const mrb_irep *irep)
106
142
  {
107
143
  int pool_no;
108
144
  size_t size = 0;
109
- mrb_value str;
110
145
 
111
- size += sizeof(uint32_t); /* plen */
112
- size += irep->plen * (sizeof(uint8_t) + sizeof(uint16_t)); /* len(n) */
146
+ size += sizeof(uint16_t); /* plen */
147
+ size += irep->plen * sizeof(uint8_t); /* len(n) */
113
148
 
114
149
  for (pool_no = 0; pool_no < irep->plen; pool_no++) {
115
150
  int ai = mrb_gc_arena_save(mrb);
116
151
 
117
- switch (mrb_type(irep->pool[pool_no])) {
118
- case MRB_TT_FIXNUM:
119
- str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
152
+ switch (irep->pool[pool_no].tt) {
153
+ case IREP_TT_INT64:
154
+ #ifdef MRB_64BIT
120
155
  {
121
- mrb_int len = RSTRING_LEN(str);
122
- mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
123
- size += (size_t)len;
156
+ int64_t i = irep->pool[pool_no].u.i64;
157
+
158
+ if (i < INT32_MIN || INT32_MAX < i)
159
+ size += 8;
160
+ else
161
+ size += 4;
124
162
  }
125
163
  break;
164
+ #else
165
+ /* fall through */
166
+ #endif
167
+ case IREP_TT_INT32:
168
+ size += 4; /* 32bits = 4bytes */
169
+ break;
126
170
 
127
- #ifndef MRB_WITHOUT_FLOAT
128
- case MRB_TT_FLOAT:
129
- str = float_to_str(mrb, irep->pool[pool_no]);
171
+ case IREP_TT_FLOAT:
172
+ #ifndef MRB_NO_FLOAT
130
173
  {
131
- mrb_int len = RSTRING_LEN(str);
132
- mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
133
- size += (size_t)len;
174
+ size += sizeof(double);
134
175
  }
135
- break;
136
176
  #endif
177
+ break;
137
178
 
138
- case MRB_TT_STRING:
179
+ default: /* packed IREP_TT_STRING */
139
180
  {
140
- mrb_int len = RSTRING_LEN(irep->pool[pool_no]);
181
+ mrb_int len = irep->pool[pool_no].tt >> 2; /* unpack length */
141
182
  mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
142
- size += (size_t)len;
183
+ size += sizeof(uint16_t);
184
+ size += (size_t)len+1;
143
185
  }
144
186
  break;
145
-
146
- default:
147
- break;
148
187
  }
149
188
  mrb_gc_arena_restore(mrb, ai);
150
189
  }
@@ -153,52 +192,63 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep)
153
192
  }
154
193
 
155
194
  static ptrdiff_t
156
- write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
195
+ write_pool_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
157
196
  {
158
197
  int pool_no;
159
198
  uint8_t *cur = buf;
160
- uint16_t len;
161
- mrb_value str;
162
- const char *char_ptr;
199
+ mrb_int len;
200
+ const char *ptr;
163
201
 
164
- cur += uint32_to_bin(irep->plen, cur); /* number of pool */
202
+ cur += uint16_to_bin(irep->plen, cur); /* number of pool */
165
203
 
166
204
  for (pool_no = 0; pool_no < irep->plen; pool_no++) {
167
205
  int ai = mrb_gc_arena_save(mrb);
168
206
 
169
- switch (mrb_type(irep->pool[pool_no])) {
170
- case MRB_TT_FIXNUM:
171
- cur += uint8_to_bin(IREP_TT_FIXNUM, cur); /* data type */
172
- str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
207
+ switch (irep->pool[pool_no].tt) {
208
+ #ifdef MRB_64BIT
209
+ case IREP_TT_INT64:
210
+ {
211
+ int64_t i = irep->pool[pool_no].u.i64;
212
+ if (i < INT32_MIN || INT32_MAX < i) {
213
+ cur += uint8_to_bin(IREP_TT_INT64, cur); /* data type */
214
+ cur += uint32_to_bin((uint32_t)((i>>32) & 0xffffffff), cur); /* i64 hi */
215
+ cur += uint32_to_bin((uint32_t)((i ) & 0xffffffff), cur); /* i64 lo */
216
+ }
217
+ else {
218
+ cur += uint8_to_bin(IREP_TT_INT32, cur); /* data type */
219
+ cur += uint32_to_bin(irep->pool[pool_no].u.i32, cur); /* i32 */
220
+ }
221
+ }
222
+ break;
223
+ #endif
224
+ case IREP_TT_INT32:
225
+ cur += uint8_to_bin(IREP_TT_INT32, cur); /* data type */
226
+ cur += uint32_to_bin(irep->pool[pool_no].u.i32, cur); /* i32 */
173
227
  break;
174
228
 
175
- #ifndef MRB_WITHOUT_FLOAT
176
- case MRB_TT_FLOAT:
229
+ case IREP_TT_FLOAT:
177
230
  cur += uint8_to_bin(IREP_TT_FLOAT, cur); /* data type */
178
- str = float_to_str(mrb, irep->pool[pool_no]);
179
- break;
231
+ #ifndef MRB_NO_FLOAT
232
+ {
233
+ dump_float(mrb, cur,irep->pool[pool_no].u.f);
234
+ cur += sizeof(double);
235
+ }
236
+ #else
237
+ cur += uint16_to_bin(0, cur); /* zero length */
180
238
  #endif
181
-
182
- case MRB_TT_STRING:
183
- cur += uint8_to_bin(IREP_TT_STRING, cur); /* data type */
184
- str = irep->pool[pool_no];
185
239
  break;
186
240
 
187
- default:
188
- continue;
189
- }
190
-
191
- char_ptr = RSTRING_PTR(str);
192
- {
193
- mrb_int tlen = RSTRING_LEN(str);
194
- mrb_assert_int_fit(mrb_int, tlen, uint16_t, UINT16_MAX);
195
- len = (uint16_t)tlen;
241
+ default: /* string */
242
+ cur += uint8_to_bin(IREP_TT_STR, cur); /* data type */
243
+ ptr = irep->pool[pool_no].u.str;
244
+ len = irep->pool[pool_no].tt>>2;
245
+ mrb_assert_int_fit(mrb_int, len, uint16_t, UINT16_MAX);
246
+ cur += uint16_to_bin((uint16_t)len, cur); /* data length */
247
+ memcpy(cur, ptr, (size_t)len);
248
+ cur += len;
249
+ *cur++ = '\0';
250
+ break;
196
251
  }
197
-
198
- cur += uint16_to_bin(len, cur); /* data length */
199
- memcpy(cur, char_ptr, (size_t)len);
200
- cur += len;
201
-
202
252
  mrb_gc_arena_restore(mrb, ai);
203
253
  }
204
254
 
@@ -207,13 +257,13 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
207
257
 
208
258
 
209
259
  static size_t
210
- get_syms_block_size(mrb_state *mrb, mrb_irep *irep)
260
+ get_syms_block_size(mrb_state *mrb, const mrb_irep *irep)
211
261
  {
212
262
  size_t size = 0;
213
263
  int sym_no;
214
264
  mrb_int len;
215
265
 
216
- size += sizeof(uint32_t); /* slen */
266
+ size += sizeof(uint16_t); /* slen */
217
267
  for (sym_no = 0; sym_no < irep->slen; sym_no++) {
218
268
  size += sizeof(uint16_t); /* snl(n) */
219
269
  if (irep->syms[sym_no] != 0) {
@@ -226,13 +276,13 @@ get_syms_block_size(mrb_state *mrb, mrb_irep *irep)
226
276
  }
227
277
 
228
278
  static ptrdiff_t
229
- write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
279
+ write_syms_block(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
230
280
  {
231
281
  int sym_no;
232
282
  uint8_t *cur = buf;
233
283
  const char *name;
234
284
 
235
- cur += uint32_to_bin(irep->slen, cur); /* number of symbol */
285
+ cur += uint16_to_bin(irep->slen, cur); /* number of symbol */
236
286
 
237
287
  for (sym_no = 0; sym_no < irep->slen; sym_no++) {
238
288
  if (irep->syms[sym_no] != 0) {
@@ -255,7 +305,7 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
255
305
  }
256
306
 
257
307
  static size_t
258
- get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep)
308
+ get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep)
259
309
  {
260
310
  size_t size = 0;
261
311
 
@@ -267,7 +317,7 @@ get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep)
267
317
  }
268
318
 
269
319
  static size_t
270
- get_irep_record_size(mrb_state *mrb, mrb_irep *irep)
320
+ get_irep_record_size(mrb_state *mrb, const mrb_irep *irep)
271
321
  {
272
322
  size_t size = 0;
273
323
  int irep_no;
@@ -280,7 +330,7 @@ get_irep_record_size(mrb_state *mrb, mrb_irep *irep)
280
330
  }
281
331
 
282
332
  static int
283
- write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *irep_record_size, uint8_t flags)
333
+ write_irep_record(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, size_t *irep_record_size, uint8_t flags)
284
334
  {
285
335
  int i;
286
336
  uint8_t *src = bin;
@@ -289,11 +339,6 @@ write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *irep_rec
289
339
  return MRB_DUMP_INVALID_IREP;
290
340
  }
291
341
 
292
- *irep_record_size = get_irep_record_size_1(mrb, irep);
293
- if (*irep_record_size == 0) {
294
- return MRB_DUMP_GENERAL_FAILURE;
295
- }
296
-
297
342
  bin += write_irep_header(mrb, irep, bin);
298
343
  bin += write_iseq_block(mrb, irep, bin, flags);
299
344
  bin += write_pool_block(mrb, irep, bin);
@@ -341,7 +386,7 @@ write_section_irep_header(mrb_state *mrb, size_t section_size, uint8_t *bin)
341
386
  }
342
387
 
343
388
  static int
344
- write_section_irep(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *len_p, uint8_t flags)
389
+ write_section_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, size_t *len_p, uint8_t flags)
345
390
  {
346
391
  int result;
347
392
  size_t rsize = 0;
@@ -357,6 +402,7 @@ write_section_irep(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *len_p,
357
402
  if (result != MRB_DUMP_OK) {
358
403
  return result;
359
404
  }
405
+ mrb_assert(rsize == get_irep_record_size(mrb, irep));
360
406
  *len_p = cur - bin + rsize;
361
407
  write_section_irep_header(mrb, *len_p, bin);
362
408
 
@@ -364,7 +410,7 @@ write_section_irep(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *len_p,
364
410
  }
365
411
 
366
412
  static size_t
367
- get_debug_record_size(mrb_state *mrb, mrb_irep *irep)
413
+ get_debug_record_size(mrb_state *mrb, const mrb_irep *irep)
368
414
  {
369
415
  size_t ret = 0;
370
416
  uint16_t f_idx;
@@ -413,11 +459,11 @@ find_filename_index(const mrb_sym *ary, int ary_len, mrb_sym s)
413
459
  }
414
460
 
415
461
  static size_t
416
- get_filename_table_size(mrb_state *mrb, mrb_irep *irep, mrb_sym **fp, uint16_t *lp)
462
+ get_filename_table_size(mrb_state *mrb, const mrb_irep *irep, mrb_sym **fp, uint16_t *lp)
417
463
  {
418
464
  mrb_sym *filenames = *fp;
419
465
  size_t size = 0;
420
- mrb_irep_debug_info *di = irep->debug_info;
466
+ const mrb_irep_debug_info *di = irep->debug_info;
421
467
  int i;
422
468
 
423
469
  mrb_assert(lp);
@@ -444,7 +490,7 @@ get_filename_table_size(mrb_state *mrb, mrb_irep *irep, mrb_sym **fp, uint16_t *
444
490
  }
445
491
 
446
492
  static size_t
447
- write_debug_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
493
+ write_debug_record_1(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
448
494
  {
449
495
  uint8_t *cur;
450
496
  uint16_t f_idx;
@@ -498,7 +544,7 @@ write_debug_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const
498
544
  }
499
545
 
500
546
  static size_t
501
- write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
547
+ write_debug_record(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
502
548
  {
503
549
  size_t size, len;
504
550
  int irep_no;
@@ -516,7 +562,7 @@ write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const*
516
562
  }
517
563
 
518
564
  static int
519
- write_section_debug(mrb_state *mrb, mrb_irep *irep, uint8_t *cur, mrb_sym const *filenames, uint16_t filenames_len)
565
+ write_section_debug(mrb_state *mrb, const mrb_irep *irep, uint8_t *cur, mrb_sym const *filenames, uint16_t filenames_len)
520
566
  {
521
567
  size_t section_size = 0;
522
568
  const uint8_t *bin = cur;
@@ -566,7 +612,7 @@ create_lv_sym_table(mrb_state *mrb, const mrb_irep *irep, mrb_sym **syms, uint32
566
612
  }
567
613
 
568
614
  for (i = 0; i + 1 < irep->nlocals; ++i) {
569
- mrb_sym const name = irep->lv[i].name;
615
+ mrb_sym const name = irep->lv[i];
570
616
  if (name == 0) continue;
571
617
  if (find_filename_index(*syms, *syms_len, name) != -1) continue;
572
618
 
@@ -609,16 +655,14 @@ write_lv_record(mrb_state *mrb, const mrb_irep *irep, uint8_t **start, mrb_sym c
609
655
  int i;
610
656
 
611
657
  for (i = 0; i + 1 < irep->nlocals; ++i) {
612
- if (irep->lv[i].name == 0) {
658
+ if (irep->lv[i] == 0) {
613
659
  cur += uint16_to_bin(RITE_LV_NULL_MARK, cur);
614
- cur += uint16_to_bin(0, cur);
615
660
  }
616
661
  else {
617
- int const sym_idx = find_filename_index(syms, syms_len, irep->lv[i].name);
662
+ int const sym_idx = find_filename_index(syms, syms_len, irep->lv[i]);
618
663
  mrb_assert(sym_idx != -1); /* local variable name must be in syms */
619
664
 
620
665
  cur += uint16_to_bin(sym_idx, cur);
621
- cur += uint16_to_bin(irep->lv[i].r, cur);
622
666
  }
623
667
  }
624
668
 
@@ -632,12 +676,12 @@ write_lv_record(mrb_state *mrb, const mrb_irep *irep, uint8_t **start, mrb_sym c
632
676
  }
633
677
 
634
678
  static size_t
635
- get_lv_record_size(mrb_state *mrb, mrb_irep *irep)
679
+ get_lv_record_size(mrb_state *mrb, const mrb_irep *irep)
636
680
  {
637
681
  size_t ret = 0;
638
682
  int i;
639
683
 
640
- ret += (sizeof(uint16_t) + sizeof(uint16_t)) * (irep->nlocals - 1);
684
+ ret += sizeof(uint16_t) * (irep->nlocals - 1);
641
685
 
642
686
  for (i = 0; i < irep->rlen; ++i) {
643
687
  ret += get_lv_record_size(mrb, irep->reps[i]);
@@ -647,7 +691,7 @@ get_lv_record_size(mrb_state *mrb, mrb_irep *irep)
647
691
  }
648
692
 
649
693
  static size_t
650
- get_lv_section_size(mrb_state *mrb, mrb_irep *irep, mrb_sym const *syms, uint32_t syms_len)
694
+ get_lv_section_size(mrb_state *mrb, const mrb_irep *irep, mrb_sym const *syms, uint32_t syms_len)
651
695
  {
652
696
  size_t ret = 0, i;
653
697
 
@@ -665,7 +709,7 @@ get_lv_section_size(mrb_state *mrb, mrb_irep *irep, mrb_sym const *syms, uint32_
665
709
  }
666
710
 
667
711
  static int
668
- write_section_lv(mrb_state *mrb, mrb_irep *irep, uint8_t *start, mrb_sym const *syms, uint32_t const syms_len)
712
+ write_section_lv(mrb_state *mrb, const mrb_irep *irep, uint8_t *start, mrb_sym const *syms, uint32_t const syms_len)
669
713
  {
670
714
  uint8_t *cur = start;
671
715
  struct rite_section_lv_header *header;
@@ -703,25 +747,20 @@ static int
703
747
  write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t *bin, uint8_t flags)
704
748
  {
705
749
  struct rite_binary_header *header = (struct rite_binary_header *)bin;
706
- uint16_t crc;
707
- uint32_t offset;
708
750
 
709
751
  memcpy(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident));
710
- memcpy(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version));
752
+ memcpy(header->major_version, RITE_BINARY_MAJOR_VER, sizeof(header->major_version));
753
+ memcpy(header->minor_version, RITE_BINARY_MINOR_VER, sizeof(header->minor_version));
711
754
  memcpy(header->compiler_name, RITE_COMPILER_NAME, sizeof(header->compiler_name));
712
755
  memcpy(header->compiler_version, RITE_COMPILER_VERSION, sizeof(header->compiler_version));
713
756
  mrb_assert(binary_size <= UINT32_MAX);
714
757
  uint32_to_bin((uint32_t)binary_size, header->binary_size);
715
758
 
716
- offset = (uint32_t)((&(header->binary_crc[0]) - bin) + sizeof(uint16_t));
717
- crc = calc_crc_16_ccitt(bin + offset, binary_size - offset, 0);
718
- uint16_to_bin(crc, header->binary_crc);
719
-
720
759
  return MRB_DUMP_OK;
721
760
  }
722
761
 
723
762
  static mrb_bool
724
- debug_info_defined_p(mrb_irep *irep)
763
+ debug_info_defined_p(const mrb_irep *irep)
725
764
  {
726
765
  int i;
727
766
 
@@ -733,7 +772,7 @@ debug_info_defined_p(mrb_irep *irep)
733
772
  }
734
773
 
735
774
  static mrb_bool
736
- lv_defined_p(mrb_irep *irep)
775
+ lv_defined_p(const mrb_irep *irep)
737
776
  {
738
777
  int i;
739
778
 
@@ -747,7 +786,7 @@ lv_defined_p(mrb_irep *irep)
747
786
  }
748
787
 
749
788
  static int
750
- dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size)
789
+ dump_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size)
751
790
  {
752
791
  int result = MRB_DUMP_GENERAL_FAILURE;
753
792
  size_t malloc_size;
@@ -835,15 +874,15 @@ error_exit:
835
874
  }
836
875
 
837
876
  int
838
- mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size)
877
+ mrb_dump_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size)
839
878
  {
840
879
  return dump_irep(mrb, irep, flags, bin, bin_size);
841
880
  }
842
881
 
843
- #ifndef MRB_DISABLE_STDIO
882
+ #ifndef MRB_NO_STDIO
844
883
 
845
884
  int
846
- mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE* fp)
885
+ mrb_dump_irep_binary(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE* fp)
847
886
  {
848
887
  uint8_t *bin = NULL;
849
888
  size_t bin_size = 0;
@@ -865,7 +904,7 @@ mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE* fp)
865
904
  }
866
905
 
867
906
  int
868
- mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname)
907
+ mrb_dump_irep_cfunc(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname)
869
908
  {
870
909
  uint8_t *bin = NULL;
871
910
  size_t bin_size = 0, bin_idx = 0;
@@ -884,15 +923,8 @@ mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE *fp, con
884
923
  "#ifdef __cplusplus\n"
885
924
  "extern const uint8_t %s[];\n"
886
925
  "#endif\n"
887
- "const uint8_t\n"
888
- "#if defined __GNUC__\n"
889
- "__attribute__((aligned(%u)))\n"
890
- "#elif defined _MSC_VER\n"
891
- "__declspec(align(%u))\n"
892
- "#endif\n"
893
- "%s[] = {",
894
- initname,
895
- (uint16_t)MRB_DUMP_ALIGNMENT, (uint16_t)MRB_DUMP_ALIGNMENT, initname) < 0) {
926
+ "const uint8_t %s[] = {",
927
+ initname, initname) < 0) {
896
928
  mrb_free(mrb, bin);
897
929
  return MRB_DUMP_WRITE_FAULT;
898
930
  }
@@ -918,4 +950,297 @@ mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE *fp, con
918
950
  return result;
919
951
  }
920
952
 
921
- #endif /* MRB_DISABLE_STDIO */
953
+ static int
954
+ dump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp)
955
+ {
956
+ if (p->tt & IREP_TT_NFLAG) { /* number */
957
+ switch (p->tt) {
958
+ #ifdef MRB_64BIT
959
+ case IREP_TT_INT64:
960
+ if (p->u.i64 < INT32_MIN || INT32_MAX < p->u.i64) {
961
+ fprintf(fp, "{IREP_TT_INT64, {.i64=%" PRId64 "}},\n", p->u.i64);
962
+ }
963
+ else {
964
+ fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", (int32_t)p->u.i64);
965
+ }
966
+ break;
967
+ #endif
968
+ case IREP_TT_INT32:
969
+ fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", p->u.i32);
970
+ break;
971
+ case IREP_TT_FLOAT:
972
+ #ifndef MRB_NO_FLOAT
973
+ if (p->u.f == 0) {
974
+ fprintf(fp, "{IREP_TT_FLOAT, {.f=%#.1f}},\n", p->u.f);
975
+ }
976
+ else {
977
+ fprintf(fp, "{IREP_TT_FLOAT, {.f=" MRB_FLOAT_FMT "}},\n", p->u.f);
978
+ }
979
+ #endif
980
+ break;
981
+ }
982
+ }
983
+ else { /* string */
984
+ int i, len = p->tt>>2;
985
+ const char *s = p->u.str;
986
+ fprintf(fp, "{IREP_TT_STR|(%d<<2), {\"", len);
987
+ for (i=0; i<len; i++) {
988
+ fprintf(fp, "\\x%02x", (int)s[i]&0xff);
989
+ }
990
+ fputs("\"}},\n", fp);
991
+ }
992
+ return MRB_DUMP_OK;
993
+ }
994
+
995
+ static mrb_bool
996
+ sym_name_word_p(const char *name, mrb_int len)
997
+ {
998
+ if (len == 0) return FALSE;
999
+ if (name[0] != '_' && !ISALPHA(name[0])) return FALSE;
1000
+ for (int i = 1; i < len; i++) {
1001
+ if (name[i] != '_' && !ISALNUM(name[i])) return FALSE;
1002
+ }
1003
+ return TRUE;
1004
+ }
1005
+
1006
+ static mrb_bool
1007
+ sym_name_with_equal_p(const char *name, mrb_int len)
1008
+ {
1009
+ return len >= 2 && name[len-1] == '=' && sym_name_word_p(name, len-1);
1010
+ }
1011
+
1012
+ static mrb_bool
1013
+ sym_name_with_question_mark_p(const char *name, mrb_int len)
1014
+ {
1015
+ return len >= 2 && name[len-1] == '?' && sym_name_word_p(name, len-1);
1016
+ }
1017
+
1018
+ static mrb_bool
1019
+ sym_name_with_bang_p(const char *name, mrb_int len)
1020
+ {
1021
+ return len >= 2 && name[len-1] == '!' && sym_name_word_p(name, len-1);
1022
+ }
1023
+
1024
+ static mrb_bool
1025
+ sym_name_ivar_p(const char *name, mrb_int len)
1026
+ {
1027
+ return len >= 2 && name[0] == '@' && sym_name_word_p(name+1, len-1);
1028
+ }
1029
+
1030
+ static mrb_bool
1031
+ sym_name_cvar_p(const char *name, mrb_int len)
1032
+ {
1033
+ return len >= 3 && name[0] == '@' && sym_name_ivar_p(name+1, len-1);
1034
+ }
1035
+
1036
+ static const char*
1037
+ sym_operator_name(const char *sym_name, mrb_int len)
1038
+ {
1039
+ mrb_sym table_size = sizeof(operator_table)/sizeof(struct operator_symbol);
1040
+ if (operator_table[table_size-1].sym_name_len < len) return NULL;
1041
+
1042
+ mrb_sym start, idx;
1043
+ int cmp;
1044
+ const struct operator_symbol *op_sym;
1045
+ for (start = 0; table_size != 0; table_size/=2) {
1046
+ idx = start+table_size/2;
1047
+ op_sym = &operator_table[idx];
1048
+ cmp = (int)len-(int)op_sym->sym_name_len;
1049
+ if (cmp == 0) {
1050
+ cmp = memcmp(sym_name, op_sym->sym_name, len);
1051
+ if (cmp == 0) return op_sym->name;
1052
+ }
1053
+ if (0 < cmp) {
1054
+ start = ++idx;
1055
+ --table_size;
1056
+ }
1057
+ }
1058
+ return NULL;
1059
+ }
1060
+
1061
+ static const char*
1062
+ sym_var_name(mrb_state *mrb, const char *initname, const char *key, int n)
1063
+ {
1064
+ char buf[32];
1065
+ mrb_value s = mrb_str_new_cstr(mrb, initname);
1066
+ mrb_str_cat_lit(mrb, s, "_");
1067
+ mrb_str_cat_cstr(mrb, s, key);
1068
+ mrb_str_cat_lit(mrb, s, "_");
1069
+ snprintf(buf, sizeof(buf), "%d", n);
1070
+ mrb_str_cat_cstr(mrb, s, buf);
1071
+ return RSTRING_PTR(s);
1072
+ }
1073
+
1074
+ static int
1075
+ dump_sym(mrb_state *mrb, mrb_sym sym, const char *var_name, int idx, mrb_value init_syms_code, FILE *fp)
1076
+ {
1077
+ if (sym == 0) return MRB_DUMP_INVALID_ARGUMENT;
1078
+
1079
+ mrb_int len;
1080
+ const char *name = mrb_sym_name_len(mrb, sym, &len), *op_name;
1081
+ if (!name) return MRB_DUMP_INVALID_ARGUMENT;
1082
+ if (sym_name_word_p(name, len)) {
1083
+ fprintf(fp, "MRB_SYM(%s)", name);
1084
+ }
1085
+ else if (sym_name_with_equal_p(name, len)) {
1086
+ fprintf(fp, "MRB_SYM_E(%.*s)", (int)(len-1), name);
1087
+ }
1088
+ else if (sym_name_with_question_mark_p(name, len)) {
1089
+ fprintf(fp, "MRB_SYM_Q(%.*s)", (int)(len-1), name);
1090
+ }
1091
+ else if (sym_name_with_bang_p(name, len)) {
1092
+ fprintf(fp, "MRB_SYM_B(%.*s)", (int)(len-1), name);
1093
+ }
1094
+ else if (sym_name_ivar_p(name, len)) {
1095
+ fprintf(fp, "MRB_IVSYM(%s)", name+1);
1096
+ }
1097
+ else if (sym_name_cvar_p(name, len)) {
1098
+ fprintf(fp, "MRB_CVSYM(%s)", name+2);
1099
+ }
1100
+ else if ((op_name = sym_operator_name(name, len))) {
1101
+ fprintf(fp, "MRB_OPSYM(%s)", op_name);
1102
+ }
1103
+ else {
1104
+ char buf[32];
1105
+ mrb_value name_obj = mrb_str_new(mrb, name, len);
1106
+ mrb_str_cat_lit(mrb, init_syms_code, " ");
1107
+ mrb_str_cat_cstr(mrb, init_syms_code, var_name);
1108
+ snprintf(buf, sizeof(buf), "[%d] = ", idx);
1109
+ mrb_str_cat_cstr(mrb, init_syms_code, buf);
1110
+ mrb_str_cat_lit(mrb, init_syms_code, "mrb_intern_lit(mrb, ");
1111
+ mrb_str_cat_str(mrb, init_syms_code, mrb_str_dump(mrb, name_obj));
1112
+ mrb_str_cat_lit(mrb, init_syms_code, ");\n");
1113
+ fputs("0", fp);
1114
+ }
1115
+ fputs(", ", fp);
1116
+ return MRB_DUMP_OK;
1117
+ }
1118
+
1119
+ static int
1120
+ dump_syms(mrb_state *mrb, const char *name, const char *key, int n, int syms_len, const mrb_sym *syms, mrb_value init_syms_code, FILE *fp)
1121
+ {
1122
+ int ai = mrb_gc_arena_save(mrb);
1123
+ mrb_int code_len = RSTRING_LEN(init_syms_code);
1124
+ const char *var_name = sym_var_name(mrb, name, key, n);
1125
+ fprintf(fp, "mrb_DEFINE_SYMS_VAR(%s, %d, (", var_name, syms_len);
1126
+ for (int i=0; i<syms_len; i++) {
1127
+ dump_sym(mrb, syms[i], var_name, i, init_syms_code, fp);
1128
+ }
1129
+ fputs("), ", fp);
1130
+ if (code_len == RSTRING_LEN(init_syms_code)) fputs("const", fp);
1131
+ fputs(");\n", fp);
1132
+ mrb_gc_arena_restore(mrb, ai);
1133
+ return MRB_DUMP_OK;
1134
+ }
1135
+
1136
+ static int
1137
+ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *name, int n, mrb_value init_syms_code, int *mp)
1138
+ {
1139
+ int i, len;
1140
+ int max = *mp;
1141
+
1142
+ /* dump reps */
1143
+ if (irep->reps) {
1144
+ for (i=0,len=irep->rlen; i<len; i++) {
1145
+ *mp += len;
1146
+ if (dump_irep_struct(mrb, irep->reps[i], flags, fp, name, max+i, init_syms_code, mp) != MRB_DUMP_OK)
1147
+ return MRB_DUMP_INVALID_ARGUMENT;
1148
+ }
1149
+ fprintf(fp, "static const mrb_irep *%s_reps_%d[%d] = {\n", name, n, len);
1150
+ for (i=0,len=irep->rlen; i<len; i++) {
1151
+ fprintf(fp, " &%s_irep_%d,\n", name, max+i);
1152
+ }
1153
+ fputs("};\n", fp);
1154
+ }
1155
+ /* dump pool */
1156
+ if (irep->pool) {
1157
+ len=irep->plen;
1158
+ fprintf(fp, "static const mrb_pool_value %s_pool_%d[%d] = {\n", name, n, len);
1159
+ for (i=0; i<len; i++) {
1160
+ if (dump_pool(mrb, &irep->pool[i], fp) != MRB_DUMP_OK)
1161
+ return MRB_DUMP_INVALID_ARGUMENT;
1162
+ }
1163
+ fputs("};\n", fp);
1164
+ }
1165
+ /* dump syms */
1166
+ if (irep->syms) {
1167
+ dump_syms(mrb, name, "syms", n, irep->slen, irep->syms, init_syms_code, fp);
1168
+ }
1169
+ /* dump iseq */
1170
+ len=irep->ilen+sizeof(struct mrb_irep_catch_handler)*irep->clen;
1171
+ fprintf(fp, "static const mrb_code %s_iseq_%d[%d] = {", name, n, len);
1172
+ for (i=0; i<len; i++) {
1173
+ if (i%20 == 0) fputs("\n", fp);
1174
+ fprintf(fp, "0x%02x,", irep->iseq[i]);
1175
+ }
1176
+ fputs("};\n", fp);
1177
+ /* dump lv */
1178
+ if (irep->lv) {
1179
+ dump_syms(mrb, name, "lv", n, irep->nlocals-1, irep->lv, init_syms_code, fp);
1180
+ }
1181
+ /* dump irep */
1182
+ fprintf(fp, "static const mrb_irep %s_irep_%d = {\n", name, n);
1183
+ fprintf(fp, " %d,%d,%d,\n", irep->nlocals, irep->nregs, irep->clen);
1184
+ fprintf(fp, " MRB_IREP_STATIC,%s_iseq_%d,\n", name, n);
1185
+ if (irep->pool) {
1186
+ fprintf(fp, " %s_pool_%d,", name, n);
1187
+ }
1188
+ else {
1189
+ fputs( " NULL,", fp);
1190
+ }
1191
+ if (irep->syms) {
1192
+ fprintf(fp, "%s_syms_%d,", name, n);
1193
+ }
1194
+ else {
1195
+ fputs( "NULL,", fp);
1196
+ }
1197
+ if (irep->reps) {
1198
+ fprintf(fp, "%s_reps_%d,\n", name, n);
1199
+ }
1200
+ else {
1201
+ fputs( "NULL,\n", fp);
1202
+ }
1203
+ if (irep->lv) {
1204
+ fprintf(fp, " %s_lv_%d,\n", name, n);
1205
+ }
1206
+ else {
1207
+ fputs( " NULL,\t\t\t\t\t/* lv */\n", fp);
1208
+ }
1209
+ fputs( " NULL,\t\t\t\t\t/* debug_info */\n", fp);
1210
+ fprintf(fp, " %d,%d,%d,%d,0\n};\n", irep->ilen, irep->plen, irep->slen, irep->rlen);
1211
+
1212
+ return MRB_DUMP_OK;
1213
+ }
1214
+
1215
+ int
1216
+ mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname)
1217
+ {
1218
+ if (fp == NULL || initname == NULL || initname[0] == '\0') {
1219
+ return MRB_DUMP_INVALID_ARGUMENT;
1220
+ }
1221
+ if (fprintf(fp, "#include <mruby.h>\n"
1222
+ "#include <mruby/proc.h>\n"
1223
+ "#include <mruby/presym.h>\n"
1224
+ "\n") < 0) {
1225
+ return MRB_DUMP_WRITE_FAULT;
1226
+ }
1227
+ fputs("#define mrb_BRACED(...) {__VA_ARGS__}\n", fp);
1228
+ fputs("#define mrb_DEFINE_SYMS_VAR(name, len, syms, qualifier) \\\n", fp);
1229
+ fputs(" static qualifier mrb_sym name[len] = mrb_BRACED syms\n", fp);
1230
+ fputs("\n", fp);
1231
+ mrb_value init_syms_code = mrb_str_new_capa(mrb, 0);
1232
+ int max = 1;
1233
+ int n = dump_irep_struct(mrb, irep, flags, fp, initname, 0, init_syms_code, &max);
1234
+ if (n != MRB_DUMP_OK) return n;
1235
+ fprintf(fp, "#ifdef __cplusplus\nextern const struct RProc %s[];\n#endif\n", initname);
1236
+ fprintf(fp, "const struct RProc %s[] = {{\n", initname);
1237
+ fprintf(fp, "NULL,NULL,MRB_TT_PROC,7,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
1238
+ fputs("static void\n", fp);
1239
+ fprintf(fp, "%s_init_syms(mrb_state *mrb)\n", initname);
1240
+ fputs("{\n", fp);
1241
+ fputs(RSTRING_PTR(init_syms_code), fp);
1242
+ fputs("}\n", fp);
1243
+ return MRB_DUMP_OK;
1244
+ }
1245
+
1246
+ #endif /* MRB_NO_STDIO */