debase-ruby_core_source 0.10.9 → 0.10.13

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 (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +1 -1
  4. data/Rakefile +6 -3
  5. data/debase-ruby_core_source.gemspec +2 -1
  6. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/addr2line.h +2 -3
  7. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/builtin.h +17 -2
  8. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/ccan/build_assert/build_assert.h +0 -0
  9. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/ccan/check_type/check_type.h +0 -0
  10. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/ccan/container_of/container_of.h +0 -0
  11. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/ccan/list/list.h +0 -0
  12. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/ccan/str/str.h +0 -0
  13. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/constant.h +10 -5
  14. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/debug_counter.h +127 -48
  15. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/dln.h +3 -18
  16. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/encindex.h +3 -2
  17. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/eval_intern.h +16 -7
  18. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/gc.h +13 -2
  19. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/hrtime.h +0 -0
  20. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/id.h +0 -0
  21. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/id_table.h +2 -0
  22. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/insns.inc +0 -4
  23. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/insns_info.inc +323 -536
  24. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/array.h +119 -0
  25. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/bignum.h +246 -0
  26. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/bits.h +566 -0
  27. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/class.h +174 -0
  28. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/compar.h +50 -0
  29. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/compile.h +32 -0
  30. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/compilers.h +108 -0
  31. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/complex.h +29 -0
  32. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/cont.h +25 -0
  33. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/dir.h +17 -0
  34. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/enc.h +20 -0
  35. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/encoding.h +28 -0
  36. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/enum.h +19 -0
  37. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/enumerator.h +22 -0
  38. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/error.h +124 -0
  39. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/eval.h +33 -0
  40. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/file.h +39 -0
  41. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/fixnum.h +185 -0
  42. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/gc.h +161 -0
  43. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/hash.h +241 -0
  44. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/imemo.h +243 -0
  45. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/inits.h +51 -0
  46. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/io.h +35 -0
  47. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/load.h +19 -0
  48. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/loadpath.h +17 -0
  49. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/math.h +24 -0
  50. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/missing.h +19 -0
  51. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/numeric.h +255 -0
  52. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/object.h +83 -0
  53. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/parse.h +23 -0
  54. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/proc.h +33 -0
  55. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/process.h +136 -0
  56. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/random.h +17 -0
  57. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/range.h +41 -0
  58. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/rational.h +71 -0
  59. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/re.h +29 -0
  60. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/sanitizers.h +191 -0
  61. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/scheduler.h +44 -0
  62. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/serial.h +24 -0
  63. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/signal.h +22 -0
  64. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/static_assert.h +17 -0
  65. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/string.h +140 -0
  66. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/struct.h +154 -0
  67. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/symbol.h +41 -0
  68. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/thread.h +54 -0
  69. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/time.h +35 -0
  70. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/transcode.h +21 -0
  71. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/util.h +31 -0
  72. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/variable.h +84 -0
  73. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/vm.h +136 -0
  74. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/warnings.h +17 -0
  75. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal.h +107 -0
  76. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/iseq.h +11 -18
  77. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/known_errors.inc +0 -0
  78. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/method.h +21 -8
  79. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/mjit.h +89 -48
  80. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/mjit_compile.inc +2746 -2288
  81. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/node.h +32 -24
  82. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/node_name.inc +2 -2
  83. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/opt_sc.inc +0 -0
  84. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/optinsn.inc +0 -0
  85. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/optunifs.inc +0 -0
  86. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/parse.h +1 -0
  87. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/probes_helper.h +2 -0
  88. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ractor_core.h +343 -0
  89. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/regenc.h +0 -0
  90. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/regint.h +1 -1
  91. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/regparse.h +0 -0
  92. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/revision.h +2 -0
  93. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ruby_assert.h +15 -0
  94. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ruby_atomic.h +23 -0
  95. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/siphash.h +0 -0
  96. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/symbol.h +4 -4
  97. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/thread_pthread.h +45 -5
  98. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/thread_win32.h +28 -3
  99. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/timev.h +1 -0
  100. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/transcode_data.h +2 -3
  101. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/transient_heap.h +6 -3
  102. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/variable.h +22 -0
  103. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/version.h +23 -11
  104. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/vm.inc +707 -671
  105. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/vm_call_iseq_optimized.inc +93 -86
  106. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_callinfo.h +456 -0
  107. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/vm_core.h +262 -194
  108. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_debug.h +116 -0
  109. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/vm_exec.h +9 -6
  110. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/vm_insnhelper.h +28 -26
  111. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/vm_opts.h +6 -5
  112. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_sync.h +136 -0
  113. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.0.0-p0}/vmtc.inc +0 -4
  114. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/addr2line.h +2 -3
  115. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/builtin.h +83 -0
  116. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/ccan/build_assert/build_assert.h +13 -13
  117. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/ccan/check_type/check_type.h +17 -17
  118. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/ccan/container_of/container_of.h +63 -63
  119. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/ccan/list/list.h +262 -262
  120. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/ccan/str/str.h +4 -4
  121. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/constant.h +10 -9
  122. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/darray.h +198 -0
  123. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/debug_counter.h +137 -48
  124. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/dln.h +3 -23
  125. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/encindex.h +3 -2
  126. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/eval_intern.h +34 -41
  127. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/gc.h +24 -11
  128. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/hrtime.h +9 -9
  129. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/id.h +4 -3
  130. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/id_table.h +3 -1
  131. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/insns.inc +6 -8
  132. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/insns_info.inc +1907 -2543
  133. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/array.h +113 -0
  134. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/bignum.h +246 -0
  135. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/bits.h +565 -0
  136. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/class.h +188 -0
  137. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/compar.h +49 -0
  138. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/compile.h +35 -0
  139. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/compilers.h +107 -0
  140. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/complex.h +29 -0
  141. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/cont.h +24 -0
  142. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/dir.h +16 -0
  143. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/enc.h +19 -0
  144. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/encoding.h +30 -0
  145. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/enum.h +18 -0
  146. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/enumerator.h +21 -0
  147. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/error.h +191 -0
  148. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/eval.h +32 -0
  149. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/file.h +38 -0
  150. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/fixnum.h +184 -0
  151. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/gc.h +175 -0
  152. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/hash.h +243 -0
  153. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/imemo.h +243 -0
  154. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/inits.h +50 -0
  155. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/io.h +38 -0
  156. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/load.h +18 -0
  157. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/loadpath.h +16 -0
  158. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/math.h +23 -0
  159. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/missing.h +18 -0
  160. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/numeric.h +271 -0
  161. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/object.h +83 -0
  162. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/parse.h +23 -0
  163. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/proc.h +32 -0
  164. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/process.h +137 -0
  165. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/random.h +16 -0
  166. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/range.h +40 -0
  167. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/rational.h +72 -0
  168. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/re.h +30 -0
  169. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/sanitizers.h +190 -0
  170. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/serial.h +23 -0
  171. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/signal.h +21 -0
  172. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/static_assert.h +16 -0
  173. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/string.h +141 -0
  174. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/struct.h +153 -0
  175. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/symbol.h +40 -0
  176. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/thread.h +53 -0
  177. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/time.h +34 -0
  178. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/transcode.h +20 -0
  179. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/util.h +27 -0
  180. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/variable.h +83 -0
  181. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/vm.h +132 -0
  182. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal/warnings.h +16 -0
  183. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/internal.h +109 -0
  184. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/iseq.h +44 -35
  185. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/known_errors.inc +0 -0
  186. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/method.h +21 -4
  187. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/mjit.h +231 -0
  188. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/mjit_compile.inc +3322 -2940
  189. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/node.h +39 -23
  190. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/node_name.inc +210 -0
  191. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/opt_sc.inc +0 -2
  192. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/optinsn.inc +7 -7
  193. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/optunifs.inc +1 -1
  194. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/parse.h +9 -5
  195. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/probes_helper.h +9 -7
  196. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/ractor_core.h +346 -0
  197. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/regenc.h +8 -8
  198. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/regint.h +16 -12
  199. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/regparse.h +2 -2
  200. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/revision.h +2 -0
  201. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/ruby_assert.h +14 -0
  202. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/ruby_atomic.h +23 -0
  203. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/siphash.h +0 -0
  204. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/symbol.h +14 -14
  205. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/thread_pthread.h +45 -5
  206. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/thread_win32.h +30 -5
  207. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/timev.h +1 -0
  208. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/transcode_data.h +49 -50
  209. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/transient_heap.h +6 -3
  210. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/variable.h +21 -0
  211. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/version.h +15 -4
  212. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/vm.inc +1033 -887
  213. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/vm_call_iseq_optimized.inc +244 -0
  214. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/vm_callinfo.h +454 -0
  215. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/vm_core.h +508 -362
  216. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/vm_debug.h +119 -0
  217. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/vm_exec.h +22 -18
  218. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview3 → ruby-3.1.0-preview1}/vm_insnhelper.h +42 -32
  219. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/vm_opts.h +8 -5
  220. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/vm_sync.h +137 -0
  221. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.1.0-preview1}/vmtc.inc +6 -8
  222. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/yjit.h +63 -0
  223. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/yjit_asm.h +392 -0
  224. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/yjit_codegen.h +19 -0
  225. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/yjit_core.h +302 -0
  226. data/lib/debase/ruby_core_source/ruby-3.1.0-preview1/yjit_iface.h +38 -0
  227. data/lib/debase/ruby_core_source/version.rb +1 -1
  228. data/lib/debase/ruby_core_source.rb +0 -2
  229. metadata +240 -110
  230. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/internal.h +0 -2682
  231. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/revision.h +0 -2
  232. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/ruby_assert.h +0 -15
  233. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/ruby_atomic.h +0 -244
  234. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/vm_call_iseq_optimized.inc +0 -237
  235. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/vm_debug.h +0 -34
  236. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/internal.h +0 -2657
  237. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/mjit.h +0 -175
  238. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/node_name.inc +0 -208
  239. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/revision.h +0 -2
  240. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/ruby_assert.h +0 -15
  241. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/ruby_atomic.h +0 -244
  242. data/lib/debase/ruby_core_source/ruby-2.7.0-preview3/vm_debug.h +0 -34
@@ -79,7 +79,7 @@ INSN_ENTRY(getlocal)
79
79
 
80
80
  /* ### Instruction preambles. ### */
81
81
  if (! leaf) ADD_PC(INSN_ATTR(width));
82
- SETUP_CANARY();
82
+ SETUP_CANARY(leaf);
83
83
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
84
84
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
85
85
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level);
@@ -97,9 +97,11 @@ INSN_ENTRY(getlocal)
97
97
 
98
98
  /* ### Instruction trailers. ### */
99
99
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
100
- CHECK_CANARY();
100
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
101
101
  INC_SP(INSN_ATTR(sp_inc));
102
102
  TOPN(0) = val;
103
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
104
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
103
105
  if (leaf) ADD_PC(INSN_ATTR(width));
104
106
  # undef INSN_ATTR
105
107
 
@@ -123,7 +125,7 @@ INSN_ENTRY(setlocal)
123
125
 
124
126
  /* ### Instruction preambles. ### */
125
127
  if (! leaf) ADD_PC(INSN_ATTR(width));
126
- SETUP_CANARY();
128
+ SETUP_CANARY(leaf);
127
129
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
128
130
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
129
131
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level);
@@ -136,12 +138,12 @@ INSN_ENTRY(setlocal)
136
138
  RB_DEBUG_COUNTER_INC(lvar_set);
137
139
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);
138
140
  }
139
- # line 140 "vm.inc"
141
+ # line 142 "vm.inc"
140
142
  # undef NAME_OF_CURRENT_INSN
141
143
 
142
144
  /* ### Instruction trailers. ### */
143
145
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
144
- CHECK_CANARY();
146
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
145
147
  INC_SP(INSN_ATTR(sp_inc));
146
148
  if (leaf) ADD_PC(INSN_ATTR(width));
147
149
  # undef INSN_ATTR
@@ -166,7 +168,7 @@ INSN_ENTRY(getblockparam)
166
168
 
167
169
  /* ### Instruction preambles. ### */
168
170
  if (! leaf) ADD_PC(INSN_ATTR(width));
169
- SETUP_CANARY();
171
+ SETUP_CANARY(leaf);
170
172
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
171
173
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
172
174
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level);
@@ -189,14 +191,16 @@ INSN_ENTRY(getblockparam)
189
191
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
190
192
  }
191
193
  }
192
- # line 193 "vm.inc"
194
+ # line 195 "vm.inc"
193
195
  # undef NAME_OF_CURRENT_INSN
194
196
 
195
197
  /* ### Instruction trailers. ### */
196
198
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
197
- CHECK_CANARY();
199
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
198
200
  INC_SP(INSN_ATTR(sp_inc));
199
201
  TOPN(0) = val;
202
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
203
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
200
204
  if (leaf) ADD_PC(INSN_ATTR(width));
201
205
  # undef INSN_ATTR
202
206
 
@@ -220,7 +224,7 @@ INSN_ENTRY(setblockparam)
220
224
 
221
225
  /* ### Instruction preambles. ### */
222
226
  if (! leaf) ADD_PC(INSN_ATTR(width));
223
- SETUP_CANARY();
227
+ SETUP_CANARY(leaf);
224
228
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
225
229
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
226
230
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level);
@@ -238,12 +242,12 @@ INSN_ENTRY(setblockparam)
238
242
 
239
243
  VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
240
244
  }
241
- # line 242 "vm.inc"
245
+ # line 246 "vm.inc"
242
246
  # undef NAME_OF_CURRENT_INSN
243
247
 
244
248
  /* ### Instruction trailers. ### */
245
249
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
246
- CHECK_CANARY();
250
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
247
251
  INC_SP(INSN_ATTR(sp_inc));
248
252
  if (leaf) ADD_PC(INSN_ATTR(width));
249
253
  # undef INSN_ATTR
@@ -268,7 +272,7 @@ INSN_ENTRY(getblockparamproxy)
268
272
 
269
273
  /* ### Instruction preambles. ### */
270
274
  if (! leaf) ADD_PC(INSN_ATTR(width));
271
- SETUP_CANARY();
275
+ SETUP_CANARY(leaf);
272
276
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
273
277
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
274
278
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level);
@@ -312,14 +316,16 @@ INSN_ENTRY(getblockparamproxy)
312
316
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
313
317
  }
314
318
  }
315
- # line 316 "vm.inc"
319
+ # line 320 "vm.inc"
316
320
  # undef NAME_OF_CURRENT_INSN
317
321
 
318
322
  /* ### Instruction trailers. ### */
319
323
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
320
- CHECK_CANARY();
324
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
321
325
  INC_SP(INSN_ATTR(sp_inc));
322
326
  TOPN(0) = val;
327
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
328
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
323
329
  if (leaf) ADD_PC(INSN_ATTR(width));
324
330
  # undef INSN_ATTR
325
331
 
@@ -343,7 +349,7 @@ INSN_ENTRY(getspecial)
343
349
 
344
350
  /* ### Instruction preambles. ### */
345
351
  if (! leaf) ADD_PC(INSN_ATTR(width));
346
- SETUP_CANARY();
352
+ SETUP_CANARY(leaf);
347
353
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
348
354
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key);
349
355
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, type);
@@ -354,14 +360,16 @@ INSN_ENTRY(getspecial)
354
360
  {
355
361
  val = vm_getspecial(ec, GET_LEP(), key, type);
356
362
  }
357
- # line 358 "vm.inc"
363
+ # line 364 "vm.inc"
358
364
  # undef NAME_OF_CURRENT_INSN
359
365
 
360
366
  /* ### Instruction trailers. ### */
361
367
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
362
- CHECK_CANARY();
368
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
363
369
  INC_SP(INSN_ATTR(sp_inc));
364
370
  TOPN(0) = val;
371
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
372
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
365
373
  if (leaf) ADD_PC(INSN_ATTR(width));
366
374
  # undef INSN_ATTR
367
375
 
@@ -384,7 +392,7 @@ INSN_ENTRY(setspecial)
384
392
 
385
393
  /* ### Instruction preambles. ### */
386
394
  if (! leaf) ADD_PC(INSN_ATTR(width));
387
- SETUP_CANARY();
395
+ SETUP_CANARY(leaf);
388
396
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
389
397
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key);
390
398
 
@@ -394,12 +402,12 @@ INSN_ENTRY(setspecial)
394
402
  {
395
403
  lep_svar_set(ec, GET_LEP(), key, obj);
396
404
  }
397
- # line 398 "vm.inc"
405
+ # line 406 "vm.inc"
398
406
  # undef NAME_OF_CURRENT_INSN
399
407
 
400
408
  /* ### Instruction trailers. ### */
401
409
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
402
- CHECK_CANARY();
410
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
403
411
  INC_SP(INSN_ATTR(sp_inc));
404
412
  if (leaf) ADD_PC(INSN_ATTR(width));
405
413
  # undef INSN_ATTR
@@ -417,14 +425,14 @@ INSN_ENTRY(getinstancevariable)
417
425
 
418
426
  /* ### Declare and assign variables. ### */
419
427
  ID id = (ID)GET_OPERAND(1);
420
- IC ic = (IC)GET_OPERAND(2);
428
+ IVC ic = (IVC)GET_OPERAND(2);
421
429
  # define INSN_ATTR(x) attr_ ## x ## _getinstancevariable(id, ic)
422
430
  bool leaf = INSN_ATTR(leaf);
423
431
  VALUE val;
424
432
 
425
433
  /* ### Instruction preambles. ### */
426
434
  if (! leaf) ADD_PC(INSN_ATTR(width));
427
- SETUP_CANARY();
435
+ SETUP_CANARY(leaf);
428
436
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
429
437
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
430
438
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic);
@@ -433,16 +441,18 @@ INSN_ENTRY(getinstancevariable)
433
441
  # define NAME_OF_CURRENT_INSN getinstancevariable
434
442
  # line 215 "insns.def"
435
443
  {
436
- val = vm_getinstancevariable(GET_SELF(), id, ic);
444
+ val = vm_getinstancevariable(GET_ISEQ(), GET_SELF(), id, ic);
437
445
  }
438
- # line 439 "vm.inc"
446
+ # line 447 "vm.inc"
439
447
  # undef NAME_OF_CURRENT_INSN
440
448
 
441
449
  /* ### Instruction trailers. ### */
442
450
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
443
- CHECK_CANARY();
451
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
444
452
  INC_SP(INSN_ATTR(sp_inc));
445
453
  TOPN(0) = val;
454
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
455
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
446
456
  if (leaf) ADD_PC(INSN_ATTR(width));
447
457
  # undef INSN_ATTR
448
458
 
@@ -459,14 +469,14 @@ INSN_ENTRY(setinstancevariable)
459
469
 
460
470
  /* ### Declare and assign variables. ### */
461
471
  ID id = (ID)GET_OPERAND(1);
462
- IC ic = (IC)GET_OPERAND(2);
472
+ IVC ic = (IVC)GET_OPERAND(2);
463
473
  # define INSN_ATTR(x) attr_ ## x ## _setinstancevariable(id, ic)
464
474
  bool leaf = INSN_ATTR(leaf);
465
475
  VALUE val = TOPN(0);
466
476
 
467
477
  /* ### Instruction preambles. ### */
468
478
  if (! leaf) ADD_PC(INSN_ATTR(width));
469
- SETUP_CANARY();
479
+ SETUP_CANARY(leaf);
470
480
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
471
481
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
472
482
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic);
@@ -475,14 +485,14 @@ INSN_ENTRY(setinstancevariable)
475
485
  # define NAME_OF_CURRENT_INSN setinstancevariable
476
486
  # line 226 "insns.def"
477
487
  {
478
- vm_setinstancevariable(GET_SELF(), id, val, ic);
488
+ vm_setinstancevariable(GET_ISEQ(), GET_SELF(), id, val, ic);
479
489
  }
480
- # line 481 "vm.inc"
490
+ # line 491 "vm.inc"
481
491
  # undef NAME_OF_CURRENT_INSN
482
492
 
483
493
  /* ### Instruction trailers. ### */
484
494
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
485
- CHECK_CANARY();
495
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
486
496
  INC_SP(INSN_ATTR(sp_inc));
487
497
  if (leaf) ADD_PC(INSN_ATTR(width));
488
498
  # undef INSN_ATTR
@@ -491,7 +501,7 @@ INSN_ENTRY(setinstancevariable)
491
501
  END_INSN(setinstancevariable);
492
502
  }
493
503
 
494
- /* insn getclassvariable(id)()(val) */
504
+ /* insn getclassvariable(id, ic)()(val) */
495
505
  INSN_ENTRY(getclassvariable)
496
506
  {
497
507
  /* ### Declare that we have just entered into an instruction. ### */
@@ -500,30 +510,36 @@ INSN_ENTRY(getclassvariable)
500
510
 
501
511
  /* ### Declare and assign variables. ### */
502
512
  ID id = (ID)GET_OPERAND(1);
503
- # define INSN_ATTR(x) attr_ ## x ## _getclassvariable(id)
513
+ IVC ic = (IVC)GET_OPERAND(2);
514
+ # define INSN_ATTR(x) attr_ ## x ## _getclassvariable(id, ic)
504
515
  bool leaf = INSN_ATTR(leaf);
505
516
  VALUE val;
506
517
 
507
518
  /* ### Instruction preambles. ### */
508
519
  if (! leaf) ADD_PC(INSN_ATTR(width));
509
- SETUP_CANARY();
520
+ SETUP_CANARY(leaf);
510
521
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
511
522
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
523
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic);
512
524
 
513
525
  /* ### Here we do the instruction body. ### */
514
526
  # define NAME_OF_CURRENT_INSN getclassvariable
515
527
  # line 238 "insns.def"
516
528
  {
517
- val = rb_cvar_get(vm_get_cvar_base(vm_get_cref(GET_EP()), GET_CFP()), id);
529
+ rb_cref_t * cref = vm_get_cref(GET_EP());
530
+ rb_control_frame_t *cfp = GET_CFP();
531
+ val = vm_getclassvariable(GET_ISEQ(), cref, cfp, id, (ICVARC)ic);
518
532
  }
519
- # line 520 "vm.inc"
533
+ # line 534 "vm.inc"
520
534
  # undef NAME_OF_CURRENT_INSN
521
535
 
522
536
  /* ### Instruction trailers. ### */
523
537
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
524
- CHECK_CANARY();
538
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
525
539
  INC_SP(INSN_ATTR(sp_inc));
526
540
  TOPN(0) = val;
541
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
542
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
527
543
  if (leaf) ADD_PC(INSN_ATTR(width));
528
544
  # undef INSN_ATTR
529
545
 
@@ -531,7 +547,7 @@ INSN_ENTRY(getclassvariable)
531
547
  END_INSN(getclassvariable);
532
548
  }
533
549
 
534
- /* insn setclassvariable(id)(val)() */
550
+ /* insn setclassvariable(id, ic)(val)() */
535
551
  INSN_ENTRY(setclassvariable)
536
552
  {
537
553
  /* ### Declare that we have just entered into an instruction. ### */
@@ -540,29 +556,31 @@ INSN_ENTRY(setclassvariable)
540
556
 
541
557
  /* ### Declare and assign variables. ### */
542
558
  ID id = (ID)GET_OPERAND(1);
543
- # define INSN_ATTR(x) attr_ ## x ## _setclassvariable(id)
559
+ IVC ic = (IVC)GET_OPERAND(2);
560
+ # define INSN_ATTR(x) attr_ ## x ## _setclassvariable(id, ic)
544
561
  bool leaf = INSN_ATTR(leaf);
545
562
  VALUE val = TOPN(0);
546
563
 
547
564
  /* ### Instruction preambles. ### */
548
565
  if (! leaf) ADD_PC(INSN_ATTR(width));
549
- SETUP_CANARY();
566
+ SETUP_CANARY(leaf);
550
567
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
551
568
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
569
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic);
552
570
 
553
571
  /* ### Here we do the instruction body. ### */
554
572
  # define NAME_OF_CURRENT_INSN setclassvariable
555
- # line 250 "insns.def"
573
+ # line 252 "insns.def"
556
574
  {
557
575
  vm_ensure_not_refinement_module(GET_SELF());
558
- rb_cvar_set(vm_get_cvar_base(vm_get_cref(GET_EP()), GET_CFP()), id, val);
576
+ vm_setclassvariable(GET_ISEQ(), vm_get_cref(GET_EP()), GET_CFP(), id, val, (ICVARC)ic);
559
577
  }
560
- # line 561 "vm.inc"
578
+ # line 579 "vm.inc"
561
579
  # undef NAME_OF_CURRENT_INSN
562
580
 
563
581
  /* ### Instruction trailers. ### */
564
582
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
565
- CHECK_CANARY();
583
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
566
584
  INC_SP(INSN_ATTR(sp_inc));
567
585
  if (leaf) ADD_PC(INSN_ATTR(width));
568
586
  # undef INSN_ATTR
@@ -588,24 +606,26 @@ INSN_ENTRY(getconstant)
588
606
 
589
607
  /* ### Instruction preambles. ### */
590
608
  if (! leaf) ADD_PC(INSN_ATTR(width));
591
- SETUP_CANARY();
609
+ SETUP_CANARY(leaf);
592
610
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
593
611
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
594
612
 
595
613
  /* ### Here we do the instruction body. ### */
596
614
  # define NAME_OF_CURRENT_INSN getconstant
597
- # line 266 "insns.def"
615
+ # line 268 "insns.def"
598
616
  {
599
617
  val = vm_get_ev_const(ec, klass, id, allow_nil == Qtrue, 0);
600
618
  }
601
- # line 602 "vm.inc"
619
+ # line 620 "vm.inc"
602
620
  # undef NAME_OF_CURRENT_INSN
603
621
 
604
622
  /* ### Instruction trailers. ### */
605
623
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
606
- CHECK_CANARY();
624
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
607
625
  INC_SP(INSN_ATTR(sp_inc));
608
626
  TOPN(0) = val;
627
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
628
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
609
629
  if (leaf) ADD_PC(INSN_ATTR(width));
610
630
  # undef INSN_ATTR
611
631
 
@@ -629,24 +649,24 @@ INSN_ENTRY(setconstant)
629
649
 
630
650
  /* ### Instruction preambles. ### */
631
651
  if (! leaf) ADD_PC(INSN_ATTR(width));
632
- SETUP_CANARY();
652
+ SETUP_CANARY(leaf);
633
653
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
634
654
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
635
655
 
636
656
  /* ### Here we do the instruction body. ### */
637
657
  # define NAME_OF_CURRENT_INSN setconstant
638
- # line 282 "insns.def"
658
+ # line 284 "insns.def"
639
659
  {
640
660
  vm_check_if_namespace(cbase);
641
661
  vm_ensure_not_refinement_module(GET_SELF());
642
662
  rb_const_set(cbase, id, val);
643
663
  }
644
- # line 645 "vm.inc"
664
+ # line 665 "vm.inc"
645
665
  # undef NAME_OF_CURRENT_INSN
646
666
 
647
667
  /* ### Instruction trailers. ### */
648
668
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
649
- CHECK_CANARY();
669
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
650
670
  INC_SP(INSN_ATTR(sp_inc));
651
671
  if (leaf) ADD_PC(INSN_ATTR(width));
652
672
  # undef INSN_ATTR
@@ -655,7 +675,7 @@ INSN_ENTRY(setconstant)
655
675
  END_INSN(setconstant);
656
676
  }
657
677
 
658
- /* insn getglobal(entry)()(val) */
678
+ /* insn getglobal(gid)()(val) */
659
679
  INSN_ENTRY(getglobal)
660
680
  {
661
681
  /* ### Declare that we have just entered into an instruction. ### */
@@ -663,32 +683,33 @@ INSN_ENTRY(getglobal)
663
683
  DEBUG_ENTER_INSN("getglobal");
664
684
 
665
685
  /* ### Declare and assign variables. ### */
666
- GENTRY entry = (GENTRY)GET_OPERAND(1);
667
- # define INSN_ATTR(x) attr_ ## x ## _getglobal(entry)
686
+ ID gid = (ID)GET_OPERAND(1);
687
+ # define INSN_ATTR(x) attr_ ## x ## _getglobal(gid)
668
688
  bool leaf = INSN_ATTR(leaf);
669
689
  VALUE val;
670
690
 
671
691
  /* ### Instruction preambles. ### */
672
692
  if (! leaf) ADD_PC(INSN_ATTR(width));
673
- SETUP_CANARY();
693
+ SETUP_CANARY(leaf);
674
694
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
675
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, entry);
695
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, gid);
676
696
 
677
697
  /* ### Here we do the instruction body. ### */
678
698
  # define NAME_OF_CURRENT_INSN getglobal
679
- # line 295 "insns.def"
699
+ # line 297 "insns.def"
680
700
  {
681
- struct rb_global_entry *gentry = (void *)entry;
682
- val = rb_gvar_get(gentry);
701
+ val = rb_gvar_get(gid);
683
702
  }
684
- # line 685 "vm.inc"
703
+ # line 704 "vm.inc"
685
704
  # undef NAME_OF_CURRENT_INSN
686
705
 
687
706
  /* ### Instruction trailers. ### */
688
707
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
689
- CHECK_CANARY();
708
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
690
709
  INC_SP(INSN_ATTR(sp_inc));
691
710
  TOPN(0) = val;
711
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
712
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
692
713
  if (leaf) ADD_PC(INSN_ATTR(width));
693
714
  # undef INSN_ATTR
694
715
 
@@ -696,7 +717,7 @@ INSN_ENTRY(getglobal)
696
717
  END_INSN(getglobal);
697
718
  }
698
719
 
699
- /* insn setglobal(entry)(val)() */
720
+ /* insn setglobal(gid)(val)() */
700
721
  INSN_ENTRY(setglobal)
