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
@@ -3,36 +3,35 @@
3
3
  spec.author = 'mruby developers'
4
4
  spec.summary = 'mruby compiler library'
5
5
 
6
- lex_def = "#{dir}/core/lex.def"
7
- core_objs = Dir.glob("#{dir}/core/*.c").map { |f|
8
- next nil if build.cxx_exception_enabled? and f =~ /(codegen).c$/
9
- objfile(f.pathmap("#{build_dir}/core/%n"))
10
- }.compact
11
-
12
- if build.cxx_exception_enabled?
13
- core_objs <<
14
- build.compile_as_cxx("#{dir}/core/y.tab.c", "#{build_dir}/core/y.tab.cxx",
15
- objfile("#{build_dir}/y.tab"), ["#{dir}/core"]) <<
16
- build.compile_as_cxx("#{dir}/core/codegen.c", "#{build_dir}/core/codegen.cxx")
17
- else
18
- core_objs << objfile("#{build_dir}/core/y.tab")
19
- file objfile("#{build_dir}/core/y.tab") => "#{dir}/core/y.tab.c" do |t|
20
- cc.run t.name, t.prerequisites.first, [], ["#{dir}/core"]
6
+ objs = %w[codegen y.tab].map do |name|
7
+ src = "#{dir}/core/#{name}.c"
8
+ if build.cxx_exception_enabled?
9
+ build.compile_as_cxx(src)
10
+ else
11
+ objfile(src.pathmap("#{build_dir}/core/%n"))
21
12
  end
22
13
  end
14
+ build.libmruby_core_objs << objs
15
+
16
+ lex_def = "#{dir}/core/lex.def"
23
17
 
24
18
  # Parser
25
19
  file "#{dir}/core/y.tab.c" => ["#{dir}/core/parse.y", lex_def] do |t|
26
20
  yacc.run t.name, t.prerequisites.first
27
- content = File.read(t.name).gsub(/^#line +\d+ +"\K.*$/){$&.relative_path}
28
- File.write(t.name, content)
21
+ replace_line_directive(t.name)
29
22
  end
30
23
 
31
24
  # Lexical analyzer
32
25
  file lex_def => "#{dir}/core/keywords" do |t|
33
26
  gperf.run t.name, t.prerequisites.first
27
+ replace_line_directive(t.name)
34
28
  end
35
29
 
36
- file build.libmruby_core_static => core_objs
37
- build.libmruby << core_objs
30
+ def replace_line_directive(path)
31
+ content = File.read(path).gsub(%r{
32
+ ^\#line\s+\d+\s+"\K.*$ | # #line directive
33
+ ^/\*\s+Command-line:.*\s\K\S+(?=\s+\*/$) # header comment in lex.def
34
+ }x, &:relative_path)
35
+ File.write(path, content)
36
+ end
38
37
  end
@@ -104,7 +104,7 @@ def to_r
104
104
 
105
105
  alias_method :imag, :imaginary
106
106
 
107
- [Fixnum, Float].each do |cls|
107
+ [Integer, Float].each do |cls|
108
108
  [:+, :-, :*, :/, :==].each do |op|
109
109
  cls.instance_eval do
110
110
  original_operator_name = :"__original_operator_#{op}_complex"
@@ -1,10 +1,11 @@
1
1
  #include <mruby.h>
2
2
  #include <mruby/class.h>
3
3
  #include <mruby/numeric.h>
4
+ #include <mruby/presym.h>
4
5
  #include <math.h>
5
6
 
6
- #ifdef MRB_WITHOUT_FLOAT
7
- # error Complex conflicts 'MRB_WITHOUT_FLOAT' configuration in your 'build_config.rb'
7
+ #ifdef MRB_NO_FLOAT
8
+ # error Complex conflicts with 'MRB_NO_FLOAT' configuration
8
9
  #endif
9
10
 
10
11
  struct mrb_complex {
@@ -12,13 +13,13 @@ struct mrb_complex {
12
13
  mrb_float imaginary;
13
14
  };
14
15
 
15
- #ifdef MRB_USE_FLOAT
16
+ #ifdef MRB_USE_FLOAT32
16
17
  #define F(x) x##f
17
18
  #else
18
19
  #define F(x) x
19
20
  #endif
20
21
 
21
- #if defined(MRB_64BIT) || defined(MRB_USE_FLOAT)
22
+ #if defined(MRB_64BIT) || defined(MRB_USE_FLOAT32)
22
23
 
23
24
  #define COMPLEX_USE_ISTRUCT
24
25
  /* use TT_ISTRUCT */
@@ -69,7 +70,7 @@ complex_ptr(mrb_state *mrb, mrb_value v)
69
70
  static mrb_value
70
71
  complex_new(mrb_state *mrb, mrb_float real, mrb_float imaginary)
71
72
  {
72
- struct RClass *c = mrb_class_get(mrb, "Complex");
73
+ struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Complex));
73
74
  struct mrb_complex *p;
74
75
  struct RBasic *comp = complex_alloc(mrb, c, &p);
75
76
  p->real = real;
@@ -122,7 +123,7 @@ complex_to_i(mrb_state *mrb, mrb_value self)
122
123
  if (p->imaginary != 0) {
123
124
  mrb_raisef(mrb, E_RANGE_ERROR, "can't convert %v into Float", self);
124
125
  }
125
- return mrb_int_value(mrb, p->real);
126
+ return mrb_int_value(mrb, (mrb_int)p->real);
126
127
  }