701
722
  {
702
723
  /* ### Declare that we have just entered into an instruction. ### */
@@ -704,30 +725,29 @@ INSN_ENTRY(setglobal)
704
725
  DEBUG_ENTER_INSN("setglobal");
705
726
 
706
727
  /* ### Declare and assign variables. ### */
707
- GENTRY entry = (GENTRY)GET_OPERAND(1);
708
- # define INSN_ATTR(x) attr_ ## x ## _setglobal(entry)
728
+ ID gid = (ID)GET_OPERAND(1);
729
+ # define INSN_ATTR(x) attr_ ## x ## _setglobal(gid)
709
730
  bool leaf = INSN_ATTR(leaf);
710
731
  VALUE val = TOPN(0);
711
732
 
712
733
  /* ### Instruction preambles. ### */
713
734
  if (! leaf) ADD_PC(INSN_ATTR(width));
714
- SETUP_CANARY();
735
+ SETUP_CANARY(leaf);
715
736
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
716
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, entry);
737
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, gid);
717
738
 
718
739
  /* ### Here we do the instruction body. ### */
719
740
  # define NAME_OF_CURRENT_INSN setglobal
720
- # line 307 "insns.def"
741
+ # line 308 "insns.def"
721
742
  {
722
- struct rb_global_entry *gentry = (void *)entry;
723
- rb_gvar_set(gentry, val);
743
+ rb_gvar_set(gid, val);
724
744
  }
725
- # line 726 "vm.inc"
745
+ # line 746 "vm.inc"
726
746
  # undef NAME_OF_CURRENT_INSN
727
747
 
728
748
  /* ### Instruction trailers. ### */
729
749
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
730
- CHECK_CANARY();
750
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
731
751
  INC_SP(INSN_ATTR(sp_inc));
732
752
  if (leaf) ADD_PC(INSN_ATTR(width));
733
753
  # undef INSN_ATTR
@@ -750,7 +770,7 @@ INSN_ENTRY(putnil)
750
770
 
751
771
  /* ### Instruction preambles. ### */
752
772
  if (! leaf) ADD_PC(INSN_ATTR(width));
753
- SETUP_CANARY();
773
+ SETUP_CANARY(leaf);
754
774
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
755
775
 
756
776
  /* ### Here we do the instruction body. ### */
@@ -759,14 +779,16 @@ INSN_ENTRY(putnil)
759
779
  {
760
780
  val = Qnil;
761
781
  }
762
- # line 763 "vm.inc"
782
+ # line 783 "vm.inc"
763
783
  # undef NAME_OF_CURRENT_INSN
764
784
 
765
785
  /* ### Instruction trailers. ### */
766
786
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
767
- CHECK_CANARY();
787
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
768
788
  INC_SP(INSN_ATTR(sp_inc));
769
789
  TOPN(0) = val;
790
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
791
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
770
792
  if (leaf) ADD_PC(INSN_ATTR(width));
771
793
  # undef INSN_ATTR
772
794
 
@@ -788,7 +810,7 @@ INSN_ENTRY(putself)
788
810
 
789
811
  /* ### Instruction preambles. ### */
790
812
  if (! leaf) ADD_PC(INSN_ATTR(width));
791
- SETUP_CANARY();
813
+ SETUP_CANARY(leaf);
792
814
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
793
815
 
794
816
  /* ### Here we do the instruction body. ### */
@@ -797,14 +819,16 @@ INSN_ENTRY(putself)
797
819
  {
798
820
  val = GET_SELF();
799
821
  }
800
- # line 801 "vm.inc"
822
+ # line 823 "vm.inc"
801
823
  # undef NAME_OF_CURRENT_INSN
802
824
 
803
825
  /* ### Instruction trailers. ### */
804
826
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
805
- CHECK_CANARY();
827
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
806
828
  INC_SP(INSN_ATTR(sp_inc));
807
829
  TOPN(0) = val;
830
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
831
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
808
832
  if (leaf) ADD_PC(INSN_ATTR(width));
809
833
  # undef INSN_ATTR
810
834
 
@@ -833,6 +857,8 @@ INSN_ENTRY(putobject)
833
857
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
834
858
  INC_SP(INSN_ATTR(sp_inc));
835
859
  TOPN(0) = val;
860
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
861
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
836
862
  if (leaf) ADD_PC(INSN_ATTR(width));
837
863
  # undef INSN_ATTR
838
864
 
@@ -855,7 +881,7 @@ INSN_ENTRY(putspecialobject)
855
881
 
856
882
  /* ### Instruction preambles. ### */
857
883
  if (! leaf) ADD_PC(INSN_ATTR(width));
858
- SETUP_CANARY();
884
+ SETUP_CANARY(leaf);
859
885
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
860
886
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, value_type);
861
887
 
@@ -868,14 +894,16 @@ INSN_ENTRY(putspecialobject)
868
894
  type = (enum vm_special_object_type)value_type;
869
895
  val = vm_get_special_object(GET_EP(), type);
870
896
  }
871
- # line 872 "vm.inc"
897
+ # line 898 "vm.inc"
872
898
  # undef NAME_OF_CURRENT_INSN
873
899
 
874
900
  /* ### Instruction trailers. ### */
875
901
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
876
- CHECK_CANARY();
902
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
877
903
  INC_SP(INSN_ATTR(sp_inc));
878
904
  TOPN(0) = val;
905
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
906
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
879
907
  if (leaf) ADD_PC(INSN_ATTR(width));
880
908
  # undef INSN_ATTR
881
909
 
@@ -898,7 +926,7 @@ INSN_ENTRY(putstring)
898
926
 
899
927
  /* ### Instruction preambles. ### */
900
928
  if (! leaf) ADD_PC(INSN_ATTR(width));
901
- SETUP_CANARY();
929
+ SETUP_CANARY(leaf);
902
930
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
903
931
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str);
904
932
 
@@ -906,16 +934,18 @@ INSN_ENTRY(putstring)
906
934
  # define NAME_OF_CURRENT_INSN putstring
907
935
  # line 367 "insns.def"
908
936
  {
909
- val = rb_str_resurrect(str);
937
+ val = rb_ec_str_resurrect(ec, str);
910
938
  }
911
- # line 912 "vm.inc"
939
+ # line 940 "vm.inc"
912
940
  # undef NAME_OF_CURRENT_INSN
913
941
 
914
942
  /* ### Instruction trailers. ### */
915
943
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
916
- CHECK_CANARY();
944
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
917
945
  INC_SP(INSN_ATTR(sp_inc));
918
946
  TOPN(0) = val;
947
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
948
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
919
949
  if (leaf) ADD_PC(INSN_ATTR(width));
920
950
  # undef INSN_ATTR
921
951
 
@@ -938,7 +968,7 @@ INSN_ENTRY(concatstrings)
938
968
 
939
969
  /* ### Instruction preambles. ### */
940
970
  if (! leaf) ADD_PC(INSN_ATTR(width));
941
- SETUP_CANARY();
971
+ SETUP_CANARY(leaf);
942
972
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
943
973
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num);
944
974
 
@@ -948,14 +978,16 @@ INSN_ENTRY(concatstrings)
948
978
  {
949
979
  val = rb_str_concat_literals(num, STACK_ADDR_FROM_TOP(num));
950
980
  }
951
- # line 952 "vm.inc"
981
+ # line 982 "vm.inc"
952
982
  # undef NAME_OF_CURRENT_INSN
953
983
 
954
984
  /* ### Instruction trailers. ### */
955
985
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
956
- CHECK_CANARY();
986
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
957
987
  INC_SP(INSN_ATTR(sp_inc));
958
988
  TOPN(0) = val;
989
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
990
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
959
991
  if (leaf) ADD_PC(INSN_ATTR(width));
960
992
  # undef INSN_ATTR
961
993
 
@@ -978,7 +1010,7 @@ INSN_ENTRY(tostring)
978
1010
 
979
1011
  /* ### Instruction preambles. ### */
980
1012
  if (! leaf) ADD_PC(INSN_ATTR(width));
981
- SETUP_CANARY();
1013
+ SETUP_CANARY(leaf);
982
1014
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
983
1015
 
984
1016
  /* ### Here we do the instruction body. ### */
@@ -987,14 +1019,16 @@ INSN_ENTRY(tostring)
987
1019
  {
988
1020
  val = rb_obj_as_string_result(str, val);
989
1021
  }
990
- # line 991 "vm.inc"
1022
+ # line 1023 "vm.inc"
991
1023
  # undef NAME_OF_CURRENT_INSN
992
1024
 
993
1025
  /* ### Instruction trailers. ### */
994
1026
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
995
- CHECK_CANARY();
1027
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
996
1028
  INC_SP(INSN_ATTR(sp_inc));
997
1029
  TOPN(0) = val;
1030
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1031
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
998
1032
  if (leaf) ADD_PC(INSN_ATTR(width));
999
1033
  # undef INSN_ATTR
1000
1034
 
@@ -1002,46 +1036,6 @@ INSN_ENTRY(tostring)
1002
1036
  END_INSN(tostring);
1003
1037
  }
1004
1038
 
1005
- /* insn freezestring(debug_info)(str)(str) */
1006
- INSN_ENTRY(freezestring)
1007
- {
1008
- /* ### Declare that we have just entered into an instruction. ### */
1009
- START_OF_ORIGINAL_INSN(freezestring);
1010
- DEBUG_ENTER_INSN("freezestring");
1011
-
1012
- /* ### Declare and assign variables. ### */
1013
- VALUE debug_info = (VALUE)GET_OPERAND(1);
1014
- # define INSN_ATTR(x) attr_ ## x ## _freezestring(debug_info)
1015
- bool leaf = INSN_ATTR(leaf);
1016
- VALUE str = TOPN(0);
1017
-
1018
- /* ### Instruction preambles. ### */
1019
- if (! leaf) ADD_PC(INSN_ATTR(width));
1020
- SETUP_CANARY();
1021
- COLLECT_USAGE_INSN(INSN_ATTR(bin));
1022
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, debug_info);
1023
-
1024
- /* ### Here we do the instruction body. ### */
1025
- # define NAME_OF_CURRENT_INSN freezestring
1026
- # line 401 "insns.def"
1027
- {
1028
- vm_freezestring(str, debug_info);
1029
- }
1030
- # line 1031 "vm.inc"
1031
- # undef NAME_OF_CURRENT_INSN
1032
-
1033
- /* ### Instruction trailers. ### */
1034
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1035
- CHECK_CANARY();
1036
- INC_SP(INSN_ATTR(sp_inc));
1037
- TOPN(0) = str;
1038
- if (leaf) ADD_PC(INSN_ATTR(width));
1039
- # undef INSN_ATTR
1040
-
1041
- /* ### Leave the instruction. ### */
1042
- END_INSN(freezestring);
1043
- }
1044
-
1045
1039
  /* insn toregexp(opt, cnt)(...)(val) */
1046
1040
  INSN_ENTRY(toregexp)
1047
1041
  {
@@ -1058,27 +1052,29 @@ INSN_ENTRY(toregexp)
1058
1052
 
1059
1053
  /* ### Instruction preambles. ### */
1060
1054
  if (! leaf) ADD_PC(INSN_ATTR(width));
1061
- SETUP_CANARY();
1055
+ SETUP_CANARY(leaf);
1062
1056
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1063
1057
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, opt);
1064
1058
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cnt);
1065
1059
 
1066
1060
  /* ### Here we do the instruction body. ### */
1067
1061
  # define NAME_OF_CURRENT_INSN toregexp
1068
- # line 417 "insns.def"
1062
+ # line 407 "insns.def"
1069
1063
  {
1070
1064
  const VALUE ary = rb_ary_tmp_new_from_values(0, cnt, STACK_ADDR_FROM_TOP(cnt));
1071
1065
  val = rb_reg_new_ary(ary, (int)opt);
1072
1066
  rb_ary_clear(ary);
1073
1067
  }
1074
- # line 1075 "vm.inc"
1068
+ # line 1069 "vm.inc"
1075
1069
  # undef NAME_OF_CURRENT_INSN
1076
1070
 
1077
1071
  /* ### Instruction trailers. ### */
1078
1072
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1079
- CHECK_CANARY();
1073
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1080
1074
  INC_SP(INSN_ATTR(sp_inc));
1081
1075
  TOPN(0) = val;
1076
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1077
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1082
1078
  if (leaf) ADD_PC(INSN_ATTR(width));
1083
1079
  # undef INSN_ATTR
1084
1080
 
@@ -1101,23 +1097,25 @@ INSN_ENTRY(intern)
1101
1097
 
1102
1098
  /* ### Instruction preambles. ### */
1103
1099
  if (! leaf) ADD_PC(INSN_ATTR(width));
1104
- SETUP_CANARY();
1100
+ SETUP_CANARY(leaf);
1105
1101
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1106
1102
 
1107
1103
  /* ### Here we do the instruction body. ### */
1108
1104
  # define NAME_OF_CURRENT_INSN intern
1109
- # line 429 "insns.def"
1105
+ # line 419 "insns.def"
1110
1106
  {
1111
1107
  sym = rb_str_intern(str);
1112
1108
  }
1113
- # line 1114 "vm.inc"
1109
+ # line 1110 "vm.inc"
1114
1110
  # undef NAME_OF_CURRENT_INSN
1115
1111
 
1116
1112
  /* ### Instruction trailers. ### */
1117
1113
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1118
- CHECK_CANARY();
1114
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1119
1115
  INC_SP(INSN_ATTR(sp_inc));
1120
1116
  TOPN(0) = sym;
1117
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1118
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1121
1119
  if (leaf) ADD_PC(INSN_ATTR(width));
1122
1120
  # undef INSN_ATTR
1123
1121
 
@@ -1140,24 +1138,26 @@ INSN_ENTRY(newarray)
1140
1138
 
1141
1139
  /* ### Instruction preambles. ### */
1142
1140
  if (! leaf) ADD_PC(INSN_ATTR(width));
1143
- SETUP_CANARY();
1141
+ SETUP_CANARY(leaf);
1144
1142
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1145
1143
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num);
1146
1144
 
1147
1145
  /* ### Here we do the instruction body. ### */
1148
1146
  # define NAME_OF_CURRENT_INSN newarray
1149
- # line 440 "insns.def"
1147
+ # line 430 "insns.def"
1150
1148
  {
1151
- val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num));
1149
+ val = rb_ec_ary_new_from_values(ec, num, STACK_ADDR_FROM_TOP(num));
1152
1150
  }
1153
- # line 1154 "vm.inc"
1151
+ # line 1152 "vm.inc"
1154
1152
  # undef NAME_OF_CURRENT_INSN
1155
1153
 
1156
1154
  /* ### Instruction trailers. ### */
1157
1155
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1158
- CHECK_CANARY();
1156
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1159
1157
  INC_SP(INSN_ATTR(sp_inc));
1160
1158
  TOPN(0) = val;
1159
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1160
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1161
1161
  if (leaf) ADD_PC(INSN_ATTR(width));
1162
1162
  # undef INSN_ATTR
1163
1163
 
@@ -1180,13 +1180,13 @@ INSN_ENTRY(newarraykwsplat)
1180
1180
 
1181
1181
  /* ### Instruction preambles. ### */
1182
1182
  if (! leaf) ADD_PC(INSN_ATTR(width));
1183
- SETUP_CANARY();
1183
+ SETUP_CANARY(leaf);
1184
1184
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1185
1185
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num);
1186
1186
 
1187
1187
  /* ### Here we do the instruction body. ### */
1188
1188
  # define NAME_OF_CURRENT_INSN newarraykwsplat
1189
- # line 455 "insns.def"
1189
+ # line 445 "insns.def"
1190
1190
  {
1191
1191
  if (RHASH_EMPTY_P(*STACK_ADDR_FROM_TOP(1))) {
1192
1192
  val = rb_ary_new4(num-1, STACK_ADDR_FROM_TOP(num));
@@ -1200,9 +1200,11 @@ INSN_ENTRY(newarraykwsplat)
1200
1200
 
1201
1201
  /* ### Instruction trailers. ### */
1202
1202
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1203
- CHECK_CANARY();
1203
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1204
1204
  INC_SP(INSN_ATTR(sp_inc));
1205
1205
  TOPN(0) = val;
1206
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1207
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1206
1208
  if (leaf) ADD_PC(INSN_ATTR(width));
1207
1209
  # undef INSN_ATTR
1208
1210
 
@@ -1225,25 +1227,27 @@ INSN_ENTRY(duparray)
1225
1227
 
1226
1228
  /* ### Instruction preambles. ### */
1227
1229
  if (! leaf) ADD_PC(INSN_ATTR(width));
1228
- SETUP_CANARY();
1230
+ SETUP_CANARY(leaf);
1229
1231
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1230
1232
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ary);
1231
1233
 
1232
1234
  /* ### Here we do the instruction body. ### */
1233
1235
  # define NAME_OF_CURRENT_INSN duparray
1234
- # line 470 "insns.def"
1236
+ # line 460 "insns.def"
1235
1237
  {
1236
1238
  RUBY_DTRACE_CREATE_HOOK(ARRAY, RARRAY_LEN(ary));
1237
1239
  val = rb_ary_resurrect(ary);
1238
1240
  }
1239
- # line 1240 "vm.inc"
1241
+ # line 1242 "vm.inc"
1240
1242
  # undef NAME_OF_CURRENT_INSN
1241
1243
 
1242
1244
  /* ### Instruction trailers. ### */
1243
1245
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1244
- CHECK_CANARY();
1246
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1245
1247
  INC_SP(INSN_ATTR(sp_inc));
1246
1248
  TOPN(0) = val;
1249
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1250
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1247
1251
  if (leaf) ADD_PC(INSN_ATTR(width));
1248
1252
  # undef INSN_ATTR
1249
1253
 
@@ -1266,25 +1270,27 @@ INSN_ENTRY(duphash)
1266
1270
 
1267
1271
  /* ### Instruction preambles. ### */
1268
1272
  if (! leaf) ADD_PC(INSN_ATTR(width));
1269
- SETUP_CANARY();
1273
+ SETUP_CANARY(leaf);
1270
1274
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1271
1275
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, hash);
1272
1276
 
1273
1277
  /* ### Here we do the instruction body. ### */
1274
1278
  # define NAME_OF_CURRENT_INSN duphash
1275
- # line 481 "insns.def"
1279
+ # line 471 "insns.def"
1276
1280
  {
1277
1281
  RUBY_DTRACE_CREATE_HOOK(HASH, RHASH_SIZE(hash) << 1);
1278
1282
  val = rb_hash_resurrect(hash);
1279
1283
  }
1280
- # line 1281 "vm.inc"
1284
+ # line 1285 "vm.inc"
1281
1285
  # undef NAME_OF_CURRENT_INSN
1282
1286
 
1283
1287
  /* ### Instruction trailers. ### */
1284
1288
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1285
- CHECK_CANARY();
1289
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1286
1290
  INC_SP(INSN_ATTR(sp_inc));
1287
1291
  TOPN(0) = val;
1292
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1293
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1288
1294
  if (leaf) ADD_PC(INSN_ATTR(width));
1289
1295
  # undef INSN_ATTR
1290
1296
 
@@ -1314,11 +1320,11 @@ INSN_ENTRY(expandarray)
1314
1320
 
1315
1321
  /* ### Here we do the instruction body. ### */
1316
1322
  # define NAME_OF_CURRENT_INSN expandarray
1317
- # line 502 "insns.def"
1323
+ # line 492 "insns.def"
1318
1324
  {
1319
1325
  vm_expandarray(GET_SP(), ary, num, (int)flag);
1320
1326
  }
1321
- # line 1322 "vm.inc"
1327
+ # line 1328 "vm.inc"
1322
1328
  # undef NAME_OF_CURRENT_INSN
1323
1329
 
1324
1330
  /* ### Instruction trailers. ### */
@@ -1347,23 +1353,25 @@ INSN_ENTRY(concatarray)
1347
1353
 
1348
1354
  /* ### Instruction preambles. ### */
1349
1355
  if (! leaf) ADD_PC(INSN_ATTR(width));
1350
- SETUP_CANARY();
1356
+ SETUP_CANARY(leaf);
1351
1357
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1352
1358
 
1353
1359
  /* ### Here we do the instruction body. ### */
1354
1360
  # define NAME_OF_CURRENT_INSN concatarray
1355
- # line 513 "insns.def"
1361
+ # line 503 "insns.def"
1356
1362
  {
1357
1363
  ary = vm_concat_array(ary1, ary2);
1358
1364
  }
1359
- # line 1360 "vm.inc"
1365
+ # line 1366 "vm.inc"
1360
1366
  # undef NAME_OF_CURRENT_INSN
1361
1367
 
1362
1368
  /* ### Instruction trailers. ### */
1363
1369
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1364
- CHECK_CANARY();
1370
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1365
1371
  INC_SP(INSN_ATTR(sp_inc));
1366
1372
  TOPN(0) = ary;
1373
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1374
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1367
1375
  if (leaf) ADD_PC(INSN_ATTR(width));
1368
1376
  # undef INSN_ATTR
1369
1377
 
@@ -1387,24 +1395,26 @@ INSN_ENTRY(splatarray)
1387
1395
 
1388
1396
  /* ### Instruction preambles. ### */
1389
1397
  if (! leaf) ADD_PC(INSN_ATTR(width));
1390
- SETUP_CANARY();
1398
+ SETUP_CANARY(leaf);
1391
1399
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1392
1400
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, flag);
1393
1401
 
1394
1402
  /* ### Here we do the instruction body. ### */
1395
1403
  # define NAME_OF_CURRENT_INSN splatarray
1396
- # line 524 "insns.def"
1404
+ # line 514 "insns.def"
1397
1405
  {
1398
1406
  obj = vm_splat_array(flag, ary);
1399
1407
  }
1400
- # line 1401 "vm.inc"
1408
+ # line 1409 "vm.inc"
1401
1409
  # undef NAME_OF_CURRENT_INSN
1402
1410
 
1403
1411
  /* ### Instruction trailers. ### */
1404
1412
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1405
- CHECK_CANARY();
1413
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1406
1414
  INC_SP(INSN_ATTR(sp_inc));
1407
1415
  TOPN(0) = obj;
1416
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1417
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1408
1418
  if (leaf) ADD_PC(INSN_ATTR(width));
1409
1419
  # undef INSN_ATTR
1410
1420
 
@@ -1427,30 +1437,34 @@ INSN_ENTRY(newhash)
1427
1437
 
1428
1438
  /* ### Instruction preambles. ### */
1429
1439
  if (! leaf) ADD_PC(INSN_ATTR(width));
1430
- SETUP_CANARY();
1440
+ SETUP_CANARY(leaf);
1431
1441
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1432
1442
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num);
1433
1443
 
1434
1444
  /* ### Here we do the instruction body. ### */
1435
1445
  # define NAME_OF_CURRENT_INSN newhash
1436
- # line 536 "insns.def"
1446
+ # line 526 "insns.def"
1437
1447
  {
1438
1448
  RUBY_DTRACE_CREATE_HOOK(HASH, num);
1439
1449
 
1440
- val = rb_hash_new_with_size(num / 2);
1441
-
1442
1450
  if (num) {
1451
+ val = rb_hash_new_with_size(num / 2);
1443
1452
  rb_hash_bulk_insert(num, STACK_ADDR_FROM_TOP(num), val);
1444
1453
  }
1454
+ else {
1455
+ val = rb_hash_new();
1456
+ }
1445
1457
  }
1446
- # line 1447 "vm.inc"
1458
+ # line 1459 "vm.inc"
1447
1459
  # undef NAME_OF_CURRENT_INSN
1448
1460
 
1449
1461
  /* ### Instruction trailers. ### */
1450
1462
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1451
- CHECK_CANARY();
1463
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1452
1464
  INC_SP(INSN_ATTR(sp_inc));
1453
1465
  TOPN(0) = val;
1466
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1467
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1454
1468
  if (leaf) ADD_PC(INSN_ATTR(width));
1455
1469
  # undef INSN_ATTR
1456
1470
 
@@ -1475,24 +1489,26 @@ INSN_ENTRY(newrange)
1475
1489
 
1476
1490
  /* ### Instruction preambles. ### */
1477
1491
  if (! leaf) ADD_PC(INSN_ATTR(width));
1478
- SETUP_CANARY();
1492
+ SETUP_CANARY(leaf);
1479
1493
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1480
1494
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, flag);
1481
1495
 
1482
1496
  /* ### Here we do the instruction body. ### */
1483
1497
  # define NAME_OF_CURRENT_INSN newrange
1484
- # line 554 "insns.def"
1498
+ # line 546 "insns.def"
1485
1499
  {
1486
1500
  val = rb_range_new(low, high, (int)flag);
1487
1501
  }
1488
- # line 1489 "vm.inc"
1502
+ # line 1503 "vm.inc"
1489
1503
  # undef NAME_OF_CURRENT_INSN
1490
1504
 
1491
1505
  /* ### Instruction trailers. ### */
1492
1506
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1493
- CHECK_CANARY();
1507
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1494
1508
  INC_SP(INSN_ATTR(sp_inc));
1495
1509
  TOPN(0) = val;
1510
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1511
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1496
1512
  if (leaf) ADD_PC(INSN_ATTR(width));
1497
1513
  # undef INSN_ATTR
1498
1514
 
@@ -1514,22 +1530,22 @@ INSN_ENTRY(pop)
1514
1530
 
1515
1531
  /* ### Instruction preambles. ### */
1516
1532
  if (! leaf) ADD_PC(INSN_ATTR(width));
1517
- SETUP_CANARY();
1533
+ SETUP_CANARY(leaf);
1518
1534
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1519
1535
 
1520
1536
  /* ### Here we do the instruction body. ### */
1521
1537
  # define NAME_OF_CURRENT_INSN pop
1522
- # line 568 "insns.def"
1538
+ # line 560 "insns.def"
1523
1539
  {
1524
1540
  (void)val;
1525
1541
  /* none */
1526
1542
  }
1527
- # line 1528 "vm.inc"
1543
+ # line 1544 "vm.inc"
1528
1544
  # undef NAME_OF_CURRENT_INSN
1529
1545
 
1530
1546
  /* ### Instruction trailers. ### */
1531
1547
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1532
- CHECK_CANARY();
1548
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1533
1549
  INC_SP(INSN_ATTR(sp_inc));
1534
1550
  if (leaf) ADD_PC(INSN_ATTR(width));
1535
1551
  # undef INSN_ATTR
@@ -1554,24 +1570,28 @@ INSN_ENTRY(dup)
1554
1570
 
1555
1571
  /* ### Instruction preambles. ### */
1556
1572
  if (! leaf) ADD_PC(INSN_ATTR(width));
1557
- SETUP_CANARY();
1573
+ SETUP_CANARY(leaf);
1558
1574
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1559
1575
 
1560
1576
  /* ### Here we do the instruction body. ### */
1561
1577
  # define NAME_OF_CURRENT_INSN dup
1562
- # line 579 "insns.def"
1578
+ # line 571 "insns.def"
1563
1579
  {
1564
1580
  val1 = val2 = val;
1565
1581
  }
1566
- # line 1567 "vm.inc"
1582
+ # line 1583 "vm.inc"
1567
1583
  # undef NAME_OF_CURRENT_INSN
1568
1584
 
1569
1585
  /* ### Instruction trailers. ### */
1570
1586
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1571
- CHECK_CANARY();
1587
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1572
1588
  INC_SP(INSN_ATTR(sp_inc));
1573
1589
  TOPN(0) = val2;
1590
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1591
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1574
1592
  TOPN(1) = val1;
1593
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_NONE));
1594
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_MOVED));
1575
1595
  if (leaf) ADD_PC(INSN_ATTR(width));
1576
1596
  # undef INSN_ATTR
1577
1597
 
@@ -1598,14 +1618,14 @@ INSN_ENTRY(dupn)
1598
1618
 
1599
1619
  /* ### Here we do the instruction body. ### */
1600
1620
  # define NAME_OF_CURRENT_INSN dupn
1601
- # line 590 "insns.def"
1621
+ # line 582 "insns.def"
1602
1622
  {
1603
1623
  void *dst = GET_SP();
1604
1624
  void *src = STACK_ADDR_FROM_TOP(n);
1605
1625
 
1606
1626
  MEMCPY(dst, src, VALUE, n);
1607
1627
  }
1608
- # line 1609 "vm.inc"
1628
+ # line 1629 "vm.inc"
1609
1629
  # undef NAME_OF_CURRENT_INSN
1610
1630
 
1611
1631
  /* ### Instruction trailers. ### */
@@ -1639,7 +1659,11 @@ INSN_ENTRY(swap)
1639
1659
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1640
1660
  INC_SP(INSN_ATTR(sp_inc));
1641
1661
  TOPN(0) = val;
1662
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1663
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1642
1664
  TOPN(1) = obj;
1665
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_NONE));
1666
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_MOVED));
1643
1667
  if (leaf) ADD_PC(INSN_ATTR(width));
1644
1668
  # undef INSN_ATTR
1645
1669
 
@@ -1647,50 +1671,6 @@ INSN_ENTRY(swap)
1647
1671
  END_INSN(swap);
1648
1672
  }
1649
1673
 
1650
- /* insn reverse(n)(...)(...) */
1651
- INSN_ENTRY(reverse)
1652
- {
1653
- /* ### Declare that we have just entered into an instruction. ### */
1654
- START_OF_ORIGINAL_INSN(reverse);
1655
- DEBUG_ENTER_INSN("reverse");
1656
-
1657
- /* ### Declare and assign variables. ### */
1658
- rb_num_t n = (rb_num_t)GET_OPERAND(1);
1659
- # define INSN_ATTR(x) attr_ ## x ## _reverse(n)
1660
- bool leaf = INSN_ATTR(leaf);
1661
-
1662
- /* ### Instruction preambles. ### */
1663
- if (! leaf) ADD_PC(INSN_ATTR(width));
1664
- COLLECT_USAGE_INSN(INSN_ATTR(bin));
1665
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, n);
1666
-
1667
- /* ### Here we do the instruction body. ### */
1668
- # define NAME_OF_CURRENT_INSN reverse
1669
- # line 614 "insns.def"
1670
- {
1671
- rb_num_t i;
1672
- VALUE *sp = STACK_ADDR_FROM_TOP(n);
1673
-
1674
- for (i=0; i<n/2; i++) {
1675
- VALUE v0 = sp[i];
1676
- VALUE v1 = TOPN(i);
1677
- sp[i] = v1;
1678
- TOPN(i) = v0;
1679
- }
1680
- }
1681
- # line 1682 "vm.inc"
1682
- # undef NAME_OF_CURRENT_INSN
1683
-
1684
- /* ### Instruction trailers. ### */
1685
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1686
- INC_SP(INSN_ATTR(sp_inc));
1687
- if (leaf) ADD_PC(INSN_ATTR(width));
1688
- # undef INSN_ATTR
1689
-
1690
- /* ### Leave the instruction. ### */
1691
- END_INSN(reverse);
1692
- }
1693
-
1694
1674
  /* insn topn(n)(...)(val) */
1695
1675
  INSN_ENTRY(topn)
1696
1676
  {
@@ -1706,24 +1686,26 @@ INSN_ENTRY(topn)
1706
1686
 
1707
1687
  /* ### Instruction preambles. ### */
1708
1688
  if (! leaf) ADD_PC(INSN_ATTR(width));
1709
- SETUP_CANARY();
1689
+ SETUP_CANARY(leaf);
1710
1690
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1711
1691
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, n);
1712
1692
 
1713
1693
  /* ### Here we do the instruction body. ### */
1714
1694
  # define NAME_OF_CURRENT_INSN topn
1715
- # line 644 "insns.def"
1695
+ # line 617 "insns.def"
1716
1696
  {
1717
1697
  val = TOPN(n);
1718
1698
  }
1719
- # line 1720 "vm.inc"
1699
+ # line 1700 "vm.inc"
1720
1700
  # undef NAME_OF_CURRENT_INSN
1721
1701
 
1722
1702
  /* ### Instruction trailers. ### */
1723
1703
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1724
- CHECK_CANARY();
1704
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1725
1705
  INC_SP(INSN_ATTR(sp_inc));
1726
1706
  TOPN(0) = val;
1707
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1708
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1727
1709
  if (leaf) ADD_PC(INSN_ATTR(width));
1728
1710
  # undef INSN_ATTR
1729
1711
 
@@ -1746,24 +1728,26 @@ INSN_ENTRY(setn)
1746
1728
 
1747
1729
  /* ### Instruction preambles. ### */
1748
1730
  if (! leaf) ADD_PC(INSN_ATTR(width));
1749
- SETUP_CANARY();
1731
+ SETUP_CANARY(leaf);
1750
1732
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1751
1733
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, n);
1752
1734
 
1753
1735
  /* ### Here we do the instruction body. ### */
1754
1736
  # define NAME_OF_CURRENT_INSN setn
1755
- # line 655 "insns.def"
1737
+ # line 628 "insns.def"
1756
1738
  {
1757
1739
  TOPN(n) = val;
1758
1740
  }
1759
- # line 1760 "vm.inc"
1741
+ # line 1742 "vm.inc"
1760
1742
  # undef NAME_OF_CURRENT_INSN
1761
1743
 
1762
1744
  /* ### Instruction trailers. ### */
1763
1745
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1764
- CHECK_CANARY();
1746
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1765
1747
  INC_SP(INSN_ATTR(sp_inc));
1766
1748
  TOPN(0) = val;
1749
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1750
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1767
1751
  if (leaf) ADD_PC(INSN_ATTR(width));
1768
1752
  # undef INSN_ATTR
1769
1753
 
@@ -1798,7 +1782,7 @@ INSN_ENTRY(adjuststack)
1798
1782
  END_INSN(adjuststack);
1799
1783
  }
1800
1784
 
1801
- /* insn defined(op_type, obj, needstr)(v)(val) */
1785
+ /* insn defined(op_type, obj, pushval)(v)(val) */
1802
1786
  INSN_ENTRY(defined)
1803
1787
  {
1804
1788
  /* ### Declare that we have just entered into an instruction. ### */
@@ -1808,34 +1792,39 @@ INSN_ENTRY(defined)
1808
1792
  /* ### Declare and assign variables. ### */
1809
1793
  rb_num_t op_type = (rb_num_t)GET_OPERAND(1);
1810
1794
  VALUE obj = (VALUE)GET_OPERAND(2);
1811
- VALUE needstr = (VALUE)GET_OPERAND(3);
1812
- # define INSN_ATTR(x) attr_ ## x ## _defined(op_type, obj, needstr)
1795
+ VALUE pushval = (VALUE)GET_OPERAND(3);
1796
+ # define INSN_ATTR(x) attr_ ## x ## _defined(op_type, obj, pushval)
1813
1797
  bool leaf = INSN_ATTR(leaf);
1814
1798
  VALUE v = TOPN(0);
1815
1799
  VALUE val;
1816
1800
 
1817
1801
  /* ### Instruction preambles. ### */
1818
1802
  if (! leaf) ADD_PC(INSN_ATTR(width));
1819
- SETUP_CANARY();
1803
+ SETUP_CANARY(leaf);
1820
1804
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1821
1805
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, op_type);
1822
1806
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, obj);
1823
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, needstr);
1807
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, pushval);
1824
1808
 
1825
1809
  /* ### Here we do the instruction body. ### */
1826
1810
  # define NAME_OF_CURRENT_INSN defined
1827
- # line 681 "insns.def"
1811
+ # line 654 "insns.def"
1828
1812
  {
1829
- val = vm_defined(ec, GET_CFP(), op_type, obj, needstr, v);
1813
+ val = Qnil;
1814
+ if (vm_defined(ec, GET_CFP(), op_type, obj, v)) {
1815
+ val = pushval;
1816
+ }
1830
1817
  }
1831
- # line 1832 "vm.inc"
1818
+ # line 1819 "vm.inc"
1832
1819
  # undef NAME_OF_CURRENT_INSN
1833
1820
 
1834
1821
  /* ### Instruction trailers. ### */
1835
1822
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1836
- CHECK_CANARY();
1823
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1837
1824
  INC_SP(INSN_ATTR(sp_inc));
1838
1825
  TOPN(0) = val;
1826
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1827
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1839
1828
  if (leaf) ADD_PC(INSN_ATTR(width));
1840
1829
  # undef INSN_ATTR
1841
1830
 
@@ -1860,24 +1849,26 @@ INSN_ENTRY(checkmatch)
1860
1849
 
1861
1850
  /* ### Instruction preambles. ### */
1862
1851
  if (! leaf) ADD_PC(INSN_ATTR(width));
1863
- SETUP_CANARY();
1852
+ SETUP_CANARY(leaf);
1864
1853
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1865
1854
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, flag);
1866
1855
 
1867
1856
  /* ### Here we do the instruction body. ### */
1868
1857
  # define NAME_OF_CURRENT_INSN checkmatch
1869
- # line 698 "insns.def"
1858
+ # line 674 "insns.def"
1870
1859
  {
1871
1860
  result = vm_check_match(ec, target, pattern, flag);
1872
1861
  }
1873
- # line 1874 "vm.inc"
1862
+ # line 1863 "vm.inc"
1874
1863
  # undef NAME_OF_CURRENT_INSN
1875
1864
 
1876
1865
  /* ### Instruction trailers. ### */
1877
1866
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1878
- CHECK_CANARY();
1867
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1879
1868
  INC_SP(INSN_ATTR(sp_inc));
1880
1869
  TOPN(0) = result;
1870
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1871
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1881
1872
  if (leaf) ADD_PC(INSN_ATTR(width));
1882
1873
  # undef INSN_ATTR
1883
1874
 
@@ -1901,25 +1892,27 @@ INSN_ENTRY(checkkeyword)
1901
1892
 
1902
1893
  /* ### Instruction preambles. ### */
1903
1894
  if (! leaf) ADD_PC(INSN_ATTR(width));
1904
- SETUP_CANARY();
1895
+ SETUP_CANARY(leaf);
1905
1896
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1906
1897
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, kw_bits_index);
1907
1898
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, keyword_index);
1908
1899
 
1909
1900
  /* ### Here we do the instruction body. ### */
1910
1901
  # define NAME_OF_CURRENT_INSN checkkeyword
1911
- # line 708 "insns.def"
1902
+ # line 684 "insns.def"
1912
1903
  {
1913
1904
  ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());
1914
1905
  }
1915
- # line 1916 "vm.inc"
1906
+ # line 1907 "vm.inc"
1916
1907
  # undef NAME_OF_CURRENT_INSN
1917
1908
 
1918
1909
  /* ### Instruction trailers. ### */
1919
1910
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1920
- CHECK_CANARY();
1911
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1921
1912
  INC_SP(INSN_ATTR(sp_inc));
1922
1913
  TOPN(0) = ret;
1914
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1915
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1923
1916
  if (leaf) ADD_PC(INSN_ATTR(width));
1924
1917
  # undef INSN_ATTR
1925
1918
 
@@ -1943,24 +1936,26 @@ INSN_ENTRY(checktype)
1943
1936
 
1944
1937
  /* ### Instruction preambles. ### */
1945
1938
  if (! leaf) ADD_PC(INSN_ATTR(width));
1946
- SETUP_CANARY();
1939
+ SETUP_CANARY(leaf);
1947
1940
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
1948
1941
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, type);
1949
1942
 
1950
1943
  /* ### Here we do the instruction body. ### */
1951
1944
  # define NAME_OF_CURRENT_INSN checktype
1952
- # line 718 "insns.def"
1945
+ # line 694 "insns.def"
1953
1946
  {
1954
1947
  ret = (TYPE(val) == (int)type) ? Qtrue : Qfalse;
1955
1948
  }
1956
- # line 1957 "vm.inc"
1949
+ # line 1950 "vm.inc"
1957
1950
  # undef NAME_OF_CURRENT_INSN
1958
1951
 
1959
1952
  /* ### Instruction trailers. ### */
1960
1953
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1961
- CHECK_CANARY();
1954
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
1962
1955
  INC_SP(INSN_ATTR(sp_inc));
1963
1956
  TOPN(0) = ret;
1957
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1958
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1964
1959
  if (leaf) ADD_PC(INSN_ATTR(width));
1965
1960
  # undef INSN_ATTR
1966
1961
 
@@ -1968,48 +1963,6 @@ INSN_ENTRY(checktype)
1968
1963
  END_INSN(checktype);
1969
1964
  }
1970
1965
 
1971
- /* insn methodref(id)(val)(ret) */
1972
- INSN_ENTRY(methodref)
1973
- {
1974
- /* ### Declare that we have just entered into an instruction. ### */
1975
- START_OF_ORIGINAL_INSN(methodref);
1976
- DEBUG_ENTER_INSN("methodref");
1977
-
1978
- /* ### Declare and assign variables. ### */
1979
- ID id = (ID)GET_OPERAND(1);
1980
- # define INSN_ATTR(x) attr_ ## x ## _methodref(id)
1981
- bool leaf = INSN_ATTR(leaf);
1982
- VALUE val = TOPN(0);
1983
- VALUE ret;
1984
-
1985
- /* ### Instruction preambles. ### */
1986
- if (! leaf) ADD_PC(INSN_ATTR(width));
1987
- SETUP_CANARY();
1988
- COLLECT_USAGE_INSN(INSN_ATTR(bin));
1989
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
1990
-
1991
- /* ### Here we do the instruction body. ### */
1992
- # define NAME_OF_CURRENT_INSN methodref
1993
- # line 728 "insns.def"
1994
- {
1995
- ret = rb_obj_method(val, ID2SYM(id));
1996
- RB_OBJ_FREEZE_RAW(ret);
1997
- }
1998
- # line 1999 "vm.inc"
1999
- # undef NAME_OF_CURRENT_INSN
2000
-
2001
- /* ### Instruction trailers. ### */
2002
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2003
- CHECK_CANARY();
2004
- INC_SP(INSN_ATTR(sp_inc));
2005
- TOPN(0) = ret;
2006
- if (leaf) ADD_PC(INSN_ATTR(width));
2007
- # undef INSN_ATTR
2008
-
2009
- /* ### Leave the instruction. ### */
2010
- END_INSN(methodref);
2011
- }
2012
-
2013
1966
  /* insn defineclass(id, class_iseq, flags)(cbase, super)(val) */
2014
1967
  INSN_ENTRY(defineclass)
2015
1968
  {
@@ -2030,7 +1983,7 @@ INSN_ENTRY(defineclass)
2030
1983
  /* ### Instruction preambles. ### */
2031
1984
  if (! leaf) ADD_PC(INSN_ATTR(width));
2032
1985
  POPN(INSN_ATTR(popn));
2033
- SETUP_CANARY();
1986
+ SETUP_CANARY(leaf);
2034
1987
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2035
1988
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
2036
1989
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, class_iseq);
@@ -2038,7 +1991,7 @@ INSN_ENTRY(defineclass)
2038
1991
 
2039
1992
  /* ### Here we do the instruction body. ### */
2040
1993
  # define NAME_OF_CURRENT_INSN defineclass
2041
- # line 745 "insns.def"
1994
+ # line 710 "insns.def"
2042
1995
  {
2043
1996
  VALUE klass = vm_find_or_create_class_by_id(id, flags, cbase, super);
2044
1997
 
@@ -2054,12 +2007,12 @@ INSN_ENTRY(defineclass)
2054
2007
  RESTORE_REGS();
2055
2008
  NEXT_INSN();
2056
2009
  }
2057
- # line 2058 "vm.inc"
2010
+ # line 2011 "vm.inc"
2058
2011
  # undef NAME_OF_CURRENT_INSN
2059
2012
 
2060
2013
  /* ### Instruction trailers. ### */
2061
2014
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2062
- CHECK_CANARY();
2015
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2063
2016
  PUSH(val);
2064
2017
  if (leaf) ADD_PC(INSN_ATTR(width));
2065
2018
  # undef INSN_ATTR
@@ -2084,23 +2037,23 @@ INSN_ENTRY(definemethod)
2084
2037
  /* ### Instruction preambles. ### */
2085
2038
  if (! leaf) ADD_PC(INSN_ATTR(width));
2086
2039
  POPN(INSN_ATTR(popn));
2087
- SETUP_CANARY();
2040
+ SETUP_CANARY(leaf);
2088
2041
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2089
2042
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
2090
2043
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, iseq);
2091
2044
 
2092
2045
  /* ### Here we do the instruction body. ### */
2093
2046
  # define NAME_OF_CURRENT_INSN definemethod
2094
- # line 766 "insns.def"
2047
+ # line 731 "insns.def"
2095
2048
  {
2096
2049
  vm_define_method(ec, Qnil, id, (VALUE)iseq, FALSE);
2097
2050
  }
2098
- # line 2099 "vm.inc"
2051
+ # line 2052 "vm.inc"
2099
2052
  # undef NAME_OF_CURRENT_INSN
2100
2053
 
2101
2054
  /* ### Instruction trailers. ### */
2102
2055
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2103
- CHECK_CANARY();
2056
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2104
2057
  if (leaf) ADD_PC(INSN_ATTR(width));
2105
2058
  # undef INSN_ATTR
2106
2059
 
@@ -2125,23 +2078,23 @@ INSN_ENTRY(definesmethod)
2125
2078
  /* ### Instruction preambles. ### */
2126
2079
  if (! leaf) ADD_PC(INSN_ATTR(width));
2127
2080
  POPN(INSN_ATTR(popn));
2128
- SETUP_CANARY();
2081
+ SETUP_CANARY(leaf);
2129
2082
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2130
2083
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
2131
2084
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, iseq);
2132
2085
 
2133
2086
  /* ### Here we do the instruction body. ### */
2134
2087
  # define NAME_OF_CURRENT_INSN definesmethod
2135
- # line 775 "insns.def"
2088
+ # line 740 "insns.def"
2136
2089
  {
2137
2090
  vm_define_method(ec, obj, id, (VALUE)iseq, TRUE);
2138
2091
  }
2139
- # line 2140 "vm.inc"
2092
+ # line 2093 "vm.inc"
2140
2093
  # undef NAME_OF_CURRENT_INSN
2141
2094
 
2142
2095
  /* ### Instruction trailers. ### */
2143
2096
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2144
- CHECK_CANARY();
2097
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2145
2098
  if (leaf) ADD_PC(INSN_ATTR(width));
2146
2099
  # undef INSN_ATTR
2147
2100
 
@@ -2149,7 +2102,7 @@ INSN_ENTRY(definesmethod)
2149
2102
  END_INSN(definesmethod);
2150
2103
  }
2151
2104
 
2152
- /* insn send(ci, cc, blockiseq)(...)(val) */
2105
+ /* insn send(cd, blockiseq)(...)(val) */
2153
2106
  INSN_ENTRY(send)
2154
2107
  {
2155
2108
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2157,40 +2110,38 @@ INSN_ENTRY(send)
2157
2110
  DEBUG_ENTER_INSN("send");
2158
2111
 
2159
2112
  /* ### Declare and assign variables. ### */
2160
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2161
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2162
- ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
2163
- # define INSN_ATTR(x) attr_ ## x ## _send(ci, cc, blockiseq)
2113
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2114
+ ISEQ blockiseq = (ISEQ)GET_OPERAND(2);
2115
+ # define INSN_ATTR(x) attr_ ## x ## _send(cd, blockiseq)
2164
2116
  bool leaf = INSN_ATTR(leaf);
2165
2117
  VALUE val;
2166
2118
 
2167
2119
  /* ### Instruction preambles. ### */
2168
2120
  if (! leaf) ADD_PC(INSN_ATTR(width));
2169
2121
  POPN(INSN_ATTR(popn));
2170
- SETUP_CANARY();
2122
+ SETUP_CANARY(leaf);
2171
2123
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2172
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2173
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2174
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, blockiseq);
2124
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2125
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, blockiseq);
2175
2126
 
2176
2127
  /* ### Here we do the instruction body. ### */
2177
2128
  # define NAME_OF_CURRENT_INSN send
2178
- # line 790 "insns.def"
2129
+ # line 756 "insns.def"
2179
2130
  {
2180
- VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), ci, blockiseq, false);
2181
- val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);
2131
+ VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, false);
2132
+ val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method);
2182
2133
 
2183
2134
  if (val == Qundef) {
2184
2135
  RESTORE_REGS();
2185
2136
  NEXT_INSN();
2186
2137
  }
2187
2138
  }
2188
- # line 2189 "vm.inc"
2139
+ # line 2140 "vm.inc"
2189
2140
  # undef NAME_OF_CURRENT_INSN
2190
2141
 
2191
2142
  /* ### Instruction trailers. ### */
2192
2143
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2193
- CHECK_CANARY();
2144
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2194
2145
  PUSH(val);
2195
2146
  if (leaf) ADD_PC(INSN_ATTR(width));
2196
2147
  # undef INSN_ATTR
@@ -2199,7 +2150,7 @@ INSN_ENTRY(send)
2199
2150
  END_INSN(send);
2200
2151
  }
2201
2152
 
2202
- /* insn opt_send_without_block(ci, cc)(...)(val) */
2153
+ /* insn opt_send_without_block(cd)(...)(val) */
2203
2154
  INSN_ENTRY(opt_send_without_block)
2204
2155
  {
2205
2156
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2207,38 +2158,36 @@ INSN_ENTRY(opt_send_without_block)
2207
2158
  DEBUG_ENTER_INSN("opt_send_without_block");
2208
2159
 
2209
2160
  /* ### Declare and assign variables. ### */
2210
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2211
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2212
- # define INSN_ATTR(x) attr_ ## x ## _opt_send_without_block(ci, cc)
2161
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2162
+ # define INSN_ATTR(x) attr_ ## x ## _opt_send_without_block(cd)
2213
2163
  bool leaf = INSN_ATTR(leaf);
2214
2164
  VALUE val;
2215
2165
 
2216
2166
  /* ### Instruction preambles. ### */
2217
2167
  if (! leaf) ADD_PC(INSN_ATTR(width));
2218
2168
  POPN(INSN_ATTR(popn));
2219
- SETUP_CANARY();
2169
+ SETUP_CANARY(leaf);
2220
2170
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2221
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2222
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2171
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2223
2172
 
2224
2173
  /* ### Here we do the instruction body. ### */
2225
2174
  # define NAME_OF_CURRENT_INSN opt_send_without_block
2226
- # line 808 "insns.def"
2175
+ # line 775 "insns.def"
2227
2176
  {
2228
2177
  VALUE bh = VM_BLOCK_HANDLER_NONE;
2229
- val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);
2178
+ val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method);
2230
2179
 
2231
2180
  if (val == Qundef) {
2232
2181
  RESTORE_REGS();
2233
2182
  NEXT_INSN();
2234
2183
  }
2235
2184
  }
2236
- # line 2237 "vm.inc"
2185
+ # line 2186 "vm.inc"
2237
2186
  # undef NAME_OF_CURRENT_INSN
2238
2187
 
2239
2188
  /* ### Instruction trailers. ### */
2240
2189
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2241
- CHECK_CANARY();
2190
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2242
2191
  PUSH(val);
2243
2192
  if (leaf) ADD_PC(INSN_ATTR(width));
2244
2193
  # undef INSN_ATTR
@@ -2247,7 +2196,7 @@ INSN_ENTRY(opt_send_without_block)
2247
2196
  END_INSN(opt_send_without_block);
2248
2197
  }
2249
2198
 
2250
- /* insn opt_str_freeze(str, ci, cc)()(val) */
2199
+ /* insn opt_str_freeze(str, cd)()(val) */
2251
2200
  INSN_ENTRY(opt_str_freeze)
2252
2201
  {
2253
2202
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2256,23 +2205,21 @@ INSN_ENTRY(opt_str_freeze)
2256
2205
 
2257
2206
  /* ### Declare and assign variables. ### */
2258
2207
  VALUE str = (VALUE)GET_OPERAND(1);
2259
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
2260
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
2261
- # define INSN_ATTR(x) attr_ ## x ## _opt_str_freeze(str, ci, cc)
2208
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
2209
+ # define INSN_ATTR(x) attr_ ## x ## _opt_str_freeze(str, cd)
2262
2210
  bool leaf = INSN_ATTR(leaf);
2263
2211
  VALUE val;
2264
2212
 
2265
2213
  /* ### Instruction preambles. ### */
2266
2214
  if (! leaf) ADD_PC(INSN_ATTR(width));
2267
- SETUP_CANARY();
2215
+ SETUP_CANARY(leaf);
2268
2216
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2269
2217
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str);
2270
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
2271
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
2218
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
2272
2219
 
2273
2220
  /* ### Here we do the instruction body. ### */
2274
2221
  # define NAME_OF_CURRENT_INSN opt_str_freeze
2275
- # line 823 "insns.def"
2222
+ # line 790 "insns.def"
2276
2223
  {
2277
2224
  val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze);
2278
2225
 
@@ -2281,14 +2228,16 @@ INSN_ENTRY(opt_str_freeze)
2281
2228
  CALL_SIMPLE_METHOD();
2282
2229
  }
2283
2230
  }
2284
- # line 2285 "vm.inc"
2231
+ # line 2232 "vm.inc"
2285
2232
  # undef NAME_OF_CURRENT_INSN
2286
2233
 
2287
2234
  /* ### Instruction trailers. ### */
2288
2235
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2289
- CHECK_CANARY();
2236
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2290
2237
  INC_SP(INSN_ATTR(sp_inc));
2291
2238
  TOPN(0) = val;
2239
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2240
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2292
2241
  if (leaf) ADD_PC(INSN_ATTR(width));
2293
2242
  # undef INSN_ATTR
2294
2243
 
@@ -2296,7 +2245,7 @@ INSN_ENTRY(opt_str_freeze)
2296
2245
  END_INSN(opt_str_freeze);
2297
2246
  }
2298
2247
 
2299
- /* insn opt_nil_p(ci, cc)(recv)(val) */
2248
+ /* insn opt_nil_p(cd)(recv)(val) */
2300
2249
  INSN_ENTRY(opt_nil_p)
2301
2250
  {
2302
2251
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2304,38 +2253,38 @@ INSN_ENTRY(opt_nil_p)
2304
2253
  DEBUG_ENTER_INSN("opt_nil_p");
2305
2254
 
2306
2255
  /* ### Declare and assign variables. ### */
2307
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2308
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2309
- # define INSN_ATTR(x) attr_ ## x ## _opt_nil_p(ci, cc)
2256
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2257
+ # define INSN_ATTR(x) attr_ ## x ## _opt_nil_p(cd)
2310
2258
  bool leaf = INSN_ATTR(leaf);
2311
2259
  VALUE recv = TOPN(0);
2312
2260
  VALUE val;
2313
2261
 
2314
2262
  /* ### Instruction preambles. ### */
2315
2263
  if (! leaf) ADD_PC(INSN_ATTR(width));
2316
- SETUP_CANARY();
2264
+ SETUP_CANARY(leaf);
2317
2265
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2318
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2319
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2266
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2320
2267
 
2321
2268
  /* ### Here we do the instruction body. ### */
2322
2269
  # define NAME_OF_CURRENT_INSN opt_nil_p
2323
- # line 838 "insns.def"
2270
+ # line 805 "insns.def"
2324
2271
  {
2325
- val = vm_opt_nil_p(ci, cc, recv);
2272
+ val = vm_opt_nil_p(GET_ISEQ(), cd, recv);
2326
2273
 
2327
2274
  if (val == Qundef) {
2328
2275
  CALL_SIMPLE_METHOD();
2329
2276
  }
2330
2277
  }
2331
- # line 2332 "vm.inc"
2278
+ # line 2279 "vm.inc"
2332
2279
  # undef NAME_OF_CURRENT_INSN
2333
2280
 
2334
2281
  /* ### Instruction trailers. ### */
2335
2282
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2336
- CHECK_CANARY();
2283
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2337
2284
  INC_SP(INSN_ATTR(sp_inc));
2338
2285
  TOPN(0) = val;
2286
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2287
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2339
2288
  if (leaf) ADD_PC(INSN_ATTR(width));
2340
2289
  # undef INSN_ATTR
2341
2290
 
@@ -2343,7 +2292,7 @@ INSN_ENTRY(opt_nil_p)
2343
2292
  END_INSN(opt_nil_p);
2344
2293
  }
2345
2294
 
2346
- /* insn opt_str_uminus(str, ci, cc)()(val) */
2295
+ /* insn opt_str_uminus(str, cd)()(val) */
2347
2296
  INSN_ENTRY(opt_str_uminus)
2348
2297
  {
2349
2298
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2352,23 +2301,21 @@ INSN_ENTRY(opt_str_uminus)
2352
2301
 
2353
2302
  /* ### Declare and assign variables. ### */
2354
2303
  VALUE str = (VALUE)GET_OPERAND(1);
2355
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
2356
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
2357
- # define INSN_ATTR(x) attr_ ## x ## _opt_str_uminus(str, ci, cc)
2304
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
2305
+ # define INSN_ATTR(x) attr_ ## x ## _opt_str_uminus(str, cd)
2358
2306
  bool leaf = INSN_ATTR(leaf);
2359
2307
  VALUE val;
2360
2308
 
2361
2309
  /* ### Instruction preambles. ### */
2362
2310
  if (! leaf) ADD_PC(INSN_ATTR(width));
2363
- SETUP_CANARY();
2311
+ SETUP_CANARY(leaf);
2364
2312
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2365
2313
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str);
2366
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
2367
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
2314
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
2368
2315
 
2369
2316
  /* ### Here we do the instruction body. ### */
2370
2317
  # define NAME_OF_CURRENT_INSN opt_str_uminus
2371
- # line 851 "insns.def"
2318
+ # line 818 "insns.def"
2372
2319
  {
2373
2320
  val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus);
2374
2321
 
@@ -2377,14 +2324,16 @@ INSN_ENTRY(opt_str_uminus)
2377
2324
  CALL_SIMPLE_METHOD();
2378
2325
  }
2379
2326
  }
2380
- # line 2381 "vm.inc"
2327
+ # line 2328 "vm.inc"
2381
2328
  # undef NAME_OF_CURRENT_INSN
2382
2329
 
2383
2330
  /* ### Instruction trailers. ### */
2384
2331
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2385
- CHECK_CANARY();
2332
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2386
2333
  INC_SP(INSN_ATTR(sp_inc));
2387
2334
  TOPN(0) = val;
2335
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2336
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2388
2337
  if (leaf) ADD_PC(INSN_ATTR(width));
2389
2338
  # undef INSN_ATTR
2390
2339
 
@@ -2407,24 +2356,26 @@ INSN_ENTRY(opt_newarray_max)
2407
2356
 
2408
2357
  /* ### Instruction preambles. ### */
2409
2358
  if (! leaf) ADD_PC(INSN_ATTR(width));
2410
- SETUP_CANARY();
2359
+ SETUP_CANARY(leaf);
2411
2360
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2412
2361
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num);
2413
2362
 
2414
2363
  /* ### Here we do the instruction body. ### */
2415
2364
  # define NAME_OF_CURRENT_INSN opt_newarray_max
2416
- # line 871 "insns.def"
2365
+ # line 838 "insns.def"
2417
2366
  {
2418
- val = vm_opt_newarray_max(num, STACK_ADDR_FROM_TOP(num));
2367
+ val = vm_opt_newarray_max(ec, num, STACK_ADDR_FROM_TOP(num));
2419
2368
  }
2420
- # line 2421 "vm.inc"
2369
+ # line 2370 "vm.inc"
2421
2370
  # undef NAME_OF_CURRENT_INSN
2422
2371
 
2423
2372
  /* ### Instruction trailers. ### */
2424
2373
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2425
- CHECK_CANARY();
2374
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2426
2375
  INC_SP(INSN_ATTR(sp_inc));
2427
2376
  TOPN(0) = val;
2377
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2378
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2428
2379
  if (leaf) ADD_PC(INSN_ATTR(width));
2429
2380
  # undef INSN_ATTR
2430
2381
 
@@ -2447,24 +2398,26 @@ INSN_ENTRY(opt_newarray_min)
2447
2398
 
2448
2399
  /* ### Instruction preambles. ### */
2449
2400
  if (! leaf) ADD_PC(INSN_ATTR(width));
2450
- SETUP_CANARY();
2401
+ SETUP_CANARY(leaf);
2451
2402
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2452
2403
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num);
2453
2404
 
2454
2405
  /* ### Here we do the instruction body. ### */
2455
2406
  # define NAME_OF_CURRENT_INSN opt_newarray_min
2456
- # line 883 "insns.def"
2407
+ # line 850 "insns.def"
2457
2408
  {
2458
- val = vm_opt_newarray_min(num, STACK_ADDR_FROM_TOP(num));
2409
+ val = vm_opt_newarray_min(ec, num, STACK_ADDR_FROM_TOP(num));
2459
2410
  }