127
128
 
128
129
  static mrb_value
@@ -224,7 +225,7 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
224
225
  #ifdef COMPLEX_USE_ISTRUCT
225
226
  mrb_assert(sizeof(struct mrb_complex) < ISTRUCT_DATA_SIZE);
226
227
  #endif
227
- comp = mrb_define_class(mrb, "Complex", mrb_class_get(mrb, "Numeric"));
228
+ comp = mrb_define_class(mrb, "Complex", mrb_class_get_id(mrb, MRB_SYM(Numeric)));
228
229
  #ifdef COMPLEX_USE_ISTRUCT
229
230
  MRB_SET_INSTANCE_TT(comp, MRB_TT_ISTRUCT);
230
231
  #else
@@ -56,11 +56,11 @@ def assert_complex(real, exp)
56
56
  assert 'Complex#/' do
57
57
  assert_complex Complex(2, 3) / Complex(2, 3) , (1 + 0i)
58
58
  assert_complex Complex(900) / Complex(1) , (900 + 0i)
59
- assert_complex Complex(-2, 9) / Complex(-9, 2), ((36 / 85) - (77i / 85))
60
- assert_complex Complex(9, 8) / 4 , ((9 / 4) + 2i)
59
+ assert_complex Complex(-2, 9) / Complex(-9, 2), ((36.0 / 85) - (77i / 85))
60
+ assert_complex Complex(9, 8) / 4 , ((9.0 / 4) + 2i)
61
61
  assert_complex Complex(20, 9) / 9.8 , (2.0408163265306123 + 0.9183673469387754i)
62
62
  if 1e39.infinite? then
63
- # MRB_USE_FLOAT in effect
63
+ # MRB_USE_FLOAT32 in effect
64
64
  ten = 1e21
65
65
  one = 1e20
66
66
  else
@@ -80,7 +80,7 @@ def assert_complex(real, exp)
80
80
  assert_float Complex(-1).abs, 1
81
81
  assert_float Complex(3.0, -4.0).abs, 5.0
82
82
  if 1e39.infinite? then
83
- # MRB_USE_FLOAT in effect
83
+ # MRB_USE_FLOAT32 in effect
84
84
  exp = 125
85
85
  else
86
86
  exp = 1021
@@ -130,6 +130,7 @@ def initialize(obj=NONE, meth=:each, *args, &block)
130
130
  @feedvalue = nil
131
131
  @stop_exc = false
132
132
  end
133
+
133
134
  attr_accessor :obj, :meth, :args
134
135
  attr_reader :fib
135
136
 
@@ -445,7 +445,7 @@ def (o = Object.new).each
445
445
  }
446
446
  end
447
447
 
448
- assert 'Integral#times' do
448
+ assert 'Integer#times' do
449
449
  a = 3
450
450
  b = a.times
451
451
  c = []
@@ -567,7 +567,7 @@ def (o = Object.new).each
567
567
  # Without initial object
568
568
  passed_args = []
569
569
  enum = Enumerator.produce {|obj| passed_args << obj; (obj || 0).succ }
570
- assert_equal Enumerator, enum.class
570
+ assert_equal Enumerator, enum.class
571
571
  assert_take [1, 2, 3], enum
572
572
  assert_equal [nil, 1, 2], passed_args
573
573
 
@@ -4,7 +4,7 @@
4
4
  spec.summary = 'extensional error handling'
5
5
 
6
6
  if build.cxx_exception_enabled?
7
- @objs << build.compile_as_cxx("#{spec.dir}/src/exception.c", "#{spec.build_dir}/src/exception.cxx")
8
- @objs.delete_if { |v| v == objfile("#{spec.build_dir}/src/exception") }
7
+ objs << build.compile_as_cxx("#{spec.dir}/src/exception.c")
8
+ objs.delete_if { |v| v == objfile("#{spec.build_dir}/src/exception") }
9
9
  end
10
10
  end
@@ -5,14 +5,16 @@
5
5
  #include <mruby/proc.h>
6
6
  #include <mruby/opcode.h>
7
7
  #include <mruby/error.h>
8
+ #include <mruby/presym.h>
8
9
 
10
+ struct REnv *mrb_env_new(mrb_state *mrb, struct mrb_context *c, mrb_callinfo *ci, int nstacks, mrb_value *stack, struct RClass *tc);
9
11
  mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p);
10
12
  mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
11
13
 
12
14
  void mrb_codedump_all(mrb_state*, struct RProc*);
13
15
 
14
16
  static struct RProc*
15
- create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding, const char *file, mrb_int line)
17
+ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value binding, const char *file, mrb_int line)
16
18
  {
17
19
  mrbc_context *cxt;
18
20
  struct mrb_parser_state *p;
@@ -20,7 +22,6 @@ create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding,
20
22
  struct REnv *e;
21
23
  mrb_callinfo *ci; /* callinfo of eval caller */
22
24
  struct RClass *target_class = NULL;
23
- int bidx;
24
25
 
25
26
  if (!mrb_nil_p(binding)) {
26
27
  mrb_raise(mrb, E_ARGUMENT_ERROR, "Binding of eval must be nil.");
@@ -39,7 +40,7 @@ create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding,
39
40
 
40
41
  /* only occur when memory ran out */
41
42
  if (!p) {
42
- mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state.");
43
+ mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state (out of memory)");
43
44
  }
44
45
 
45
46
  if (0 < p->nerr) {
@@ -79,28 +80,19 @@ create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding,
79
80
  target_class = MRB_PROC_TARGET_CLASS(ci->proc);
80
81
  }
81
82
  if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) {
82
- if (ci->env) {
83
- e = ci->env;
83
+ if ((e = mrb_vm_ci_env(ci)) != NULL) {
84
+ /* do nothing, because e is assigned already */
84
85
  }
85
86
  else {
86
- e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV,
87
- (struct RClass*)target_class);
88
- e->mid = ci->mid;
89
- e->stack = ci[1].stackent;
90
- e->cxt = mrb->c;
91
- MRB_ENV_SET_LEN(e, ci->proc->body.irep->nlocals);
92
- bidx = ci->argc;
93
- if (ci->argc < 0) bidx = 2;
94
- else bidx += 1;
95
- MRB_ENV_SET_BIDX(e, bidx);
96
- ci->env = e;
87
+ e = mrb_env_new(mrb, mrb->c, ci, ci->proc->body.irep->nlocals, ci->stack, target_class);
88
+ ci->u.env = e;
97
89
  }
98
90
  proc->e.env = e;
99
91
  proc->flags |= MRB_PROC_ENVSET;
100
92
  mrb_field_write_barrier(mrb, (struct RBasic*)proc, (struct RBasic*)e);
101
93
  }
102
94
  proc->upper = ci->proc;
103
- mrb->c->ci->target_class = target_class;
95
+ mrb_vm_ci_target_class_set(mrb->c->ci, target_class);
104
96
  /* mrb_codedump_all(mrb, proc); */
105
97
 
106
98
  mrb_parser_free(p);
@@ -124,17 +116,17 @@ exec_irep(mrb_state *mrb, mrb_value self, struct RProc *proc)
124
116
  return ret;
125
117
  }
126
118
  /* clear block */
127
- mrb->c->stack[1] = mrb_nil_value();
119
+ mrb->c->ci->stack[1] = mrb_nil_value();
128
120
  return mrb_exec_irep(mrb, self, proc);
129
121
  }
130
122
 
131
123
  static mrb_value
132
124
  f_eval(mrb_state *mrb, mrb_value self)