2460
- # line 2461 "vm.inc"
2411
+ # line 2412 "vm.inc"
2461
2412
  # undef NAME_OF_CURRENT_INSN
2462
2413
 
2463
2414
  /* ### Instruction trailers. ### */
2464
2415
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2465
- CHECK_CANARY();
2416
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2466
2417
  INC_SP(INSN_ATTR(sp_inc));
2467
2418
  TOPN(0) = val;
2419
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2420
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2468
2421
  if (leaf) ADD_PC(INSN_ATTR(width));
2469
2422
  # undef INSN_ATTR
2470
2423
 
@@ -2472,7 +2425,7 @@ INSN_ENTRY(opt_newarray_min)
2472
2425
  END_INSN(opt_newarray_min);
2473
2426
  }
2474
2427
 
2475
- /* insn invokesuper(ci, cc, blockiseq)(...)(val) */
2428
+ /* insn invokesuper(cd, blockiseq)(...)(val) */
2476
2429
  INSN_ENTRY(invokesuper)
2477
2430
  {
2478
2431
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2480,40 +2433,38 @@ INSN_ENTRY(invokesuper)
2480
2433
  DEBUG_ENTER_INSN("invokesuper");
2481
2434
 
2482
2435
  /* ### Declare and assign variables. ### */
2483
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2484
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2485
- ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
2486
- # define INSN_ATTR(x) attr_ ## x ## _invokesuper(ci, cc, blockiseq)
2436
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2437
+ ISEQ blockiseq = (ISEQ)GET_OPERAND(2);
2438
+ # define INSN_ATTR(x) attr_ ## x ## _invokesuper(cd, blockiseq)
2487
2439
  bool leaf = INSN_ATTR(leaf);
2488
2440
  VALUE val;
2489
2441
 
2490
2442
  /* ### Instruction preambles. ### */
2491
2443
  if (! leaf) ADD_PC(INSN_ATTR(width));
2492
2444
  POPN(INSN_ATTR(popn));
2493
- SETUP_CANARY();
2445
+ SETUP_CANARY(leaf);
2494
2446
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2495
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2496
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2497
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, blockiseq);
2447
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2448
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, blockiseq);
2498
2449
 
2499
2450
  /* ### Here we do the instruction body. ### */
2500
2451
  # define NAME_OF_CURRENT_INSN invokesuper
2501
- # line 894 "insns.def"
2452
+ # line 862 "insns.def"
2502
2453
  {
2503
- VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), ci, blockiseq, true);
2504
- val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_super_method);
2454
+ VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, true);
2455
+ val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_super);
2505
2456
 
2506
2457
  if (val == Qundef) {
2507
2458
  RESTORE_REGS();
2508
2459
  NEXT_INSN();
2509
2460
  }
2510
2461
  }
2511
- # line 2512 "vm.inc"
2462
+ # line 2463 "vm.inc"
2512
2463
  # undef NAME_OF_CURRENT_INSN
2513
2464
 
2514
2465
  /* ### Instruction trailers. ### */
2515
2466
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2516
- CHECK_CANARY();
2467
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2517
2468
  PUSH(val);
2518
2469
  if (leaf) ADD_PC(INSN_ATTR(width));
2519
2470
  # undef INSN_ATTR
@@ -2522,7 +2473,7 @@ INSN_ENTRY(invokesuper)
2522
2473
  END_INSN(invokesuper);
2523
2474
  }
2524
2475
 
2525
- /* insn invokeblock(ci)(...)(val) */
2476
+ /* insn invokeblock(cd)(...)(val) */
2526
2477
  INSN_ENTRY(invokeblock)
2527
2478
  {
2528
2479
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2530,40 +2481,36 @@ INSN_ENTRY(invokeblock)
2530
2481
  DEBUG_ENTER_INSN("invokeblock");
2531
2482
 
2532
2483
  /* ### Declare and assign variables. ### */
2533
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2534
- # define INSN_ATTR(x) attr_ ## x ## _invokeblock(ci)
2484
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2485
+ # define INSN_ATTR(x) attr_ ## x ## _invokeblock(cd)
2535
2486
  bool leaf = INSN_ATTR(leaf);
2536
2487
  VALUE val;
2537
2488
 
2538
2489
  /* ### Instruction preambles. ### */
2539
2490
  if (! leaf) ADD_PC(INSN_ATTR(width));
2540
2491
  POPN(INSN_ATTR(popn));
2541
- SETUP_CANARY();
2492
+ SETUP_CANARY(leaf);
2542
2493
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2543
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2494
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2544
2495
 
2545
2496
  /* ### Here we do the instruction body. ### */
2546
2497
  # define NAME_OF_CURRENT_INSN invokeblock
2547
- # line 912 "insns.def"
2498
+ # line 881 "insns.def"
2548
2499
  {
2549
- static struct rb_call_cache cc = {
2550
- 0, 0, NULL, NULL, vm_invokeblock_i,
2551
- };
2552
-
2553
2500
  VALUE bh = VM_BLOCK_HANDLER_NONE;
2554
- val = vm_sendish(ec, GET_CFP(), ci, &cc, bh, vm_search_invokeblock);
2501
+ val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_invokeblock);
2555
2502
 
2556
2503
  if (val == Qundef) {
2557
2504
  RESTORE_REGS();
2558
2505
  NEXT_INSN();
2559
2506
  }
2560
2507
  }
2561
- # line 2562 "vm.inc"
2508
+ # line 2509 "vm.inc"
2562
2509
  # undef NAME_OF_CURRENT_INSN
2563
2510
 
2564
2511
  /* ### Instruction trailers. ### */
2565
2512
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2566
- CHECK_CANARY();
2513
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2567
2514
  PUSH(val);
2568
2515
  if (leaf) ADD_PC(INSN_ATTR(width));
2569
2516
  # undef INSN_ATTR
@@ -2587,12 +2534,12 @@ INSN_ENTRY(leave)
2587
2534
  /* ### Instruction preambles. ### */
2588
2535
  if (! leaf) ADD_PC(INSN_ATTR(width));
2589
2536
  POPN(INSN_ATTR(popn));
2590
- SETUP_CANARY();
2537
+ SETUP_CANARY(leaf);
2591
2538
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2592
2539
 
2593
2540
  /* ### Here we do the instruction body. ### */
2594
2541
  # define NAME_OF_CURRENT_INSN leave
2595
- # line 937 "insns.def"
2542
+ # line 902 "insns.def"
2596
2543
  {
2597
2544
  if (OPT_CHECKED_RUN) {
2598
2545
  const VALUE *const bp = vm_base_ptr(GET_CFP());
@@ -2601,8 +2548,6 @@ INSN_ENTRY(leave)
2601
2548
  }
2602
2549
  }
2603
2550
 
2604
- RUBY_VM_CHECK_INTS(ec);
2605
-
2606
2551
  if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
2607
2552
  # if OPT_CALL_THREADED_CODE
2608
2553
  rb_ec_thread_ptr(ec)->retval = val;
@@ -2615,12 +2560,12 @@ INSN_ENTRY(leave)
2615
2560
  RESTORE_REGS();
2616
2561
  }
2617
2562
  }
2618
- # line 2619 "vm.inc"
2563
+ # line 2564 "vm.inc"
2619
2564
  # undef NAME_OF_CURRENT_INSN
2620
2565
 
2621
2566
  /* ### Instruction trailers. ### */
2622
2567
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2623
- CHECK_CANARY();
2568
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2624
2569
  PUSH(val);
2625
2570
  if (leaf) ADD_PC(INSN_ATTR(width));
2626
2571
  # undef INSN_ATTR
@@ -2645,27 +2590,28 @@ INSN_ENTRY(throw)
2645
2590
 
2646
2591
  /* ### Instruction preambles. ### */
2647
2592
  if (! leaf) ADD_PC(INSN_ATTR(width));
2648
- SETUP_CANARY();
2593
+ SETUP_CANARY(leaf);
2649
2594
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2650
2595
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, throw_state);
2651
2596
 
2652
2597
  /* ### Here we do the instruction body. ### */
2653
2598
  # define NAME_OF_CURRENT_INSN throw
2654
- # line 972 "insns.def"
2599
+ # line 935 "insns.def"
2655
2600
  {
2656
- RUBY_VM_CHECK_INTS(ec);
2657
2601
  val = vm_throw(ec, GET_CFP(), throw_state, throwobj);
2658
2602
  THROW_EXCEPTION(val);
2659
2603
  /* unreachable */
2660
2604
  }
2661
- # line 2662 "vm.inc"
2605
+ # line 2606 "vm.inc"
2662
2606
  # undef NAME_OF_CURRENT_INSN
2663
2607
 
2664
2608
  /* ### Instruction trailers. ### */
2665
2609
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2666
- CHECK_CANARY();
2610
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2667
2611
  INC_SP(INSN_ATTR(sp_inc));
2668
2612
  TOPN(0) = val;
2613
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2614
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2669
2615
  if (leaf) ADD_PC(INSN_ATTR(width));
2670
2616
  # undef INSN_ATTR
2671
2617
 
@@ -2687,23 +2633,23 @@ INSN_ENTRY(jump)
2687
2633
 
2688
2634
  /* ### Instruction preambles. ### */
2689
2635
  if (! leaf) ADD_PC(INSN_ATTR(width));
2690
- SETUP_CANARY();
2636
+ SETUP_CANARY(leaf);
2691
2637
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2692
2638
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst);
2693
2639
 
2694
2640
  /* ### Here we do the instruction body. ### */
2695
2641
  # define NAME_OF_CURRENT_INSN jump
2696
- # line 991 "insns.def"
2642
+ # line 953 "insns.def"
2697
2643
  {
2698
2644
  RUBY_VM_CHECK_INTS(ec);
2699
2645
  JUMP(dst);
2700
2646
  }
2701
- # line 2702 "vm.inc"
2647
+ # line 2648 "vm.inc"
2702
2648
  # undef NAME_OF_CURRENT_INSN
2703
2649
 
2704
2650
  /* ### Instruction trailers. ### */
2705
2651
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2706
- CHECK_CANARY();
2652
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2707
2653
  INC_SP(INSN_ATTR(sp_inc));
2708
2654
  if (leaf) ADD_PC(INSN_ATTR(width));
2709
2655
  # undef INSN_ATTR
@@ -2727,25 +2673,25 @@ INSN_ENTRY(branchif)
2727
2673
 
2728
2674
  /* ### Instruction preambles. ### */
2729
2675
  if (! leaf) ADD_PC(INSN_ATTR(width));
2730
- SETUP_CANARY();
2676
+ SETUP_CANARY(leaf);
2731
2677
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2732
2678
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst);
2733
2679
 
2734
2680
  /* ### Here we do the instruction body. ### */
2735
2681
  # define NAME_OF_CURRENT_INSN branchif
2736
- # line 1004 "insns.def"
2682
+ # line 966 "insns.def"
2737
2683
  {
2738
2684
  if (RTEST(val)) {
2739
2685
  RUBY_VM_CHECK_INTS(ec);
2740
2686
  JUMP(dst);
2741
2687
  }
2742
2688
  }
2743
- # line 2744 "vm.inc"
2689
+ # line 2690 "vm.inc"
2744
2690
  # undef NAME_OF_CURRENT_INSN
2745
2691
 
2746
2692
  /* ### Instruction trailers. ### */
2747
2693
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2748
- CHECK_CANARY();
2694
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2749
2695
  INC_SP(INSN_ATTR(sp_inc));
2750
2696
  if (leaf) ADD_PC(INSN_ATTR(width));
2751
2697
  # undef INSN_ATTR
@@ -2769,25 +2715,25 @@ INSN_ENTRY(branchunless)
2769
2715
 
2770
2716
  /* ### Instruction preambles. ### */
2771
2717
  if (! leaf) ADD_PC(INSN_ATTR(width));
2772
- SETUP_CANARY();
2718
+ SETUP_CANARY(leaf);
2773
2719
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2774
2720
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst);
2775
2721
 
2776
2722
  /* ### Here we do the instruction body. ### */
2777
2723
  # define NAME_OF_CURRENT_INSN branchunless
2778
- # line 1019 "insns.def"
2724
+ # line 981 "insns.def"
2779
2725
  {
2780
2726
  if (!RTEST(val)) {
2781
2727
  RUBY_VM_CHECK_INTS(ec);
2782
2728
  JUMP(dst);
2783
2729
  }
2784
2730
  }
2785
- # line 2786 "vm.inc"
2731
+ # line 2732 "vm.inc"
2786
2732
  # undef NAME_OF_CURRENT_INSN
2787
2733
 
2788
2734
  /* ### Instruction trailers. ### */
2789
2735
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2790
- CHECK_CANARY();
2736
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2791
2737
  INC_SP(INSN_ATTR(sp_inc));
2792
2738
  if (leaf) ADD_PC(INSN_ATTR(width));
2793
2739
  # undef INSN_ATTR
@@ -2811,25 +2757,25 @@ INSN_ENTRY(branchnil)
2811
2757
 
2812
2758
  /* ### Instruction preambles. ### */
2813
2759
  if (! leaf) ADD_PC(INSN_ATTR(width));
2814
- SETUP_CANARY();
2760
+ SETUP_CANARY(leaf);
2815
2761
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2816
2762
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst);
2817
2763
 
2818
2764
  /* ### Here we do the instruction body. ### */
2819
2765
  # define NAME_OF_CURRENT_INSN branchnil
2820
- # line 1034 "insns.def"
2766
+ # line 996 "insns.def"
2821
2767
  {
2822
2768
  if (NIL_P(val)) {
2823
2769
  RUBY_VM_CHECK_INTS(ec);
2824
2770
  JUMP(dst);
2825
2771
  }
2826
2772
  }
2827
- # line 2828 "vm.inc"
2773
+ # line 2774 "vm.inc"
2828
2774
  # undef NAME_OF_CURRENT_INSN
2829
2775
 
2830
2776
  /* ### Instruction trailers. ### */
2831
2777
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2832
- CHECK_CANARY();
2778
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2833
2779
  INC_SP(INSN_ATTR(sp_inc));
2834
2780
  if (leaf) ADD_PC(INSN_ATTR(width));
2835
2781
  # undef INSN_ATTR
@@ -2854,31 +2800,34 @@ INSN_ENTRY(opt_getinlinecache)
2854
2800
 
2855
2801
  /* ### Instruction preambles. ### */
2856
2802
  if (! leaf) ADD_PC(INSN_ATTR(width));
2857
- SETUP_CANARY();
2803
+ SETUP_CANARY(leaf);
2858
2804
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2859
2805
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst);
2860
2806
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic);
2861
2807
 
2862
2808
  /* ### Here we do the instruction body. ### */
2863
2809
  # define NAME_OF_CURRENT_INSN opt_getinlinecache
2864
- # line 1051 "insns.def"
2810
+ # line 1013 "insns.def"
2865
2811
  {
2866
- if (vm_ic_hit_p(ic, GET_EP())) {
2867
- val = ic->ic_value.value;
2868
- JUMP(dst);
2812
+ struct iseq_inline_constant_cache_entry *ice = ic->entry;
2813
+ if (ice && vm_ic_hit_p(ice, GET_EP())) {
2814
+ val = ice->value;
2815
+ JUMP(dst);
2869
2816
  }
2870
2817
  else {
2871
2818
  val = Qnil;
2872
2819
  }
2873
2820
  }
2874
- # line 2875 "vm.inc"
2821
+ # line 2822 "vm.inc"
2875
2822
  # undef NAME_OF_CURRENT_INSN
2876
2823
 
2877
2824
  /* ### Instruction trailers. ### */
2878
2825
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2879
- CHECK_CANARY();
2826
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2880
2827
  INC_SP(INSN_ATTR(sp_inc));
2881
2828
  TOPN(0) = val;
2829
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2830
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2882
2831
  if (leaf) ADD_PC(INSN_ATTR(width));
2883
2832
  # undef INSN_ATTR
2884
2833
 
@@ -2901,24 +2850,26 @@ INSN_ENTRY(opt_setinlinecache)
2901
2850
 
2902
2851
  /* ### Instruction preambles. ### */
2903
2852
  if (! leaf) ADD_PC(INSN_ATTR(width));
2904
- SETUP_CANARY();
2853
+ SETUP_CANARY(leaf);
2905
2854
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2906
2855
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ic);
2907
2856
 
2908
2857
  /* ### Here we do the instruction body. ### */
2909
2858
  # define NAME_OF_CURRENT_INSN opt_setinlinecache
2910
- # line 1067 "insns.def"
2859
+ # line 1031 "insns.def"
2911
2860
  {
2912
- vm_ic_update(ic, val, GET_EP());
2861
+ vm_ic_update(GET_ISEQ(), ic, val, GET_EP());
2913
2862
  }
2914
- # line 2915 "vm.inc"
2863
+ # line 2864 "vm.inc"
2915
2864
  # undef NAME_OF_CURRENT_INSN
2916
2865
 
2917
2866
  /* ### Instruction trailers. ### */
2918
2867
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2919
- CHECK_CANARY();
2868
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2920
2869
  INC_SP(INSN_ATTR(sp_inc));
2921
2870
  TOPN(0) = val;
2871
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2872
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2922
2873
  if (leaf) ADD_PC(INSN_ATTR(width));
2923
2874
  # undef INSN_ATTR
2924
2875
 
@@ -2943,23 +2894,23 @@ INSN_ENTRY(once)
2943
2894
  /* ### Instruction preambles. ### */
2944
2895
  if (! leaf) ADD_PC(INSN_ATTR(width));
2945
2896
  POPN(INSN_ATTR(popn));
2946
- SETUP_CANARY();
2897
+ SETUP_CANARY(leaf);
2947
2898
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2948
2899
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, iseq);
2949
2900
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ise);
2950
2901
 
2951
2902
  /* ### Here we do the instruction body. ### */
2952
2903
  # define NAME_OF_CURRENT_INSN once
2953
- # line 1077 "insns.def"
2904
+ # line 1041 "insns.def"
2954
2905
  {
2955
2906
  val = vm_once_dispatch(ec, iseq, ise);
2956
2907
  }
2957
- # line 2958 "vm.inc"
2908
+ # line 2909 "vm.inc"
2958
2909
  # undef NAME_OF_CURRENT_INSN
2959
2910
 
2960
2911
  /* ### Instruction trailers. ### */
2961
2912
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2962
- CHECK_CANARY();
2913
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
2963
2914
  PUSH(val);
2964
2915
  if (leaf) ADD_PC(INSN_ATTR(width));
2965
2916
  # undef INSN_ATTR
@@ -2984,14 +2935,14 @@ INSN_ENTRY(opt_case_dispatch)
2984
2935
 
2985
2936
  /* ### Instruction preambles. ### */
2986
2937
  if (! leaf) ADD_PC(INSN_ATTR(width));
2987
- SETUP_CANARY();
2938
+ SETUP_CANARY(leaf);
2988
2939
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2989
2940
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, hash);
2990
2941
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, else_offset);
2991
2942
 
2992
2943
  /* ### Here we do the instruction body. ### */
2993
2944
  # define NAME_OF_CURRENT_INSN opt_case_dispatch
2994
- # line 1088 "insns.def"
2945
+ # line 1052 "insns.def"
2995
2946
  {
2996
2947
  OFFSET dst = vm_case_dispatch(hash, else_offset, key);
2997
2948
 
@@ -2999,12 +2950,12 @@ INSN_ENTRY(opt_case_dispatch)
2999
2950
  JUMP(dst);
3000
2951
  }
3001
2952
  }
3002
- # line 3003 "vm.inc"
2953
+ # line 2954 "vm.inc"
3003
2954
  # undef NAME_OF_CURRENT_INSN
3004
2955
 
3005
2956
  /* ### Instruction trailers. ### */
3006
2957
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3007
- CHECK_CANARY();
2958
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3008
2959
  INC_SP(INSN_ATTR(sp_inc));
3009
2960
  if (leaf) ADD_PC(INSN_ATTR(width));
3010
2961
  # undef INSN_ATTR
@@ -3013,7 +2964,7 @@ INSN_ENTRY(opt_case_dispatch)
3013
2964
  END_INSN(opt_case_dispatch);
3014
2965
  }
3015
2966
 
3016
- /* insn opt_plus(ci, cc)(recv, obj)(val) */
2967
+ /* insn opt_plus(cd)(recv, obj)(val) */
3017
2968
  INSN_ENTRY(opt_plus)
3018
2969
  {
3019
2970
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3021,9 +2972,8 @@ INSN_ENTRY(opt_plus)
3021
2972
  DEBUG_ENTER_INSN("opt_plus");
3022
2973
 
3023
2974
  /* ### Declare and assign variables. ### */
3024
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3025
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3026
- # define INSN_ATTR(x) attr_ ## x ## _opt_plus(ci, cc)
2975
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2976
+ # define INSN_ATTR(x) attr_ ## x ## _opt_plus(cd)
3027
2977
  bool leaf = INSN_ATTR(leaf);
3028
2978
  VALUE recv = TOPN(1);
3029
2979
  VALUE obj = TOPN(0);
@@ -3031,14 +2981,13 @@ INSN_ENTRY(opt_plus)
3031
2981
 
3032
2982
  /* ### Instruction preambles. ### */
3033
2983
  if (! leaf) ADD_PC(INSN_ATTR(width));
3034
- SETUP_CANARY();
2984
+ SETUP_CANARY(leaf);
3035
2985
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3036
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3037
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2986
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3038
2987
 
3039
2988
  /* ### Here we do the instruction body. ### */
3040
2989
  # define NAME_OF_CURRENT_INSN opt_plus
3041
- # line 1104 "insns.def"
2990
+ # line 1068 "insns.def"
3042
2991
  {
3043
2992
  val = vm_opt_plus(recv, obj);
3044
2993
 
@@ -3046,14 +2995,16 @@ INSN_ENTRY(opt_plus)
3046
2995
  CALL_SIMPLE_METHOD();
3047
2996
  }
3048
2997
  }
3049
- # line 3050 "vm.inc"
2998
+ # line 2999 "vm.inc"
3050
2999
  # undef NAME_OF_CURRENT_INSN
3051
3000
 
3052
3001
  /* ### Instruction trailers. ### */
3053
3002
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3054
- CHECK_CANARY();
3003
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3055
3004
  INC_SP(INSN_ATTR(sp_inc));
3056
3005
  TOPN(0) = val;
3006
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3007
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3057
3008
  if (leaf) ADD_PC(INSN_ATTR(width));
3058
3009
  # undef INSN_ATTR
3059
3010
 
@@ -3061,7 +3012,7 @@ INSN_ENTRY(opt_plus)
3061
3012
  END_INSN(opt_plus);
3062
3013
  }
3063
3014
 
3064
- /* insn opt_minus(ci, cc)(recv, obj)(val) */
3015
+ /* insn opt_minus(cd)(recv, obj)(val) */
3065
3016
  INSN_ENTRY(opt_minus)
3066
3017
  {
3067
3018
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3069,9 +3020,8 @@ INSN_ENTRY(opt_minus)
3069
3020
  DEBUG_ENTER_INSN("opt_minus");
3070
3021
 
3071
3022
  /* ### Declare and assign variables. ### */
3072
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3073
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3074
- # define INSN_ATTR(x) attr_ ## x ## _opt_minus(ci, cc)
3023
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3024
+ # define INSN_ATTR(x) attr_ ## x ## _opt_minus(cd)
3075
3025
  bool leaf = INSN_ATTR(leaf);
3076
3026
  VALUE recv = TOPN(1);
3077
3027
  VALUE obj = TOPN(0);
@@ -3079,14 +3029,13 @@ INSN_ENTRY(opt_minus)
3079
3029
 
3080
3030
  /* ### Instruction preambles. ### */
3081
3031
  if (! leaf) ADD_PC(INSN_ATTR(width));
3082
- SETUP_CANARY();
3032
+ SETUP_CANARY(leaf);
3083
3033
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3084
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3085
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3034
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3086
3035
 
3087
3036
  /* ### Here we do the instruction body. ### */
3088
3037
  # define NAME_OF_CURRENT_INSN opt_minus
3089
- # line 1118 "insns.def"
3038
+ # line 1082 "insns.def"
3090
3039
  {
3091
3040
  val = vm_opt_minus(recv, obj);
3092
3041
 
@@ -3094,14 +3043,16 @@ INSN_ENTRY(opt_minus)
3094
3043
  CALL_SIMPLE_METHOD();
3095
3044
  }
3096
3045
  }
3097
- # line 3098 "vm.inc"
3046
+ # line 3047 "vm.inc"
3098
3047
  # undef NAME_OF_CURRENT_INSN
3099
3048
 
3100
3049
  /* ### Instruction trailers. ### */
3101
3050
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3102
- CHECK_CANARY();
3051
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3103
3052
  INC_SP(INSN_ATTR(sp_inc));
3104
3053
  TOPN(0) = val;
3054
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3055
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3105
3056
  if (leaf) ADD_PC(INSN_ATTR(width));
3106
3057
  # undef INSN_ATTR
3107
3058
 
@@ -3109,7 +3060,7 @@ INSN_ENTRY(opt_minus)
3109
3060
  END_INSN(opt_minus);
3110
3061
  }
3111
3062
 
3112
- /* insn opt_mult(ci, cc)(recv, obj)(val) */
3063
+ /* insn opt_mult(cd)(recv, obj)(val) */
3113
3064
  INSN_ENTRY(opt_mult)
3114
3065
  {
3115
3066
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3117,9 +3068,8 @@ INSN_ENTRY(opt_mult)
3117
3068
  DEBUG_ENTER_INSN("opt_mult");
3118
3069
 
3119
3070
  /* ### Declare and assign variables. ### */
3120
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3121
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3122
- # define INSN_ATTR(x) attr_ ## x ## _opt_mult(ci, cc)
3071
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3072
+ # define INSN_ATTR(x) attr_ ## x ## _opt_mult(cd)
3123
3073
  bool leaf = INSN_ATTR(leaf);
3124
3074
  VALUE recv = TOPN(1);
3125
3075
  VALUE obj = TOPN(0);
@@ -3127,14 +3077,13 @@ INSN_ENTRY(opt_mult)
3127
3077
 
3128
3078
  /* ### Instruction preambles. ### */
3129
3079
  if (! leaf) ADD_PC(INSN_ATTR(width));
3130
- SETUP_CANARY();
3080
+ SETUP_CANARY(leaf);
3131
3081
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3132
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3133
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3082
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3134
3083
 
3135
3084
  /* ### Here we do the instruction body. ### */
3136
3085
  # define NAME_OF_CURRENT_INSN opt_mult
3137
- # line 1132 "insns.def"
3086
+ # line 1096 "insns.def"
3138
3087
  {
3139
3088
  val = vm_opt_mult(recv, obj);
3140
3089
 
@@ -3142,14 +3091,16 @@ INSN_ENTRY(opt_mult)
3142
3091
  CALL_SIMPLE_METHOD();
3143
3092
  }
3144
3093
  }
3145
- # line 3146 "vm.inc"
3094
+ # line 3095 "vm.inc"
3146
3095
  # undef NAME_OF_CURRENT_INSN
3147
3096
 
3148
3097
  /* ### Instruction trailers. ### */
3149
3098
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3150
- CHECK_CANARY();
3099
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3151
3100
  INC_SP(INSN_ATTR(sp_inc));
3152
3101
  TOPN(0) = val;
3102
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3103
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3153
3104
  if (leaf) ADD_PC(INSN_ATTR(width));
3154
3105
  # undef INSN_ATTR
3155
3106
 
@@ -3157,7 +3108,7 @@ INSN_ENTRY(opt_mult)
3157
3108
  END_INSN(opt_mult);
3158
3109
  }
3159
3110
 
3160
- /* insn opt_div(ci, cc)(recv, obj)(val) */
3111
+ /* insn opt_div(cd)(recv, obj)(val) */
3161
3112
  INSN_ENTRY(opt_div)
3162
3113
  {
3163
3114
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3165,9 +3116,8 @@ INSN_ENTRY(opt_div)
3165
3116
  DEBUG_ENTER_INSN("opt_div");
3166
3117
 
3167
3118
  /* ### Declare and assign variables. ### */
3168
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3169
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3170
- # define INSN_ATTR(x) attr_ ## x ## _opt_div(ci, cc)
3119
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3120
+ # define INSN_ATTR(x) attr_ ## x ## _opt_div(cd)
3171
3121
  bool leaf = INSN_ATTR(leaf);
3172
3122
  VALUE recv = TOPN(1);
3173
3123
  VALUE obj = TOPN(0);
@@ -3175,14 +3125,13 @@ INSN_ENTRY(opt_div)
3175
3125
 
3176
3126
  /* ### Instruction preambles. ### */
3177
3127
  if (! leaf) ADD_PC(INSN_ATTR(width));
3178
- SETUP_CANARY();
3128
+ SETUP_CANARY(leaf);
3179
3129
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3180
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3181
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3130
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3182
3131
 
3183
3132
  /* ### Here we do the instruction body. ### */
3184
3133
  # define NAME_OF_CURRENT_INSN opt_div
3185
- # line 1149 "insns.def"
3134
+ # line 1113 "insns.def"
3186
3135
  {
3187
3136
  val = vm_opt_div(recv, obj);
3188
3137
 
@@ -3190,14 +3139,16 @@ INSN_ENTRY(opt_div)
3190
3139
  CALL_SIMPLE_METHOD();
3191
3140
  }
3192
3141
  }
3193
- # line 3194 "vm.inc"
3142
+ # line 3143 "vm.inc"
3194
3143
  # undef NAME_OF_CURRENT_INSN
3195
3144
 
3196
3145
  /* ### Instruction trailers. ### */
3197
3146
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3198
- CHECK_CANARY();
3147
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3199
3148
  INC_SP(INSN_ATTR(sp_inc));
3200
3149
  TOPN(0) = val;
3150
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3151
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3201
3152
  if (leaf) ADD_PC(INSN_ATTR(width));
3202
3153
  # undef INSN_ATTR
3203
3154
 
@@ -3205,7 +3156,7 @@ INSN_ENTRY(opt_div)
3205
3156
  END_INSN(opt_div);