133
125
  {
134
- char *s;
126
+ const char *s;
135
127
  mrb_int len;
136
128
  mrb_value binding = mrb_nil_value();
137
- char *file = NULL;
129
+ const char *file = NULL;
138
130
  mrb_int line = 1;
139
131
  struct RProc *proc;
140
132
 
@@ -149,14 +141,14 @@ static mrb_value
149
141
  f_instance_eval(mrb_state *mrb, mrb_value self)
150
142
  {
151
143
  mrb_value b;
152
- mrb_int argc; mrb_value *argv;
144
+ mrb_int argc; const mrb_value *argv;
153
145
 
154
146
  mrb_get_args(mrb, "*!&", &argv, &argc, &b);
155
147
 
156
148
  if (mrb_nil_p(b)) {
157
- char *s;
149
+ const char *s;
158
150
  mrb_int len;
159
- char *file = NULL;
151
+ const char *file = NULL;
160
152
  mrb_int line = 1;
161
153
  mrb_value cv;
162
154
  struct RProc *proc;
@@ -166,7 +158,7 @@ f_instance_eval(mrb_state *mrb, mrb_value self)
166
158
  proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line);
167
159
  MRB_PROC_SET_TARGET_CLASS(proc, mrb_class_ptr(cv));
168
160
  mrb_assert(!MRB_PROC_CFUNC_P(proc));
169
- mrb->c->ci->target_class = mrb_class_ptr(cv);
161
+ mrb_vm_ci_target_class_set(mrb->c->ci, mrb_class_ptr(cv));
170
162
  return exec_irep(mrb, self, proc);
171
163
  }
172
164
  else {
@@ -179,7 +171,7 @@ void
179
171
  mrb_mruby_eval_gem_init(mrb_state* mrb)
180
172
  {
181
173
  mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3));
182
- mrb_define_method(mrb, mrb_class_get(mrb, "BasicObject"), "instance_eval", f_instance_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK());
174
+ mrb_define_method(mrb, mrb_class_get_id(mrb, MRB_SYM(BasicObject)), "instance_eval", f_instance_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK());
183
175
  }
184
176
 
185
177
  void
@@ -93,7 +93,6 @@ fiber_init(mrb_state *mrb, mrb_value self)
93
93
  }
94
94
  c->stbase = (mrb_value *)mrb_malloc(mrb, slen*sizeof(mrb_value));
95
95
  c->stend = c->stbase + slen;
96
- c->stack = c->stbase;
97
96
 
98
97
  #ifdef MRB_NAN_BOXING
99
98
  {
@@ -110,20 +109,19 @@ fiber_init(mrb_state *mrb, mrb_value self)
110
109
  #endif
111
110
 
112
111
  /* copy receiver from a block */
113
- c->stack[0] = mrb->c->stack[0];
112
+ c->stbase[0] = mrb->c->ci->stack[0];
114
113
 
115
114
  /* initialize callinfo stack */
116
115
  c->cibase = (mrb_callinfo *)mrb_calloc(mrb, FIBER_CI_INIT_SIZE, sizeof(mrb_callinfo));
117
116
  c->ciend = c->cibase + FIBER_CI_INIT_SIZE;
118
117
  c->ci = c->cibase;
119
- c->ci->stackent = c->stack;
120
118
 
121
119
  /* adjust return callinfo */
122
120
  ci = c->ci;
123
- ci->target_class = MRB_PROC_TARGET_CLASS(p);
124
- ci->proc = p;
121
+ mrb_vm_ci_target_class_set(ci, MRB_PROC_TARGET_CLASS(p));
122
+ mrb_vm_ci_proc_set(ci, p);
125
123
  mrb_field_write_barrier(mrb, (struct RBasic*)mrb_obj_ptr(self), (struct RBasic*)p);
126
- ci->pc = p->body.irep->iseq;
124
+ ci->stack = c->stbase;
127
125
  ci[1] = ci[0];
128
126
  c->ci++; /* push dummy callinfo */
129
127
 
@@ -154,7 +152,7 @@ fiber_result(mrb_state *mrb, const mrb_value *a, mrb_int len)
154
152
  }
155
153
 
156
154
  /* mark return from context modifying method */
157
- #define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL
155
+ #define MARK_CONTEXT_MODIFY(c) (c)->ci->u.target_class = NULL
158
156
 
159
157
  static void
160
158
  fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c)
@@ -214,21 +212,27 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
214
212
  mrb_raise(mrb, E_FIBER_ERROR, "double resume (current)");
215
213
  }
216
214
  mrb_stack_extend(mrb, len+2); /* for receiver and (optional) block */
217
- b = c->stack+1;
215
+ b = c->stbase+1;
218
216
  e = b + len;
219
217
  while (b<e) {
220
218
  *b++ = *a++;
221
219
  }
220
+ if (vmexec) {
221
+ c->ci--; /* pop dummy callinfo */
222
+ }
222
223
  c->cibase->argc = (int)len;
223
- value = c->stack[0] = MRB_PROC_ENV(c->ci->proc)->stack[0];
224
+ value = c->stbase[0] = MRB_PROC_ENV(c->cibase->proc)->stack[0];
224
225
  }