3206
3157
  }
3207
3158
 
3208
- /* insn opt_mod(ci, cc)(recv, obj)(val) */
3159
+ /* insn opt_mod(cd)(recv, obj)(val) */
3209
3160
  INSN_ENTRY(opt_mod)
3210
3161
  {
3211
3162
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3213,9 +3164,8 @@ INSN_ENTRY(opt_mod)
3213
3164
  DEBUG_ENTER_INSN("opt_mod");
3214
3165
 
3215
3166
  /* ### Declare and assign variables. ### */
3216
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3217
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3218
- # define INSN_ATTR(x) attr_ ## x ## _opt_mod(ci, cc)
3167
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3168
+ # define INSN_ATTR(x) attr_ ## x ## _opt_mod(cd)
3219
3169
  bool leaf = INSN_ATTR(leaf);
3220
3170
  VALUE recv = TOPN(1);
3221
3171
  VALUE obj = TOPN(0);
@@ -3223,14 +3173,13 @@ INSN_ENTRY(opt_mod)
3223
3173
 
3224
3174
  /* ### Instruction preambles. ### */
3225
3175
  if (! leaf) ADD_PC(INSN_ATTR(width));
3226
- SETUP_CANARY();
3176
+ SETUP_CANARY(leaf);
3227
3177
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3228
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3229
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3178
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3230
3179
 
3231
3180
  /* ### Here we do the instruction body. ### */
3232
3181
  # define NAME_OF_CURRENT_INSN opt_mod
3233
- # line 1165 "insns.def"
3182
+ # line 1129 "insns.def"
3234
3183
  {
3235
3184
  val = vm_opt_mod(recv, obj);
3236
3185
 
@@ -3238,14 +3187,16 @@ INSN_ENTRY(opt_mod)
3238
3187
  CALL_SIMPLE_METHOD();
3239
3188
  }
3240
3189
  }
3241
- # line 3242 "vm.inc"
3190
+ # line 3191 "vm.inc"
3242
3191
  # undef NAME_OF_CURRENT_INSN
3243
3192
 
3244
3193
  /* ### Instruction trailers. ### */
3245
3194
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3246
- CHECK_CANARY();
3195
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3247
3196
  INC_SP(INSN_ATTR(sp_inc));
3248
3197
  TOPN(0) = val;
3198
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3199
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3249
3200
  if (leaf) ADD_PC(INSN_ATTR(width));
3250
3201
  # undef INSN_ATTR
3251
3202
 
@@ -3253,7 +3204,7 @@ INSN_ENTRY(opt_mod)
3253
3204
  END_INSN(opt_mod);
3254
3205
  }
3255
3206
 
3256
- /* insn opt_eq(ci, cc)(recv, obj)(val) */
3207
+ /* insn opt_eq(cd)(recv, obj)(val) */
3257
3208
  INSN_ENTRY(opt_eq)
3258
3209
  {
3259
3210
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3261,9 +3212,8 @@ INSN_ENTRY(opt_eq)
3261
3212
  DEBUG_ENTER_INSN("opt_eq");
3262
3213
 
3263
3214
  /* ### Declare and assign variables. ### */
3264
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3265
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3266
- # define INSN_ATTR(x) attr_ ## x ## _opt_eq(ci, cc)
3215
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3216
+ # define INSN_ATTR(x) attr_ ## x ## _opt_eq(cd)
3267
3217
  bool leaf = INSN_ATTR(leaf);
3268
3218
  VALUE recv = TOPN(1);
3269
3219
  VALUE obj = TOPN(0);
@@ -3271,29 +3221,30 @@ INSN_ENTRY(opt_eq)
3271
3221
 
3272
3222
  /* ### Instruction preambles. ### */
3273
3223
  if (! leaf) ADD_PC(INSN_ATTR(width));
3274
- SETUP_CANARY();
3224
+ SETUP_CANARY(leaf);
3275
3225
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3276
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3277
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3226
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3278
3227
 
3279
3228
  /* ### Here we do the instruction body. ### */
3280
3229
  # define NAME_OF_CURRENT_INSN opt_eq
3281
- # line 1179 "insns.def"
3230
+ # line 1143 "insns.def"
3282
3231
  {
3283
- val = opt_eq_func(recv, obj, ci, cc);
3232
+ val = opt_equality(GET_ISEQ(), recv, obj, cd);
3284
3233
 
3285
3234
  if (val == Qundef) {
3286
3235
  CALL_SIMPLE_METHOD();
3287
3236
  }
3288
3237
  }
3289
- # line 3290 "vm.inc"
3238
+ # line 3239 "vm.inc"
3290
3239
  # undef NAME_OF_CURRENT_INSN
3291
3240
 
3292
3241
  /* ### Instruction trailers. ### */
3293
3242
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3294
- CHECK_CANARY();
3243
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3295
3244
  INC_SP(INSN_ATTR(sp_inc));
3296
3245
  TOPN(0) = val;
3246
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3247
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3297
3248
  if (leaf) ADD_PC(INSN_ATTR(width));
3298
3249
  # undef INSN_ATTR
3299
3250
 
@@ -3301,7 +3252,7 @@ INSN_ENTRY(opt_eq)
3301
3252
  END_INSN(opt_eq);
3302
3253
  }
3303
3254
 
3304
- /* insn opt_neq(ci_eq, cc_eq, ci, cc)(recv, obj)(val) */
3255
+ /* insn opt_neq(cd_eq, cd)(recv, obj)(val) */
3305
3256
  INSN_ENTRY(opt_neq)
3306
3257
  {
3307
3258
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3309,11 +3260,9 @@ INSN_ENTRY(opt_neq)
3309
3260
  DEBUG_ENTER_INSN("opt_neq");
3310
3261
 
3311
3262
  /* ### Declare and assign variables. ### */
3312
- CALL_INFO ci_eq = (CALL_INFO)GET_OPERAND(1);
3313
- CALL_CACHE cc_eq = (CALL_CACHE)GET_OPERAND(2);
3314
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(3);
3315
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(4);
3316
- # define INSN_ATTR(x) attr_ ## x ## _opt_neq(ci_eq, cc_eq, ci, cc)
3263
+ CALL_DATA cd_eq = (CALL_DATA)GET_OPERAND(1);
3264
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
3265
+ # define INSN_ATTR(x) attr_ ## x ## _opt_neq(cd_eq, cd)
3317
3266
  bool leaf = INSN_ATTR(leaf);
3318
3267
  VALUE recv = TOPN(1);
3319
3268
  VALUE obj = TOPN(0);
@@ -3321,31 +3270,31 @@ INSN_ENTRY(opt_neq)
3321
3270
 
3322
3271
  /* ### Instruction preambles. ### */
3323
3272
  if (! leaf) ADD_PC(INSN_ATTR(width));
3324
- SETUP_CANARY();
3273
+ SETUP_CANARY(leaf);
3325
3274
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3326
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci_eq);
3327
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc_eq);
3328
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, ci);
3329
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 3, cc);
3275
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd_eq);
3276
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
3330
3277
 
3331
3278
  /* ### Here we do the instruction body. ### */
3332
3279
  # define NAME_OF_CURRENT_INSN opt_neq
3333
- # line 1193 "insns.def"
3280
+ # line 1157 "insns.def"
3334
3281
  {
3335
- val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);
3282
+ val = vm_opt_neq(GET_ISEQ(), cd, cd_eq, recv, obj);
3336
3283
 
3337
3284
  if (val == Qundef) {
3338
3285
  CALL_SIMPLE_METHOD();
3339
3286
  }
3340
3287
  }
3341
- # line 3342 "vm.inc"
3288
+ # line 3289 "vm.inc"
3342
3289
  # undef NAME_OF_CURRENT_INSN
3343
3290
 
3344
3291
  /* ### Instruction trailers. ### */
3345
3292
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3346
- CHECK_CANARY();
3293
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3347
3294
  INC_SP(INSN_ATTR(sp_inc));
3348
3295
  TOPN(0) = val;
3296
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3297
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3349
3298
  if (leaf) ADD_PC(INSN_ATTR(width));
3350
3299
  # undef INSN_ATTR
3351
3300
 
@@ -3353,7 +3302,7 @@ INSN_ENTRY(opt_neq)
3353
3302
  END_INSN(opt_neq);
3354
3303
  }
3355
3304
 
3356
- /* insn opt_lt(ci, cc)(recv, obj)(val) */
3305
+ /* insn opt_lt(cd)(recv, obj)(val) */
3357
3306
  INSN_ENTRY(opt_lt)
3358
3307
  {
3359
3308
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3361,9 +3310,8 @@ INSN_ENTRY(opt_lt)
3361
3310
  DEBUG_ENTER_INSN("opt_lt");
3362
3311
 
3363
3312
  /* ### Declare and assign variables. ### */
3364
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3365
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3366
- # define INSN_ATTR(x) attr_ ## x ## _opt_lt(ci, cc)
3313
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3314
+ # define INSN_ATTR(x) attr_ ## x ## _opt_lt(cd)
3367
3315
  bool leaf = INSN_ATTR(leaf);
3368
3316
  VALUE recv = TOPN(1);
3369
3317
  VALUE obj = TOPN(0);
@@ -3371,14 +3319,13 @@ INSN_ENTRY(opt_lt)
3371
3319
 
3372
3320
  /* ### Instruction preambles. ### */
3373
3321
  if (! leaf) ADD_PC(INSN_ATTR(width));
3374
- SETUP_CANARY();
3322
+ SETUP_CANARY(leaf);
3375
3323
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3376
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3377
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3324
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3378
3325
 
3379
3326
  /* ### Here we do the instruction body. ### */
3380
3327
  # define NAME_OF_CURRENT_INSN opt_lt
3381
- # line 1207 "insns.def"
3328
+ # line 1171 "insns.def"
3382
3329
  {
3383
3330
  val = vm_opt_lt(recv, obj);
3384
3331
 
@@ -3386,14 +3333,16 @@ INSN_ENTRY(opt_lt)
3386
3333
  CALL_SIMPLE_METHOD();
3387
3334
  }
3388
3335
  }
3389
- # line 3390 "vm.inc"
3336
+ # line 3337 "vm.inc"
3390
3337
  # undef NAME_OF_CURRENT_INSN
3391
3338
 
3392
3339
  /* ### Instruction trailers. ### */
3393
3340
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3394
- CHECK_CANARY();
3341
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3395
3342
  INC_SP(INSN_ATTR(sp_inc));
3396
3343
  TOPN(0) = val;
3344
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3345
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3397
3346
  if (leaf) ADD_PC(INSN_ATTR(width));
3398
3347
  # undef INSN_ATTR
3399
3348
 
@@ -3401,7 +3350,7 @@ INSN_ENTRY(opt_lt)
3401
3350
  END_INSN(opt_lt);
3402
3351
  }
3403
3352
 
3404
- /* insn opt_le(ci, cc)(recv, obj)(val) */
3353
+ /* insn opt_le(cd)(recv, obj)(val) */
3405
3354
  INSN_ENTRY(opt_le)
3406
3355
  {
3407
3356
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3409,9 +3358,8 @@ INSN_ENTRY(opt_le)
3409
3358
  DEBUG_ENTER_INSN("opt_le");
3410
3359
 
3411
3360
  /* ### Declare and assign variables. ### */
3412
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3413
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3414
- # define INSN_ATTR(x) attr_ ## x ## _opt_le(ci, cc)
3361
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3362
+ # define INSN_ATTR(x) attr_ ## x ## _opt_le(cd)
3415
3363
  bool leaf = INSN_ATTR(leaf);
3416
3364
  VALUE recv = TOPN(1);
3417
3365
  VALUE obj = TOPN(0);
@@ -3419,14 +3367,13 @@ INSN_ENTRY(opt_le)
3419
3367
 
3420
3368
  /* ### Instruction preambles. ### */
3421
3369
  if (! leaf) ADD_PC(INSN_ATTR(width));
3422
- SETUP_CANARY();
3370
+ SETUP_CANARY(leaf);
3423
3371
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3424
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3425
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3372
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3426
3373
 
3427
3374
  /* ### Here we do the instruction body. ### */
3428
3375
  # define NAME_OF_CURRENT_INSN opt_le
3429
- # line 1221 "insns.def"
3376
+ # line 1185 "insns.def"
3430
3377
  {
3431
3378
  val = vm_opt_le(recv, obj);
3432
3379
 
@@ -3434,14 +3381,16 @@ INSN_ENTRY(opt_le)
3434
3381
  CALL_SIMPLE_METHOD();
3435
3382
  }
3436
3383
  }
3437
- # line 3438 "vm.inc"
3384
+ # line 3385 "vm.inc"
3438
3385
  # undef NAME_OF_CURRENT_INSN
3439
3386
 
3440
3387
  /* ### Instruction trailers. ### */
3441
3388
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3442
- CHECK_CANARY();
3389
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3443
3390
  INC_SP(INSN_ATTR(sp_inc));
3444
3391
  TOPN(0) = val;
3392
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3393
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3445
3394
  if (leaf) ADD_PC(INSN_ATTR(width));
3446
3395
  # undef INSN_ATTR
3447
3396
 
@@ -3449,7 +3398,7 @@ INSN_ENTRY(opt_le)
3449
3398
  END_INSN(opt_le);
3450
3399
  }
3451
3400
 
3452
- /* insn opt_gt(ci, cc)(recv, obj)(val) */
3401
+ /* insn opt_gt(cd)(recv, obj)(val) */
3453
3402
  INSN_ENTRY(opt_gt)
3454
3403
  {
3455
3404
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3457,9 +3406,8 @@ INSN_ENTRY(opt_gt)
3457
3406
  DEBUG_ENTER_INSN("opt_gt");
3458
3407
 
3459
3408
  /* ### Declare and assign variables. ### */
3460
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3461
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3462
- # define INSN_ATTR(x) attr_ ## x ## _opt_gt(ci, cc)
3409
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3410
+ # define INSN_ATTR(x) attr_ ## x ## _opt_gt(cd)
3463
3411
  bool leaf = INSN_ATTR(leaf);
3464
3412
  VALUE recv = TOPN(1);
3465
3413
  VALUE obj = TOPN(0);
@@ -3467,14 +3415,13 @@ INSN_ENTRY(opt_gt)
3467
3415
 
3468
3416
  /* ### Instruction preambles. ### */
3469
3417
  if (! leaf) ADD_PC(INSN_ATTR(width));
3470
- SETUP_CANARY();
3418
+ SETUP_CANARY(leaf);
3471
3419
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3472
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3473
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3420
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3474
3421
 
3475
3422
  /* ### Here we do the instruction body. ### */
3476
3423
  # define NAME_OF_CURRENT_INSN opt_gt
3477
- # line 1235 "insns.def"
3424
+ # line 1199 "insns.def"
3478
3425
  {
3479
3426
  val = vm_opt_gt(recv, obj);
3480
3427
 
@@ -3482,14 +3429,16 @@ INSN_ENTRY(opt_gt)
3482
3429
  CALL_SIMPLE_METHOD();
3483
3430
  }
3484
3431
  }
3485
- # line 3486 "vm.inc"
3432
+ # line 3433 "vm.inc"
3486
3433
  # undef NAME_OF_CURRENT_INSN
3487
3434
 
3488
3435
  /* ### Instruction trailers. ### */
3489
3436
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3490
- CHECK_CANARY();
3437
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3491
3438
  INC_SP(INSN_ATTR(sp_inc));
3492
3439
  TOPN(0) = val;
3440
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3441
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3493
3442
  if (leaf) ADD_PC(INSN_ATTR(width));
3494
3443
  # undef INSN_ATTR
3495
3444
 
@@ -3497,7 +3446,7 @@ INSN_ENTRY(opt_gt)
3497
3446
  END_INSN(opt_gt);
3498
3447
  }
3499
3448
 
3500
- /* insn opt_ge(ci, cc)(recv, obj)(val) */
3449
+ /* insn opt_ge(cd)(recv, obj)(val) */
3501
3450
  INSN_ENTRY(opt_ge)
3502
3451
  {
3503
3452
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3505,9 +3454,8 @@ INSN_ENTRY(opt_ge)
3505
3454
  DEBUG_ENTER_INSN("opt_ge");
3506
3455
 
3507
3456
  /* ### Declare and assign variables. ### */
3508
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3509
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3510
- # define INSN_ATTR(x) attr_ ## x ## _opt_ge(ci, cc)
3457
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3458
+ # define INSN_ATTR(x) attr_ ## x ## _opt_ge(cd)
3511
3459
  bool leaf = INSN_ATTR(leaf);
3512
3460
  VALUE recv = TOPN(1);
3513
3461
  VALUE obj = TOPN(0);
@@ -3515,14 +3463,13 @@ INSN_ENTRY(opt_ge)
3515
3463
 
3516
3464
  /* ### Instruction preambles. ### */
3517
3465
  if (! leaf) ADD_PC(INSN_ATTR(width));
3518
- SETUP_CANARY();
3466
+ SETUP_CANARY(leaf);
3519
3467
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3520
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3521
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3468
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3522
3469
 
3523
3470
  /* ### Here we do the instruction body. ### */
3524
3471
  # define NAME_OF_CURRENT_INSN opt_ge
3525
- # line 1249 "insns.def"
3472
+ # line 1213 "insns.def"
3526
3473
  {
3527
3474
  val = vm_opt_ge(recv, obj);
3528
3475
 
@@ -3530,14 +3477,16 @@ INSN_ENTRY(opt_ge)
3530
3477
  CALL_SIMPLE_METHOD();
3531
3478
  }
3532
3479
  }
3533
- # line 3534 "vm.inc"
3480
+ # line 3481 "vm.inc"
3534
3481
  # undef NAME_OF_CURRENT_INSN
3535
3482
 
3536
3483
  /* ### Instruction trailers. ### */
3537
3484
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3538
- CHECK_CANARY();
3485
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3539
3486
  INC_SP(INSN_ATTR(sp_inc));
3540
3487
  TOPN(0) = val;
3488
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3489
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3541
3490
  if (leaf) ADD_PC(INSN_ATTR(width));
3542
3491
  # undef INSN_ATTR
3543
3492
 
@@ -3545,7 +3494,7 @@ INSN_ENTRY(opt_ge)
3545
3494
  END_INSN(opt_ge);
3546
3495
  }
3547
3496
 
3548
- /* insn opt_ltlt(ci, cc)(recv, obj)(val) */
3497
+ /* insn opt_ltlt(cd)(recv, obj)(val) */
3549
3498
  INSN_ENTRY(opt_ltlt)
3550
3499
  {
3551
3500
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3553,9 +3502,8 @@ INSN_ENTRY(opt_ltlt)
3553
3502
  DEBUG_ENTER_INSN("opt_ltlt");
3554
3503
 
3555
3504
  /* ### Declare and assign variables. ### */
3556
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3557
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3558
- # define INSN_ATTR(x) attr_ ## x ## _opt_ltlt(ci, cc)
3505
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3506
+ # define INSN_ATTR(x) attr_ ## x ## _opt_ltlt(cd)
3559
3507
  bool leaf = INSN_ATTR(leaf);
3560
3508
  VALUE recv = TOPN(1);
3561
3509
  VALUE obj = TOPN(0);
@@ -3563,14 +3511,13 @@ INSN_ENTRY(opt_ltlt)
3563
3511
 
3564
3512
  /* ### Instruction preambles. ### */
3565
3513
  if (! leaf) ADD_PC(INSN_ATTR(width));
3566
- SETUP_CANARY();
3514
+ SETUP_CANARY(leaf);
3567
3515
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3568
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3569
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3516
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3570
3517
 
3571
3518
  /* ### Here we do the instruction body. ### */
3572
3519
  # define NAME_OF_CURRENT_INSN opt_ltlt
3573
- # line 1267 "insns.def"
3520
+ # line 1231 "insns.def"
3574
3521
  {
3575
3522
  val = vm_opt_ltlt(recv, obj);
3576
3523
 
@@ -3578,14 +3525,16 @@ INSN_ENTRY(opt_ltlt)
3578
3525
  CALL_SIMPLE_METHOD();
3579
3526
  }
3580
3527
  }
3581
- # line 3582 "vm.inc"
3528
+ # line 3529 "vm.inc"
3582
3529
  # undef NAME_OF_CURRENT_INSN
3583
3530
 
3584
3531
  /* ### Instruction trailers. ### */
3585
3532
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3586
- CHECK_CANARY();
3533
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3587
3534
  INC_SP(INSN_ATTR(sp_inc));
3588
3535
  TOPN(0) = val;
3536
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3537
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3589
3538
  if (leaf) ADD_PC(INSN_ATTR(width));
3590
3539
  # undef INSN_ATTR
3591
3540
 
@@ -3593,7 +3542,7 @@ INSN_ENTRY(opt_ltlt)
3593
3542
  END_INSN(opt_ltlt);
3594
3543
  }
3595
3544
 
3596
- /* insn opt_and(ci, cc)(recv, obj)(val) */
3545
+ /* insn opt_and(cd)(recv, obj)(val) */
3597
3546
  INSN_ENTRY(opt_and)
3598
3547
  {
3599
3548
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3601,9 +3550,8 @@ INSN_ENTRY(opt_and)
3601
3550
  DEBUG_ENTER_INSN("opt_and");
3602
3551
 
3603
3552
  /* ### Declare and assign variables. ### */
3604
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3605
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3606
- # define INSN_ATTR(x) attr_ ## x ## _opt_and(ci, cc)
3553
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3554
+ # define INSN_ATTR(x) attr_ ## x ## _opt_and(cd)
3607
3555
  bool leaf = INSN_ATTR(leaf);
3608
3556
  VALUE recv = TOPN(1);
3609
3557
  VALUE obj = TOPN(0);
@@ -3611,14 +3559,13 @@ INSN_ENTRY(opt_and)
3611
3559
 
3612
3560
  /* ### Instruction preambles. ### */
3613
3561
  if (! leaf) ADD_PC(INSN_ATTR(width));
3614
- SETUP_CANARY();
3562
+ SETUP_CANARY(leaf);
3615
3563
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3616
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3617
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3564
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3618
3565
 
3619
3566
  /* ### Here we do the instruction body. ### */
3620
3567
  # define NAME_OF_CURRENT_INSN opt_and
3621
- # line 1281 "insns.def"
3568
+ # line 1245 "insns.def"
3622
3569
  {
3623
3570
  val = vm_opt_and(recv, obj);
3624
3571
 
@@ -3626,14 +3573,16 @@ INSN_ENTRY(opt_and)
3626
3573
  CALL_SIMPLE_METHOD();
3627
3574
  }
3628
3575
  }
3629
- # line 3630 "vm.inc"
3576
+ # line 3577 "vm.inc"
3630
3577
  # undef NAME_OF_CURRENT_INSN
3631
3578
 
3632
3579
  /* ### Instruction trailers. ### */
3633
3580
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3634
- CHECK_CANARY();
3581
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3635
3582
  INC_SP(INSN_ATTR(sp_inc));
3636
3583
  TOPN(0) = val;
3584
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3585
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3637
3586
  if (leaf) ADD_PC(INSN_ATTR(width));
3638
3587
  # undef INSN_ATTR
3639
3588
 
@@ -3641,7 +3590,7 @@ INSN_ENTRY(opt_and)
3641
3590
  END_INSN(opt_and);
3642
3591
  }
3643
3592
 
3644
- /* insn opt_or(ci, cc)(recv, obj)(val) */
3593
+ /* insn opt_or(cd)(recv, obj)(val) */
3645
3594
  INSN_ENTRY(opt_or)
3646
3595
  {
3647
3596
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3649,9 +3598,8 @@ INSN_ENTRY(opt_or)
3649
3598
  DEBUG_ENTER_INSN("opt_or");
3650
3599
 
3651
3600
  /* ### Declare and assign variables. ### */
3652
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3653
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3654
- # define INSN_ATTR(x) attr_ ## x ## _opt_or(ci, cc)
3601
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3602
+ # define INSN_ATTR(x) attr_ ## x ## _opt_or(cd)
3655
3603
  bool leaf = INSN_ATTR(leaf);
3656
3604
  VALUE recv = TOPN(1);
3657
3605
  VALUE obj = TOPN(0);
@@ -3659,14 +3607,13 @@ INSN_ENTRY(opt_or)
3659
3607
 
3660
3608
  /* ### Instruction preambles. ### */
3661
3609
  if (! leaf) ADD_PC(INSN_ATTR(width));
3662
- SETUP_CANARY();
3610
+ SETUP_CANARY(leaf);
3663
3611
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3664
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3665
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3612
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3666
3613
 
3667
3614
  /* ### Here we do the instruction body. ### */
3668
3615
  # define NAME_OF_CURRENT_INSN opt_or
3669
- # line 1295 "insns.def"
3616
+ # line 1259 "insns.def"
3670
3617
  {
3671
3618
  val = vm_opt_or(recv, obj);
3672
3619
 
@@ -3674,14 +3621,16 @@ INSN_ENTRY(opt_or)
3674
3621
  CALL_SIMPLE_METHOD();
3675
3622
  }
3676
3623
  }
3677
- # line 3678 "vm.inc"
3624
+ # line 3625 "vm.inc"
3678
3625
  # undef NAME_OF_CURRENT_INSN
3679
3626
 
3680
3627
  /* ### Instruction trailers. ### */
3681
3628
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3682
- CHECK_CANARY();
3629
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3683
3630
  INC_SP(INSN_ATTR(sp_inc));
3684
3631
  TOPN(0) = val;
3632
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3633
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3685
3634
  if (leaf) ADD_PC(INSN_ATTR(width));
3686
3635
  # undef INSN_ATTR
3687
3636
 
@@ -3689,7 +3638,7 @@ INSN_ENTRY(opt_or)
3689
3638
  END_INSN(opt_or);
3690
3639
  }
3691
3640
 
3692
- /* insn opt_aref(ci, cc)(recv, obj)(val) */
3641
+ /* insn opt_aref(cd)(recv, obj)(val) */
3693
3642
  INSN_ENTRY(opt_aref)
3694
3643
  {
3695
3644
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3697,9 +3646,8 @@ INSN_ENTRY(opt_aref)
3697
3646
  DEBUG_ENTER_INSN("opt_aref");
3698
3647
 
3699
3648
  /* ### Declare and assign variables. ### */
3700
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3701
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3702
- # define INSN_ATTR(x) attr_ ## x ## _opt_aref(ci, cc)
3649
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3650
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aref(cd)
3703
3651
  bool leaf = INSN_ATTR(leaf);
3704
3652
  VALUE recv = TOPN(1);
3705
3653
  VALUE obj = TOPN(0);
@@ -3707,14 +3655,13 @@ INSN_ENTRY(opt_aref)
3707
3655
 
3708
3656
  /* ### Instruction preambles. ### */
3709
3657
  if (! leaf) ADD_PC(INSN_ATTR(width));
3710
- SETUP_CANARY();
3658
+ SETUP_CANARY(leaf);
3711
3659
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3712
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3713
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3660
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3714
3661
 
3715
3662
  /* ### Here we do the instruction body. ### */
3716
3663
  # define NAME_OF_CURRENT_INSN opt_aref
3717
- # line 1314 "insns.def"
3664
+ # line 1278 "insns.def"
3718
3665
  {
3719
3666
  val = vm_opt_aref(recv, obj);
3720
3667
 
@@ -3722,14 +3669,16 @@ INSN_ENTRY(opt_aref)
3722
3669
  CALL_SIMPLE_METHOD();
3723
3670
  }
3724
3671
  }
3725
- # line 3726 "vm.inc"
3672
+ # line 3673 "vm.inc"
3726
3673
  # undef NAME_OF_CURRENT_INSN
3727
3674
 
3728
3675
  /* ### Instruction trailers. ### */
3729
3676
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3730
- CHECK_CANARY();
3677
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3731
3678
  INC_SP(INSN_ATTR(sp_inc));
3732
3679
  TOPN(0) = val;
3680
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3681
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3733
3682
  if (leaf) ADD_PC(INSN_ATTR(width));
3734
3683
  # undef INSN_ATTR
3735
3684
 
@@ -3737,7 +3686,7 @@ INSN_ENTRY(opt_aref)
3737
3686
  END_INSN(opt_aref);
3738
3687
  }
3739
3688
 
3740
- /* insn opt_aset(ci, cc)(recv, obj, set)(val) */
3689
+ /* insn opt_aset(cd)(recv, obj, set)(val) */
3741
3690
  INSN_ENTRY(opt_aset)
3742
3691
  {
3743
3692
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3745,9 +3694,8 @@ INSN_ENTRY(opt_aset)
3745
3694
  DEBUG_ENTER_INSN("opt_aset");
3746
3695
 
3747
3696
  /* ### Declare and assign variables. ### */
3748
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3749
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3750
- # define INSN_ATTR(x) attr_ ## x ## _opt_aset(ci, cc)
3697
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3698
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aset(cd)
3751
3699
  bool leaf = INSN_ATTR(leaf);
3752
3700
  VALUE recv = TOPN(2);
3753
3701
  VALUE obj = TOPN(1);
@@ -3756,14 +3704,13 @@ INSN_ENTRY(opt_aset)
3756
3704
 
3757
3705
  /* ### Instruction preambles. ### */
3758
3706
  if (! leaf) ADD_PC(INSN_ATTR(width));
3759
- SETUP_CANARY();
3707
+ SETUP_CANARY(leaf);
3760
3708
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3761
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3762
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3709
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3763
3710
 
3764
3711
  /* ### Here we do the instruction body. ### */
3765
3712
  # define NAME_OF_CURRENT_INSN opt_aset
3766
- # line 1331 "insns.def"
3713
+ # line 1295 "insns.def"
3767
3714
  {
3768
3715
  val = vm_opt_aset(recv, obj, set);
3769
3716
 
@@ -3771,14 +3718,16 @@ INSN_ENTRY(opt_aset)
3771
3718
  CALL_SIMPLE_METHOD();
3772
3719
  }
3773
3720
  }
3774
- # line 3775 "vm.inc"
3721
+ # line 3722 "vm.inc"
3775
3722
  # undef NAME_OF_CURRENT_INSN
3776
3723
 
3777
3724
  /* ### Instruction trailers. ### */
3778
3725
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3779
- CHECK_CANARY();
3726
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3780
3727
  INC_SP(INSN_ATTR(sp_inc));
3781
3728
  TOPN(0) = val;
3729
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3730
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3782
3731
  if (leaf) ADD_PC(INSN_ATTR(width));
3783
3732
  # undef INSN_ATTR
3784
3733
 
@@ -3786,7 +3735,7 @@ INSN_ENTRY(opt_aset)
3786
3735
  END_INSN(opt_aset);
3787
3736
  }
3788
3737
 
3789
- /* insn opt_aset_with(key, ci, cc)(recv, val)(val) */
3738
+ /* insn opt_aset_with(key, cd)(recv, val)(val) */
3790
3739
  INSN_ENTRY(opt_aset_with)
3791
3740
  {
3792
3741
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3795,24 +3744,22 @@ INSN_ENTRY(opt_aset_with)
3795
3744
 
3796
3745
  /* ### Declare and assign variables. ### */
3797
3746
  VALUE key = (VALUE)GET_OPERAND(1);
3798
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
3799
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
3800
- # define INSN_ATTR(x) attr_ ## x ## _opt_aset_with(key, ci, cc)
3747
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
3748
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aset_with(key, cd)
3801
3749
  bool leaf = INSN_ATTR(leaf);
3802
3750
  VALUE recv = TOPN(1);
3803
3751
  VALUE val = TOPN(0);
3804
3752
 
3805
3753
  /* ### Instruction preambles. ### */
3806
3754
  if (! leaf) ADD_PC(INSN_ATTR(width));
3807
- SETUP_CANARY();
3755
+ SETUP_CANARY(leaf);
3808
3756
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3809
3757
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key);
3810
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
3811
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
3758
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
3812
3759
 
3813
3760
  /* ### Here we do the instruction body. ### */
3814
3761
  # define NAME_OF_CURRENT_INSN opt_aset_with
3815
- # line 1347 "insns.def"
3762
+ # line 1311 "insns.def"
3816
3763
  {
3817
3764
  VALUE tmp = vm_opt_aset_with(recv, key, val);
3818
3765
 
@@ -3827,14 +3774,16 @@ INSN_ENTRY(opt_aset_with)
3827
3774
  CALL_SIMPLE_METHOD();
3828
3775
  }
3829
3776
  }
3830
- # line 3831 "vm.inc"
3777
+ # line 3778 "vm.inc"
3831
3778
  # undef NAME_OF_CURRENT_INSN
3832
3779
 
3833
3780
  /* ### Instruction trailers. ### */
3834
3781
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3835
- CHECK_CANARY();
3782
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3836
3783
  INC_SP(INSN_ATTR(sp_inc));
3837
3784
  TOPN(0) = val;
3785
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3786
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3838
3787
  if (leaf) ADD_PC(INSN_ATTR(width));
3839
3788
  # undef INSN_ATTR
3840
3789
 
@@ -3842,7 +3791,7 @@ INSN_ENTRY(opt_aset_with)
3842
3791
  END_INSN(opt_aset_with);
3843
3792
  }
3844
3793
 
3845
- /* insn opt_aref_with(key, ci, cc)(recv)(val) */
3794
+ /* insn opt_aref_with(key, cd)(recv)(val) */
3846
3795
  INSN_ENTRY(opt_aref_with)
3847
3796
  {
3848
3797
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3851,24 +3800,22 @@ INSN_ENTRY(opt_aref_with)
3851
3800
 
3852
3801
  /* ### Declare and assign variables. ### */
3853
3802
  VALUE key = (VALUE)GET_OPERAND(1);
3854
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
3855
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
3856
- # define INSN_ATTR(x) attr_ ## x ## _opt_aref_with(key, ci, cc)
3803
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
3804
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aref_with(key, cd)
3857
3805
  bool leaf = INSN_ATTR(leaf);
3858
3806
  VALUE recv = TOPN(0);
3859
3807
  VALUE val;
3860
3808
 
3861
3809
  /* ### Instruction preambles. ### */
3862
3810
  if (! leaf) ADD_PC(INSN_ATTR(width));
3863
- SETUP_CANARY();
3811
+ SETUP_CANARY(leaf);
3864
3812
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3865
3813
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key);
3866
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
3867
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
3814
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
3868
3815
 
3869
3816
  /* ### Here we do the instruction body. ### */
3870
3817
  # define NAME_OF_CURRENT_INSN opt_aref_with
3871
- # line 1370 "insns.def"
3818
+ # line 1334 "insns.def"
3872
3819
  {
3873
3820
  val = vm_opt_aref_with(recv, key);
3874
3821
 
@@ -3879,14 +3826,16 @@ INSN_ENTRY(opt_aref_with)
3879
3826
  CALL_SIMPLE_METHOD();
3880
3827
  }
3881
3828
  }
3882
- # line 3883 "vm.inc"
3829
+ # line 3830 "vm.inc"
3883
3830
  # undef NAME_OF_CURRENT_INSN
3884
3831
 
3885
3832
  /* ### Instruction trailers. ### */
3886
3833
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3887
- CHECK_CANARY();
3834
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3888
3835
  INC_SP(INSN_ATTR(sp_inc));
3889
3836
  TOPN(0) = val;
3837
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3838
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3890
3839
  if (leaf) ADD_PC(INSN_ATTR(width));
3891
3840
  # undef INSN_ATTR
3892
3841
 
@@ -3894,7 +3843,7 @@ INSN_ENTRY(opt_aref_with)
3894
3843
  END_INSN(opt_aref_with);
3895
3844
  }
3896
3845
 
3897
- /* insn opt_length(ci, cc)(recv)(val) */
3846
+ /* insn opt_length(cd)(recv)(val) */
3898
3847
  INSN_ENTRY(opt_length)
3899
3848
  {
3900
3849
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3902,23 +3851,21 @@ INSN_ENTRY(opt_length)
3902
3851
  DEBUG_ENTER_INSN("opt_length");
3903
3852
 
3904
3853
  /* ### Declare and assign variables. ### */
3905
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3906
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3907
- # define INSN_ATTR(x) attr_ ## x ## _opt_length(ci, cc)
3854
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3855
+ # define INSN_ATTR(x) attr_ ## x ## _opt_length(cd)
3908
3856
  bool leaf = INSN_ATTR(leaf);
3909
3857
  VALUE recv = TOPN(0);
3910
3858
  VALUE val;
3911
3859
 
3912
3860
  /* ### Instruction preambles. ### */
3913
3861
  if (! leaf) ADD_PC(INSN_ATTR(width));
3914
- SETUP_CANARY();
3862
+ SETUP_CANARY(leaf);
3915
3863
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3916
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3917
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3864
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3918
3865
 
3919
3866
  /* ### Here we do the instruction body. ### */
3920
3867
  # define NAME_OF_CURRENT_INSN opt_length
3921
- # line 1387 "insns.def"
3868
+ # line 1351 "insns.def"
3922
3869
  {
3923
3870
  val = vm_opt_length(recv, BOP_LENGTH);
3924
3871
 
@@ -3926,14 +3873,16 @@ INSN_ENTRY(opt_length)
3926
3873
  CALL_SIMPLE_METHOD();
3927
3874
  }
3928
3875
  }
3929
- # line 3930 "vm.inc"
3876
+ # line 3877 "vm.inc"
3930
3877
  # undef NAME_OF_CURRENT_INSN
3931
3878
 
3932
3879
  /* ### Instruction trailers. ### */
3933
3880
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3934
- CHECK_CANARY();
3881
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3935
3882
  INC_SP(INSN_ATTR(sp_inc));
3936
3883
  TOPN(0) = val;
3884
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3885
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3937
3886
  if (leaf) ADD_PC(INSN_ATTR(width));
3938
3887
  # undef INSN_ATTR
3939
3888
 
@@ -3941,7 +3890,7 @@ INSN_ENTRY(opt_length)
3941
3890
  END_INSN(opt_length);
3942
3891
  }
3943
3892
 
3944
- /* insn opt_size(ci, cc)(recv)(val) */
3893
+ /* insn opt_size(cd)(recv)(val) */
3945
3894
  INSN_ENTRY(opt_size)
3946
3895
  {
3947
3896
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3949,23 +3898,21 @@ INSN_ENTRY(opt_size)
3949
3898
  DEBUG_ENTER_INSN("opt_size");
3950
3899
 
3951
3900
  /* ### Declare and assign variables. ### */
3952
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3953
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3954
- # define INSN_ATTR(x) attr_ ## x ## _opt_size(ci, cc)
3901
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3902
+ # define INSN_ATTR(x) attr_ ## x ## _opt_size(cd)
3955
3903
  bool leaf = INSN_ATTR(leaf);
3956
3904
  VALUE recv = TOPN(0);
3957
3905
  VALUE val;
3958
3906
 
3959
3907
  /* ### Instruction preambles. ### */
3960
3908
  if (! leaf) ADD_PC(INSN_ATTR(width));
3961
- SETUP_CANARY();
3909
+ SETUP_CANARY(leaf);
3962
3910
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3963
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3964
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3911
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3965
3912
 
3966
3913
  /* ### Here we do the instruction body. ### */
3967
3914
  # define NAME_OF_CURRENT_INSN opt_size
3968
- # line 1401 "insns.def"
3915
+ # line 1365 "insns.def"
3969
3916
  {
3970
3917
  val = vm_opt_length(recv, BOP_SIZE);
3971
3918
 
@@ -3973,14 +3920,16 @@ INSN_ENTRY(opt_size)
3973
3920
  CALL_SIMPLE_METHOD();
3974
3921
  }
3975
3922
  }
3976
- # line 3977 "vm.inc"
3923
+ # line 3924 "vm.inc"
3977
3924
  # undef NAME_OF_CURRENT_INSN
3978
3925
 
3979
3926
  /* ### Instruction trailers. ### */
3980
3927
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
3981
- CHECK_CANARY();
3928
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
3982
3929
  INC_SP(INSN_ATTR(sp_inc));
3983
3930
  TOPN(0) = val;
3931
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3932
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3984
3933
  if (leaf) ADD_PC(INSN_ATTR(width));
3985
3934
  # undef INSN_ATTR
3986
3935
 
@@ -3988,7 +3937,7 @@ INSN_ENTRY(opt_size)
3988
3937
  END_INSN(opt_size);
3989
3938
  }
3990
3939
 
3991
- /* insn opt_empty_p(ci, cc)(recv)(val) */
3940
+ /* insn opt_empty_p(cd)(recv)(val) */
3992
3941
  INSN_ENTRY(opt_empty_p)
3993
3942
  {
3994
3943
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3996,23 +3945,21 @@ INSN_ENTRY(opt_empty_p)
3996
3945
  DEBUG_ENTER_INSN("opt_empty_p");
3997
3946
 
3998
3947
  /* ### Declare and assign variables. ### */
3999
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4000
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4001
- # define INSN_ATTR(x) attr_ ## x ## _opt_empty_p(ci, cc)
3948
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3949
+ # define INSN_ATTR(x) attr_ ## x ## _opt_empty_p(cd)
4002
3950
  bool leaf = INSN_ATTR(leaf);
4003
3951
  VALUE recv = TOPN(0);
4004
3952
  VALUE val;
4005
3953
 
4006
3954
  /* ### Instruction preambles. ### */
4007
3955
  if (! leaf) ADD_PC(INSN_ATTR(width));
4008
- SETUP_CANARY();
3956
+ SETUP_CANARY(leaf);
4009
3957
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4010
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4011
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3958
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4012
3959
 
4013
3960
  /* ### Here we do the instruction body. ### */
4014
3961
  # define NAME_OF_CURRENT_INSN opt_empty_p
4015
- # line 1415 "insns.def"
3962
+ # line 1379 "insns.def"
4016
3963
  {
4017
3964
  val = vm_opt_empty_p(recv);
4018
3965
 
@@ -4020,14 +3967,16 @@ INSN_ENTRY(opt_empty_p)
4020
3967
  CALL_SIMPLE_METHOD();
4021
3968
  }
4022
3969
  }
4023
- # line 4024 "vm.inc"
3970
+ # line 3971 "vm.inc"
4024
3971
  # undef NAME_OF_CURRENT_INSN
4025
3972
 
4026
3973
  /* ### Instruction trailers. ### */
4027
3974
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4028
- CHECK_CANARY();
3975
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4029
3976
  INC_SP(INSN_ATTR(sp_inc));
4030
3977
  TOPN(0) = val;
3978
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3979
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4031
3980
  if (leaf) ADD_PC(INSN_ATTR(width));
4032
3981
  # undef INSN_ATTR
4033
3982
 
@@ -4035,7 +3984,7 @@ INSN_ENTRY(opt_empty_p)
4035
3984
  END_INSN(opt_empty_p);
4036
3985
  }
4037
3986
 
4038
- /* insn opt_succ(ci, cc)(recv)(val) */
3987
+ /* insn opt_succ(cd)(recv)(val) */
4039
3988
  INSN_ENTRY(opt_succ)
4040
3989
  {
4041
3990
  /* ### Declare that we have just entered into an instruction. ### */
@@ -4043,23 +3992,21 @@ INSN_ENTRY(opt_succ)
4043
3992
  DEBUG_ENTER_INSN("opt_succ");
4044
3993
 
4045
3994
  /* ### Declare and assign variables. ### */
4046
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4047
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4048
- # define INSN_ATTR(x) attr_ ## x ## _opt_succ(ci, cc)
3995
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3996
+ # define INSN_ATTR(x) attr_ ## x ## _opt_succ(cd)
4049
3997
  bool leaf = INSN_ATTR(leaf);
4050
3998
  VALUE recv = TOPN(0);
4051
3999
  VALUE val;
4052
4000
 
4053
4001
  /* ### Instruction preambles. ### */
4054
4002
  if (! leaf) ADD_PC(INSN_ATTR(width));
4055
- SETUP_CANARY();
4003
+ SETUP_CANARY(leaf);
4056
4004
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4057
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4058
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4005
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4059
4006
 
4060
4007
  /* ### Here we do the instruction body. ### */
4061
4008
  # define NAME_OF_CURRENT_INSN opt_succ
4062
- # line 1429 "insns.def"
4009
+ # line 1393 "insns.def"
4063
4010
  {
4064
4011
  val = vm_opt_succ(recv);
4065
4012
 
@@ -4067,14 +4014,16 @@ INSN_ENTRY(opt_succ)
4067
4014
  CALL_SIMPLE_METHOD();
4068
4015
  }
4069
4016
  }
4070
- # line 4071 "vm.inc"
4017
+ # line 4018 "vm.inc"
4071
4018
  # undef NAME_OF_CURRENT_INSN
4072
4019
 
4073
4020
  /* ### Instruction trailers. ### */
4074
4021
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4075
- CHECK_CANARY();
4022
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4076
4023
  INC_SP(INSN_ATTR(sp_inc));
4077
4024
  TOPN(0) = val;
4025
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4026
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4078
4027
  if (leaf) ADD_PC(INSN_ATTR(width));
4079
4028
  # undef INSN_ATTR
4080
4029
 
@@ -4082,7 +4031,7 @@ INSN_ENTRY(opt_succ)
4082
4031
  END_INSN(opt_succ);
4083
4032
  }
4084
4033
 
4085
- /* insn opt_not(ci, cc)(recv)(val) */
4034
+ /* insn opt_not(cd)(recv)(val) */
4086
4035
  INSN_ENTRY(opt_not)
4087
4036
  {
4088
4037
  /* ### Declare that we have just entered into an instruction. ### */
@@ -4090,38 +4039,38 @@ INSN_ENTRY(opt_not)
4090
4039
  DEBUG_ENTER_INSN("opt_not");
4091
4040
 
4092
4041
  /* ### Declare and assign variables. ### */
4093
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4094
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4095
- # define INSN_ATTR(x) attr_ ## x ## _opt_not(ci, cc)
4042
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
4043
+ # define INSN_ATTR(x) attr_ ## x ## _opt_not(cd)
4096
4044
  bool leaf = INSN_ATTR(leaf);
4097
4045
  VALUE recv = TOPN(0);
4098
4046
  VALUE val;
4099
4047
 
4100
4048
  /* ### Instruction preambles. ### */
4101
4049
  if (! leaf) ADD_PC(INSN_ATTR(width));
4102
- SETUP_CANARY();
4050
+ SETUP_CANARY(leaf);
4103
4051
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4104
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4105
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4052
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4106
4053
 
4107
4054
  /* ### Here we do the instruction body. ### */
4108
4055
  # define NAME_OF_CURRENT_INSN opt_not
4109
- # line 1443 "insns.def"
4056
+ # line 1407 "insns.def"
4110
4057
  {
4111
- val = vm_opt_not(ci, cc, recv);
4058
+ val = vm_opt_not(GET_ISEQ(), cd, recv);
4112
4059
 
4113
4060
  if (val == Qundef) {
4114
4061
  CALL_SIMPLE_METHOD();
4115
4062
  }
4116
4063
  }
4117
- # line 4118 "vm.inc"
4064
+ # line 4065 "vm.inc"
4118
4065
  # undef NAME_OF_CURRENT_INSN
4119
4066
 
4120
4067
  /* ### Instruction trailers. ### */
4121
4068
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4122
- CHECK_CANARY();
4069
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4123
4070
  INC_SP(INSN_ATTR(sp_inc));
4124
4071
  TOPN(0) = val;
4072
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4073
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4125
4074
  if (leaf) ADD_PC(INSN_ATTR(width));
4126
4075
  # undef INSN_ATTR
4127
4076
 
@@ -4129,7 +4078,7 @@ INSN_ENTRY(opt_not)
4129
4078
  END_INSN(opt_not);
4130
4079
  }
4131
4080
 
4132
- /* insn opt_regexpmatch2(ci, cc)(obj2, obj1)(val) */
4081
+ /* insn opt_regexpmatch2(cd)(obj2, obj1)(val) */
4133
4082
  INSN_ENTRY(opt_regexpmatch2)
4134
4083
  {
4135
4084
  /* ### Declare that we have just entered into an instruction. ### */
@@ -4137,9 +4086,8 @@ INSN_ENTRY(opt_regexpmatch2)
4137
4086
  DEBUG_ENTER_INSN("opt_regexpmatch2");
4138
4087
 
4139
4088
  /* ### Declare and assign variables. ### */
4140
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4141
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4142
- # define INSN_ATTR(x) attr_ ## x ## _opt_regexpmatch2(ci, cc)
4089
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
4090
+ # define INSN_ATTR(x) attr_ ## x ## _opt_regexpmatch2(cd)
4143
4091
  bool leaf = INSN_ATTR(leaf);
4144
4092
  VALUE obj2 = TOPN(1);
4145
4093
  VALUE obj1 = TOPN(0);
@@ -4147,14 +4095,13 @@ INSN_ENTRY(opt_regexpmatch2)
4147
4095
 
4148
4096
  /* ### Instruction preambles. ### */
4149
4097
  if (! leaf) ADD_PC(INSN_ATTR(width));
4150
- SETUP_CANARY();
4098
+ SETUP_CANARY(leaf);
4151
4099
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4152
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4153
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4100
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4154
4101
 
4155
4102
  /* ### Here we do the instruction body. ### */
4156
4103
  # define NAME_OF_CURRENT_INSN opt_regexpmatch2
4157
- # line 1458 "insns.def"
4104
+ # line 1422 "insns.def"
4158
4105
  {
4159
4106
  val = vm_opt_regexpmatch2(obj2, obj1);
4160
4107
 
@@ -4162,14 +4109,16 @@ INSN_ENTRY(opt_regexpmatch2)
4162
4109
  CALL_SIMPLE_METHOD();
4163
4110
  }
4164
4111
  }
4165
- # line 4166 "vm.inc"
4112
+ # line 4113 "vm.inc"
4166
4113
  # undef NAME_OF_CURRENT_INSN
4167
4114
 
4168
4115
  /* ### Instruction trailers. ### */
4169
4116
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4170
- CHECK_CANARY();
4117
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4171
4118
  INC_SP(INSN_ATTR(sp_inc));
4172
4119
  TOPN(0) = val;
4120
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4121
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4173
4122
  if (leaf) ADD_PC(INSN_ATTR(width));
4174
4123
  # undef INSN_ATTR
4175
4124
 
@@ -4177,51 +4126,148 @@ INSN_ENTRY(opt_regexpmatch2)
4177
4126
  END_INSN(opt_regexpmatch2);
4178
4127
  }
4179
4128
 
4180
- /* insn opt_call_c_function(funcptr)()() */
4181
- INSN_ENTRY(opt_call_c_function)
4129
+ /* insn invokebuiltin(bf)(...)(val) */
4130
+ INSN_ENTRY(invokebuiltin)
4182
4131
  {
4183
4132
  /* ### Declare that we have just entered into an instruction. ### */
4184
- START_OF_ORIGINAL_INSN(opt_call_c_function);
4185
- DEBUG_ENTER_INSN("opt_call_c_function");
4133
+ START_OF_ORIGINAL_INSN(invokebuiltin);
4134
+ DEBUG_ENTER_INSN("invokebuiltin");
4186
4135
 
4187
4136
  /* ### Declare and assign variables. ### */
4188
- rb_insn_func_t funcptr = (rb_insn_func_t)GET_OPERAND(1);
4189
- # define INSN_ATTR(x) attr_ ## x ## _opt_call_c_function(funcptr)
4137
+ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1);
4138
+ # define INSN_ATTR(x) attr_ ## x ## _invokebuiltin(bf)
4190
4139
  bool leaf = INSN_ATTR(leaf);
4140
+ VALUE val;
4191
4141
 
4192
4142
  /* ### Instruction preambles. ### */
4193
4143
  if (! leaf) ADD_PC(INSN_ATTR(width));
4194
- POPN(INSN_ATTR(popn));
4195
- SETUP_CANARY();
4144
+ SETUP_CANARY(leaf);
4196
4145
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4197
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, funcptr);
4146
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf);
4198
4147
 
4199
4148
  /* ### Here we do the instruction body. ### */
4200
- # define NAME_OF_CURRENT_INSN opt_call_c_function
4201
- # line 1474 "insns.def"
4149
+ # define NAME_OF_CURRENT_INSN invokebuiltin
4150
+ # line 1459 "insns.def"
4202
4151
  {
4203
- reg_cfp = (funcptr)(ec, reg_cfp);
4152
+ val = vm_invoke_builtin(ec, reg_cfp, bf, STACK_ADDR_FROM_TOP(bf->argc));
4153
+ }
4154
+ # line 4155 "vm.inc"
4155
+ # undef NAME_OF_CURRENT_INSN
4204
4156
 
4205
- if (reg_cfp == 0) {
4206
- VALUE err = ec->errinfo;
4207
- ec->errinfo = Qnil;
4208
- THROW_EXCEPTION(err);
4209
- }
4157
+ /* ### Instruction trailers. ### */
4158
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4159
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4160
+ INC_SP(INSN_ATTR(sp_inc));
4161
+ TOPN(0) = val;
4162
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4163
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4164
+ if (leaf) ADD_PC(INSN_ATTR(width));
4165
+ # undef INSN_ATTR
4210
4166
 
4211
- RESTORE_REGS();
4212
- NEXT_INSN();
4167
+ /* ### Leave the instruction. ### */
4168
+ END_INSN(invokebuiltin);
4213
4169
  }
4214
- # line 4215 "vm.inc"
4170
+
4171
+ /* insn opt_invokebuiltin_delegate(bf, index)()(val) */
4172
+ INSN_ENTRY(opt_invokebuiltin_delegate)
4173
+ {
4174
+ /* ### Declare that we have just entered into an instruction. ### */
4175
+ START_OF_ORIGINAL_INSN(opt_invokebuiltin_delegate);
4176
+ DEBUG_ENTER_INSN("opt_invokebuiltin_delegate");
4177
+
4178
+ /* ### Declare and assign variables. ### */
4179
+ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1);
4180
+ rb_num_t index = (rb_num_t)GET_OPERAND(2);
4181
+ # define INSN_ATTR(x) attr_ ## x ## _opt_invokebuiltin_delegate(bf, index)
4182
+ bool leaf = INSN_ATTR(leaf);
4183
+ VALUE val;
4184
+
4185
+ /* ### Instruction preambles. ### */
4186
+ if (! leaf) ADD_PC(INSN_ATTR(width));
4187
+ SETUP_CANARY(leaf);
4188
+ COLLECT_USAGE_INSN(INSN_ATTR(bin));
4189
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf);
4190
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, index);
4191
+
4192
+ /* ### Here we do the instruction body. ### */
4193
+ # define NAME_OF_CURRENT_INSN opt_invokebuiltin_delegate
4194
+ # line 1470 "insns.def"
4195
+ {
4196
+ val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);
4197
+ }
4198
+ # line 4199 "vm.inc"
4215
4199
  # undef NAME_OF_CURRENT_INSN
4216
4200
 
4217
4201
  /* ### Instruction trailers. ### */
4218
4202
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4219
- CHECK_CANARY();
4203
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4204
+ INC_SP(INSN_ATTR(sp_inc));
4205
+ TOPN(0) = val;
4206
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4207
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4220
4208
  if (leaf) ADD_PC(INSN_ATTR(width));
4221
4209
  # undef INSN_ATTR
4222
4210
 
4223
4211
  /* ### Leave the instruction. ### */
4224
- END_INSN(opt_call_c_function);
4212
+ END_INSN(opt_invokebuiltin_delegate);
4213
+ }
4214
+
4215
+ /* insn opt_invokebuiltin_delegate_leave(bf, index)()(val) */
4216
+ INSN_ENTRY(opt_invokebuiltin_delegate_leave)
4217
+ {
4218
+ /* ### Declare that we have just entered into an instruction. ### */
4219
+ START_OF_ORIGINAL_INSN(opt_invokebuiltin_delegate_leave);
4220
+ DEBUG_ENTER_INSN("opt_invokebuiltin_delegate_leave");
4221
+
4222
+ /* ### Declare and assign variables. ### */
4223
+ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1);
4224
+ rb_num_t index = (rb_num_t)GET_OPERAND(2);
4225
+ # define INSN_ATTR(x) attr_ ## x ## _opt_invokebuiltin_delegate_leave(bf, index)
4226
+ bool leaf = INSN_ATTR(leaf);
4227
+ VALUE val;
4228
+
4229
+ /* ### Instruction preambles. ### */
4230
+ if (! leaf) ADD_PC(INSN_ATTR(width));
4231
+ SETUP_CANARY(leaf);
4232
+ COLLECT_USAGE_INSN(INSN_ATTR(bin));
4233
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf);
4234
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, index);
4235
+
4236
+ /* ### Here we do the instruction body. ### */
4237
+ # define NAME_OF_CURRENT_INSN opt_invokebuiltin_delegate_leave
4238
+ # line 1481 "insns.def"
4239
+ {
4240
+ val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);
4241
+
4242
+ /* leave fastpath */
4243
+ /* TracePoint/return fallbacks this insn to opt_invokebuiltin_delegate */
4244
+ if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
4245
+ # if OPT_CALL_THREADED_CODE
4246
+ rb_ec_thread_ptr(ec)->retval = val;
4247
+ return 0;
4248
+ # else
4249
+ return val;
4250
+ # endif
4251
+ }
4252
+ else {
4253
+ RESTORE_REGS();
4254
+ }
4255
+ }
4256
+ # line 4257 "vm.inc"
4257
+ # undef NAME_OF_CURRENT_INSN
4258
+
4259
+ /* ### Instruction trailers. ### */
4260
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4261
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4262
+ INC_SP(INSN_ATTR(sp_inc));
4263
+ TOPN(0) = val;
4264
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4265
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4266
+ if (leaf) ADD_PC(INSN_ATTR(width));
4267
+ # undef INSN_ATTR
4268
+
4269
+ /* ### Leave the instruction. ### */
4270
+ END_INSN(opt_invokebuiltin_delegate_leave);
4225
4271
  }
4226
4272
 
4227
4273
  /* insn getlocal_WC_0(idx)()(val) */
@@ -4234,7 +4280,7 @@ INSN_ENTRY(getlocal_WC_0)
4234
4280
  /* ### Declare and assign variables. ### */
4235
4281
  #line 10 "defs/opt_operand.def"
4236
4282
  const rb_num_t level = 0;
4237
- #line 4238 "vm.inc"
4283
+ #line 4284 "vm.inc"
4238
4284
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4239
4285
  # define INSN_ATTR(x) attr_ ## x ## _getlocal_WC_0(idx)
4240
4286
  bool leaf = INSN_ATTR(leaf);
@@ -4242,7 +4288,7 @@ INSN_ENTRY(getlocal_WC_0)
4242
4288
 
4243
4289
  /* ### Instruction preambles. ### */
4244
4290
  if (! leaf) ADD_PC(INSN_ATTR(width));
4245
- SETUP_CANARY();
4291
+ SETUP_CANARY(leaf);
4246
4292
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4247
4293
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
4248
4294
 
@@ -4254,14 +4300,16 @@ INSN_ENTRY(getlocal_WC_0)
4254
4300
  RB_DEBUG_COUNTER_INC(lvar_get);
4255
4301
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
4256
4302
  }
4257
- # line 4258 "vm.inc"
4303
+ # line 4304 "vm.inc"
4258
4304
  # undef NAME_OF_CURRENT_INSN
4259
4305
 
4260
4306
  /* ### Instruction trailers. ### */
4261
4307
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4262
- CHECK_CANARY();
4308
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4263
4309
  INC_SP(INSN_ATTR(sp_inc));
4264
4310
  TOPN(0) = val;
4311
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4312
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4265
4313
  if (leaf) ADD_PC(INSN_ATTR(width));
4266
4314
  # undef INSN_ATTR
4267
4315
 
@@ -4279,7 +4327,7 @@ INSN_ENTRY(getlocal_WC_1)
4279
4327
  /* ### Declare and assign variables. ### */
4280
4328
  #line 11 "defs/opt_operand.def"
4281
4329
  const rb_num_t level = 1;
4282
- #line 4283 "vm.inc"
4330
+ #line 4331 "vm.inc"
4283
4331
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4284
4332
  # define INSN_ATTR(x) attr_ ## x ## _getlocal_WC_1(idx)