225
226
  else {
226
227
  value = fiber_result(mrb, a, len);
228
+ if (vmexec) {
229
+ c->ci->stack[c->ci[1].acc] = value;
230
+ }
227
231
  }
228
232
 
229
233
  if (vmexec) {
230
234
  c->vmexec = TRUE;
231
- value = mrb_vm_exec(mrb, c->ci[-1].proc, c->ci->pc);
235
+ value = mrb_vm_exec(mrb, c->ci->proc, c->ci->pc);
232
236
  mrb->c = old_c;
233
237
  }
234
238
  else {
@@ -255,7 +259,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
255
259
  static mrb_value
256
260
  fiber_resume(mrb_state *mrb, mrb_value self)
257
261
  {
258
- mrb_value *a;
262
+ const mrb_value *a;
259
263
  mrb_int len;
260
264
  mrb_bool vmexec = FALSE;
261
265
 
@@ -315,7 +319,7 @@ static mrb_value
315
319
  fiber_transfer(mrb_state *mrb, mrb_value self)
316
320
  {
317
321
  struct mrb_context *c = fiber_check(mrb, self);
318
- mrb_value* a;
322
+ const mrb_value* a;
319
323
  mrb_int len;
320
324
 
321
325
  fiber_check_cfunc(mrb, mrb->c);
@@ -354,6 +358,7 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
354
358
  if (c->vmexec) {
355
359
  c->vmexec = FALSE;
356
360
  mrb->c->ci->acc = CI_ACC_RESUMED;
361
+ c->ci--; /* pop callinfo for yield */
357
362
  }
358
363
  MARK_CONTEXT_MODIFY(mrb->c);
359
364
  return fiber_result(mrb, a, len);
@@ -374,7 +379,7 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
374
379
  static mrb_value
375
380
  fiber_yield(mrb_state *mrb, mrb_value self)
376
381
  {
377
- mrb_value *a;
382
+ const mrb_value *a;
378
383
  mrb_int len;
379
384
 
380
385
  mrb_get_args(mrb, "*!", &a, &len);
@@ -22,7 +22,8 @@
22
22
  static mrb_value
23
23
  hash_values_at(mrb_state *mrb, mrb_value hash)
24
24
  {
25
- mrb_value *argv, result;
25
+ const mrb_value *argv;
26
+ mrb_value result;
26
27
  mrb_int argc, i;
27
28
  int ai;
28
29
 
@@ -49,7 +50,8 @@ hash_values_at(mrb_state *mrb, mrb_value hash)
49
50
  static mrb_value
50
51
  hash_slice(mrb_state *mrb, mrb_value hash)
51
52
  {
52
- mrb_value *argv, result;
53
+ const mrb_value *argv;
54
+ mrb_value result;
53
55
  mrb_int argc, i;
54
56
 
55
57
  mrb_get_args(mrb, "*", &argv, &argc);
@@ -67,6 +69,31 @@ hash_slice(mrb_state *mrb, mrb_value hash)
67
69
  return result;
68
70
  }
69
71
 
72
+ /*
73
+ * call-seq:
74
+ * hsh.except(*keys) -> a_hash
75
+ *
76
+ * Returns a hash excluding the given keys and their values.
77
+ *
78
+ * h = { a: 100, b: 200, c: 300 }
79
+ * h.except(:a) #=> {:b=>200, :c=>300}
80
+ * h.except(:b, :c, :d) #=> {:a=>100}
81
+ */
82
+ static mrb_value
83
+ hash_except(mrb_state *mrb, mrb_value hash)
84
+ {
85
+ const mrb_value *argv;
86
+ mrb_value result;
87
+ mrb_int argc, i;
88
+
89
+ mrb_get_args(mrb, "*", &argv, &argc);
90
+ result = mrb_hash_dup(mrb, hash);
91
+ for (i = 0; i < argc; i++) {
92
+ mrb_hash_delete_key(mrb, result, argv[i]);
93
+ }
94
+ return result;
95
+ }
96
+
70
97
  void
71
98
  mrb_mruby_hash_ext_gem_init(mrb_state *mrb)
72
99
  {
@@ -75,6 +102,7 @@ mrb_mruby_hash_ext_gem_init(mrb_state *mrb)
75
102
  h = mrb->hash_class;
76
103
  mrb_define_method(mrb, h, "values_at", hash_values_at, MRB_ARGS_ANY());
77
104
  mrb_define_method(mrb, h, "slice", hash_slice, MRB_ARGS_ANY());
105
+ mrb_define_method(mrb, h, "except", hash_except, MRB_ARGS_ANY());
78
106
  }
79
107
 
80
108
  void