4285
4333
  bool leaf = INSN_ATTR(leaf);
@@ -4287,7 +4335,7 @@ INSN_ENTRY(getlocal_WC_1)
4287
4335
 
4288
4336
  /* ### Instruction preambles. ### */
4289
4337
  if (! leaf) ADD_PC(INSN_ATTR(width));
4290
- SETUP_CANARY();
4338
+ SETUP_CANARY(leaf);
4291
4339
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4292
4340
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
4293
4341
 
@@ -4299,14 +4347,16 @@ INSN_ENTRY(getlocal_WC_1)
4299
4347
  RB_DEBUG_COUNTER_INC(lvar_get);
4300
4348
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
4301
4349
  }
4302
- # line 4303 "vm.inc"
4350
+ # line 4351 "vm.inc"
4303
4351
  # undef NAME_OF_CURRENT_INSN
4304
4352
 
4305
4353
  /* ### Instruction trailers. ### */
4306
4354
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4307
- CHECK_CANARY();
4355
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4308
4356
  INC_SP(INSN_ATTR(sp_inc));
4309
4357
  TOPN(0) = val;
4358
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4359
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4310
4360
  if (leaf) ADD_PC(INSN_ATTR(width));
4311
4361
  # undef INSN_ATTR
4312
4362
 
@@ -4324,7 +4374,7 @@ INSN_ENTRY(setlocal_WC_0)
4324
4374
  /* ### Declare and assign variables. ### */
4325
4375
  #line 12 "defs/opt_operand.def"
4326
4376
  const rb_num_t level = 0;
4327
- #line 4328 "vm.inc"
4377
+ #line 4378 "vm.inc"
4328
4378
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4329
4379
  # define INSN_ATTR(x) attr_ ## x ## _setlocal_WC_0(idx)
4330
4380
  bool leaf = INSN_ATTR(leaf);
@@ -4332,7 +4382,7 @@ INSN_ENTRY(setlocal_WC_0)
4332
4382
 
4333
4383
  /* ### Instruction preambles. ### */
4334
4384
  if (! leaf) ADD_PC(INSN_ATTR(width));
4335
- SETUP_CANARY();
4385
+ SETUP_CANARY(leaf);
4336
4386
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4337
4387
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
4338
4388
 
@@ -4344,12 +4394,12 @@ INSN_ENTRY(setlocal_WC_0)
4344
4394
  RB_DEBUG_COUNTER_INC(lvar_set);
4345
4395
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);
4346
4396
  }
4347
- # line 4348 "vm.inc"
4397
+ # line 4398 "vm.inc"
4348
4398
  # undef NAME_OF_CURRENT_INSN
4349
4399
 
4350
4400
  /* ### Instruction trailers. ### */
4351
4401
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4352
- CHECK_CANARY();
4402
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4353
4403
  INC_SP(INSN_ATTR(sp_inc));
4354
4404
  if (leaf) ADD_PC(INSN_ATTR(width));
4355
4405
  # undef INSN_ATTR
@@ -4368,7 +4418,7 @@ INSN_ENTRY(setlocal_WC_1)
4368
4418
  /* ### Declare and assign variables. ### */
4369
4419
  #line 13 "defs/opt_operand.def"
4370
4420
  const rb_num_t level = 1;
4371
- #line 4372 "vm.inc"
4421
+ #line 4422 "vm.inc"
4372
4422
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4373
4423
  # define INSN_ATTR(x) attr_ ## x ## _setlocal_WC_1(idx)
4374
4424
  bool leaf = INSN_ATTR(leaf);
@@ -4376,7 +4426,7 @@ INSN_ENTRY(setlocal_WC_1)
4376
4426
 
4377
4427
  /* ### Instruction preambles. ### */
4378
4428
  if (! leaf) ADD_PC(INSN_ATTR(width));
4379
- SETUP_CANARY();
4429
+ SETUP_CANARY(leaf);
4380
4430
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4381
4431
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx);
4382
4432
 
@@ -4388,12 +4438,12 @@ INSN_ENTRY(setlocal_WC_1)
4388
4438
  RB_DEBUG_COUNTER_INC(lvar_set);
4389
4439
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);
4390
4440
  }
4391
- # line 4392 "vm.inc"
4441
+ # line 4442 "vm.inc"
4392
4442
  # undef NAME_OF_CURRENT_INSN
4393
4443
 
4394
4444
  /* ### Instruction trailers. ### */
4395
4445
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4396
- CHECK_CANARY();
4446
+ CHECK_CANARY(leaf, INSN_ATTR(bin));
4397
4447
  INC_SP(INSN_ATTR(sp_inc));
4398
4448
  if (leaf) ADD_PC(INSN_ATTR(width));
4399
4449
  # undef INSN_ATTR
@@ -4412,7 +4462,7 @@ INSN_ENTRY(putobject_INT2FIX_0_)
4412
4462
  /* ### Declare and assign variables. ### */
4413
4463
  #line 15 "defs/opt_operand.def"
4414
4464
  const VALUE val = INT2FIX(0);
4415
- #line 4416 "vm.inc"
4465
+ #line 4466 "vm.inc"
4416
4466
  # define INSN_ATTR(x) attr_ ## x ## _putobject_INT2FIX_0_()
4417
4467
  bool leaf = INSN_ATTR(leaf);
4418
4468
 
@@ -4424,6 +4474,8 @@ INSN_ENTRY(putobject_INT2FIX_0_)
4424
4474
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4425
4475
  INC_SP(INSN_ATTR(sp_inc));
4426
4476
  TOPN(0) = val;
4477
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4478
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4427
4479
  if (leaf) ADD_PC(INSN_ATTR(width));
4428
4480
  # undef INSN_ATTR
4429
4481
 
@@ -4441,7 +4493,7 @@ INSN_ENTRY(putobject_INT2FIX_1_)
4441
4493
  /* ### Declare and assign variables. ### */
4442
4494
  #line 16 "defs/opt_operand.def"
4443
4495
  const VALUE val = INT2FIX(1);
4444
- #line 4445 "vm.inc"
4496
+ #line 4497 "vm.inc"
4445
4497
  # define INSN_ATTR(x) attr_ ## x ## _putobject_INT2FIX_1_()
4446
4498
  bool leaf = INSN_ATTR(leaf);
4447
4499
 
@@ -4453,6 +4505,8 @@ INSN_ENTRY(putobject_INT2FIX_1_)
4453
4505
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4454
4506
  INC_SP(INSN_ATTR(sp_inc));
4455
4507
  TOPN(0) = val;
4508
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4509
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4456
4510
  if (leaf) ADD_PC(INSN_ATTR(width));
4457
4511
  # undef INSN_ATTR
4458
4512
 
@@ -4463,7 +4517,8 @@ INSN_ENTRY(putobject_INT2FIX_1_)
4463
4517
  /* insn trace_nop(...)(...)(...) */
4464
4518
  INSN_ENTRY(trace_nop)
4465
4519
  {
4466
- vm_trace(ec, GET_CFP(), GET_PC());
4520
+ vm_trace(ec, GET_CFP());
4521
+
4467
4522
  DISPATCH_ORIGINAL_INSN(nop);
4468
4523
  END_INSN(trace_nop);
4469
4524
  }
@@ -4471,7 +4526,8 @@ INSN_ENTRY(trace_nop)
4471
4526
  /* insn trace_getlocal(...)(...)(...) */
4472
4527
  INSN_ENTRY(trace_getlocal)
4473
4528
  {
4474
- vm_trace(ec, GET_CFP(), GET_PC());
4529
+ vm_trace(ec, GET_CFP());
4530
+
4475
4531
  DISPATCH_ORIGINAL_INSN(getlocal);
4476
4532
  END_INSN(trace_getlocal);
4477
4533
  }
@@ -4479,7 +4535,8 @@ INSN_ENTRY(trace_getlocal)
4479
4535
  /* insn trace_setlocal(...)(...)(...) */
4480
4536
  INSN_ENTRY(trace_setlocal)
4481
4537
  {
4482
- vm_trace(ec, GET_CFP(), GET_PC());
4538
+ vm_trace(ec, GET_CFP());
4539
+
4483
4540
  DISPATCH_ORIGINAL_INSN(setlocal);
4484
4541
  END_INSN(trace_setlocal);
4485
4542
  }
@@ -4487,7 +4544,8 @@ INSN_ENTRY(trace_setlocal)
4487
4544
  /* insn trace_getblockparam(...)(...)(...) */
4488
4545
  INSN_ENTRY(trace_getblockparam)
4489
4546
  {
4490
- vm_trace(ec, GET_CFP(), GET_PC());
4547
+ vm_trace(ec, GET_CFP());
4548
+
4491
4549
  DISPATCH_ORIGINAL_INSN(getblockparam);
4492
4550
  END_INSN(trace_getblockparam);
4493
4551
  }
@@ -4495,7 +4553,8 @@ INSN_ENTRY(trace_getblockparam)
4495
4553
  /* insn trace_setblockparam(...)(...)(...) */
4496
4554
  INSN_ENTRY(trace_setblockparam)
4497
4555
  {
4498
- vm_trace(ec, GET_CFP(), GET_PC());
4556
+ vm_trace(ec, GET_CFP());
4557
+
4499
4558
  DISPATCH_ORIGINAL_INSN(setblockparam);
4500
4559
  END_INSN(trace_setblockparam);
4501
4560
  }
@@ -4503,7 +4562,8 @@ INSN_ENTRY(trace_setblockparam)
4503
4562
  /* insn trace_getblockparamproxy(...)(...)(...) */
4504
4563
  INSN_ENTRY(trace_getblockparamproxy)
4505
4564
  {
4506
- vm_trace(ec, GET_CFP(), GET_PC());
4565
+ vm_trace(ec, GET_CFP());
4566
+
4507
4567
  DISPATCH_ORIGINAL_INSN(getblockparamproxy);
4508
4568
  END_INSN(trace_getblockparamproxy);
4509
4569
  }
@@ -4511,7 +4571,8 @@ INSN_ENTRY(trace_getblockparamproxy)
4511
4571
  /* insn trace_getspecial(...)(...)(...) */
4512
4572
  INSN_ENTRY(trace_getspecial)
4513
4573
  {
4514
- vm_trace(ec, GET_CFP(), GET_PC());
4574
+ vm_trace(ec, GET_CFP());
4575
+
4515
4576
  DISPATCH_ORIGINAL_INSN(getspecial);
4516
4577
  END_INSN(trace_getspecial);
4517
4578
  }
@@ -4519,7 +4580,8 @@ INSN_ENTRY(trace_getspecial)
4519
4580
  /* insn trace_setspecial(...)(...)(...) */
4520
4581
  INSN_ENTRY(trace_setspecial)
4521
4582
  {
4522
- vm_trace(ec, GET_CFP(), GET_PC());
4583
+ vm_trace(ec, GET_CFP());
4584
+
4523
4585
  DISPATCH_ORIGINAL_INSN(setspecial);
4524
4586
  END_INSN(trace_setspecial);
4525
4587
  }
@@ -4527,7 +4589,8 @@ INSN_ENTRY(trace_setspecial)
4527
4589
  /* insn trace_getinstancevariable(...)(...)(...) */
4528
4590
  INSN_ENTRY(trace_getinstancevariable)
4529
4591
  {
4530
- vm_trace(ec, GET_CFP(), GET_PC());
4592
+ vm_trace(ec, GET_CFP());
4593
+
4531
4594
  DISPATCH_ORIGINAL_INSN(getinstancevariable);
4532
4595
  END_INSN(trace_getinstancevariable);
4533
4596
  }
@@ -4535,7 +4598,8 @@ INSN_ENTRY(trace_getinstancevariable)
4535
4598
  /* insn trace_setinstancevariable(...)(...)(...) */
4536
4599
  INSN_ENTRY(trace_setinstancevariable)
4537
4600
  {
4538
- vm_trace(ec, GET_CFP(), GET_PC());
4601
+ vm_trace(ec, GET_CFP());
4602
+
4539
4603
  DISPATCH_ORIGINAL_INSN(setinstancevariable);
4540
4604
  END_INSN(trace_setinstancevariable);
4541
4605
  }
@@ -4543,7 +4607,8 @@ INSN_ENTRY(trace_setinstancevariable)
4543
4607
  /* insn trace_getclassvariable(...)(...)(...) */
4544
4608
  INSN_ENTRY(trace_getclassvariable)
4545
4609
  {
4546
- vm_trace(ec, GET_CFP(), GET_PC());
4610
+ vm_trace(ec, GET_CFP());
4611
+
4547
4612
  DISPATCH_ORIGINAL_INSN(getclassvariable);
4548
4613
  END_INSN(trace_getclassvariable);
4549
4614
  }
@@ -4551,7 +4616,8 @@ INSN_ENTRY(trace_getclassvariable)
4551
4616
  /* insn trace_setclassvariable(...)(...)(...) */
4552
4617
  INSN_ENTRY(trace_setclassvariable)
4553
4618
  {
4554
- vm_trace(ec, GET_CFP(), GET_PC());
4619
+ vm_trace(ec, GET_CFP());
4620
+
4555
4621
  DISPATCH_ORIGINAL_INSN(setclassvariable);
4556
4622
  END_INSN(trace_setclassvariable);
4557
4623
  }
@@ -4559,7 +4625,8 @@ INSN_ENTRY(trace_setclassvariable)
4559
4625
  /* insn trace_getconstant(...)(...)(...) */
4560
4626
  INSN_ENTRY(trace_getconstant)
4561
4627
  {
4562
- vm_trace(ec, GET_CFP(), GET_PC());
4628
+ vm_trace(ec, GET_CFP());
4629
+
4563
4630
  DISPATCH_ORIGINAL_INSN(getconstant);
4564
4631
  END_INSN(trace_getconstant);
4565
4632
  }
@@ -4567,7 +4634,8 @@ INSN_ENTRY(trace_getconstant)
4567
4634
  /* insn trace_setconstant(...)(...)(...) */
4568
4635
  INSN_ENTRY(trace_setconstant)
4569
4636
  {
4570
- vm_trace(ec, GET_CFP(), GET_PC());
4637
+ vm_trace(ec, GET_CFP());
4638
+
4571
4639
  DISPATCH_ORIGINAL_INSN(setconstant);
4572
4640
  END_INSN(trace_setconstant);
4573
4641
  }
@@ -4575,7 +4643,8 @@ INSN_ENTRY(trace_setconstant)
4575
4643
  /* insn trace_getglobal(...)(...)(...) */
4576
4644
  INSN_ENTRY(trace_getglobal)
4577
4645
  {
4578
- vm_trace(ec, GET_CFP(), GET_PC());
4646
+ vm_trace(ec, GET_CFP());
4647
+
4579
4648
  DISPATCH_ORIGINAL_INSN(getglobal);
4580
4649
  END_INSN(trace_getglobal);
4581
4650
  }
@@ -4583,7 +4652,8 @@ INSN_ENTRY(trace_getglobal)
4583
4652
  /* insn trace_setglobal(...)(...)(...) */
4584
4653
  INSN_ENTRY(trace_setglobal)
4585
4654
  {
4586
- vm_trace(ec, GET_CFP(), GET_PC());
4655
+ vm_trace(ec, GET_CFP());
4656
+
4587
4657
  DISPATCH_ORIGINAL_INSN(setglobal);
4588
4658
  END_INSN(trace_setglobal);
4589
4659
  }
@@ -4591,7 +4661,8 @@ INSN_ENTRY(trace_setglobal)
4591
4661
  /* insn trace_putnil(...)(...)(...) */
4592
4662
  INSN_ENTRY(trace_putnil)
4593
4663
  {
4594
- vm_trace(ec, GET_CFP(), GET_PC());
4664
+ vm_trace(ec, GET_CFP());
4665
+
4595
4666
  DISPATCH_ORIGINAL_INSN(putnil);
4596
4667
  END_INSN(trace_putnil);
4597
4668
  }
@@ -4599,7 +4670,8 @@ INSN_ENTRY(trace_putnil)
4599
4670
  /* insn trace_putself(...)(...)(...) */
4600
4671
  INSN_ENTRY(trace_putself)
4601
4672
  {
4602
- vm_trace(ec, GET_CFP(), GET_PC());
4673
+ vm_trace(ec, GET_CFP());
4674
+
4603
4675
  DISPATCH_ORIGINAL_INSN(putself);
4604
4676
  END_INSN(trace_putself);
4605
4677
  }
@@ -4607,7 +4679,8 @@ INSN_ENTRY(trace_putself)
4607
4679
  /* insn trace_putobject(...)(...)(...) */
4608
4680
  INSN_ENTRY(trace_putobject)
4609
4681
  {
4610
- vm_trace(ec, GET_CFP(), GET_PC());
4682
+ vm_trace(ec, GET_CFP());
4683
+
4611
4684
  DISPATCH_ORIGINAL_INSN(putobject);
4612
4685
  END_INSN(trace_putobject);
4613
4686
  }
@@ -4615,7 +4688,8 @@ INSN_ENTRY(trace_putobject)
4615
4688
  /* insn trace_putspecialobject(...)(...)(...) */
4616
4689
  INSN_ENTRY(trace_putspecialobject)
4617
4690
  {
4618
- vm_trace(ec, GET_CFP(), GET_PC());
4691
+ vm_trace(ec, GET_CFP());
4692
+
4619
4693
  DISPATCH_ORIGINAL_INSN(putspecialobject);
4620
4694
  END_INSN(trace_putspecialobject);
4621
4695
  }
@@ -4623,7 +4697,8 @@ INSN_ENTRY(trace_putspecialobject)
4623
4697
  /* insn trace_putstring(...)(...)(...) */
4624
4698
  INSN_ENTRY(trace_putstring)
4625
4699
  {
4626
- vm_trace(ec, GET_CFP(), GET_PC());
4700
+ vm_trace(ec, GET_CFP());
4701
+
4627
4702
  DISPATCH_ORIGINAL_INSN(putstring);
4628
4703
  END_INSN(trace_putstring);
4629
4704
  }
@@ -4631,7 +4706,8 @@ INSN_ENTRY(trace_putstring)
4631
4706
  /* insn trace_concatstrings(...)(...)(...) */
4632
4707
  INSN_ENTRY(trace_concatstrings)
4633
4708
  {
4634
- vm_trace(ec, GET_CFP(), GET_PC());
4709
+ vm_trace(ec, GET_CFP());
4710
+
4635
4711
  DISPATCH_ORIGINAL_INSN(concatstrings);
4636
4712
  END_INSN(trace_concatstrings);
4637
4713
  }
@@ -4639,23 +4715,17 @@ INSN_ENTRY(trace_concatstrings)
4639
4715
  /* insn trace_tostring(...)(...)(...) */
4640
4716
  INSN_ENTRY(trace_tostring)
4641
4717
  {
4642
- vm_trace(ec, GET_CFP(), GET_PC());
4718
+ vm_trace(ec, GET_CFP());
4719
+
4643
4720
  DISPATCH_ORIGINAL_INSN(tostring);
4644
4721
  END_INSN(trace_tostring);
4645
4722
  }
4646
4723
 
4647
- /* insn trace_freezestring(...)(...)(...) */
4648
- INSN_ENTRY(trace_freezestring)
4649
- {
4650
- vm_trace(ec, GET_CFP(), GET_PC());
4651
- DISPATCH_ORIGINAL_INSN(freezestring);
4652
- END_INSN(trace_freezestring);
4653
- }
4654
-
4655
4724
  /* insn trace_toregexp(...)(...)(...) */
4656
4725
  INSN_ENTRY(trace_toregexp)
4657
4726
  {
4658
- vm_trace(ec, GET_CFP(), GET_PC());
4727
+ vm_trace(ec, GET_CFP());
4728
+
4659
4729
  DISPATCH_ORIGINAL_INSN(toregexp);
4660
4730
  END_INSN(trace_toregexp);
4661
4731
  }
@@ -4663,7 +4733,8 @@ INSN_ENTRY(trace_toregexp)
4663
4733
  /* insn trace_intern(...)(...)(...) */
4664
4734
  INSN_ENTRY(trace_intern)
4665
4735
  {
4666
- vm_trace(ec, GET_CFP(), GET_PC());
4736
+ vm_trace(ec, GET_CFP());
4737
+
4667
4738
  DISPATCH_ORIGINAL_INSN(intern);
4668
4739
  END_INSN(trace_intern);
4669
4740
  }
@@ -4671,7 +4742,8 @@ INSN_ENTRY(trace_intern)
4671
4742
  /* insn trace_newarray(...)(...)(...) */
4672
4743
  INSN_ENTRY(trace_newarray)
4673
4744
  {
4674
- vm_trace(ec, GET_CFP(), GET_PC());
4745
+ vm_trace(ec, GET_CFP());
4746
+
4675
4747
  DISPATCH_ORIGINAL_INSN(newarray);
4676
4748
  END_INSN(trace_newarray);
4677
4749
  }
@@ -4679,7 +4751,8 @@ INSN_ENTRY(trace_newarray)
4679
4751
  /* insn trace_newarraykwsplat(...)(...)(...) */
4680
4752
  INSN_ENTRY(trace_newarraykwsplat)
4681
4753
  {
4682
- vm_trace(ec, GET_CFP(), GET_PC());
4754
+ vm_trace(ec, GET_CFP());
4755
+
4683
4756
  DISPATCH_ORIGINAL_INSN(newarraykwsplat);
4684
4757
  END_INSN(trace_newarraykwsplat);
4685
4758
  }
@@ -4687,7 +4760,8 @@ INSN_ENTRY(trace_newarraykwsplat)
4687
4760
  /* insn trace_duparray(...)(...)(...) */
4688
4761
  INSN_ENTRY(trace_duparray)
4689
4762
  {
4690
- vm_trace(ec, GET_CFP(), GET_PC());
4763
+ vm_trace(ec, GET_CFP());
4764
+
4691
4765
  DISPATCH_ORIGINAL_INSN(duparray);
4692
4766
  END_INSN(trace_duparray);
4693
4767
  }
@@ -4695,7 +4769,8 @@ INSN_ENTRY(trace_duparray)
4695
4769
  /* insn trace_duphash(...)(...)(...) */
4696
4770
  INSN_ENTRY(trace_duphash)
4697
4771
  {
4698
- vm_trace(ec, GET_CFP(), GET_PC());
4772
+ vm_trace(ec, GET_CFP());
4773
+
4699
4774
  DISPATCH_ORIGINAL_INSN(duphash);
4700
4775
  END_INSN(trace_duphash);
4701
4776
  }
@@ -4703,7 +4778,8 @@ INSN_ENTRY(trace_duphash)
4703
4778
  /* insn trace_expandarray(...)(...)(...) */
4704
4779
  INSN_ENTRY(trace_expandarray)
4705
4780
  {
4706
- vm_trace(ec, GET_CFP(), GET_PC());
4781
+ vm_trace(ec, GET_CFP());
4782
+
4707
4783
  DISPATCH_ORIGINAL_INSN(expandarray);
4708
4784
  END_INSN(trace_expandarray);
4709
4785
  }
@@ -4711,7 +4787,8 @@ INSN_ENTRY(trace_expandarray)
4711
4787
  /* insn trace_concatarray(...)(...)(...) */
4712
4788
  INSN_ENTRY(trace_concatarray)
4713
4789
  {
4714
- vm_trace(ec, GET_CFP(), GET_PC());
4790
+ vm_trace(ec, GET_CFP());
4791
+
4715
4792
  DISPATCH_ORIGINAL_INSN(concatarray);
4716
4793
  END_INSN(trace_concatarray);
4717
4794
  }
@@ -4719,7 +4796,8 @@ INSN_ENTRY(trace_concatarray)
4719
4796
  /* insn trace_splatarray(...)(...)(...) */
4720
4797
  INSN_ENTRY(trace_splatarray)
4721
4798
  {
4722
- vm_trace(ec, GET_CFP(), GET_PC());
4799
+ vm_trace(ec, GET_CFP());
4800
+
4723
4801
  DISPATCH_ORIGINAL_INSN(splatarray);
4724
4802
  END_INSN(trace_splatarray);
4725
4803
  }
@@ -4727,7 +4805,8 @@ INSN_ENTRY(trace_splatarray)
4727
4805
  /* insn trace_newhash(...)(...)(...) */
4728
4806
  INSN_ENTRY(trace_newhash)
4729
4807
  {
4730
- vm_trace(ec, GET_CFP(), GET_PC());
4808
+ vm_trace(ec, GET_CFP());
4809
+
4731
4810
  DISPATCH_ORIGINAL_INSN(newhash);
4732
4811
  END_INSN(trace_newhash);
4733
4812
  }
@@ -4735,7 +4814,8 @@ INSN_ENTRY(trace_newhash)
4735
4814
  /* insn trace_newrange(...)(...)(...) */
4736
4815
  INSN_ENTRY(trace_newrange)
4737
4816
  {
4738
- vm_trace(ec, GET_CFP(), GET_PC());
4817
+ vm_trace(ec, GET_CFP());
4818
+
4739
4819
  DISPATCH_ORIGINAL_INSN(newrange);
4740
4820
  END_INSN(trace_newrange);
4741
4821
  }
@@ -4743,7 +4823,8 @@ INSN_ENTRY(trace_newrange)
4743
4823
  /* insn trace_pop(...)(...)(...) */
4744
4824
  INSN_ENTRY(trace_pop)
4745
4825
  {
4746
- vm_trace(ec, GET_CFP(), GET_PC());
4826
+ vm_trace(ec, GET_CFP());
4827
+
4747
4828
  DISPATCH_ORIGINAL_INSN(pop);
4748
4829
  END_INSN(trace_pop);
4749
4830
  }
@@ -4751,7 +4832,8 @@ INSN_ENTRY(trace_pop)
4751
4832
  /* insn trace_dup(...)(...)(...) */
4752
4833
  INSN_ENTRY(trace_dup)
4753
4834
  {
4754
- vm_trace(ec, GET_CFP(), GET_PC());
4835
+ vm_trace(ec, GET_CFP());
4836
+
4755
4837
  DISPATCH_ORIGINAL_INSN(dup);
4756
4838
  END_INSN(trace_dup);
4757
4839
  }
@@ -4759,7 +4841,8 @@ INSN_ENTRY(trace_dup)
4759
4841
  /* insn trace_dupn(...)(...)(...) */
4760
4842
  INSN_ENTRY(trace_dupn)
4761
4843
  {
4762
- vm_trace(ec, GET_CFP(), GET_PC());
4844
+ vm_trace(ec, GET_CFP());
4845
+
4763
4846
  DISPATCH_ORIGINAL_INSN(dupn);
4764
4847
  END_INSN(trace_dupn);
4765
4848
  }
@@ -4767,23 +4850,17 @@ INSN_ENTRY(trace_dupn)
4767
4850
  /* insn trace_swap(...)(...)(...) */
4768
4851
  INSN_ENTRY(trace_swap)
4769
4852
  {
4770
- vm_trace(ec, GET_CFP(), GET_PC());
4853
+ vm_trace(ec, GET_CFP());
4854
+
4771
4855
  DISPATCH_ORIGINAL_INSN(swap);
4772
4856
  END_INSN(trace_swap);
4773
4857
  }
4774
4858
 
4775
- /* insn trace_reverse(...)(...)(...) */
4776
- INSN_ENTRY(trace_reverse)
4777
- {
4778
- vm_trace(ec, GET_CFP(), GET_PC());
4779
- DISPATCH_ORIGINAL_INSN(reverse);
4780
- END_INSN(trace_reverse);
4781
- }
4782
-
4783
4859
  /* insn trace_topn(...)(...)(...) */
4784
4860
  INSN_ENTRY(trace_topn)
4785
4861
  {
4786
- vm_trace(ec, GET_CFP(), GET_PC());
4862
+ vm_trace(ec, GET_CFP());
4863
+
4787
4864
  DISPATCH_ORIGINAL_INSN(topn);
4788
4865
  END_INSN(trace_topn);
4789
4866
  }
@@ -4791,7 +4868,8 @@ INSN_ENTRY(trace_topn)
4791
4868
  /* insn trace_setn(...)(...)(...) */
4792
4869
  INSN_ENTRY(trace_setn)
4793
4870
  {
4794
- vm_trace(ec, GET_CFP(), GET_PC());
4871
+ vm_trace(ec, GET_CFP());
4872
+
4795
4873
  DISPATCH_ORIGINAL_INSN(setn);
4796
4874
  END_INSN(trace_setn);
4797
4875
  }
@@ -4799,7 +4877,8 @@ INSN_ENTRY(trace_setn)
4799
4877
  /* insn trace_adjuststack(...)(...)(...) */
4800
4878
  INSN_ENTRY(trace_adjuststack)
4801
4879
  {
4802
- vm_trace(ec, GET_CFP(), GET_PC());
4880
+ vm_trace(ec, GET_CFP());
4881
+
4803
4882
  DISPATCH_ORIGINAL_INSN(adjuststack);
4804
4883
  END_INSN(trace_adjuststack);
4805
4884
  }
@@ -4807,7 +4886,8 @@ INSN_ENTRY(trace_adjuststack)
4807
4886
  /* insn trace_defined(...)(...)(...) */
4808
4887
  INSN_ENTRY(trace_defined)
4809
4888
  {
4810
- vm_trace(ec, GET_CFP(), GET_PC());
4889
+ vm_trace(ec, GET_CFP());
4890
+
4811
4891
  DISPATCH_ORIGINAL_INSN(defined);
4812
4892
  END_INSN(trace_defined);
4813
4893
  }
@@ -4815,7 +4895,8 @@ INSN_ENTRY(trace_defined)
4815
4895
  /* insn trace_checkmatch(...)(...)(...) */
4816
4896
  INSN_ENTRY(trace_checkmatch)
4817
4897
  {
4818
- vm_trace(ec, GET_CFP(), GET_PC());
4898
+ vm_trace(ec, GET_CFP());
4899
+
4819
4900
  DISPATCH_ORIGINAL_INSN(checkmatch);
4820
4901
  END_INSN(trace_checkmatch);
4821
4902
  }
@@ -4823,7 +4904,8 @@ INSN_ENTRY(trace_checkmatch)
4823
4904
  /* insn trace_checkkeyword(...)(...)(...) */
4824
4905
  INSN_ENTRY(trace_checkkeyword)
4825
4906
  {
4826
- vm_trace(ec, GET_CFP(), GET_PC());
4907
+ vm_trace(ec, GET_CFP());
4908
+
4827
4909
  DISPATCH_ORIGINAL_INSN(checkkeyword);
4828
4910
  END_INSN(trace_checkkeyword);
4829
4911
  }
@@ -4831,23 +4913,17 @@ INSN_ENTRY(trace_checkkeyword)
4831
4913
  /* insn trace_checktype(...)(...)(...) */
4832
4914
  INSN_ENTRY(trace_checktype)
4833
4915
  {
4834
- vm_trace(ec, GET_CFP(), GET_PC());
4916
+ vm_trace(ec, GET_CFP());
4917
+
4835
4918
  DISPATCH_ORIGINAL_INSN(checktype);
4836
4919
  END_INSN(trace_checktype);
4837
4920
  }
4838
4921
 
4839
- /* insn trace_methodref(...)(...)(...) */
4840
- INSN_ENTRY(trace_methodref)
4841
- {
4842
- vm_trace(ec, GET_CFP(), GET_PC());
4843
- DISPATCH_ORIGINAL_INSN(methodref);
4844
- END_INSN(trace_methodref);
4845
- }
4846
-
4847
4922
  /* insn trace_defineclass(...)(...)(...) */
4848
4923
  INSN_ENTRY(trace_defineclass)
4849
4924
  {
4850
- vm_trace(ec, GET_CFP(), GET_PC());
4925
+ vm_trace(ec, GET_CFP());
4926
+
4851
4927
  DISPATCH_ORIGINAL_INSN(defineclass);
4852
4928
  END_INSN(trace_defineclass);
4853
4929
  }
@@ -4855,7 +4931,8 @@ INSN_ENTRY(trace_defineclass)
4855
4931
  /* insn trace_definemethod(...)(...)(...) */
4856
4932
  INSN_ENTRY(trace_definemethod)
4857
4933
  {
4858
- vm_trace(ec, GET_CFP(), GET_PC());
4934
+ vm_trace(ec, GET_CFP());
4935
+
4859
4936
  DISPATCH_ORIGINAL_INSN(definemethod);
4860
4937
  END_INSN(trace_definemethod);
4861
4938
  }
@@ -4863,7 +4940,8 @@ INSN_ENTRY(trace_definemethod)
4863
4940
  /* insn trace_definesmethod(...)(...)(...) */
4864
4941
  INSN_ENTRY(trace_definesmethod)
4865
4942
  {
4866
- vm_trace(ec, GET_CFP(), GET_PC());
4943
+ vm_trace(ec, GET_CFP());
4944
+
4867
4945
  DISPATCH_ORIGINAL_INSN(definesmethod);
4868
4946
  END_INSN(trace_definesmethod);
4869
4947
  }
@@ -4871,7 +4949,8 @@ INSN_ENTRY(trace_definesmethod)
4871
4949
  /* insn trace_send(...)(...)(...) */
4872
4950
  INSN_ENTRY(trace_send)
4873
4951
  {
4874
- vm_trace(ec, GET_CFP(), GET_PC());
4952
+ vm_trace(ec, GET_CFP());
4953
+
4875
4954
  DISPATCH_ORIGINAL_INSN(send);
4876
4955
  END_INSN(trace_send);
4877
4956
  }
@@ -4879,7 +4958,8 @@ INSN_ENTRY(trace_send)
4879
4958
  /* insn trace_opt_send_without_block(...)(...)(...) */
4880
4959
  INSN_ENTRY(trace_opt_send_without_block)
4881
4960
  {
4882
- vm_trace(ec, GET_CFP(), GET_PC());
4961
+ vm_trace(ec, GET_CFP());
4962
+
4883
4963
  DISPATCH_ORIGINAL_INSN(opt_send_without_block);
4884
4964
  END_INSN(trace_opt_send_without_block);
4885
4965
  }
@@ -4887,7 +4967,8 @@ INSN_ENTRY(trace_opt_send_without_block)
4887
4967
  /* insn trace_opt_str_freeze(...)(...)(...) */
4888
4968
  INSN_ENTRY(trace_opt_str_freeze)
4889
4969
  {
4890
- vm_trace(ec, GET_CFP(), GET_PC());
4970
+ vm_trace(ec, GET_CFP());
4971
+
4891
4972
  DISPATCH_ORIGINAL_INSN(opt_str_freeze);
4892
4973
  END_INSN(trace_opt_str_freeze);
4893
4974
  }
@@ -4895,15 +4976,17 @@ INSN_ENTRY(trace_opt_str_freeze)
4895
4976
  /* insn trace_opt_nil_p(...)(...)(...) */
4896
4977
  INSN_ENTRY(trace_opt_nil_p)
4897
4978
  {
4898
- vm_trace(ec, GET_CFP(), GET_PC());
4899
- DISPATCH_ORIGINAL_INSN(opt_nil_p);
4979
+ vm_trace(ec, GET_CFP());
4980
+
4981
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
4900
4982
  END_INSN(trace_opt_nil_p);
4901
4983
  }
4902
4984
 
4903
4985
  /* insn trace_opt_str_uminus(...)(...)(...) */
4904
4986
  INSN_ENTRY(trace_opt_str_uminus)
4905
4987
  {
4906
- vm_trace(ec, GET_CFP(), GET_PC());
4988
+ vm_trace(ec, GET_CFP());
4989
+
4907
4990
  DISPATCH_ORIGINAL_INSN(opt_str_uminus);
4908
4991
  END_INSN(trace_opt_str_uminus);
4909
4992
  }
@@ -4911,7 +4994,8 @@ INSN_ENTRY(trace_opt_str_uminus)
4911
4994
  /* insn trace_opt_newarray_max(...)(...)(...) */
4912
4995
  INSN_ENTRY(trace_opt_newarray_max)
4913
4996
  {
4914
- vm_trace(ec, GET_CFP(), GET_PC());
4997
+ vm_trace(ec, GET_CFP());
4998
+
4915
4999
  DISPATCH_ORIGINAL_INSN(opt_newarray_max);
4916
5000
  END_INSN(trace_opt_newarray_max);
4917
5001
  }
@@ -4919,7 +5003,8 @@ INSN_ENTRY(trace_opt_newarray_max)
4919
5003
  /* insn trace_opt_newarray_min(...)(...)(...) */
4920
5004
  INSN_ENTRY(trace_opt_newarray_min)
4921
5005
  {
4922
- vm_trace(ec, GET_CFP(), GET_PC());
5006
+ vm_trace(ec, GET_CFP());
5007
+
4923
5008
  DISPATCH_ORIGINAL_INSN(opt_newarray_min);
4924
5009
  END_INSN(trace_opt_newarray_min);
4925
5010
  }
@@ -4927,7 +5012,8 @@ INSN_ENTRY(trace_opt_newarray_min)
4927
5012
  /* insn trace_invokesuper(...)(...)(...) */
4928
5013
  INSN_ENTRY(trace_invokesuper)
4929
5014
  {
4930
- vm_trace(ec, GET_CFP(), GET_PC());
5015
+ vm_trace(ec, GET_CFP());
5016
+
4931
5017
  DISPATCH_ORIGINAL_INSN(invokesuper);
4932
5018
  END_INSN(trace_invokesuper);
4933
5019
  }
@@ -4935,7 +5021,8 @@ INSN_ENTRY(trace_invokesuper)
4935
5021
  /* insn trace_invokeblock(...)(...)(...) */
4936
5022
  INSN_ENTRY(trace_invokeblock)
4937
5023
  {
4938
- vm_trace(ec, GET_CFP(), GET_PC());
5024
+ vm_trace(ec, GET_CFP());
5025
+
4939
5026
  DISPATCH_ORIGINAL_INSN(invokeblock);
4940
5027
  END_INSN(trace_invokeblock);
4941
5028
  }
@@ -4943,7 +5030,8 @@ INSN_ENTRY(trace_invokeblock)
4943
5030
  /* insn trace_leave(...)(...)(...) */
4944
5031
  INSN_ENTRY(trace_leave)
4945
5032
  {
4946
- vm_trace(ec, GET_CFP(), GET_PC());
5033
+ vm_trace(ec, GET_CFP());
5034
+
4947
5035
  DISPATCH_ORIGINAL_INSN(leave);
4948
5036
  END_INSN(trace_leave);
4949
5037
  }
@@ -4951,7 +5039,8 @@ INSN_ENTRY(trace_leave)
4951
5039
  /* insn trace_throw(...)(...)(...) */
4952
5040
  INSN_ENTRY(trace_throw)
4953
5041
  {
4954
- vm_trace(ec, GET_CFP(), GET_PC());
5042
+ vm_trace(ec, GET_CFP());
5043
+
4955
5044
  DISPATCH_ORIGINAL_INSN(throw);
4956
5045
  END_INSN(trace_throw);
4957
5046
  }
@@ -4959,7 +5048,8 @@ INSN_ENTRY(trace_throw)
4959
5048
  /* insn trace_jump(...)(...)(...) */
4960
5049
  INSN_ENTRY(trace_jump)
4961
5050
  {
4962
- vm_trace(ec, GET_CFP(), GET_PC());
5051
+ vm_trace(ec, GET_CFP());
5052
+
4963
5053
  DISPATCH_ORIGINAL_INSN(jump);
4964
5054
  END_INSN(trace_jump);
4965
5055
  }
@@ -4967,7 +5057,8 @@ INSN_ENTRY(trace_jump)
4967
5057
  /* insn trace_branchif(...)(...)(...) */
4968
5058
  INSN_ENTRY(trace_branchif)
4969
5059
  {
4970
- vm_trace(ec, GET_CFP(), GET_PC());
5060
+ vm_trace(ec, GET_CFP());
5061
+
4971
5062
  DISPATCH_ORIGINAL_INSN(branchif);
4972
5063
  END_INSN(trace_branchif);
4973
5064
  }
@@ -4975,7 +5066,8 @@ INSN_ENTRY(trace_branchif)
4975
5066
  /* insn trace_branchunless(...)(...)(...) */
4976
5067
  INSN_ENTRY(trace_branchunless)
4977
5068
  {
4978
- vm_trace(ec, GET_CFP(), GET_PC());
5069
+ vm_trace(ec, GET_CFP());
5070
+
4979
5071
  DISPATCH_ORIGINAL_INSN(branchunless);
4980
5072
  END_INSN(trace_branchunless);
4981
5073
  }
@@ -4983,7 +5075,8 @@ INSN_ENTRY(trace_branchunless)
4983
5075
  /* insn trace_branchnil(...)(...)(...) */
4984
5076
  INSN_ENTRY(trace_branchnil)
4985
5077
  {
4986
- vm_trace(ec, GET_CFP(), GET_PC());
5078
+ vm_trace(ec, GET_CFP());
5079
+
4987
5080
  DISPATCH_ORIGINAL_INSN(branchnil);
4988
5081
  END_INSN(trace_branchnil);
4989
5082
  }
@@ -4991,7 +5084,8 @@ INSN_ENTRY(trace_branchnil)
4991
5084
  /* insn trace_opt_getinlinecache(...)(...)(...) */
4992
5085
  INSN_ENTRY(trace_opt_getinlinecache)
4993
5086
  {
4994
- vm_trace(ec, GET_CFP(), GET_PC());
5087
+ vm_trace(ec, GET_CFP());
5088
+
4995
5089
  DISPATCH_ORIGINAL_INSN(opt_getinlinecache);
4996
5090
  END_INSN(trace_opt_getinlinecache);
4997
5091
  }
@@ -4999,7 +5093,8 @@ INSN_ENTRY(trace_opt_getinlinecache)
4999
5093
  /* insn trace_opt_setinlinecache(...)(...)(...) */
5000
5094
  INSN_ENTRY(trace_opt_setinlinecache)
5001
5095
  {
5002
- vm_trace(ec, GET_CFP(), GET_PC());
5096
+ vm_trace(ec, GET_CFP());
5097
+
5003
5098
  DISPATCH_ORIGINAL_INSN(opt_setinlinecache);
5004
5099
  END_INSN(trace_opt_setinlinecache);
5005
5100
  }
@@ -5007,7 +5102,8 @@ INSN_ENTRY(trace_opt_setinlinecache)
5007
5102
  /* insn trace_once(...)(...)(...) */
5008
5103
  INSN_ENTRY(trace_once)
5009
5104
  {
5010
- vm_trace(ec, GET_CFP(), GET_PC());
5105
+ vm_trace(ec, GET_CFP());
5106
+
5011
5107
  DISPATCH_ORIGINAL_INSN(once);
5012
5108
  END_INSN(trace_once);
5013
5109
  }
@@ -5015,7 +5111,8 @@ INSN_ENTRY(trace_once)
5015
5111
  /* insn trace_opt_case_dispatch(...)(...)(...) */
5016
5112
  INSN_ENTRY(trace_opt_case_dispatch)
5017
5113
  {
5018
- vm_trace(ec, GET_CFP(), GET_PC());
5114
+ vm_trace(ec, GET_CFP());
5115
+
5019
5116
  DISPATCH_ORIGINAL_INSN(opt_case_dispatch);
5020
5117
  END_INSN(trace_opt_case_dispatch);
5021
5118
  }
@@ -5023,135 +5120,152 @@ INSN_ENTRY(trace_opt_case_dispatch)
5023
5120
  /* insn trace_opt_plus(...)(...)(...) */
5024
5121
  INSN_ENTRY(trace_opt_plus)
5025
5122
  {
5026
- vm_trace(ec, GET_CFP(), GET_PC());
5027
- DISPATCH_ORIGINAL_INSN(opt_plus);
5123
+ vm_trace(ec, GET_CFP());
5124
+
5125
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5028
5126
  END_INSN(trace_opt_plus);
5029
5127
  }
5030
5128
 
5031
5129
  /* insn trace_opt_minus(...)(...)(...) */
5032
5130
  INSN_ENTRY(trace_opt_minus)
5033
5131
  {
5034
- vm_trace(ec, GET_CFP(), GET_PC());
5035
- DISPATCH_ORIGINAL_INSN(opt_minus);
5132
+ vm_trace(ec, GET_CFP());
5133
+
5134
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5036
5135
  END_INSN(trace_opt_minus);
5037
5136
  }
5038
5137
 
5039
5138
  /* insn trace_opt_mult(...)(...)(...) */
5040
5139
  INSN_ENTRY(trace_opt_mult)
5041
5140
  {
5042
- vm_trace(ec, GET_CFP(), GET_PC());
5043
- DISPATCH_ORIGINAL_INSN(opt_mult);
5141
+ vm_trace(ec, GET_CFP());
5142
+
5143
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5044
5144
  END_INSN(trace_opt_mult);
5045
5145
  }
5046
5146
 
5047
5147
  /* insn trace_opt_div(...)(...)(...) */
5048
5148
  INSN_ENTRY(trace_opt_div)
5049
5149
  {
5050
- vm_trace(ec, GET_CFP(), GET_PC());
5051
- DISPATCH_ORIGINAL_INSN(opt_div);
5150
+ vm_trace(ec, GET_CFP());
5151
+
5152
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5052
5153
  END_INSN(trace_opt_div);
5053
5154
  }
5054
5155
 
5055
5156
  /* insn trace_opt_mod(...)(...)(...) */
5056
5157
  INSN_ENTRY(trace_opt_mod)
5057
5158
  {
5058
- vm_trace(ec, GET_CFP(), GET_PC());
5059
- DISPATCH_ORIGINAL_INSN(opt_mod);
5159
+ vm_trace(ec, GET_CFP());
5160
+
5161
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5060
5162
  END_INSN(trace_opt_mod);
5061
5163
  }
5062
5164
 
5063
5165
  /* insn trace_opt_eq(...)(...)(...) */
5064
5166
  INSN_ENTRY(trace_opt_eq)
5065
5167
  {
5066
- vm_trace(ec, GET_CFP(), GET_PC());
5067
- DISPATCH_ORIGINAL_INSN(opt_eq);
5168
+ vm_trace(ec, GET_CFP());
5169
+
5170
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5068
5171
  END_INSN(trace_opt_eq);
5069
5172
  }
5070
5173
 
5071
5174
  /* insn trace_opt_neq(...)(...)(...) */
5072
5175
  INSN_ENTRY(trace_opt_neq)
5073
5176
  {
5074
- vm_trace(ec, GET_CFP(), GET_PC());
5075
- DISPATCH_ORIGINAL_INSN(opt_neq);
5177
+ vm_trace(ec, GET_CFP());
5178
+ ADD_PC(1);
5179
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5076
5180
  END_INSN(trace_opt_neq);
5077
5181
  }
5078
5182
 
5079
5183
  /* insn trace_opt_lt(...)(...)(...) */
5080
5184
  INSN_ENTRY(trace_opt_lt)
5081
5185
  {
5082
- vm_trace(ec, GET_CFP(), GET_PC());
5083
- DISPATCH_ORIGINAL_INSN(opt_lt);
5186
+ vm_trace(ec, GET_CFP());
5187
+
5188
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5084
5189
  END_INSN(trace_opt_lt);
5085
5190
  }
5086
5191
 
5087
5192
  /* insn trace_opt_le(...)(...)(...) */
5088
5193
  INSN_ENTRY(trace_opt_le)
5089
5194
  {
5090
- vm_trace(ec, GET_CFP(), GET_PC());
5091
- DISPATCH_ORIGINAL_INSN(opt_le);
5195
+ vm_trace(ec, GET_CFP());
5196
+
5197
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5092
5198
  END_INSN(trace_opt_le);
5093
5199
  }
5094
5200
 
5095
5201
  /* insn trace_opt_gt(...)(...)(...) */
5096
5202
  INSN_ENTRY(trace_opt_gt)
5097
5203
  {
5098
- vm_trace(ec, GET_CFP(), GET_PC());
5099
- DISPATCH_ORIGINAL_INSN(opt_gt);
5204
+ vm_trace(ec, GET_CFP());
5205
+
5206
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5100
5207
  END_INSN(trace_opt_gt);
5101
5208
  }
5102
5209
 
5103
5210
  /* insn trace_opt_ge(...)(...)(...) */
5104
5211
  INSN_ENTRY(trace_opt_ge)
5105
5212
  {
5106
- vm_trace(ec, GET_CFP(), GET_PC());
5107
- DISPATCH_ORIGINAL_INSN(opt_ge);
5213
+ vm_trace(ec, GET_CFP());
5214
+
5215
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5108
5216
  END_INSN(trace_opt_ge);
5109
5217
  }
5110
5218
 
5111
5219
  /* insn trace_opt_ltlt(...)(...)(...) */
5112
5220
  INSN_ENTRY(trace_opt_ltlt)
5113
5221
  {
5114
- vm_trace(ec, GET_CFP(), GET_PC());
5115
- DISPATCH_ORIGINAL_INSN(opt_ltlt);
5222
+ vm_trace(ec, GET_CFP());
5223
+
5224
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5116
5225
  END_INSN(trace_opt_ltlt);
5117
5226
  }
5118
5227
 
5119
5228
  /* insn trace_opt_and(...)(...)(...) */
5120
5229
  INSN_ENTRY(trace_opt_and)
5121
5230
  {
5122
- vm_trace(ec, GET_CFP(), GET_PC());
5123
- DISPATCH_ORIGINAL_INSN(opt_and);
5231
+ vm_trace(ec, GET_CFP());
5232
+
5233
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5124
5234
  END_INSN(trace_opt_and);
5125
5235
  }
5126
5236
 
5127
5237
  /* insn trace_opt_or(...)(...)(...) */
5128
5238
  INSN_ENTRY(trace_opt_or)
5129
5239
  {
5130
- vm_trace(ec, GET_CFP(), GET_PC());
5131
- DISPATCH_ORIGINAL_INSN(opt_or);
5240
+ vm_trace(ec, GET_CFP());
5241
+
5242
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5132
5243
  END_INSN(trace_opt_or);
5133
5244
  }
5134
5245
 
5135
5246
  /* insn trace_opt_aref(...)(...)(...) */
5136
5247
  INSN_ENTRY(trace_opt_aref)
5137
5248
  {
5138
- vm_trace(ec, GET_CFP(), GET_PC());
5139
- DISPATCH_ORIGINAL_INSN(opt_aref);
5249
+ vm_trace(ec, GET_CFP());
5250
+
5251
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5140
5252
  END_INSN(trace_opt_aref);
5141
5253
  }
5142
5254
 
5143
5255
  /* insn trace_opt_aset(...)(...)(...) */
5144
5256
  INSN_ENTRY(trace_opt_aset)
5145
5257
  {
5146
- vm_trace(ec, GET_CFP(), GET_PC());
5147
- DISPATCH_ORIGINAL_INSN(opt_aset);
5258
+ vm_trace(ec, GET_CFP());
5259
+
5260
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5148
5261
  END_INSN(trace_opt_aset);
5149
5262
  }
5150
5263
 
5151
5264
  /* insn trace_opt_aset_with(...)(...)(...) */
5152
5265
  INSN_ENTRY(trace_opt_aset_with)
5153
5266
  {
5154
- vm_trace(ec, GET_CFP(), GET_PC());
5267
+ vm_trace(ec, GET_CFP());
5268
+
5155
5269
  DISPATCH_ORIGINAL_INSN(opt_aset_with);
5156
5270
  END_INSN(trace_opt_aset_with);
5157
5271
  }
@@ -5159,7 +5273,8 @@ INSN_ENTRY(trace_opt_aset_with)
5159
5273
  /* insn trace_opt_aref_with(...)(...)(...) */
5160
5274
  INSN_ENTRY(trace_opt_aref_with)
5161
5275
  {
5162
- vm_trace(ec, GET_CFP(), GET_PC());
5276
+ vm_trace(ec, GET_CFP());
5277
+
5163
5278
  DISPATCH_ORIGINAL_INSN(opt_aref_with);
5164
5279
  END_INSN(trace_opt_aref_with);
5165
5280
  }
@@ -5167,63 +5282,89 @@ INSN_ENTRY(trace_opt_aref_with)
5167
5282
  /* insn trace_opt_length(...)(...)(...) */
5168
5283
  INSN_ENTRY(trace_opt_length)
5169
5284
  {
5170
- vm_trace(ec, GET_CFP(), GET_PC());
5171
- DISPATCH_ORIGINAL_INSN(opt_length);
5285
+ vm_trace(ec, GET_CFP());
5286
+
5287
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5172
5288
  END_INSN(trace_opt_length);
5173
5289
  }
5174
5290
 
5175
5291
  /* insn trace_opt_size(...)(...)(...) */
5176
5292
  INSN_ENTRY(trace_opt_size)
5177
5293
  {
5178
- vm_trace(ec, GET_CFP(), GET_PC());
5179
- DISPATCH_ORIGINAL_INSN(opt_size);
5294
+ vm_trace(ec, GET_CFP());
5295
+
5296
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5180
5297
  END_INSN(trace_opt_size);
5181
5298
  }
5182
5299
 
5183
5300
  /* insn trace_opt_empty_p(...)(...)(...) */
5184
5301
  INSN_ENTRY(trace_opt_empty_p)
5185
5302
  {
5186
- vm_trace(ec, GET_CFP(), GET_PC());
5187
- DISPATCH_ORIGINAL_INSN(opt_empty_p);
5303
+ vm_trace(ec, GET_CFP());
5304
+
5305
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5188
5306
  END_INSN(trace_opt_empty_p);
5189
5307
  }
5190
5308
 
5191
5309
  /* insn trace_opt_succ(...)(...)(...) */
5192
5310
  INSN_ENTRY(trace_opt_succ)
5193
5311
  {
5194
- vm_trace(ec, GET_CFP(), GET_PC());
5195
- DISPATCH_ORIGINAL_INSN(opt_succ);
5312
+ vm_trace(ec, GET_CFP());
5313
+
5314
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5196
5315
  END_INSN(trace_opt_succ);
5197
5316
  }
5198
5317
 
5199
5318
  /* insn trace_opt_not(...)(...)(...) */
5200
5319
  INSN_ENTRY(trace_opt_not)
5201
5320
  {
5202
- vm_trace(ec, GET_CFP(), GET_PC());
5203
- DISPATCH_ORIGINAL_INSN(opt_not);
5321
+ vm_trace(ec, GET_CFP());
5322
+
5323
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5204
5324
  END_INSN(trace_opt_not);
5205
5325
  }
5206
5326
 
5207
5327
  /* insn trace_opt_regexpmatch2(...)(...)(...) */
5208
5328
  INSN_ENTRY(trace_opt_regexpmatch2)
5209
5329
  {
5210
- vm_trace(ec, GET_CFP(), GET_PC());
5211
- DISPATCH_ORIGINAL_INSN(opt_regexpmatch2);
5330
+ vm_trace(ec, GET_CFP());
5331
+
5332
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
5212
5333
  END_INSN(trace_opt_regexpmatch2);
5213
5334
  }
5214
5335
 
5215
- /* insn trace_opt_call_c_function(...)(...)(...) */
5216
- INSN_ENTRY(trace_opt_call_c_function)
5336
+ /* insn trace_invokebuiltin(...)(...)(...) */
5337
+ INSN_ENTRY(trace_invokebuiltin)
5338
+ {
5339
+ vm_trace(ec, GET_CFP());
5340
+
5341
+ DISPATCH_ORIGINAL_INSN(invokebuiltin);
5342
+ END_INSN(trace_invokebuiltin);
5343
+ }
5344
+
5345
+ /* insn trace_opt_invokebuiltin_delegate(...)(...)(...) */
5346
+ INSN_ENTRY(trace_opt_invokebuiltin_delegate)
5347
+ {
5348
+ vm_trace(ec, GET_CFP());
5349
+
5350
+ DISPATCH_ORIGINAL_INSN(opt_invokebuiltin_delegate);
5351
+ END_INSN(trace_opt_invokebuiltin_delegate);
5352
+ }
5353
+
5354
+ /* insn trace_opt_invokebuiltin_delegate_leave(...)(...)(...) */
5355
+ INSN_ENTRY(trace_opt_invokebuiltin_delegate_leave)
5217
5356
  {
5218
- vm_trace(ec, GET_CFP(), GET_PC());
5219
- DISPATCH_ORIGINAL_INSN(opt_call_c_function);
5220
- END_INSN(trace_opt_call_c_function);
5357
+ vm_trace(ec, GET_CFP());
5358
+
5359
+ DISPATCH_ORIGINAL_INSN(opt_invokebuiltin_delegate_leave);
5360
+ END_INSN(trace_opt_invokebuiltin_delegate_leave);
5221
5361
  }
5222
5362
 
5223
5363
  /* insn trace_getlocal_WC_0(...)(...)(...) */
5224
5364
  INSN_ENTRY(trace_getlocal_WC_0)
5225
5365
  {
5226
- vm_trace(ec, GET_CFP(), GET_PC());
5366
+ vm_trace(ec, GET_CFP());
5367
+
5227
5368
  DISPATCH_ORIGINAL_INSN(getlocal_WC_0);
5228
5369
  END_INSN(trace_getlocal_WC_0);
5229
5370
  }
@@ -5231,7 +5372,8 @@ INSN_ENTRY(trace_getlocal_WC_0)
5231
5372
  /* insn trace_getlocal_WC_1(...)(...)(...) */
5232
5373
  INSN_ENTRY(trace_getlocal_WC_1)
5233
5374
  {
5234
- vm_trace(ec, GET_CFP(), GET_PC());
5375
+ vm_trace(ec, GET_CFP());
5376
+
5235
5377
  DISPATCH_ORIGINAL_INSN(getlocal_WC_1);
5236
5378
  END_INSN(trace_getlocal_WC_1);
5237
5379
  }
@@ -5239,7 +5381,8 @@ INSN_ENTRY(trace_getlocal_WC_1)
5239
5381
  /* insn trace_setlocal_WC_0(...)(...)(...) */
5240
5382
  INSN_ENTRY(trace_setlocal_WC_0)
5241
5383
  {
5242
- vm_trace(ec, GET_CFP(), GET_PC());
5384
+ vm_trace(ec, GET_CFP());
5385
+
5243
5386
  DISPATCH_ORIGINAL_INSN(setlocal_WC_0);
5244
5387
  END_INSN(trace_setlocal_WC_0);
5245
5388
  }
@@ -5247,7 +5390,8 @@ INSN_ENTRY(trace_setlocal_WC_0)
5247
5390
  /* insn trace_setlocal_WC_1(...)(...)(...) */
5248
5391
  INSN_ENTRY(trace_setlocal_WC_1)
5249
5392
  {
5250
- vm_trace(ec, GET_CFP(), GET_PC());
5393
+ vm_trace(ec, GET_CFP());
5394
+
5251
5395
  DISPATCH_ORIGINAL_INSN(setlocal_WC_1);
5252
5396
  END_INSN(trace_setlocal_WC_1);
5253
5397
  }
@@ -5255,7 +5399,8 @@ INSN_ENTRY(trace_setlocal_WC_1)
5255
5399
  /* insn trace_putobject_INT2FIX_0_(...)(...)(...) */
5256
5400
  INSN_ENTRY(trace_putobject_INT2FIX_0_)
5257
5401
  {
5258
- vm_trace(ec, GET_CFP(), GET_PC());
5402
+ vm_trace(ec, GET_CFP());
5403
+
5259
5404
  DISPATCH_ORIGINAL_INSN(putobject_INT2FIX_0_);
5260
5405
  END_INSN(trace_putobject_INT2FIX_0_);
5261
5406
  }
@@ -5263,7 +5408,8 @@ INSN_ENTRY(trace_putobject_INT2FIX_0_)
5263
5408
  /* insn trace_putobject_INT2FIX_1_(...)(...)(...) */
5264
5409
  INSN_ENTRY(trace_putobject_INT2FIX_1_)
5265
5410
  {
5266
- vm_trace(ec, GET_CFP(), GET_PC());
5411
+ vm_trace(ec, GET_CFP());
5412
+
5267
5413
  DISPATCH_ORIGINAL_INSN(putobject_INT2FIX_1_);
5268
5414
  END_INSN(trace_putobject_INT2FIX_1_);
5269
5415
  }