debase-ruby_core_source 0.10.2 → 0.10.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (339) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +6 -2
  4. data/Rakefile +6 -3
  5. data/debase-ruby_core_source.gemspec +2 -1
  6. data/lib/debase/ruby_core_source.rb +6 -5
  7. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/addr2line.h +0 -0
  8. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ccan/build_assert/build_assert.h +0 -0
  9. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ccan/check_type/check_type.h +0 -0
  10. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ccan/container_of/container_of.h +0 -0
  11. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ccan/list/list.h +0 -0
  12. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ccan/str/str.h +0 -0
  13. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/constant.h +1 -0
  14. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/debug_counter.h +0 -0
  15. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/dln.h +0 -0
  16. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/encindex.h +2 -0
  17. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/eval_intern.h +0 -0
  18. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/gc.h +0 -0
  19. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/id.h +0 -0
  20. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/id_table.h +0 -0
  21. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/insns.inc +2 -2
  22. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/insns_info.inc +157 -157
  23. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/internal.h +5 -4
  24. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/iseq.h +2 -2
  25. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/known_errors.inc +0 -0
  26. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/method.h +0 -0
  27. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/node.h +0 -0
  28. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/node_name.inc +0 -0
  29. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/opt_sc.inc +0 -0
  30. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/optinsn.inc +0 -0
  31. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/optunifs.inc +0 -0
  32. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/parse.h +0 -0
  33. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/probes_helper.h +0 -0
  34. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/regenc.h +0 -0
  35. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/regint.h +0 -0
  36. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/regparse.h +0 -0
  37. data/lib/debase/ruby_core_source/ruby-2.5.1-p57/revision.h +1 -0
  38. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ruby_assert.h +0 -0
  39. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/ruby_atomic.h +0 -0
  40. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/siphash.h +0 -0
  41. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/symbol.h +0 -0
  42. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/thread_pthread.h +0 -0
  43. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/thread_win32.h +0 -0
  44. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/timev.h +0 -0
  45. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/transcode_data.h +0 -0
  46. data/lib/debase/ruby_core_source/ruby-2.5.1-p57/version.h +73 -0
  47. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vm.inc +13 -13
  48. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vm_call_iseq_optimized.inc +0 -0
  49. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vm_core.h +3 -4
  50. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.5.1-p57}/vm_debug.h +0 -0
  51. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vm_exec.h +0 -0
  52. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vm_insnhelper.h +0 -0
  53. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vm_opts.h +1 -2
  54. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.5.1-p57}/vmtc.inc +2 -2
  55. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/addr2line.h +1 -1
  56. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ccan/build_assert/build_assert.h +0 -0
  57. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ccan/check_type/check_type.h +0 -0
  58. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ccan/container_of/container_of.h +0 -0
  59. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ccan/list/list.h +20 -5
  60. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ccan/str/str.h +0 -0
  61. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/constant.h +1 -0
  62. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/debug_counter.h +283 -0
  63. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/dln.h +0 -0
  64. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/encindex.h +2 -0
  65. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/eval_intern.h +45 -53
  66. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/gc.h +2 -3
  67. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/hrtime.h +168 -0
  68. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/id.h +4 -2
  69. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/id_table.h +0 -0
  70. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/insns.inc +249 -0
  71. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/insns_info.inc +9374 -0
  72. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/internal.h +608 -100
  73. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/iseq.h +127 -91
  74. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/known_errors.inc +477 -432
  75. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/method.h +28 -15
  76. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/mjit.h +148 -0
  77. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/mjit_compile.inc +4224 -0
  78. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/node.h +449 -0
  79. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/node_name.inc +6 -18
  80. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/opt_sc.inc +109 -0
  81. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/optinsn.inc +128 -0
  82. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/optunifs.inc +43 -0
  83. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/parse.h +210 -0
  84. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/probes_helper.h +42 -0
  85. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/regenc.h +1 -1
  86. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/regint.h +0 -0
  87. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/regparse.h +1 -1
  88. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/revision.h +1 -0
  89. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ruby_assert.h +6 -0
  90. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/ruby_atomic.h +14 -3
  91. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/siphash.h +1 -1
  92. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/symbol.h +1 -1
  93. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/thread_pthread.h +75 -0
  94. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/thread_win32.h +0 -0
  95. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/timev.h +53 -0
  96. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/transcode_data.h +0 -0
  97. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/transient_heap.h +60 -0
  98. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/version.h +7 -7
  99. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/vm.inc +4502 -0
  100. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/vm_call_iseq_optimized.inc +213 -0
  101. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/vm_core.h +385 -182
  102. data/lib/debase/ruby_core_source/{ruby-2.5.0-rc1 → ruby-2.6.0-p0}/vm_debug.h +0 -0
  103. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/vm_exec.h +33 -13
  104. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/vm_insnhelper.h +316 -0
  105. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.0-p0}/vm_opts.h +18 -5
  106. data/lib/debase/ruby_core_source/ruby-2.6.0-p0/vmtc.inc +243 -0
  107. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/addr2line.h +21 -0
  108. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ccan/build_assert/build_assert.h +40 -0
  109. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ccan/check_type/check_type.h +63 -0
  110. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ccan/container_of/container_of.h +142 -0
  111. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ccan/list/list.h +788 -0
  112. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ccan/str/str.h +16 -0
  113. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/constant.h +51 -0
  114. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/debug_counter.h +283 -0
  115. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/dln.h +51 -0
  116. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/encindex.h +69 -0
  117. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/eval_intern.h +333 -0
  118. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/gc.h +116 -0
  119. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/hrtime.h +168 -0
  120. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/id.h +252 -0
  121. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/id_table.h +31 -0
  122. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/insns.inc +249 -0
  123. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/insns_info.inc +9374 -0
  124. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/internal.h +2470 -0
  125. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/iseq.h +304 -0
  126. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/known_errors.inc +791 -0
  127. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/method.h +229 -0
  128. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/mjit.h +148 -0
  129. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/mjit_compile.inc +4226 -0
  130. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/node.h +449 -0
  131. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/node_name.inc +200 -0
  132. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/opt_sc.inc +109 -0
  133. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/optinsn.inc +128 -0
  134. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/optunifs.inc +43 -0
  135. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.5-p114}/parse.h +47 -31
  136. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/probes_helper.h +42 -0
  137. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/regenc.h +254 -0
  138. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/regint.h +938 -0
  139. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/regparse.h +370 -0
  140. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/revision.h +1 -0
  141. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ruby_assert.h +60 -0
  142. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/ruby_atomic.h +244 -0
  143. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/siphash.h +48 -0
  144. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/symbol.h +112 -0
  145. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/thread_pthread.h +75 -0
  146. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/thread_win32.h +36 -0
  147. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/timev.h +53 -0
  148. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/transcode_data.h +139 -0
  149. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/transient_heap.h +60 -0
  150. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.6.5-p114}/version.h +7 -7
  151. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm.inc +4504 -0
  152. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm_call_iseq_optimized.inc +213 -0
  153. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm_core.h +1910 -0
  154. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm_debug.h +37 -0
  155. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm_exec.h +202 -0
  156. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm_insnhelper.h +316 -0
  157. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vm_opts.h +70 -0
  158. data/lib/debase/ruby_core_source/ruby-2.6.5-p114/vmtc.inc +243 -0
  159. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/addr2line.h +21 -0
  160. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/builtin.h +78 -0
  161. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ccan/build_assert/build_assert.h +40 -0
  162. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ccan/check_type/check_type.h +63 -0
  163. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ccan/container_of/container_of.h +142 -0
  164. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ccan/list/list.h +788 -0
  165. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ccan/str/str.h +16 -0
  166. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/constant.h +50 -0
  167. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/debug_counter.h +390 -0
  168. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/dln.h +51 -0
  169. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/encindex.h +69 -0
  170. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/eval_intern.h +312 -0
  171. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/gc.h +131 -0
  172. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/hrtime.h +168 -0
  173. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/id.h +290 -0
  174. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/id_table.h +34 -0
  175. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/insns.inc +253 -0
  176. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/insns_info.inc +9197 -0
  177. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/internal.h +2697 -0
  178. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/iseq.h +312 -0
  179. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/known_errors.inc +791 -0
  180. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/method.h +229 -0
  181. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/mjit.h +177 -0
  182. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/mjit_compile.inc +7779 -0
  183. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/node.h +476 -0
  184. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/node_name.inc +208 -0
  185. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/opt_sc.inc +109 -0
  186. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/optinsn.inc +128 -0
  187. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/optunifs.inc +43 -0
  188. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/parse.h +210 -0
  189. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/probes_helper.h +42 -0
  190. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/regenc.h +254 -0
  191. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/regint.h +938 -0
  192. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/regparse.h +370 -0
  193. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/revision.h +2 -0
  194. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ruby_assert.h +15 -0
  195. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/ruby_atomic.h +244 -0
  196. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/siphash.h +48 -0
  197. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/symbol.h +119 -0
  198. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/thread_pthread.h +75 -0
  199. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/thread_win32.h +36 -0
  200. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/timev.h +56 -0
  201. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/transcode_data.h +139 -0
  202. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/transient_heap.h +62 -0
  203. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/variable.h +9 -0
  204. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/version.h +77 -0
  205. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vm.inc +5466 -0
  206. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vm_call_iseq_optimized.inc +237 -0
  207. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vm_core.h +1968 -0
  208. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vm_debug.h +34 -0
  209. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vm_exec.h +193 -0
  210. data/lib/debase/ruby_core_source/{ruby-2.5.0-preview1 → ruby-2.7.0-p0}/vm_insnhelper.h +81 -64
  211. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vm_opts.h +72 -0
  212. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/vmtc.inc +247 -0
  213. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/addr2line.h +20 -0
  214. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/builtin.h +83 -0
  215. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/build_assert/build_assert.h +40 -0
  216. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/check_type/check_type.h +63 -0
  217. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/container_of/container_of.h +142 -0
  218. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/list/list.h +788 -0
  219. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/str/str.h +16 -0
  220. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/constant.h +55 -0
  221. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/debug_counter.h +423 -0
  222. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/dln.h +36 -0
  223. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/encindex.h +70 -0
  224. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/eval_intern.h +312 -0
  225. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/gc.h +140 -0
  226. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/hrtime.h +168 -0
  227. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/id.h +290 -0
  228. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/id_table.h +36 -0
  229. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/insns.inc +249 -0
  230. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/insns_info.inc +8979 -0
  231. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal.h +107 -0
  232. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/array.h +114 -0
  233. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/bignum.h +246 -0
  234. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/bits.h +566 -0
  235. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/class.h +168 -0
  236. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/compar.h +50 -0
  237. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/compile.h +32 -0
  238. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/compilers.h +108 -0
  239. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/complex.h +29 -0
  240. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/cont.h +25 -0
  241. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/dir.h +17 -0
  242. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/enc.h +20 -0
  243. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/encoding.h +28 -0
  244. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/enum.h +19 -0
  245. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/enumerator.h +22 -0
  246. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/error.h +131 -0
  247. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/eval.h +33 -0
  248. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/file.h +39 -0
  249. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/fixnum.h +185 -0
  250. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/gc.h +154 -0
  251. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/hash.h +240 -0
  252. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/imemo.h +243 -0
  253. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/inits.h +51 -0
  254. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/io.h +35 -0
  255. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/load.h +19 -0
  256. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/loadpath.h +17 -0
  257. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/math.h +24 -0
  258. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/missing.h +19 -0
  259. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/mjit.h +29 -0
  260. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/numeric.h +252 -0
  261. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/object.h +83 -0
  262. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/parse.h +23 -0
  263. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/proc.h +32 -0
  264. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/process.h +136 -0
  265. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/random.h +17 -0
  266. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/range.h +37 -0
  267. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/rational.h +69 -0
  268. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/re.h +29 -0
  269. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/sanitizers.h +191 -0
  270. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/scheduler.h +35 -0
  271. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/serial.h +24 -0
  272. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/signal.h +22 -0
  273. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/static_assert.h +17 -0
  274. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/string.h +135 -0
  275. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/struct.h +154 -0
  276. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/symbol.h +41 -0
  277. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/thread.h +60 -0
  278. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/time.h +35 -0
  279. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/transcode.h +21 -0
  280. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/util.h +31 -0
  281. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/variable.h +83 -0
  282. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/vm.h +135 -0
  283. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/warnings.h +17 -0
  284. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/iseq.h +304 -0
  285. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/known_errors.inc +791 -0
  286. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/method.h +245 -0
  287. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/mjit.h +197 -0
  288. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/mjit_compile.inc +8082 -0
  289. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/node.h +484 -0
  290. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/node_name.inc +210 -0
  291. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/opt_sc.inc +109 -0
  292. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/optinsn.inc +128 -0
  293. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/optunifs.inc +43 -0
  294. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/parse.h +211 -0
  295. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/probes_helper.h +44 -0
  296. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ractor.h +271 -0
  297. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ractor_pub.h +50 -0
  298. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/regenc.h +254 -0
  299. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/regint.h +938 -0
  300. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/regparse.h +370 -0
  301. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/revision.h +2 -0
  302. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ruby_assert.h +15 -0
  303. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ruby_atomic.h +236 -0
  304. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/siphash.h +48 -0
  305. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/symbol.h +119 -0
  306. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/thread_pthread.h +106 -0
  307. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/thread_win32.h +66 -0
  308. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/timev.h +57 -0
  309. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/transcode_data.h +138 -0
  310. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/transient_heap.h +61 -0
  311. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/variable.h +21 -0
  312. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/version.h +89 -0
  313. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm.inc +5360 -0
  314. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_call_iseq_optimized.inc +244 -0
  315. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_callinfo.h +457 -0
  316. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_core.h +1952 -0
  317. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_debug.h +116 -0
  318. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_exec.h +196 -0
  319. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_insnhelper.h +260 -0
  320. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_opts.h +73 -0
  321. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_sync.h +97 -0
  322. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vmtc.inc +243 -0
  323. data/lib/debase/ruby_core_source/version.rb +1 -1
  324. metadata +335 -102
  325. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/insns.inc +0 -118
  326. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/insns_info.inc +0 -827
  327. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/node.h +0 -523
  328. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/opt_sc.inc +0 -809
  329. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/optinsn.inc +0 -77
  330. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/optunifs.inc +0 -49
  331. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/probes_helper.h +0 -43
  332. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/revision.h +0 -1
  333. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/vm.inc +0 -2935
  334. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/vm_call_iseq_optimized.inc +0 -212
  335. data/lib/debase/ruby_core_source/ruby-2.5.0-preview1/vmtc.inc +0 -115
  336. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/debug_counter.h +0 -109
  337. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/revision.h +0 -1
  338. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/thread_pthread.h +0 -54
  339. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/timev.h +0 -42
@@ -33,10 +33,11 @@ typedef enum {
33
33
  } rb_method_visibility_t;
34
34
 
35
35
  typedef struct rb_scope_visi_struct {
36
- rb_method_visibility_t method_visi : 3;
36
+ BITFIELD(rb_method_visibility_t, method_visi, 3);
37
37
  unsigned int module_func : 1;
38
38
  } rb_scope_visibility_t;
39
39
 
40
+ /*! CREF (Class REFerence) */
40
41
  typedef struct rb_cref_struct {
41
42
  VALUE flags;
42
43
  const VALUE refinements;
@@ -98,21 +99,23 @@ METHOD_ENTRY_FLAGS_COPY(rb_method_entry_t *dst, const rb_method_entry_t *src)
98
99
  }
99
100
 
100
101
  typedef enum {
101
- VM_METHOD_TYPE_ISEQ,
102
- VM_METHOD_TYPE_CFUNC,
103
- VM_METHOD_TYPE_ATTRSET,
104
- VM_METHOD_TYPE_IVAR,
102
+ VM_METHOD_TYPE_ISEQ, /*!< Ruby method */
103
+ VM_METHOD_TYPE_CFUNC, /*!< C method */
104
+ VM_METHOD_TYPE_ATTRSET, /*!< attr_writer or attr_accessor */
105
+ VM_METHOD_TYPE_IVAR, /*!< attr_reader or attr_accessor */
105
106
  VM_METHOD_TYPE_BMETHOD,
106
107
  VM_METHOD_TYPE_ZSUPER,
107
108
  VM_METHOD_TYPE_ALIAS,
108
109
  VM_METHOD_TYPE_UNDEF,
109
110
  VM_METHOD_TYPE_NOTIMPLEMENTED,
110
- VM_METHOD_TYPE_OPTIMIZED, /* Kernel#send, Proc#call, etc */
111
- VM_METHOD_TYPE_MISSING, /* wrapper for method_missing(id) */
112
- VM_METHOD_TYPE_REFINED,
111
+ VM_METHOD_TYPE_OPTIMIZED, /*!< Kernel#send, Proc#call, etc */
112
+ VM_METHOD_TYPE_MISSING, /*!< wrapper for method_missing(id) */
113
+ VM_METHOD_TYPE_REFINED, /*!< refinement */
113
114
 
114
115
  END_OF_ENUMERATION(VM_METHOD_TYPE)
115
116
  } rb_method_type_t;
117
+ #define VM_METHOD_TYPE_MINIMUM_BITS 4
118
+ /* TODO: STATIC_ASSERT for VM_METHOD_TYPE_MINIMUM_BITS */
116
119
 
117
120
  #ifndef rb_iseq_t
118
121
  typedef struct rb_iseq_struct rb_iseq_t;
@@ -120,8 +123,8 @@ typedef struct rb_iseq_struct rb_iseq_t;
120
123
  #endif
121
124
 
122
125
  typedef struct rb_method_iseq_struct {
123
- const rb_iseq_t * const iseqptr; /* should be separated from iseqval */
124
- rb_cref_t * const cref; /* should be marked */
126
+ const rb_iseq_t * const iseqptr; /*!< iseq pointer, should be separated from iseqval */
127
+ rb_cref_t * const cref; /*!< class reference, should be marked */
125
128
  } rb_method_iseq_t; /* check rb_add_method_iseq() when modify the fields */
126
129
 
127
130
  typedef struct rb_method_cfunc_struct {
@@ -144,14 +147,20 @@ typedef struct rb_method_refined_struct {
144
147
  const VALUE owner;
145
148
  } rb_method_refined_t;
146
149
 
150
+ typedef struct rb_method_bmethod_struct {
151
+ const VALUE proc; /* should be marked */
152
+ struct rb_hook_list_struct *hooks;
153
+ } rb_method_bmethod_t;
154
+
147
155
  enum method_optimized_type {
148
156
  OPTIMIZED_METHOD_TYPE_SEND,
149
157
  OPTIMIZED_METHOD_TYPE_CALL,
158
+ OPTIMIZED_METHOD_TYPE_BLOCK_CALL,
150
159
  OPTIMIZED_METHOD_TYPE__MAX
151
160
  };
152
161
 
153
162
  PACKED_STRUCT_UNALIGNED(struct rb_method_definition_struct {
154
- unsigned int type : 4; /* method type */
163
+ BITFIELD(rb_method_type_t, type, VM_METHOD_TYPE_MINIMUM_BITS);
155
164
  int alias_count : 28;
156
165
  int complemented_count : 28;
157
166
 
@@ -161,9 +170,9 @@ PACKED_STRUCT_UNALIGNED(struct rb_method_definition_struct {
161
170
  rb_method_attr_t attr;
162
171
  rb_method_alias_t alias;
163
172
  rb_method_refined_t refined;
173
+ rb_method_bmethod_t bmethod;
164
174
 
165
- const VALUE proc; /* should be marked */
166
- enum method_optimized_type optimize_type;
175
+ enum method_optimized_type optimize_type;
167
176
  } body;
168
177
 
169
178
  ID original_id;
@@ -187,14 +196,16 @@ rb_method_entry_t *rb_method_entry_create(ID called_id, VALUE klass, rb_method_v
187
196
  const rb_method_entry_t *rb_method_entry_at(VALUE obj, ID id);
188
197
 
189
198
  const rb_method_entry_t *rb_method_entry(VALUE klass, ID id);
190
- const rb_method_entry_t *rb_method_entry_with_refinements(VALUE klass, ID id, VALUE *defined_class);
191
199
  const rb_method_entry_t *rb_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_class);
192
200
  const rb_method_entry_t *rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me);
201
+ RUBY_SYMBOL_EXPORT_BEGIN
202
+ const rb_callable_method_entry_t *rb_resolve_refined_method_callable(VALUE refinements, const rb_callable_method_entry_t *me);
203
+ const rb_method_entry_t *rb_resolve_me_location(const rb_method_entry_t *, VALUE[5]);
204
+ RUBY_SYMBOL_EXPORT_END
193
205
 
194
206
  const rb_callable_method_entry_t *rb_callable_method_entry(VALUE klass, ID id);
195
207
  const rb_callable_method_entry_t *rb_callable_method_entry_with_refinements(VALUE klass, ID id, VALUE *defined_class);
196
208
  const rb_callable_method_entry_t *rb_callable_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_class);
197
- const rb_callable_method_entry_t *rb_resolve_refined_method_callable(VALUE refinements, const rb_callable_method_entry_t *me);
198
209
 
199
210
  int rb_method_entry_arity(const rb_method_entry_t *me);
200
211
  int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2);
@@ -213,4 +224,6 @@ void rb_method_entry_copy(rb_method_entry_t *dst, const rb_method_entry_t *src);
213
224
 
214
225
  void rb_scope_visibility_set(rb_method_visibility_t);
215
226
 
227
+ VALUE rb_unnamed_parameters(int arity);
228
+
216
229
  #endif /* RUBY_METHOD_H */
@@ -0,0 +1,148 @@
1
+ /**********************************************************************
2
+
3
+ mjit.h - Interface to MRI method JIT compiler for Ruby's main thread
4
+
5
+ Copyright (C) 2017 Vladimir Makarov <vmakarov@redhat.com>.
6
+
7
+ **********************************************************************/
8
+
9
+ #ifndef RUBY_MJIT_H
10
+ #define RUBY_MJIT_H 1
11
+
12
+ #include "ruby.h"
13
+
14
+ #if USE_MJIT
15
+
16
+ /* Special address values of a function generated from the
17
+ corresponding iseq by MJIT: */
18
+ enum rb_mjit_iseq_func {
19
+ /* ISEQ was not queued yet for the machine code generation */
20
+ NOT_ADDED_JIT_ISEQ_FUNC = 0,
21
+ /* ISEQ is already queued for the machine code generation but the
22
+ code is not ready yet for the execution */
23
+ NOT_READY_JIT_ISEQ_FUNC = 1,
24
+ /* ISEQ included not compilable insn, some internal assertion failed
25
+ or the unit is unloaded */
26
+ NOT_COMPILED_JIT_ISEQ_FUNC = 2,
27
+ /* End mark */
28
+ LAST_JIT_ISEQ_FUNC = 3
29
+ };
30
+
31
+ /* MJIT options which can be defined on the MRI command line. */
32
+ struct mjit_options {
33
+ /* Converted from "jit" feature flag to tell the enablement
34
+ information to ruby_show_version(). */
35
+ char on;
36
+ /* Save temporary files after MRI finish. The temporary files
37
+ include the pre-compiled header, C code file generated for ISEQ,
38
+ and the corresponding object file. */
39
+ char save_temps;
40
+ /* Print MJIT warnings to stderr. */
41
+ char warnings;
42
+ /* Disable compiler optimization and add debug symbols. It can be
43
+ very slow. */
44
+ char debug;
45
+ /* If not 0, all ISeqs are synchronously compiled. For testing. */
46
+ unsigned int wait;
47
+ /* Number of calls to trigger JIT compilation. For testing. */
48
+ unsigned int min_calls;
49
+ /* Force printing info about MJIT work of level VERBOSE or
50
+ less. 0=silence, 1=medium, 2=verbose. */
51
+ int verbose;
52
+ /* Maximal permitted number of iseq JIT codes in a MJIT memory
53
+ cache. */
54
+ int max_cache_size;
55
+ };
56
+
57
+ typedef VALUE (*mjit_func_t)(rb_execution_context_t *, rb_control_frame_t *);
58
+
59
+ RUBY_SYMBOL_EXPORT_BEGIN
60
+ RUBY_EXTERN struct mjit_options mjit_opts;
61
+ RUBY_EXTERN int mjit_call_p;
62
+
63
+ extern void mjit_add_iseq_to_process(const rb_iseq_t *iseq);
64
+ extern VALUE mjit_wait_call(rb_execution_context_t *ec, struct rb_iseq_constant_body *body);
65
+ RUBY_SYMBOL_EXPORT_END
66
+
67
+ extern int mjit_compile(FILE *f, const struct rb_iseq_constant_body *body, const char *funcname, struct rb_call_cache *cc_entries, union iseq_inline_storage_entry *is_entries);
68
+ extern void mjit_init(struct mjit_options *opts);
69
+ extern void mjit_postponed_job_register_start_hook(void);
70
+ extern void mjit_postponed_job_register_finish_hook(void);
71
+ extern void mjit_gc_start_hook(void);
72
+ extern void mjit_gc_finish_hook(void);
73
+ extern void mjit_free_iseq(const rb_iseq_t *iseq);
74
+ extern void mjit_mark(void);
75
+ extern struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec);
76
+ extern void mjit_cont_free(struct mjit_cont *cont);
77
+ extern void mjit_add_class_serial(rb_serial_t class_serial);
78
+ extern void mjit_remove_class_serial(rb_serial_t class_serial);
79
+
80
+ /* A threshold used to reject long iseqs from JITting as such iseqs
81
+ takes too much time to be compiled. */
82
+ #define JIT_ISEQ_SIZE_THRESHOLD 1000
83
+
84
+ /* Return TRUE if given ISeq body should be compiled by MJIT */
85
+ static inline int
86
+ mjit_target_iseq_p(struct rb_iseq_constant_body *body)
87
+ {
88
+ return (body->type == ISEQ_TYPE_METHOD || body->type == ISEQ_TYPE_BLOCK)
89
+ && body->iseq_size < JIT_ISEQ_SIZE_THRESHOLD;
90
+ }
91
+
92
+ /* Try to execute the current iseq in ec. Use JIT code if it is ready.
93
+ If it is not, add ISEQ to the compilation queue and return Qundef. */
94
+ static inline VALUE
95
+ mjit_exec(rb_execution_context_t *ec)
96
+ {
97
+ const rb_iseq_t *iseq;
98
+ struct rb_iseq_constant_body *body;
99
+ long unsigned total_calls;
100
+ mjit_func_t func;
101
+
102
+ if (!mjit_call_p)
103
+ return Qundef;
104
+
105
+ iseq = ec->cfp->iseq;
106
+ body = iseq->body;
107
+ total_calls = ++body->total_calls;
108
+
109
+ func = body->jit_func;
110
+ if (UNLIKELY((uintptr_t)func <= (uintptr_t)LAST_JIT_ISEQ_FUNC)) {
111
+ switch ((enum rb_mjit_iseq_func)func) {
112
+ case NOT_ADDED_JIT_ISEQ_FUNC:
113
+ if (total_calls == mjit_opts.min_calls && mjit_target_iseq_p(body)) {
114
+ mjit_add_iseq_to_process(iseq);
115
+ if (UNLIKELY(mjit_opts.wait)) {
116
+ return mjit_wait_call(ec, body);
117
+ }
118
+ }
119
+ return Qundef;
120
+ case NOT_READY_JIT_ISEQ_FUNC:
121
+ case NOT_COMPILED_JIT_ISEQ_FUNC:
122
+ return Qundef;
123
+ default: /* to avoid warning with LAST_JIT_ISEQ_FUNC */
124
+ break;
125
+ }
126
+ }
127
+
128
+ return func(ec, ec->cfp);
129
+ }
130
+
131
+ void mjit_child_after_fork(void);
132
+
133
+ #else /* USE_MJIT */
134
+ static inline struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec){return NULL;}
135
+ static inline void mjit_cont_free(struct mjit_cont *cont){}
136
+ static inline void mjit_postponed_job_register_start_hook(void){}
137
+ static inline void mjit_postponed_job_register_finish_hook(void){}
138
+ static inline void mjit_gc_start_hook(void){}
139
+ static inline void mjit_gc_finish_hook(void){}
140
+ static inline void mjit_free_iseq(const rb_iseq_t *iseq){}
141
+ static inline void mjit_mark(void){}
142
+ static inline void mjit_add_class_serial(rb_serial_t class_serial){}
143
+ static inline void mjit_remove_class_serial(rb_serial_t class_serial){}
144
+ static inline VALUE mjit_exec(rb_execution_context_t *ec) { return Qundef; /* unreachable */ }
145
+ static inline void mjit_child_after_fork(void){}
146
+
147
+ #endif /* USE_MJIT */
148
+ #endif /* RUBY_MJIT_H */
@@ -0,0 +1,4224 @@
1
+ /* -*- mode:c; style:ruby; coding: utf-8; indent-tabs-mode: nil -*- */
2
+
3
+ /* This is an auto-generated file and is a part of the programming language
4
+ * Ruby. The person who created a program to generate this file (``I''
5
+ * hereafter) would like to refrain from defining licensing of this generated
6
+ * source code.
7
+ *
8
+ * This file consist of many small parts of codes copyrighted by each authors,
9
+ * not only the ``I'' person. Those original authors agree with some
10
+ * open-source license. I believe that the license we agree is the condition
11
+ * mentioned in the file COPYING. It states "4. You may modify and include
12
+ * the part of the software into any other software ...". But the problem is,
13
+ * the license never makes it clear if such modified parts still remain in the
14
+ * same license, or not. The fact that we agree with the source code's
15
+ * licensing terms do not automatically define that of generated ones. This is
16
+ * the reason why this file is under unclear situation. All that I know is
17
+ * that above provision guarantees this file to exist.
18
+ *
19
+ * Please let me hesitate to declare something about this nuanced contract. I
20
+ * am not in the position to take over other authors' license to merge into my
21
+ * one. Changing them to (say) GPLv3 is not doable by myself. Perhaps someday
22
+ * it might turn out to be okay to say this file is under a license. I wish the
23
+ * situation would become more clear in the future. */
24
+
25
+ /*******************************************************************/
26
+ /*******************************************************************/
27
+ /*******************************************************************/
28
+ /**
29
+ This file is the main part of compile_insn() in mjit_compile.c.
30
+
31
+ ----
32
+ This file is auto generated by insns2vm.rb
33
+ DO NOT TOUCH!
34
+
35
+ If you want to fix something, you must edit "tool/ruby_vm/views/mjit_compile.inc.erb"
36
+ or tool/insns2vm.rb
37
+ */
38
+
39
+ switch (insn) {
40
+ case BIN(nop):
41
+ fprintf(f, "{\n");
42
+ {
43
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
44
+ if (status->local_stack_p) {
45
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
46
+ }
47
+
48
+ if (body->catch_except_p || FALSE) {
49
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
50
+ pc_moved_p = TRUE;
51
+ }
52
+ if (status->local_stack_p) {
53
+ }
54
+ else {
55
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
56
+ }
57
+ fprintf(f, " {\n");
58
+ fprintf(f, " /* none */\n");
59
+ fprintf(f, " }\n");
60
+ b->stack_size += attr_sp_inc_nop();
61
+ }
62
+ fprintf(f, "}\n");
63
+ break;
64
+ case BIN(getlocal):
65
+ fprintf(f, "{\n");
66
+ {
67
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
68
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
69
+ MAYBE_UNUSED(rb_num_t level) = (rb_num_t)operands[1];
70
+ if (status->local_stack_p) {
71
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
72
+ }
73
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
74
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
75
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
76
+
77
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
78
+ fprintf(f, "\n");
79
+ fprintf(f, " level = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
80
+ fprintf(f, "\n");
81
+ if (body->catch_except_p || FALSE) {
82
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
83
+ pc_moved_p = TRUE;
84
+ }
85
+ if (status->local_stack_p) {
86
+ }
87
+ else {
88
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
89
+ }
90
+ fprintf(f, " {\n");
91
+ fprintf(f, " val = *(vm_get_ep(GET_EP(), level) - idx);\n");
92
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_get);\n");
93
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n");
94
+ fprintf(f, " }\n");
95
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getlocal(idx, level) - 1);
96
+ b->stack_size += attr_sp_inc_getlocal(idx, level);
97
+ }
98
+ fprintf(f, "}\n");
99
+ break;
100
+ case BIN(setlocal):
101
+ fprintf(f, "{\n");
102
+ {
103
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
104
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
105
+ MAYBE_UNUSED(rb_num_t level) = (rb_num_t)operands[1];
106
+ if (status->local_stack_p) {
107
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
108
+ }
109
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
110
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
111
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
112
+
113
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
114
+ fprintf(f, "\n");
115
+ fprintf(f, " level = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
116
+ fprintf(f, "\n");
117
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
118
+ if (body->catch_except_p || FALSE) {
119
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
120
+ pc_moved_p = TRUE;
121
+ }
122
+ if (status->local_stack_p) {
123
+ }
124
+ else {
125
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
126
+ }
127
+ fprintf(f, " {\n");
128
+ fprintf(f, " vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);\n");
129
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_set);\n");
130
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n");
131
+ fprintf(f, " }\n");
132
+ b->stack_size += attr_sp_inc_setlocal(idx, level);
133
+ }
134
+ fprintf(f, "}\n");
135
+ break;
136
+ case BIN(getblockparam):
137
+ fprintf(f, "{\n");
138
+ {
139
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
140
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
141
+ MAYBE_UNUSED(rb_num_t level) = (rb_num_t)operands[1];
142
+ if (status->local_stack_p) {
143
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
144
+ }
145
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
146
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
147
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
148
+
149
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
150
+ fprintf(f, "\n");
151
+ fprintf(f, " level = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
152
+ fprintf(f, "\n");
153
+ if (body->catch_except_p || FALSE) {
154
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
155
+ pc_moved_p = TRUE;
156
+ }
157
+ if (status->local_stack_p) {
158
+ }
159
+ else {
160
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
161
+ }
162
+ fprintf(f, " {\n");
163
+ fprintf(f, " const VALUE *ep = vm_get_ep(GET_EP(), level);\n");
164
+ fprintf(f, " VM_ASSERT(VM_ENV_LOCAL_P(ep));\n");
165
+ fprintf(f, "\n");
166
+ fprintf(f, " if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {\n");
167
+ fprintf(f, " val = rb_vm_bh_to_procval(ec, VM_ENV_BLOCK_HANDLER(ep));\n");
168
+ fprintf(f, " vm_env_write(ep, -(int)idx, val);\n");
169
+ fprintf(f, " VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);\n");
170
+ fprintf(f, " }\n");
171
+ fprintf(f, " else {\n");
172
+ fprintf(f, " val = *(ep - idx);\n");
173
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_get);\n");
174
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n");
175
+ fprintf(f, " }\n");
176
+ fprintf(f, " }\n");
177
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getblockparam(idx, level) - 1);
178
+ b->stack_size += attr_sp_inc_getblockparam(idx, level);
179
+ }
180
+ fprintf(f, "}\n");
181
+ break;
182
+ case BIN(setblockparam):
183
+ fprintf(f, "{\n");
184
+ {
185
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
186
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
187
+ MAYBE_UNUSED(rb_num_t level) = (rb_num_t)operands[1];
188
+ if (status->local_stack_p) {
189
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
190
+ }
191
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
192
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
193
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
194
+
195
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
196
+ fprintf(f, "\n");
197
+ fprintf(f, " level = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
198
+ fprintf(f, "\n");
199
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
200
+ if (body->catch_except_p || FALSE) {
201
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
202
+ pc_moved_p = TRUE;
203
+ }
204
+ if (status->local_stack_p) {
205
+ }
206
+ else {
207
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
208
+ }
209
+ fprintf(f, " {\n");
210
+ fprintf(f, " const VALUE *ep = vm_get_ep(GET_EP(), level);\n");
211
+ fprintf(f, " VM_ASSERT(VM_ENV_LOCAL_P(ep));\n");
212
+ fprintf(f, "\n");
213
+ fprintf(f, " vm_env_write(ep, -(int)idx, val);\n");
214
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_set);\n");
215
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n");
216
+ fprintf(f, "\n");
217
+ fprintf(f, " VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);\n");
218
+ fprintf(f, " }\n");
219
+ b->stack_size += attr_sp_inc_setblockparam(idx, level);
220
+ }
221
+ fprintf(f, "}\n");
222
+ break;
223
+ case BIN(getspecial):
224
+ fprintf(f, "{\n");
225
+ {
226
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
227
+ MAYBE_UNUSED(rb_num_t key) = (rb_num_t)operands[0];
228
+ MAYBE_UNUSED(rb_num_t type) = (rb_num_t)operands[1];
229
+ if (status->local_stack_p) {
230
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
231
+ }
232
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
233
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) key, type;\n");
234
+
235
+ fprintf(f, " key = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
236
+ fprintf(f, "\n");
237
+ fprintf(f, " type = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
238
+ fprintf(f, "\n");
239
+ if (body->catch_except_p || FALSE) {
240
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
241
+ pc_moved_p = TRUE;
242
+ }
243
+ if (status->local_stack_p) {
244
+ }
245
+ else {
246
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
247
+ }
248
+ fprintf(f, " {\n");
249
+ fprintf(f, " val = vm_getspecial(ec, GET_LEP(), key, type);\n");
250
+ fprintf(f, " }\n");
251
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getspecial(key, type) - 1);
252
+ b->stack_size += attr_sp_inc_getspecial(key, type);
253
+ }
254
+ fprintf(f, "}\n");
255
+ break;
256
+ case BIN(setspecial):
257
+ fprintf(f, "{\n");
258
+ {
259
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
260
+ MAYBE_UNUSED(rb_num_t key) = (rb_num_t)operands[0];
261
+ if (status->local_stack_p) {
262
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
263
+ }
264
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj;\n");
265
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) key;\n");
266
+
267
+ fprintf(f, " key = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
268
+ fprintf(f, "\n");
269
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
270
+ if (body->catch_except_p || FALSE) {
271
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
272
+ pc_moved_p = TRUE;
273
+ }
274
+ if (status->local_stack_p) {
275
+ }
276
+ else {
277
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
278
+ }
279
+ fprintf(f, " {\n");
280
+ fprintf(f, " lep_svar_set(ec, GET_LEP(), key, obj);\n");
281
+ fprintf(f, " }\n");
282
+ b->stack_size += attr_sp_inc_setspecial(key);
283
+ }
284
+ fprintf(f, "}\n");
285
+ break;
286
+ case BIN(getinstancevariable):
287
+ #if OPT_IC_FOR_IVAR
288
+ {
289
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
290
+ MAYBE_UNUSED(IC ic) = (IC)operands[1];
291
+ IC ic_copy = &(status->is_entries + ((union iseq_inline_storage_entry *)ic - body->is_entries))->cache;
292
+ if (ic_copy->ic_serial) {
293
+ fprintf(f, "{\n");
294
+ fprintf(f, " VALUE obj = GET_SELF();\n");
295
+ fprintf(f, " const rb_serial_t ic_serial = (rb_serial_t)%"PRI_SERIALT_PREFIX"u;\n", ic_copy->ic_serial);
296
+ fprintf(f, " const st_index_t index = %"PRIuSIZE";\n", ic_copy->ic_value.index);
297
+ fprintf(f, " VALUE val;\n");
298
+ fprintf(f, " if (LIKELY(RB_TYPE_P(obj, T_OBJECT) && ic_serial == RCLASS_SERIAL(RBASIC(obj)->klass) && index < ROBJECT_NUMIV(obj) && (val = ROBJECT_IVPTR(obj)[index]) != Qundef)) {\n");
299
+ fprintf(f, " stack[%d] = val;\n", b->stack_size);
300
+ fprintf(f, " }\n");
301
+ fprintf(f, " else {\n");
302
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
303
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
304
+ fprintf(f, " goto cancel;\n");
305
+ fprintf(f, " }\n");
306
+
307
+ b->stack_size += attr_sp_inc_getinstancevariable(id, ic);
308
+ fprintf(f, "}\n");
309
+ break;
310
+ }
311
+ }
312
+ #endif /* OPT_IC_FOR_IVAR */
313
+ fprintf(f, "{\n");
314
+ {
315
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
316
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
317
+ MAYBE_UNUSED(IC ic) = (IC)operands[1];
318
+ if (status->local_stack_p) {
319
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
320
+ }
321
+ fprintf(f, " MAYBE_UNUSED(IC) ic;\n");
322
+ fprintf(f, " MAYBE_UNUSED(ID) id;\n");
323
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
324
+
325
+ fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
326
+ comment_id(f, (ID)operands[0]);
327
+ fprintf(f, "\n");
328
+ fprintf(f, " ic = (IC)0x%"PRIxVALUE";", operands[1]);
329
+ fprintf(f, "\n");
330
+ if (body->catch_except_p || TRUE) {
331
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
332
+ pc_moved_p = TRUE;
333
+ }
334
+ if (status->local_stack_p) {
335
+ }
336
+ else {
337
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
338
+ }
339
+ fprintf(f, " {\n");
340
+ fprintf(f, " val = vm_getinstancevariable(GET_SELF(), id, ic);\n");
341
+ fprintf(f, " }\n");
342
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getinstancevariable(id, ic) - 1);
343
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
344
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_getinstancevariable(id, ic) + 1);
345
+ if (!pc_moved_p) {
346
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
347
+ }
348
+ fprintf(f, " goto cancel;\n");
349
+ fprintf(f, " }\n");
350
+ b->stack_size += attr_sp_inc_getinstancevariable(id, ic);
351
+ }
352
+ fprintf(f, "}\n");
353
+ break;
354
+ case BIN(setinstancevariable):
355
+ #if OPT_IC_FOR_IVAR
356
+ {
357
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
358
+ MAYBE_UNUSED(IC ic) = (IC)operands[1];
359
+ IC ic_copy = &(status->is_entries + ((union iseq_inline_storage_entry *)ic - body->is_entries))->cache;
360
+ if (ic_copy->ic_serial) {
361
+ fprintf(f, "{\n");
362
+ fprintf(f, " VALUE obj = GET_SELF();\n");
363
+ fprintf(f, " const rb_serial_t ic_serial = (rb_serial_t)%"PRI_SERIALT_PREFIX"u;\n", ic_copy->ic_serial);
364
+ fprintf(f, " const st_index_t index = %"PRIuSIZE";\n", ic_copy->ic_value.index);
365
+ fprintf(f, " VALUE val = stack[%d];\n", b->stack_size - 1);
366
+ fprintf(f, " if (LIKELY(RB_TYPE_P(obj, T_OBJECT) && ic_serial == RCLASS_SERIAL(RBASIC(obj)->klass) && index < ROBJECT_NUMIV(obj))) {\n");
367
+ fprintf(f, " VALUE *ptr = ROBJECT_IVPTR(obj);\n");
368
+ fprintf(f, " RB_OBJ_WRITE(obj, &ptr[index], val);\n");
369
+ fprintf(f, " }\n");
370
+ fprintf(f, " else {\n");
371
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
372
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
373
+ fprintf(f, " goto cancel;\n");
374
+ fprintf(f, " }\n");
375
+
376
+ b->stack_size += attr_sp_inc_setinstancevariable(id, ic);
377
+ fprintf(f, "}\n");
378
+ break;
379
+ }
380
+ }
381
+ #endif /* OPT_IC_FOR_IVAR */
382
+ fprintf(f, "{\n");
383
+ {
384
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
385
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
386
+ MAYBE_UNUSED(IC ic) = (IC)operands[1];
387
+ if (status->local_stack_p) {
388
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
389
+ }
390
+ fprintf(f, " MAYBE_UNUSED(IC) ic;\n");
391
+ fprintf(f, " MAYBE_UNUSED(ID) id;\n");
392
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
393
+
394
+ fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
395
+ comment_id(f, (ID)operands[0]);
396
+ fprintf(f, "\n");
397
+ fprintf(f, " ic = (IC)0x%"PRIxVALUE";", operands[1]);
398
+ fprintf(f, "\n");
399
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
400
+ if (body->catch_except_p || FALSE) {
401
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
402
+ pc_moved_p = TRUE;
403
+ }
404
+ if (status->local_stack_p) {
405
+ }
406
+ else {
407
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
408
+ }
409
+ fprintf(f, " {\n");
410
+ fprintf(f, " vm_setinstancevariable(GET_SELF(), id, val, ic);\n");
411
+ fprintf(f, " }\n");
412
+ b->stack_size += attr_sp_inc_setinstancevariable(id, ic);
413
+ }
414
+ fprintf(f, "}\n");
415
+ break;
416
+ case BIN(getclassvariable):
417
+ fprintf(f, "{\n");
418
+ {
419
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
420
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
421
+ if (status->local_stack_p) {
422
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
423
+ }
424
+ fprintf(f, " MAYBE_UNUSED(ID) id;\n");
425
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
426
+
427
+ fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
428
+ comment_id(f, (ID)operands[0]);
429
+ fprintf(f, "\n");
430
+ if (body->catch_except_p || TRUE) {
431
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
432
+ pc_moved_p = TRUE;
433
+ }
434
+ if (status->local_stack_p) {
435
+ }
436
+ else {
437
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
438
+ }
439
+ fprintf(f, " {\n");
440
+ fprintf(f, " val = rb_cvar_get(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id);\n");
441
+ fprintf(f, " }\n");
442
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getclassvariable(id) - 1);
443
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
444
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_getclassvariable(id) + 1);
445
+ if (!pc_moved_p) {
446
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
447
+ }
448
+ fprintf(f, " goto cancel;\n");
449
+ fprintf(f, " }\n");
450
+ b->stack_size += attr_sp_inc_getclassvariable(id);
451
+ }
452
+ fprintf(f, "}\n");
453
+ break;
454
+ case BIN(setclassvariable):
455
+ fprintf(f, "{\n");
456
+ {
457
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
458
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
459
+ if (status->local_stack_p) {
460
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
461
+ }
462
+ fprintf(f, " MAYBE_UNUSED(ID) id;\n");
463
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
464
+
465
+ fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
466
+ comment_id(f, (ID)operands[0]);
467
+ fprintf(f, "\n");
468
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
469
+ if (body->catch_except_p || TRUE) {
470
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
471
+ pc_moved_p = TRUE;
472
+ }
473
+ if (status->local_stack_p) {
474
+ }
475
+ else {
476
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
477
+ }
478
+ fprintf(f, " {\n");
479
+ fprintf(f, " vm_ensure_not_refinement_module(GET_SELF());\n");
480
+ fprintf(f, " rb_cvar_set(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id, val);\n");
481
+ fprintf(f, " }\n");
482
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
483
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_setclassvariable(id) + 1);
484
+ if (!pc_moved_p) {
485
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
486
+ }
487
+ fprintf(f, " goto cancel;\n");
488
+ fprintf(f, " }\n");
489
+ b->stack_size += attr_sp_inc_setclassvariable(id);
490
+ }
491
+ fprintf(f, "}\n");
492
+ break;
493
+ case BIN(getconstant):
494
+ fprintf(f, "{\n");
495
+ {
496
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
497
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
498
+ if (status->local_stack_p) {
499
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
500
+ }
501
+ fprintf(f, " MAYBE_UNUSED(ID) id;\n");
502
+ fprintf(f, " MAYBE_UNUSED(VALUE) klass, val;\n");
503
+
504
+ fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
505
+ comment_id(f, (ID)operands[0]);
506
+ fprintf(f, "\n");
507
+ fprintf(f, " klass = stack[%d];\n", b->stack_size - 1);
508
+ if (body->catch_except_p || TRUE) {
509
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
510
+ pc_moved_p = TRUE;
511
+ }
512
+ if (status->local_stack_p) {
513
+ }
514
+ else {
515
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
516
+ }
517
+ fprintf(f, " {\n");
518
+ fprintf(f, " val = vm_get_ev_const(ec, klass, id, 0);\n");
519
+ fprintf(f, " }\n");
520
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getconstant(id) - 1);
521
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
522
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_getconstant(id) + 1);
523
+ if (!pc_moved_p) {
524
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
525
+ }
526
+ fprintf(f, " goto cancel;\n");
527
+ fprintf(f, " }\n");
528
+ b->stack_size += attr_sp_inc_getconstant(id);
529
+ }
530
+ fprintf(f, "}\n");
531
+ break;
532
+ case BIN(setconstant):
533
+ fprintf(f, "{\n");
534
+ {
535
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
536
+ MAYBE_UNUSED(ID id) = (ID)operands[0];
537
+ if (status->local_stack_p) {
538
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
539
+ }
540
+ fprintf(f, " MAYBE_UNUSED(ID) id;\n");
541
+ fprintf(f, " MAYBE_UNUSED(VALUE) cbase, val;\n");
542
+
543
+ fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
544
+ comment_id(f, (ID)operands[0]);
545
+ fprintf(f, "\n");
546
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 2);
547
+ fprintf(f, " cbase = stack[%d];\n", b->stack_size - 1);
548
+ if (body->catch_except_p || TRUE) {
549
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
550
+ pc_moved_p = TRUE;
551
+ }
552
+ if (status->local_stack_p) {
553
+ }
554
+ else {
555
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
556
+ }
557
+ fprintf(f, " {\n");
558
+ fprintf(f, " vm_check_if_namespace(cbase);\n");
559
+ fprintf(f, " vm_ensure_not_refinement_module(GET_SELF());\n");
560
+ fprintf(f, " rb_const_set(cbase, id, val);\n");
561
+ fprintf(f, " }\n");
562
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
563
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_setconstant(id) + 1);
564
+ if (!pc_moved_p) {
565
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
566
+ }
567
+ fprintf(f, " goto cancel;\n");
568
+ fprintf(f, " }\n");
569
+ b->stack_size += attr_sp_inc_setconstant(id);
570
+ }
571
+ fprintf(f, "}\n");
572
+ break;
573
+ case BIN(getglobal):
574
+ fprintf(f, "{\n");
575
+ {
576
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
577
+ MAYBE_UNUSED(GENTRY entry) = (GENTRY)operands[0];
578
+ if (status->local_stack_p) {
579
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
580
+ }
581
+ fprintf(f, " MAYBE_UNUSED(GENTRY) entry;\n");
582
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
583
+
584
+ fprintf(f, " entry = (GENTRY)0x%"PRIxVALUE";", operands[0]);
585
+ fprintf(f, "\n");
586
+ if (body->catch_except_p || TRUE) {
587
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
588
+ pc_moved_p = TRUE;
589
+ }
590
+ if (status->local_stack_p) {
591
+ }
592
+ else {
593
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
594
+ }
595
+ fprintf(f, " {\n");
596
+ fprintf(f, " val = GET_GLOBAL((VALUE)entry);\n");
597
+ fprintf(f, " }\n");
598
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getglobal(entry) - 1);
599
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
600
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_getglobal(entry) + 1);
601
+ if (!pc_moved_p) {
602
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
603
+ }
604
+ fprintf(f, " goto cancel;\n");
605
+ fprintf(f, " }\n");
606
+ b->stack_size += attr_sp_inc_getglobal(entry);
607
+ }
608
+ fprintf(f, "}\n");
609
+ break;
610
+ case BIN(setglobal):
611
+ fprintf(f, "{\n");
612
+ {
613
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
614
+ MAYBE_UNUSED(GENTRY entry) = (GENTRY)operands[0];
615
+ if (status->local_stack_p) {
616
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
617
+ }
618
+ fprintf(f, " MAYBE_UNUSED(GENTRY) entry;\n");
619
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
620
+
621
+ fprintf(f, " entry = (GENTRY)0x%"PRIxVALUE";", operands[0]);
622
+ fprintf(f, "\n");
623
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
624
+ if (body->catch_except_p || TRUE) {
625
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
626
+ pc_moved_p = TRUE;
627
+ }
628
+ if (status->local_stack_p) {
629
+ }
630
+ else {
631
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
632
+ }
633
+ fprintf(f, " {\n");
634
+ fprintf(f, " SET_GLOBAL((VALUE)entry, val);\n");
635
+ fprintf(f, " }\n");
636
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
637
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_setglobal(entry) + 1);
638
+ if (!pc_moved_p) {
639
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
640
+ }
641
+ fprintf(f, " goto cancel;\n");
642
+ fprintf(f, " }\n");
643
+ b->stack_size += attr_sp_inc_setglobal(entry);
644
+ }
645
+ fprintf(f, "}\n");
646
+ break;
647
+ case BIN(putnil):
648
+ fprintf(f, "{\n");
649
+ {
650
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
651
+ if (status->local_stack_p) {
652
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
653
+ }
654
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
655
+
656
+ if (body->catch_except_p || FALSE) {
657
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
658
+ pc_moved_p = TRUE;
659
+ }
660
+ if (status->local_stack_p) {
661
+ }
662
+ else {
663
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
664
+ }
665
+ fprintf(f, " {\n");
666
+ fprintf(f, " val = Qnil;\n");
667
+ fprintf(f, " }\n");
668
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putnil() - 1);
669
+ b->stack_size += attr_sp_inc_putnil();
670
+ }
671
+ fprintf(f, "}\n");
672
+ break;
673
+ case BIN(putself):
674
+ fprintf(f, "{\n");
675
+ {
676
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
677
+ if (status->local_stack_p) {
678
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
679
+ }
680
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
681
+
682
+ if (body->catch_except_p || FALSE) {
683
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
684
+ pc_moved_p = TRUE;
685
+ }
686
+ if (status->local_stack_p) {
687
+ }
688
+ else {
689
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
690
+ }
691
+ fprintf(f, " {\n");
692
+ fprintf(f, " val = GET_SELF();\n");
693
+ fprintf(f, " }\n");
694
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putself() - 1);
695
+ b->stack_size += attr_sp_inc_putself();
696
+ }
697
+ fprintf(f, "}\n");
698
+ break;
699
+ case BIN(putobject):
700
+ fprintf(f, "{\n");
701
+ {
702
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
703
+ MAYBE_UNUSED(VALUE val) = (VALUE)operands[0];
704
+ if (status->local_stack_p) {
705
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
706
+ }
707
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
708
+
709
+ fprintf(f, " val = (VALUE)0x%"PRIxVALUE";", operands[0]);
710
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
711
+ fprintf(f, "\n");
712
+ if (body->catch_except_p || FALSE) {
713
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
714
+ pc_moved_p = TRUE;
715
+ }
716
+ if (status->local_stack_p) {
717
+ }
718
+ else {
719
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
720
+ }
721
+ fprintf(f, " {\n");
722
+ fprintf(f, " /* */\n");
723
+ fprintf(f, " }\n");
724
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putobject(val) - 1);
725
+ b->stack_size += attr_sp_inc_putobject(val);
726
+ }
727
+ fprintf(f, "}\n");
728
+ break;
729
+ case BIN(putspecialobject):
730
+ fprintf(f, "{\n");
731
+ {
732
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
733
+ MAYBE_UNUSED(rb_num_t value_type) = (rb_num_t)operands[0];
734
+ if (status->local_stack_p) {
735
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
736
+ }
737
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
738
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) value_type;\n");
739
+
740
+ fprintf(f, " value_type = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
741
+ fprintf(f, "\n");
742
+ if (body->catch_except_p || FALSE) {
743
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
744
+ pc_moved_p = TRUE;
745
+ }
746
+ if (status->local_stack_p) {
747
+ }
748
+ else {
749
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
750
+ }
751
+ fprintf(f, " {\n");
752
+ fprintf(f, " enum vm_special_object_type type;\n");
753
+ fprintf(f, "\n");
754
+ fprintf(f, " type = (enum vm_special_object_type)value_type;\n");
755
+ fprintf(f, " val = vm_get_special_object(GET_EP(), type);\n");
756
+ fprintf(f, " }\n");
757
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putspecialobject(value_type) - 1);
758
+ b->stack_size += attr_sp_inc_putspecialobject(value_type);
759
+ }
760
+ fprintf(f, "}\n");
761
+ break;
762
+ case BIN(putiseq):
763
+ fprintf(f, "{\n");
764
+ {
765
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
766
+ MAYBE_UNUSED(ISEQ iseq) = (ISEQ)operands[0];
767
+ if (status->local_stack_p) {
768
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
769
+ }
770
+ fprintf(f, " MAYBE_UNUSED(ISEQ) iseq;\n");
771
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret;\n");
772
+
773
+ fprintf(f, " iseq = (ISEQ)0x%"PRIxVALUE";", operands[0]);
774
+ fprintf(f, "\n");
775
+ if (body->catch_except_p || FALSE) {
776
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
777
+ pc_moved_p = TRUE;
778
+ }
779
+ if (status->local_stack_p) {
780
+ }
781
+ else {
782
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
783
+ }
784
+ fprintf(f, " {\n");
785
+ fprintf(f, " ret = (VALUE)iseq;\n");
786
+ fprintf(f, " }\n");
787
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_putiseq(iseq) - 1);
788
+ b->stack_size += attr_sp_inc_putiseq(iseq);
789
+ }
790
+ fprintf(f, "}\n");
791
+ break;
792
+ case BIN(putstring):
793
+ fprintf(f, "{\n");
794
+ {
795
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
796
+ MAYBE_UNUSED(VALUE str) = (VALUE)operands[0];
797
+ if (status->local_stack_p) {
798
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
799
+ }
800
+ fprintf(f, " MAYBE_UNUSED(VALUE) str, val;\n");
801
+
802
+ fprintf(f, " str = (VALUE)0x%"PRIxVALUE";", operands[0]);
803
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
804
+ fprintf(f, "\n");
805
+ if (body->catch_except_p || FALSE) {
806
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
807
+ pc_moved_p = TRUE;
808
+ }
809
+ if (status->local_stack_p) {
810
+ }
811
+ else {
812
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
813
+ }
814
+ fprintf(f, " {\n");
815
+ fprintf(f, " val = rb_str_resurrect(str);\n");
816
+ fprintf(f, " }\n");
817
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putstring(str) - 1);
818
+ b->stack_size += attr_sp_inc_putstring(str);
819
+ }
820
+ fprintf(f, "}\n");
821
+ break;
822
+ case BIN(concatstrings):
823
+ fprintf(f, "{\n");
824
+ {
825
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
826
+ MAYBE_UNUSED(rb_num_t num) = (rb_num_t)operands[0];
827
+ if (status->local_stack_p) {
828
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
829
+ }
830
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
831
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) num;\n");
832
+
833
+ fprintf(f, " num = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
834
+ fprintf(f, "\n");
835
+ if (body->catch_except_p || FALSE) {
836
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
837
+ pc_moved_p = TRUE;
838
+ }
839
+ if (status->local_stack_p) {
840
+ }
841
+ else {
842
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
843
+ }
844
+ fprintf(f, " {\n");
845
+ fprintf(f, " val = rb_str_concat_literals(num, %s);\n",
846
+ (status->local_stack_p ? "stack + (stack_size - (num))" : "STACK_ADDR_FROM_TOP(num)"));
847
+ fprintf(f, " }\n");
848
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_concatstrings(num) - 1);
849
+ b->stack_size += attr_sp_inc_concatstrings(num);
850
+ }
851
+ fprintf(f, "}\n");
852
+ break;
853
+ case BIN(tostring):
854
+ fprintf(f, "{\n");
855
+ {
856
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
857
+ if (status->local_stack_p) {
858
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
859
+ }
860
+ fprintf(f, " MAYBE_UNUSED(VALUE) str, val;\n");
861
+
862
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 2);
863
+ fprintf(f, " str = stack[%d];\n", b->stack_size - 1);
864
+ if (body->catch_except_p || FALSE) {
865
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
866
+ pc_moved_p = TRUE;
867
+ }
868
+ if (status->local_stack_p) {
869
+ }
870
+ else {
871
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
872
+ }
873
+ fprintf(f, " {\n");
874
+ fprintf(f, " val = rb_obj_as_string_result(str, val);\n");
875
+ fprintf(f, " }\n");
876
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_tostring() - 1);
877
+ b->stack_size += attr_sp_inc_tostring();
878
+ }
879
+ fprintf(f, "}\n");
880
+ break;
881
+ case BIN(freezestring):
882
+ fprintf(f, "{\n");
883
+ {
884
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
885
+ MAYBE_UNUSED(VALUE debug_info) = (VALUE)operands[0];
886
+ if (status->local_stack_p) {
887
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
888
+ }
889
+ fprintf(f, " MAYBE_UNUSED(VALUE) debug_info, str;\n");
890
+
891
+ fprintf(f, " debug_info = (VALUE)0x%"PRIxVALUE";", operands[0]);
892
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
893
+ fprintf(f, "\n");
894
+ fprintf(f, " str = stack[%d];\n", b->stack_size - 1);
895
+ if (body->catch_except_p || FALSE) {
896
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
897
+ pc_moved_p = TRUE;
898
+ }
899
+ if (status->local_stack_p) {
900
+ }
901
+ else {
902
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
903
+ }
904
+ fprintf(f, " {\n");
905
+ fprintf(f, " vm_freezestring(str, debug_info);\n");
906
+ fprintf(f, " }\n");
907
+ fprintf(f, " stack[%d] = str;\n", b->stack_size + (int)attr_sp_inc_freezestring(debug_info) - 1);
908
+ b->stack_size += attr_sp_inc_freezestring(debug_info);
909
+ }
910
+ fprintf(f, "}\n");
911
+ break;
912
+ case BIN(toregexp):
913
+ fprintf(f, "{\n");
914
+ {
915
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
916
+ MAYBE_UNUSED(rb_num_t opt) = (rb_num_t)operands[0];
917
+ MAYBE_UNUSED(rb_num_t cnt) = (rb_num_t)operands[1];
918
+ if (status->local_stack_p) {
919
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
920
+ }
921
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
922
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) cnt, opt;\n");
923
+
924
+ fprintf(f, " opt = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
925
+ fprintf(f, "\n");
926
+ fprintf(f, " cnt = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
927
+ fprintf(f, "\n");
928
+ if (body->catch_except_p || FALSE) {
929
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
930
+ pc_moved_p = TRUE;
931
+ }
932
+ if (status->local_stack_p) {
933
+ }
934
+ else {
935
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
936
+ }
937
+ fprintf(f, " {\n");
938
+ fprintf(f, " const VALUE ary = rb_ary_tmp_new_from_values(0, cnt, %s);\n",
939
+ (status->local_stack_p ? "stack + (stack_size - (cnt))" : "STACK_ADDR_FROM_TOP(cnt)"));
940
+ fprintf(f, " val = rb_reg_new_ary(ary, (int)opt);\n");
941
+ fprintf(f, " rb_ary_clear(ary);\n");
942
+ fprintf(f, " }\n");
943
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_toregexp(opt, cnt) - 1);
944
+ b->stack_size += attr_sp_inc_toregexp(opt, cnt);
945
+ }
946
+ fprintf(f, "}\n");
947
+ break;
948
+ case BIN(intern):
949
+ fprintf(f, "{\n");
950
+ {
951
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
952
+ if (status->local_stack_p) {
953
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
954
+ }
955
+ fprintf(f, " MAYBE_UNUSED(VALUE) str, sym;\n");
956
+
957
+ fprintf(f, " str = stack[%d];\n", b->stack_size - 1);
958
+ if (body->catch_except_p || FALSE) {
959
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
960
+ pc_moved_p = TRUE;
961
+ }
962
+ if (status->local_stack_p) {
963
+ }
964
+ else {
965
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
966
+ }
967
+ fprintf(f, " {\n");
968
+ fprintf(f, " sym = rb_str_intern(str);\n");
969
+ fprintf(f, " }\n");
970
+ fprintf(f, " stack[%d] = sym;\n", b->stack_size + (int)attr_sp_inc_intern() - 1);
971
+ b->stack_size += attr_sp_inc_intern();
972
+ }
973
+ fprintf(f, "}\n");
974
+ break;
975
+ case BIN(newarray):
976
+ fprintf(f, "{\n");
977
+ {
978
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
979
+ MAYBE_UNUSED(rb_num_t num) = (rb_num_t)operands[0];
980
+ if (status->local_stack_p) {
981
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
982
+ }
983
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
984
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) num;\n");
985
+
986
+ fprintf(f, " num = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
987
+ fprintf(f, "\n");
988
+ if (body->catch_except_p || FALSE) {
989
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
990
+ pc_moved_p = TRUE;
991
+ }
992
+ if (status->local_stack_p) {
993
+ }
994
+ else {
995
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
996
+ }
997
+ fprintf(f, " {\n");
998
+ fprintf(f, " val = rb_ary_new4(num, %s);\n",
999
+ (status->local_stack_p ? "stack + (stack_size - (num))" : "STACK_ADDR_FROM_TOP(num)"));
1000
+ fprintf(f, " }\n");
1001
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_newarray(num) - 1);
1002
+ b->stack_size += attr_sp_inc_newarray(num);
1003
+ }
1004
+ fprintf(f, "}\n");
1005
+ break;
1006
+ case BIN(duparray):
1007
+ fprintf(f, "{\n");
1008
+ {
1009
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1010
+ MAYBE_UNUSED(VALUE ary) = (VALUE)operands[0];
1011
+ if (status->local_stack_p) {
1012
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1013
+ }
1014
+ fprintf(f, " MAYBE_UNUSED(VALUE) ary, val;\n");
1015
+
1016
+ fprintf(f, " ary = (VALUE)0x%"PRIxVALUE";", operands[0]);
1017
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
1018
+ fprintf(f, "\n");
1019
+ if (body->catch_except_p || FALSE) {
1020
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1021
+ pc_moved_p = TRUE;
1022
+ }
1023
+ if (status->local_stack_p) {
1024
+ }
1025
+ else {
1026
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1027
+ }
1028
+ fprintf(f, " {\n");
1029
+ fprintf(f, " val = rb_ary_resurrect(ary);\n");
1030
+ fprintf(f, " }\n");
1031
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_duparray(ary) - 1);
1032
+ b->stack_size += attr_sp_inc_duparray(ary);
1033
+ }
1034
+ fprintf(f, "}\n");
1035
+ break;
1036
+ case BIN(duphash):
1037
+ fprintf(f, "{\n");
1038
+ {
1039
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1040
+ MAYBE_UNUSED(VALUE hash) = (VALUE)operands[0];
1041
+ if (status->local_stack_p) {
1042
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1043
+ }
1044
+ fprintf(f, " MAYBE_UNUSED(VALUE) hash, val;\n");
1045
+
1046
+ fprintf(f, " hash = (VALUE)0x%"PRIxVALUE";", operands[0]);
1047
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
1048
+ fprintf(f, "\n");
1049
+ if (body->catch_except_p || FALSE) {
1050
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1051
+ pc_moved_p = TRUE;
1052
+ }
1053
+ if (status->local_stack_p) {
1054
+ }
1055
+ else {
1056
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1057
+ }
1058
+ fprintf(f, " {\n");
1059
+ fprintf(f, " val = rb_hash_resurrect(hash);\n");
1060
+ fprintf(f, " }\n");
1061
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_duphash(hash) - 1);
1062
+ b->stack_size += attr_sp_inc_duphash(hash);
1063
+ }
1064
+ fprintf(f, "}\n");
1065
+ break;
1066
+ case BIN(expandarray):
1067
+ fprintf(f, "{\n");
1068
+ {
1069
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1070
+ MAYBE_UNUSED(rb_num_t num) = (rb_num_t)operands[0];
1071
+ MAYBE_UNUSED(rb_num_t flag) = (rb_num_t)operands[1];
1072
+ if (status->local_stack_p) {
1073
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1074
+ }
1075
+ fprintf(f, " MAYBE_UNUSED(VALUE) ary;\n");
1076
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) flag, num;\n");
1077
+
1078
+ fprintf(f, " num = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1079
+ fprintf(f, "\n");
1080
+ fprintf(f, " flag = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
1081
+ fprintf(f, "\n");
1082
+ fprintf(f, " ary = stack[%d];\n", b->stack_size - 1);
1083
+ if (body->catch_except_p || TRUE) {
1084
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1085
+ pc_moved_p = TRUE;
1086
+ }
1087
+ if (status->local_stack_p) {
1088
+ }
1089
+ else {
1090
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1091
+ }
1092
+ fprintf(f, " {\n");
1093
+ fprintf(f, " vm_expandarray(%s, ary, num, (int)flag);\n", (status->local_stack_p ? "(stack + stack_size)" : "GET_SP()"));
1094
+ fprintf(f, " }\n");
1095
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1096
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_expandarray(num, flag) + 1);
1097
+ if (!pc_moved_p) {
1098
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1099
+ }
1100
+ fprintf(f, " goto cancel;\n");
1101
+ fprintf(f, " }\n");
1102
+ b->stack_size += attr_sp_inc_expandarray(num, flag);
1103
+ }
1104
+ fprintf(f, "}\n");
1105
+ break;
1106
+ case BIN(concatarray):
1107
+ fprintf(f, "{\n");
1108
+ {
1109
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1110
+ if (status->local_stack_p) {
1111
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1112
+ }
1113
+ fprintf(f, " MAYBE_UNUSED(VALUE) ary, ary1, ary2;\n");
1114
+
1115
+ fprintf(f, " ary1 = stack[%d];\n", b->stack_size - 2);
1116
+ fprintf(f, " ary2 = stack[%d];\n", b->stack_size - 1);
1117
+ if (body->catch_except_p || TRUE) {
1118
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1119
+ pc_moved_p = TRUE;
1120
+ }
1121
+ if (status->local_stack_p) {
1122
+ }
1123
+ else {
1124
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1125
+ }
1126
+ fprintf(f, " {\n");
1127
+ fprintf(f, " ary = vm_concat_array(ary1, ary2);\n");
1128
+ fprintf(f, " }\n");
1129
+ fprintf(f, " stack[%d] = ary;\n", b->stack_size + (int)attr_sp_inc_concatarray() - 1);
1130
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1131
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_concatarray() + 1);
1132
+ if (!pc_moved_p) {
1133
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1134
+ }
1135
+ fprintf(f, " goto cancel;\n");
1136
+ fprintf(f, " }\n");
1137
+ b->stack_size += attr_sp_inc_concatarray();
1138
+ }
1139
+ fprintf(f, "}\n");
1140
+ break;
1141
+ case BIN(splatarray):
1142
+ fprintf(f, "{\n");
1143
+ {
1144
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1145
+ MAYBE_UNUSED(VALUE flag) = (VALUE)operands[0];
1146
+ if (status->local_stack_p) {
1147
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1148
+ }
1149
+ fprintf(f, " MAYBE_UNUSED(VALUE) ary, flag, obj;\n");
1150
+
1151
+ fprintf(f, " flag = (VALUE)0x%"PRIxVALUE";", operands[0]);
1152
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
1153
+ fprintf(f, "\n");
1154
+ fprintf(f, " ary = stack[%d];\n", b->stack_size - 1);
1155
+ if (body->catch_except_p || TRUE) {
1156
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1157
+ pc_moved_p = TRUE;
1158
+ }
1159
+ if (status->local_stack_p) {
1160
+ }
1161
+ else {
1162
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1163
+ }
1164
+ fprintf(f, " {\n");
1165
+ fprintf(f, " obj = vm_splat_array(flag, ary);\n");
1166
+ fprintf(f, " }\n");
1167
+ fprintf(f, " stack[%d] = obj;\n", b->stack_size + (int)attr_sp_inc_splatarray(flag) - 1);
1168
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1169
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_splatarray(flag) + 1);
1170
+ if (!pc_moved_p) {
1171
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1172
+ }
1173
+ fprintf(f, " goto cancel;\n");
1174
+ fprintf(f, " }\n");
1175
+ b->stack_size += attr_sp_inc_splatarray(flag);
1176
+ }
1177
+ fprintf(f, "}\n");
1178
+ break;
1179
+ case BIN(newhash):
1180
+ fprintf(f, "{\n");
1181
+ {
1182
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1183
+ MAYBE_UNUSED(rb_num_t num) = (rb_num_t)operands[0];
1184
+ if (status->local_stack_p) {
1185
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1186
+ }
1187
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1188
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) num;\n");
1189
+
1190
+ fprintf(f, " num = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1191
+ fprintf(f, "\n");
1192
+ if (body->catch_except_p || TRUE) {
1193
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1194
+ pc_moved_p = TRUE;
1195
+ }
1196
+ if (status->local_stack_p) {
1197
+ }
1198
+ else {
1199
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1200
+ }
1201
+ fprintf(f, " {\n");
1202
+ fprintf(f, " RUBY_DTRACE_CREATE_HOOK(HASH, num);\n");
1203
+ fprintf(f, "\n");
1204
+ fprintf(f, " val = rb_hash_new_with_size(num / 2);\n");
1205
+ fprintf(f, "\n");
1206
+ fprintf(f, " if (num) {\n");
1207
+ fprintf(f, " rb_hash_bulk_insert(num, %s, val);\n",
1208
+ (status->local_stack_p ? "stack + (stack_size - (num))" : "STACK_ADDR_FROM_TOP(num)"));
1209
+ fprintf(f, " }\n");
1210
+ fprintf(f, " }\n");
1211
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_newhash(num) - 1);
1212
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1213
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_newhash(num) + 1);
1214
+ if (!pc_moved_p) {
1215
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1216
+ }
1217
+ fprintf(f, " goto cancel;\n");
1218
+ fprintf(f, " }\n");
1219
+ b->stack_size += attr_sp_inc_newhash(num);
1220
+ }
1221
+ fprintf(f, "}\n");
1222
+ break;
1223
+ case BIN(newrange):
1224
+ fprintf(f, "{\n");
1225
+ {
1226
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1227
+ MAYBE_UNUSED(rb_num_t flag) = (rb_num_t)operands[0];
1228
+ if (status->local_stack_p) {
1229
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1230
+ }
1231
+ fprintf(f, " MAYBE_UNUSED(VALUE) high, low, val;\n");
1232
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) flag;\n");
1233
+
1234
+ fprintf(f, " flag = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1235
+ fprintf(f, "\n");
1236
+ fprintf(f, " low = stack[%d];\n", b->stack_size - 2);
1237
+ fprintf(f, " high = stack[%d];\n", b->stack_size - 1);
1238
+ if (body->catch_except_p || TRUE) {
1239
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1240
+ pc_moved_p = TRUE;
1241
+ }
1242
+ if (status->local_stack_p) {
1243
+ }
1244
+ else {
1245
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1246
+ }
1247
+ fprintf(f, " {\n");
1248
+ fprintf(f, " val = rb_range_new(low, high, (int)flag);\n");
1249
+ fprintf(f, " }\n");
1250
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_newrange(flag) - 1);
1251
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1252
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_newrange(flag) + 1);
1253
+ if (!pc_moved_p) {
1254
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1255
+ }
1256
+ fprintf(f, " goto cancel;\n");
1257
+ fprintf(f, " }\n");
1258
+ b->stack_size += attr_sp_inc_newrange(flag);
1259
+ }
1260
+ fprintf(f, "}\n");
1261
+ break;
1262
+ case BIN(pop):
1263
+ fprintf(f, "{\n");
1264
+ {
1265
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1266
+ if (status->local_stack_p) {
1267
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1268
+ }
1269
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1270
+
1271
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
1272
+ if (body->catch_except_p || FALSE) {
1273
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1274
+ pc_moved_p = TRUE;
1275
+ }
1276
+ if (status->local_stack_p) {
1277
+ }
1278
+ else {
1279
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1280
+ }
1281
+ fprintf(f, " {\n");
1282
+ fprintf(f, " (void)val;\n");
1283
+ fprintf(f, " /* none */\n");
1284
+ fprintf(f, " }\n");
1285
+ b->stack_size += attr_sp_inc_pop();
1286
+ }
1287
+ fprintf(f, "}\n");
1288
+ break;
1289
+ case BIN(dup):
1290
+ fprintf(f, "{\n");
1291
+ {
1292
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1293
+ if (status->local_stack_p) {
1294
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1295
+ }
1296
+ fprintf(f, " MAYBE_UNUSED(VALUE) val, val1, val2;\n");
1297
+
1298
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
1299
+ if (body->catch_except_p || FALSE) {
1300
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1301
+ pc_moved_p = TRUE;
1302
+ }
1303
+ if (status->local_stack_p) {
1304
+ }
1305
+ else {
1306
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1307
+ }
1308
+ fprintf(f, " {\n");
1309
+ fprintf(f, " val1 = val2 = val;\n");
1310
+ fprintf(f, " }\n");
1311
+ fprintf(f, " stack[%d] = val2;\n", b->stack_size + (int)attr_sp_inc_dup() - 1);
1312
+ fprintf(f, " stack[%d] = val1;\n", b->stack_size + (int)attr_sp_inc_dup() - 2);
1313
+ b->stack_size += attr_sp_inc_dup();
1314
+ }
1315
+ fprintf(f, "}\n");
1316
+ break;
1317
+ case BIN(dupn):
1318
+ fprintf(f, "{\n");
1319
+ {
1320
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1321
+ MAYBE_UNUSED(rb_num_t n) = (rb_num_t)operands[0];
1322
+ if (status->local_stack_p) {
1323
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1324
+ }
1325
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) n;\n");
1326
+
1327
+ fprintf(f, " n = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1328
+ fprintf(f, "\n");
1329
+ if (body->catch_except_p || FALSE) {
1330
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1331
+ pc_moved_p = TRUE;
1332
+ }
1333
+ if (status->local_stack_p) {
1334
+ }
1335
+ else {
1336
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1337
+ }
1338
+ fprintf(f, " {\n");
1339
+ fprintf(f, " void *dst = %s;\n", (status->local_stack_p ? "(stack + stack_size)" : "GET_SP()"));
1340
+ fprintf(f, " void *src = %s;\n",
1341
+ (status->local_stack_p ? "stack + (stack_size - (n))" : "STACK_ADDR_FROM_TOP(n)"));
1342
+ fprintf(f, "\n");
1343
+ fprintf(f, " MEMCPY(dst, src, VALUE, n);\n");
1344
+ fprintf(f, " }\n");
1345
+ b->stack_size += attr_sp_inc_dupn(n);
1346
+ }
1347
+ fprintf(f, "}\n");
1348
+ break;
1349
+ case BIN(swap):
1350
+ fprintf(f, "{\n");
1351
+ {
1352
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1353
+ if (status->local_stack_p) {
1354
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1355
+ }
1356
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, val;\n");
1357
+
1358
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 2);
1359
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
1360
+ if (body->catch_except_p || FALSE) {
1361
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1362
+ pc_moved_p = TRUE;
1363
+ }
1364
+ if (status->local_stack_p) {
1365
+ }
1366
+ else {
1367
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1368
+ }
1369
+ fprintf(f, " {\n");
1370
+ fprintf(f, " /* none */\n");
1371
+ fprintf(f, " }\n");
1372
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_swap() - 1);
1373
+ fprintf(f, " stack[%d] = obj;\n", b->stack_size + (int)attr_sp_inc_swap() - 2);
1374
+ b->stack_size += attr_sp_inc_swap();
1375
+ }
1376
+ fprintf(f, "}\n");
1377
+ break;
1378
+ case BIN(reverse):
1379
+ fprintf(f, "{\n");
1380
+ {
1381
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1382
+ MAYBE_UNUSED(rb_num_t n) = (rb_num_t)operands[0];
1383
+ if (status->local_stack_p) {
1384
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1385
+ }
1386
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) n;\n");
1387
+
1388
+ fprintf(f, " n = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1389
+ fprintf(f, "\n");
1390
+ if (body->catch_except_p || FALSE) {
1391
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1392
+ pc_moved_p = TRUE;
1393
+ }
1394
+ if (status->local_stack_p) {
1395
+ }
1396
+ else {
1397
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1398
+ }
1399
+ fprintf(f, " {\n");
1400
+ fprintf(f, " rb_num_t i;\n");
1401
+ fprintf(f, " VALUE *sp = %s;\n",
1402
+ (status->local_stack_p ? "stack + (stack_size - (n))" : "STACK_ADDR_FROM_TOP(n)"));
1403
+ fprintf(f, "\n");
1404
+ fprintf(f, " for (i=0; i<n/2; i++) {\n");
1405
+ fprintf(f, " VALUE v0 = sp[i];\n");
1406
+ fprintf(f, " VALUE v1 = %s;\n",
1407
+ (status->local_stack_p ? "*(stack + (stack_size - (i) - 1))" : "TOPN(i)"));
1408
+ fprintf(f, " sp[i] = v1;\n");
1409
+ fprintf(f, " %s = v0;\n",
1410
+ (status->local_stack_p ? "*(stack + (stack_size - (i) - 1))" : "TOPN(i)"));
1411
+ fprintf(f, " }\n");
1412
+ fprintf(f, " }\n");
1413
+ b->stack_size += attr_sp_inc_reverse(n);
1414
+ }
1415
+ fprintf(f, "}\n");
1416
+ break;
1417
+ case BIN(reput):
1418
+ fprintf(f, "{\n");
1419
+ {
1420
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1421
+ if (status->local_stack_p) {
1422
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1423
+ }
1424
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1425
+
1426
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
1427
+ if (body->catch_except_p || FALSE) {
1428
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1429
+ pc_moved_p = TRUE;
1430
+ }
1431
+ if (status->local_stack_p) {
1432
+ }
1433
+ else {
1434
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1435
+ }
1436
+ fprintf(f, " {\n");
1437
+ fprintf(f, " /* none */\n");
1438
+ fprintf(f, " }\n");
1439
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_reput() - 1);
1440
+ b->stack_size += attr_sp_inc_reput();
1441
+ }
1442
+ fprintf(f, "}\n");
1443
+ break;
1444
+ case BIN(topn):
1445
+ fprintf(f, "{\n");
1446
+ {
1447
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1448
+ MAYBE_UNUSED(rb_num_t n) = (rb_num_t)operands[0];
1449
+ if (status->local_stack_p) {
1450
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1451
+ }
1452
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1453
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) n;\n");
1454
+
1455
+ fprintf(f, " n = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1456
+ fprintf(f, "\n");
1457
+ if (body->catch_except_p || FALSE) {
1458
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1459
+ pc_moved_p = TRUE;
1460
+ }
1461
+ if (status->local_stack_p) {
1462
+ }
1463
+ else {
1464
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1465
+ }
1466
+ fprintf(f, " {\n");
1467
+ fprintf(f, " val = %s;\n",
1468
+ (status->local_stack_p ? "*(stack + (stack_size - (n) - 1))" : "TOPN(n)"));
1469
+ fprintf(f, " }\n");
1470
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_topn(n) - 1);
1471
+ b->stack_size += attr_sp_inc_topn(n);
1472
+ }
1473
+ fprintf(f, "}\n");
1474
+ break;
1475
+ case BIN(setn):
1476
+ fprintf(f, "{\n");
1477
+ {
1478
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1479
+ MAYBE_UNUSED(rb_num_t n) = (rb_num_t)operands[0];
1480
+ if (status->local_stack_p) {
1481
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1482
+ }
1483
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1484
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) n;\n");
1485
+
1486
+ fprintf(f, " n = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1487
+ fprintf(f, "\n");
1488
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
1489
+ if (body->catch_except_p || FALSE) {
1490
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1491
+ pc_moved_p = TRUE;
1492
+ }
1493
+ if (status->local_stack_p) {
1494
+ }
1495
+ else {
1496
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1497
+ }
1498
+ fprintf(f, " {\n");
1499
+ fprintf(f, " %s = val;\n",
1500
+ (status->local_stack_p ? "*(stack + (stack_size - (n) - 1))" : "TOPN(n)"));
1501
+ fprintf(f, " }\n");
1502
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_setn(n) - 1);
1503
+ b->stack_size += attr_sp_inc_setn(n);
1504
+ }
1505
+ fprintf(f, "}\n");
1506
+ break;
1507
+ case BIN(adjuststack):
1508
+ fprintf(f, "{\n");
1509
+ {
1510
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1511
+ MAYBE_UNUSED(rb_num_t n) = (rb_num_t)operands[0];
1512
+ if (status->local_stack_p) {
1513
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1514
+ }
1515
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) n;\n");
1516
+
1517
+ fprintf(f, " n = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1518
+ fprintf(f, "\n");
1519
+ if (body->catch_except_p || FALSE) {
1520
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1521
+ pc_moved_p = TRUE;
1522
+ }
1523
+ if (status->local_stack_p) {
1524
+ }
1525
+ else {
1526
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1527
+ }
1528
+ fprintf(f, " {\n");
1529
+ fprintf(f, " /* none */\n");
1530
+ fprintf(f, " }\n");
1531
+ b->stack_size += attr_sp_inc_adjuststack(n);
1532
+ }
1533
+ fprintf(f, "}\n");
1534
+ break;
1535
+ case BIN(defined):
1536
+ fprintf(f, "{\n");
1537
+ {
1538
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1539
+ MAYBE_UNUSED(rb_num_t op_type) = (rb_num_t)operands[0];
1540
+ MAYBE_UNUSED(VALUE obj) = (VALUE)operands[1];
1541
+ MAYBE_UNUSED(VALUE needstr) = (VALUE)operands[2];
1542
+ if (status->local_stack_p) {
1543
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1544
+ }
1545
+ fprintf(f, " MAYBE_UNUSED(VALUE) needstr, obj, v, val;\n");
1546
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) op_type;\n");
1547
+
1548
+ fprintf(f, " op_type = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1549
+ fprintf(f, "\n");
1550
+ fprintf(f, " obj = (VALUE)0x%"PRIxVALUE";", operands[1]);
1551
+ if (SYMBOL_P((VALUE)operands[1])) comment_id(f, SYM2ID((VALUE)operands[1]));
1552
+ fprintf(f, "\n");
1553
+ fprintf(f, " needstr = (VALUE)0x%"PRIxVALUE";", operands[2]);
1554
+ if (SYMBOL_P((VALUE)operands[2])) comment_id(f, SYM2ID((VALUE)operands[2]));
1555
+ fprintf(f, "\n");
1556
+ fprintf(f, " v = stack[%d];\n", b->stack_size - 1);
1557
+ if (body->catch_except_p || TRUE) {
1558
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1559
+ pc_moved_p = TRUE;
1560
+ }
1561
+ if (status->local_stack_p) {
1562
+ }
1563
+ else {
1564
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1565
+ }
1566
+ fprintf(f, " {\n");
1567
+ fprintf(f, " val = vm_defined(ec, GET_CFP(), op_type, obj, needstr, v);\n");
1568
+ fprintf(f, " }\n");
1569
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_defined(op_type, obj, needstr) - 1);
1570
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1571
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_defined(op_type, obj, needstr) + 1);
1572
+ if (!pc_moved_p) {
1573
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1574
+ }
1575
+ fprintf(f, " goto cancel;\n");
1576
+ fprintf(f, " }\n");
1577
+ b->stack_size += attr_sp_inc_defined(op_type, obj, needstr);
1578
+ }
1579
+ fprintf(f, "}\n");
1580
+ break;
1581
+ case BIN(checkmatch):
1582
+ fprintf(f, "{\n");
1583
+ {
1584
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1585
+ MAYBE_UNUSED(rb_num_t flag) = (rb_num_t)operands[0];
1586
+ if (status->local_stack_p) {
1587
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1588
+ }
1589
+ fprintf(f, " MAYBE_UNUSED(VALUE) pattern, result, target;\n");
1590
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) flag;\n");
1591
+
1592
+ fprintf(f, " flag = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1593
+ fprintf(f, "\n");
1594
+ fprintf(f, " target = stack[%d];\n", b->stack_size - 2);
1595
+ fprintf(f, " pattern = stack[%d];\n", b->stack_size - 1);
1596
+ if (body->catch_except_p || TRUE) {
1597
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1598
+ pc_moved_p = TRUE;
1599
+ }
1600
+ if (status->local_stack_p) {
1601
+ }
1602
+ else {
1603
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1604
+ }
1605
+ fprintf(f, " {\n");
1606
+ fprintf(f, " result = vm_check_match(ec, target, pattern, flag);\n");
1607
+ fprintf(f, " }\n");
1608
+ fprintf(f, " stack[%d] = result;\n", b->stack_size + (int)attr_sp_inc_checkmatch(flag) - 1);
1609
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1610
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_checkmatch(flag) + 1);
1611
+ if (!pc_moved_p) {
1612
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1613
+ }
1614
+ fprintf(f, " goto cancel;\n");
1615
+ fprintf(f, " }\n");
1616
+ b->stack_size += attr_sp_inc_checkmatch(flag);
1617
+ }
1618
+ fprintf(f, "}\n");
1619
+ break;
1620
+ case BIN(checkkeyword):
1621
+ fprintf(f, "{\n");
1622
+ {
1623
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1624
+ MAYBE_UNUSED(lindex_t kw_bits_index) = (lindex_t)operands[0];
1625
+ MAYBE_UNUSED(lindex_t keyword_index) = (lindex_t)operands[1];
1626
+ if (status->local_stack_p) {
1627
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1628
+ }
1629
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret;\n");
1630
+ fprintf(f, " MAYBE_UNUSED(lindex_t) keyword_index, kw_bits_index;\n");
1631
+
1632
+ fprintf(f, " kw_bits_index = (lindex_t)0x%"PRIxVALUE";", operands[0]);
1633
+ fprintf(f, "\n");
1634
+ fprintf(f, " keyword_index = (lindex_t)0x%"PRIxVALUE";", operands[1]);
1635
+ fprintf(f, "\n");
1636
+ if (body->catch_except_p || FALSE) {
1637
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1638
+ pc_moved_p = TRUE;
1639
+ }
1640
+ if (status->local_stack_p) {
1641
+ }
1642
+ else {
1643
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1644
+ }
1645
+ fprintf(f, " {\n");
1646
+ fprintf(f, " ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());\n");
1647
+ fprintf(f, " }\n");
1648
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_checkkeyword(kw_bits_index, keyword_index) - 1);
1649
+ b->stack_size += attr_sp_inc_checkkeyword(kw_bits_index, keyword_index);
1650
+ }
1651
+ fprintf(f, "}\n");
1652
+ break;
1653
+ case BIN(checktype):
1654
+ fprintf(f, "{\n");
1655
+ {
1656
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1657
+ MAYBE_UNUSED(rb_num_t type) = (rb_num_t)operands[0];
1658
+ if (status->local_stack_p) {
1659
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1660
+ }
1661
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret, val;\n");
1662
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) type;\n");
1663
+
1664
+ fprintf(f, " type = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
1665
+ fprintf(f, "\n");
1666
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
1667
+ if (body->catch_except_p || FALSE) {
1668
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1669
+ pc_moved_p = TRUE;
1670
+ }
1671
+ if (status->local_stack_p) {
1672
+ }
1673
+ else {
1674
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1675
+ }
1676
+ fprintf(f, " {\n");
1677
+ fprintf(f, " ret = (TYPE(val) == (int)type) ? Qtrue : Qfalse;\n");
1678
+ fprintf(f, " }\n");
1679
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_checktype(type) - 1);
1680
+ b->stack_size += attr_sp_inc_checktype(type);
1681
+ }
1682
+ fprintf(f, "}\n");
1683
+ break;
1684
+ case BIN(send):
1685
+ {
1686
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1687
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
1688
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
1689
+ MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[2];
1690
+ CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
1691
+ if (has_valid_method_type(cc_copy)) {
1692
+ const rb_iseq_t *iseq;
1693
+ unsigned int argc = ci->orig_argc; /* unlike `ci->orig_argc`, `argc` may include blockarg */
1694
+ argc += ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0);
1695
+
1696
+ if (!(ci->flag & VM_CALL_TAILCALL) && /* inlining non-tailcall path */
1697
+ cc_copy->me->def->type == VM_METHOD_TYPE_ISEQ && inlinable_iseq_p(ci, cc_copy, iseq = def_iseq_ptr(cc_copy->me->def)) /* CC_SET_FASTPATH in vm_callee_setup_arg */) {
1698
+ int param_size = iseq->body->param.size; /* TODO: check calling->argc for argument_arity_error */
1699
+
1700
+ fprintf(f, "{\n");
1701
+ if (status->local_stack_p) {
1702
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1703
+ }
1704
+
1705
+ fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
1706
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
1707
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
1708
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1709
+ fprintf(f, " goto cancel;\n");
1710
+ fprintf(f, " }\n");
1711
+
1712
+ if (body->catch_except_p || TRUE) {
1713
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1714
+ pc_moved_p = TRUE;
1715
+ }
1716
+ if (status->local_stack_p) {
1717
+ {
1718
+ rb_snum_t i, push_size;
1719
+ push_size = -attr_sp_inc_send(ci, cc, blockiseq) + 1 - 0;
1720
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
1721
+ for (i = 0; i < push_size; i++) {
1722
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
1723
+ }
1724
+ }
1725
+ }
1726
+ else {
1727
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
1728
+ }
1729
+
1730
+ fprintf(f, " {\n");
1731
+ fprintf(f, " struct rb_calling_info calling;\n");
1732
+ fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", operands[0], operands[2]);
1733
+ fprintf(f, " calling.argc = %d;\n", ci->orig_argc);
1734
+ fprintf(f, " calling.recv = stack[%d];\n", b->stack_size - 1 - argc);
1735
+
1736
+ fprintf(f, " {\n");
1737
+ fprintf(f, " VALUE v;\n");
1738
+ fprintf(f, " vm_call_iseq_setup_normal(ec, reg_cfp, &calling, (const rb_callable_method_entry_t *)0x%"PRIxVALUE", 0, %d, %d);\n",
1739
+ (VALUE)cc_copy->me, param_size, iseq->body->local_table_size); /* rb_simple_iseq_p checks rb_simple_iseq_p, which ensures has_opt == FALSE */
1740
+ if (iseq->body->catch_except_p) {
1741
+ fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n");
1742
+ fprintf(f, " v = vm_exec(ec, TRUE);\n");
1743
+ }
1744
+ else {
1745
+ fprintf(f, " if ((v = mjit_exec(ec)) == Qundef) {\n");
1746
+ fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n"); /* This is vm_call0_body's code after vm_call_iseq_setup */
1747
+ fprintf(f, " v = vm_exec(ec, FALSE);\n");
1748
+ fprintf(f, " }\n");
1749
+ }
1750
+ fprintf(f, " stack[%d] = v;\n", b->stack_size - argc - 1);
1751
+ fprintf(f, " }\n");
1752
+
1753
+ fprintf(f, " }\n");
1754
+
1755
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1756
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_send(ci, cc, blockiseq) + 1);
1757
+ if (!pc_moved_p) {
1758
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1759
+ }
1760
+ fprintf(f, " goto cancel;\n");
1761
+ fprintf(f, " }\n");
1762
+
1763
+ b->stack_size += attr_sp_inc_send(ci, cc, blockiseq);
1764
+
1765
+ fprintf(f, "}\n");
1766
+ break;
1767
+ }
1768
+ }
1769
+ }
1770
+ fprintf(f, "{\n");
1771
+ {
1772
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1773
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
1774
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
1775
+ MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[2];
1776
+ if (status->local_stack_p) {
1777
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1778
+ }
1779
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
1780
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
1781
+ fprintf(f, " MAYBE_UNUSED(ISEQ) blockiseq;\n");
1782
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1783
+
1784
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
1785
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
1786
+ fprintf(f, "\n");
1787
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
1788
+ fprintf(f, "\n");
1789
+ fprintf(f, " blockiseq = (ISEQ)0x%"PRIxVALUE";", operands[2]);
1790
+ fprintf(f, "\n");
1791
+ if (body->catch_except_p || TRUE) {
1792
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1793
+ pc_moved_p = TRUE;
1794
+ }
1795
+ if (status->local_stack_p) {
1796
+ {
1797
+ rb_snum_t i, push_size;
1798
+ push_size = -attr_sp_inc_send(ci, cc, blockiseq) + 1 - 0;
1799
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
1800
+ for (i = 0; i < push_size; i++) {
1801
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
1802
+ }
1803
+ }
1804
+ }
1805
+ else {
1806
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
1807
+ }
1808
+ fprintf(f, " {\n");
1809
+ fprintf(f, " struct rb_calling_info calling;\n");
1810
+ fprintf(f, "\n");
1811
+ fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, ci, blockiseq, FALSE);\n");
1812
+ fprintf(f, " calling.recv = TOPN(calling.argc = ci->orig_argc);\n");
1813
+ fprintf(f, " vm_search_method(ci, cc, calling.recv);\n");
1814
+ fprintf(f, " CALL_METHOD(&calling, ci, cc);\n");
1815
+ fprintf(f, " }\n");
1816
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_send(ci, cc, blockiseq) - 1);
1817
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1818
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_send(ci, cc, blockiseq) + 1);
1819
+ if (!pc_moved_p) {
1820
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1821
+ }
1822
+ fprintf(f, " goto cancel;\n");
1823
+ fprintf(f, " }\n");
1824
+ b->stack_size += attr_sp_inc_send(ci, cc, blockiseq);
1825
+ }
1826
+ fprintf(f, "}\n");
1827
+ break;
1828
+ case BIN(opt_send_without_block):
1829
+ {
1830
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1831
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
1832
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
1833
+ CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
1834
+ if (has_valid_method_type(cc_copy)) {
1835
+ const rb_iseq_t *iseq;
1836
+ unsigned int argc = ci->orig_argc; /* unlike `ci->orig_argc`, `argc` may include blockarg */
1837
+
1838
+ if (!(ci->flag & VM_CALL_TAILCALL) && /* inlining non-tailcall path */
1839
+ cc_copy->me->def->type == VM_METHOD_TYPE_ISEQ && inlinable_iseq_p(ci, cc_copy, iseq = def_iseq_ptr(cc_copy->me->def)) /* CC_SET_FASTPATH in vm_callee_setup_arg */) {
1840
+ int param_size = iseq->body->param.size; /* TODO: check calling->argc for argument_arity_error */
1841
+
1842
+ fprintf(f, "{\n");
1843
+ if (status->local_stack_p) {
1844
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1845
+ }
1846
+
1847
+ fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
1848
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
1849
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
1850
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1851
+ fprintf(f, " goto cancel;\n");
1852
+ fprintf(f, " }\n");
1853
+
1854
+ if (body->catch_except_p || TRUE) {
1855
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1856
+ pc_moved_p = TRUE;
1857
+ }
1858
+ if (status->local_stack_p) {
1859
+ {
1860
+ rb_snum_t i, push_size;
1861
+ push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
1862
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
1863
+ for (i = 0; i < push_size; i++) {
1864
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
1865
+ }
1866
+ }
1867
+ }
1868
+ else {
1869
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
1870
+ }
1871
+
1872
+ fprintf(f, " {\n");
1873
+ fprintf(f, " struct rb_calling_info calling;\n");
1874
+ fprintf(f, " calling.block_handler = VM_BLOCK_HANDLER_NONE;\n");
1875
+ fprintf(f, " calling.argc = %d;\n", ci->orig_argc);
1876
+ fprintf(f, " calling.recv = stack[%d];\n", b->stack_size - 1 - argc);
1877
+
1878
+ fprintf(f, " {\n");
1879
+ fprintf(f, " VALUE v;\n");
1880
+ fprintf(f, " vm_call_iseq_setup_normal(ec, reg_cfp, &calling, (const rb_callable_method_entry_t *)0x%"PRIxVALUE", 0, %d, %d);\n",
1881
+ (VALUE)cc_copy->me, param_size, iseq->body->local_table_size); /* rb_simple_iseq_p checks rb_simple_iseq_p, which ensures has_opt == FALSE */
1882
+ if (iseq->body->catch_except_p) {
1883
+ fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n");
1884
+ fprintf(f, " v = vm_exec(ec, TRUE);\n");
1885
+ }
1886
+ else {
1887
+ fprintf(f, " if ((v = mjit_exec(ec)) == Qundef) {\n");
1888
+ fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n"); /* This is vm_call0_body's code after vm_call_iseq_setup */
1889
+ fprintf(f, " v = vm_exec(ec, FALSE);\n");
1890
+ fprintf(f, " }\n");
1891
+ }
1892
+ fprintf(f, " stack[%d] = v;\n", b->stack_size - argc - 1);
1893
+ fprintf(f, " }\n");
1894
+
1895
+ fprintf(f, " }\n");
1896
+
1897
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1898
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) + 1);
1899
+ if (!pc_moved_p) {
1900
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1901
+ }
1902
+ fprintf(f, " goto cancel;\n");
1903
+ fprintf(f, " }\n");
1904
+
1905
+ b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
1906
+
1907
+ fprintf(f, "}\n");
1908
+ break;
1909
+ }
1910
+ }
1911
+ }
1912
+ fprintf(f, "{\n");
1913
+ {
1914
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1915
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
1916
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
1917
+ if (status->local_stack_p) {
1918
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1919
+ }
1920
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
1921
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
1922
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
1923
+
1924
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
1925
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
1926
+ fprintf(f, "\n");
1927
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
1928
+ fprintf(f, "\n");
1929
+ if (body->catch_except_p || TRUE) {
1930
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1931
+ pc_moved_p = TRUE;
1932
+ }
1933
+ if (status->local_stack_p) {
1934
+ {
1935
+ rb_snum_t i, push_size;
1936
+ push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
1937
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
1938
+ for (i = 0; i < push_size; i++) {
1939
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
1940
+ }
1941
+ }
1942
+ }
1943
+ else {
1944
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
1945
+ }
1946
+ fprintf(f, " {\n");
1947
+ fprintf(f, " struct rb_calling_info calling;\n");
1948
+ fprintf(f, " calling.block_handler = VM_BLOCK_HANDLER_NONE;\n");
1949
+ fprintf(f, " vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));\n");
1950
+ fprintf(f, " CALL_METHOD(&calling, ci, cc);\n");
1951
+ fprintf(f, " }\n");
1952
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
1953
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
1954
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) + 1);
1955
+ if (!pc_moved_p) {
1956
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
1957
+ }
1958
+ fprintf(f, " goto cancel;\n");
1959
+ fprintf(f, " }\n");
1960
+ b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
1961
+ }
1962
+ fprintf(f, "}\n");
1963
+ break;
1964
+ case BIN(opt_str_freeze):
1965
+ fprintf(f, "{\n");
1966
+ {
1967
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
1968
+ MAYBE_UNUSED(VALUE str) = (VALUE)operands[0];
1969
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
1970
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
1971
+ if (status->local_stack_p) {
1972
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1973
+ }
1974
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
1975
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
1976
+ fprintf(f, " MAYBE_UNUSED(VALUE) str, val;\n");
1977
+
1978
+ fprintf(f, " str = (VALUE)0x%"PRIxVALUE";", operands[0]);
1979
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
1980
+ fprintf(f, "\n");
1981
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
1982
+ comment_id(f, ((CALL_INFO)operands[1])->mid);
1983
+ fprintf(f, "\n");
1984
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
1985
+ fprintf(f, "\n");
1986
+ if (body->catch_except_p || FALSE) {
1987
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1988
+ pc_moved_p = TRUE;
1989
+ }
1990
+ if (status->local_stack_p) {
1991
+ }
1992
+ else {
1993
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
1994
+ }
1995
+ fprintf(f, " {\n");
1996
+ fprintf(f, " val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze);\n");
1997
+ fprintf(f, "\n");
1998
+ fprintf(f, " if (val == Qundef) {\n");
1999
+ fprintf(f, " PUSH(rb_str_resurrect(str));\n");
2000
+ if (status->local_stack_p) {
2001
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2002
+ }
2003
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2004
+ fprintf(f, " goto cancel;\n");
2005
+ fprintf(f, " }\n");
2006
+ fprintf(f, " }\n");
2007
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_str_freeze(str, ci, cc) - 1);
2008
+ b->stack_size += attr_sp_inc_opt_str_freeze(str, ci, cc);
2009
+ }
2010
+ fprintf(f, "}\n");
2011
+ break;
2012
+ case BIN(opt_str_uminus):
2013
+ fprintf(f, "{\n");
2014
+ {
2015
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2016
+ MAYBE_UNUSED(VALUE str) = (VALUE)operands[0];
2017
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
2018
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
2019
+ if (status->local_stack_p) {
2020
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2021
+ }
2022
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2023
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2024
+ fprintf(f, " MAYBE_UNUSED(VALUE) str, val;\n");
2025
+
2026
+ fprintf(f, " str = (VALUE)0x%"PRIxVALUE";", operands[0]);
2027
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
2028
+ fprintf(f, "\n");
2029
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
2030
+ comment_id(f, ((CALL_INFO)operands[1])->mid);
2031
+ fprintf(f, "\n");
2032
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
2033
+ fprintf(f, "\n");
2034
+ if (body->catch_except_p || FALSE) {
2035
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2036
+ pc_moved_p = TRUE;
2037
+ }
2038
+ if (status->local_stack_p) {
2039
+ }
2040
+ else {
2041
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2042
+ }
2043
+ fprintf(f, " {\n");
2044
+ fprintf(f, " val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus);\n");
2045
+ fprintf(f, "\n");
2046
+ fprintf(f, " if (val == Qundef) {\n");
2047
+ fprintf(f, " PUSH(rb_str_resurrect(str));\n");
2048
+ if (status->local_stack_p) {
2049
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2050
+ }
2051
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2052
+ fprintf(f, " goto cancel;\n");
2053
+ fprintf(f, " }\n");
2054
+ fprintf(f, " }\n");
2055
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_str_uminus(str, ci, cc) - 1);
2056
+ b->stack_size += attr_sp_inc_opt_str_uminus(str, ci, cc);
2057
+ }
2058
+ fprintf(f, "}\n");
2059
+ break;
2060
+ case BIN(opt_newarray_max):
2061
+ fprintf(f, "{\n");
2062
+ {
2063
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2064
+ MAYBE_UNUSED(rb_num_t num) = (rb_num_t)operands[0];
2065
+ if (status->local_stack_p) {
2066
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2067
+ }
2068
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2069
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) num;\n");
2070
+
2071
+ fprintf(f, " num = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
2072
+ fprintf(f, "\n");
2073
+ if (body->catch_except_p || TRUE) {
2074
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2075
+ pc_moved_p = TRUE;
2076
+ }
2077
+ if (status->local_stack_p) {
2078
+ }
2079
+ else {
2080
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2081
+ }
2082
+ fprintf(f, " {\n");
2083
+ fprintf(f, " val = vm_opt_newarray_max(num, %s);\n",
2084
+ (status->local_stack_p ? "stack + (stack_size - (num))" : "STACK_ADDR_FROM_TOP(num)"));
2085
+ fprintf(f, " }\n");
2086
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_newarray_max(num) - 1);
2087
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2088
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_newarray_max(num) + 1);
2089
+ if (!pc_moved_p) {
2090
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2091
+ }
2092
+ fprintf(f, " goto cancel;\n");
2093
+ fprintf(f, " }\n");
2094
+ b->stack_size += attr_sp_inc_opt_newarray_max(num);
2095
+ }
2096
+ fprintf(f, "}\n");
2097
+ break;
2098
+ case BIN(opt_newarray_min):
2099
+ fprintf(f, "{\n");
2100
+ {
2101
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2102
+ MAYBE_UNUSED(rb_num_t num) = (rb_num_t)operands[0];
2103
+ if (status->local_stack_p) {
2104
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2105
+ }
2106
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2107
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) num;\n");
2108
+
2109
+ fprintf(f, " num = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
2110
+ fprintf(f, "\n");
2111
+ if (body->catch_except_p || TRUE) {
2112
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2113
+ pc_moved_p = TRUE;
2114
+ }
2115
+ if (status->local_stack_p) {
2116
+ }
2117
+ else {
2118
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2119
+ }
2120
+ fprintf(f, " {\n");
2121
+ fprintf(f, " val = vm_opt_newarray_min(num, %s);\n",
2122
+ (status->local_stack_p ? "stack + (stack_size - (num))" : "STACK_ADDR_FROM_TOP(num)"));
2123
+ fprintf(f, " }\n");
2124
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_newarray_min(num) - 1);
2125
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2126
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_newarray_min(num) + 1);
2127
+ if (!pc_moved_p) {
2128
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2129
+ }
2130
+ fprintf(f, " goto cancel;\n");
2131
+ fprintf(f, " }\n");
2132
+ b->stack_size += attr_sp_inc_opt_newarray_min(num);
2133
+ }
2134
+ fprintf(f, "}\n");
2135
+ break;
2136
+ case BIN(invokesuper):
2137
+ fprintf(f, "{\n");
2138
+ {
2139
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2140
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2141
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2142
+ MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[2];
2143
+ if (status->local_stack_p) {
2144
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2145
+ }
2146
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2147
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2148
+ fprintf(f, " MAYBE_UNUSED(ISEQ) blockiseq;\n");
2149
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2150
+
2151
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2152
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2153
+ fprintf(f, "\n");
2154
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2155
+ fprintf(f, "\n");
2156
+ fprintf(f, " blockiseq = (ISEQ)0x%"PRIxVALUE";", operands[2]);
2157
+ fprintf(f, "\n");
2158
+ if (body->catch_except_p || TRUE) {
2159
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2160
+ pc_moved_p = TRUE;
2161
+ }
2162
+ if (status->local_stack_p) {
2163
+ {
2164
+ rb_snum_t i, push_size;
2165
+ push_size = -attr_sp_inc_invokesuper(ci, cc, blockiseq) + 1 - 0;
2166
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2167
+ for (i = 0; i < push_size; i++) {
2168
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
2169
+ }
2170
+ }
2171
+ }
2172
+ else {
2173
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
2174
+ }
2175
+ fprintf(f, " {\n");
2176
+ fprintf(f, " struct rb_calling_info calling;\n");
2177
+ fprintf(f, "\n");
2178
+ fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, ci, blockiseq, TRUE);\n");
2179
+ fprintf(f, " calling.recv = TOPN(calling.argc = ci->orig_argc);\n");
2180
+ fprintf(f, " vm_search_super_method(ec, GET_CFP(), &calling, ci, cc);\n");
2181
+ fprintf(f, " CALL_METHOD(&calling, ci, cc);\n");
2182
+ fprintf(f, " }\n");
2183
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_invokesuper(ci, cc, blockiseq) - 1);
2184
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2185
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_invokesuper(ci, cc, blockiseq) + 1);
2186
+ if (!pc_moved_p) {
2187
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2188
+ }
2189
+ fprintf(f, " goto cancel;\n");
2190
+ fprintf(f, " }\n");
2191
+ b->stack_size += attr_sp_inc_invokesuper(ci, cc, blockiseq);
2192
+ }
2193
+ fprintf(f, "}\n");
2194
+ break;
2195
+ case BIN(invokeblock):
2196
+ fprintf(f, "{\n");
2197
+ {
2198
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2199
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2200
+ if (status->local_stack_p) {
2201
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2202
+ }
2203
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2204
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2205
+
2206
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2207
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2208
+ fprintf(f, "\n");
2209
+ if (body->catch_except_p || TRUE) {
2210
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2211
+ pc_moved_p = TRUE;
2212
+ }
2213
+ if (status->local_stack_p) {
2214
+ {
2215
+ rb_snum_t i, push_size;
2216
+ push_size = -attr_sp_inc_invokeblock(ci) + 1 - 0;
2217
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2218
+ for (i = 0; i < push_size; i++) {
2219
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
2220
+ }
2221
+ }
2222
+ }
2223
+ else {
2224
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
2225
+ }
2226
+ fprintf(f, " {\n");
2227
+ fprintf(f, " struct rb_calling_info calling;\n");
2228
+ fprintf(f, " VALUE block_handler;\n");
2229
+ fprintf(f, "\n");
2230
+ fprintf(f, " calling.argc = ci->orig_argc;\n");
2231
+ fprintf(f, " calling.block_handler = VM_BLOCK_HANDLER_NONE;\n");
2232
+ fprintf(f, " calling.recv = Qundef; /* should not be used */\n");
2233
+ fprintf(f, "\n");
2234
+ fprintf(f, " block_handler = VM_CF_BLOCK_HANDLER(GET_CFP());\n");
2235
+ fprintf(f, " if (block_handler == VM_BLOCK_HANDLER_NONE) {\n");
2236
+ fprintf(f, " rb_vm_localjump_error(\"no block given (yield)\", Qnil, 0);\n");
2237
+ fprintf(f, " }\n");
2238
+ fprintf(f, "\n");
2239
+ fprintf(f, " val = vm_invoke_block(ec, GET_CFP(), &calling, ci, block_handler);\n");
2240
+ fprintf(f, " if (val == Qundef) {\n");
2241
+ fprintf(f, " EXEC_EC_CFP(val);\n");
2242
+ fprintf(f, " }\n");
2243
+ fprintf(f, " }\n");
2244
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_invokeblock(ci) - 1);
2245
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2246
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_invokeblock(ci) + 1);
2247
+ if (!pc_moved_p) {
2248
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2249
+ }
2250
+ fprintf(f, " goto cancel;\n");
2251
+ fprintf(f, " }\n");
2252
+ b->stack_size += attr_sp_inc_invokeblock(ci);
2253
+ }
2254
+ fprintf(f, "}\n");
2255
+ break;
2256
+ case BIN(leave):
2257
+ if (b->stack_size != 1) {
2258
+ if (mjit_opts.warnings || mjit_opts.verbose)
2259
+ fprintf(stderr, "MJIT warning: Unexpected JIT stack_size on leave: %d\n", b->stack_size);
2260
+ status->success = FALSE;
2261
+ }
2262
+ fprintf(f, "{\n");
2263
+ {
2264
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2265
+ if (status->local_stack_p) {
2266
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2267
+ }
2268
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2269
+
2270
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
2271
+ if (body->catch_except_p || TRUE) {
2272
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2273
+ pc_moved_p = TRUE;
2274
+ }
2275
+ if (status->local_stack_p) {
2276
+ {
2277
+ rb_snum_t i, push_size;
2278
+ push_size = -attr_sp_inc_leave() + 1 - 1;
2279
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2280
+ for (i = 0; i < push_size; i++) {
2281
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
2282
+ }
2283
+ }
2284
+ }
2285
+ else {
2286
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 1); /* POPN(INSN_ATTR(popn)); */
2287
+ }
2288
+ fprintf(f, " {\n");
2289
+ fprintf(f, " if (OPT_CHECKED_RUN) {\n");
2290
+ fprintf(f, " const VALUE *const bp = vm_base_ptr(reg_cfp);\n");
2291
+ fprintf(f, " if (reg_cfp->sp != bp) {\n");
2292
+ fprintf(f, " vm_stack_consistency_error(ec, reg_cfp, bp);\n");
2293
+ fprintf(f, " }\n");
2294
+ fprintf(f, " }\n");
2295
+ fprintf(f, "\n");
2296
+ fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2297
+ fprintf(f, "\n");
2298
+ fprintf(f, " if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {\n");
2299
+ fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
2300
+ fprintf(f, " rb_ec_thread_ptr(ec)->retval = val;\n");
2301
+ fprintf(f, " return 0;\n");
2302
+ fprintf(f, "#else\n");
2303
+ fprintf(f, " return val;\n");
2304
+ fprintf(f, "#endif\n");
2305
+ fprintf(f, " }\n");
2306
+ fprintf(f, " else {\n");
2307
+ fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
2308
+ fprintf(f, " rb_ec_thread_ptr(ec)->retval = val;\n");
2309
+ fprintf(f, " return 0;\n");
2310
+ fprintf(f, "#else\n");
2311
+ fprintf(f, " return val;\n");
2312
+ fprintf(f, "#endif\n");
2313
+ fprintf(f, " }\n");
2314
+ fprintf(f, " }\n");
2315
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_leave() - 1);
2316
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2317
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_leave() + 1);
2318
+ if (!pc_moved_p) {
2319
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2320
+ }
2321
+ fprintf(f, " goto cancel;\n");
2322
+ fprintf(f, " }\n");
2323
+ b->stack_size += attr_sp_inc_leave();
2324
+ }
2325
+ fprintf(f, "}\n");
2326
+ b->finish_p = TRUE;
2327
+ break;
2328
+ case BIN(throw):
2329
+ fprintf(f, "{\n");
2330
+ {
2331
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2332
+ MAYBE_UNUSED(rb_num_t throw_state) = (rb_num_t)operands[0];
2333
+ if (status->local_stack_p) {
2334
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2335
+ }
2336
+ fprintf(f, " MAYBE_UNUSED(VALUE) throwobj, val;\n");
2337
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) throw_state;\n");
2338
+
2339
+ fprintf(f, " throw_state = (rb_num_t)0x%"PRIxVALUE";", operands[0]);
2340
+ fprintf(f, "\n");
2341
+ fprintf(f, " throwobj = stack[%d];\n", b->stack_size - 1);
2342
+ if (body->catch_except_p || TRUE) {
2343
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2344
+ pc_moved_p = TRUE;
2345
+ }
2346
+ if (status->local_stack_p) {
2347
+ }
2348
+ else {
2349
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2350
+ }
2351
+ fprintf(f, " {\n");
2352
+ fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2353
+ fprintf(f, " val = vm_throw(ec, GET_CFP(), throw_state, throwobj);\n");
2354
+ fprintf(f, " THROW_EXCEPTION(val);\n");
2355
+ fprintf(f, " /* unreachable */\n");
2356
+ fprintf(f, " }\n");
2357
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_throw(throw_state) - 1);
2358
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2359
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_throw(throw_state) + 1);
2360
+ if (!pc_moved_p) {
2361
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2362
+ }
2363
+ fprintf(f, " goto cancel;\n");
2364
+ fprintf(f, " }\n");
2365
+ b->stack_size += attr_sp_inc_throw(throw_state);
2366
+ }
2367
+ fprintf(f, "}\n");
2368
+ b->finish_p = TRUE;
2369
+ break;
2370
+ case BIN(jump):
2371
+ fprintf(f, "{\n");
2372
+ {
2373
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2374
+ MAYBE_UNUSED(OFFSET dst) = (OFFSET)operands[0];
2375
+ if (status->local_stack_p) {
2376
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2377
+ }
2378
+ fprintf(f, " MAYBE_UNUSED(OFFSET) dst;\n");
2379
+
2380
+ fprintf(f, " dst = (OFFSET)0x%"PRIxVALUE";", operands[0]);
2381
+ fprintf(f, "\n");
2382
+ if (body->catch_except_p || TRUE) {
2383
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2384
+ pc_moved_p = TRUE;
2385
+ }
2386
+ if (status->local_stack_p) {
2387
+ }
2388
+ else {
2389
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2390
+ }
2391
+ fprintf(f, " {\n");
2392
+ fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2393
+ next_pos = pos + insn_len(insn) + (unsigned int)dst;
2394
+ fprintf(f, " goto label_%d;\n", next_pos);
2395
+ fprintf(f, " }\n");
2396
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2397
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_jump(dst) + 1);
2398
+ if (!pc_moved_p) {
2399
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2400
+ }
2401
+ fprintf(f, " goto cancel;\n");
2402
+ fprintf(f, " }\n");
2403
+ b->stack_size += attr_sp_inc_jump(dst);
2404
+ }
2405
+ fprintf(f, "}\n");
2406
+ break;
2407
+ case BIN(branchif):
2408
+ fprintf(f, "{\n");
2409
+ {
2410
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2411
+ MAYBE_UNUSED(OFFSET dst) = (OFFSET)operands[0];
2412
+ if (status->local_stack_p) {
2413
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2414
+ }
2415
+ fprintf(f, " MAYBE_UNUSED(OFFSET) dst;\n");
2416
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2417
+
2418
+ fprintf(f, " dst = (OFFSET)0x%"PRIxVALUE";", operands[0]);
2419
+ fprintf(f, "\n");
2420
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
2421
+ if (body->catch_except_p || TRUE) {
2422
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2423
+ pc_moved_p = TRUE;
2424
+ }
2425
+ if (status->local_stack_p) {
2426
+ }
2427
+ else {
2428
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2429
+ }
2430
+ fprintf(f, " {\n");
2431
+ fprintf(f, " if (RTEST(val)) {\n");
2432
+ fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2433
+ next_pos = pos + insn_len(insn) + (unsigned int)dst;
2434
+ fprintf(f, " goto label_%d;\n", next_pos);
2435
+ fprintf(f, " }\n");
2436
+ fprintf(f, " }\n");
2437
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2438
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_branchif(dst) + 1);
2439
+ if (!pc_moved_p) {
2440
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2441
+ }
2442
+ fprintf(f, " goto cancel;\n");
2443
+ fprintf(f, " }\n");
2444
+ b->stack_size += attr_sp_inc_branchif(dst);
2445
+ }
2446
+ fprintf(f, "}\n");
2447
+ compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
2448
+ break;
2449
+ case BIN(branchunless):
2450
+ fprintf(f, "{\n");
2451
+ {
2452
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2453
+ MAYBE_UNUSED(OFFSET dst) = (OFFSET)operands[0];
2454
+ if (status->local_stack_p) {
2455
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2456
+ }
2457
+ fprintf(f, " MAYBE_UNUSED(OFFSET) dst;\n");
2458
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2459
+
2460
+ fprintf(f, " dst = (OFFSET)0x%"PRIxVALUE";", operands[0]);
2461
+ fprintf(f, "\n");
2462
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
2463
+ if (body->catch_except_p || TRUE) {
2464
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2465
+ pc_moved_p = TRUE;
2466
+ }
2467
+ if (status->local_stack_p) {
2468
+ }
2469
+ else {
2470
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2471
+ }
2472
+ fprintf(f, " {\n");
2473
+ fprintf(f, " if (!RTEST(val)) {\n");
2474
+ fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2475
+ next_pos = pos + insn_len(insn) + (unsigned int)dst;
2476
+ fprintf(f, " goto label_%d;\n", next_pos);
2477
+ fprintf(f, " }\n");
2478
+ fprintf(f, " }\n");
2479
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2480
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_branchunless(dst) + 1);
2481
+ if (!pc_moved_p) {
2482
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2483
+ }
2484
+ fprintf(f, " goto cancel;\n");
2485
+ fprintf(f, " }\n");
2486
+ b->stack_size += attr_sp_inc_branchunless(dst);
2487
+ }
2488
+ fprintf(f, "}\n");
2489
+ compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
2490
+ break;
2491
+ case BIN(branchnil):
2492
+ fprintf(f, "{\n");
2493
+ {
2494
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2495
+ MAYBE_UNUSED(OFFSET dst) = (OFFSET)operands[0];
2496
+ if (status->local_stack_p) {
2497
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2498
+ }
2499
+ fprintf(f, " MAYBE_UNUSED(OFFSET) dst;\n");
2500
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2501
+
2502
+ fprintf(f, " dst = (OFFSET)0x%"PRIxVALUE";", operands[0]);
2503
+ fprintf(f, "\n");
2504
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
2505
+ if (body->catch_except_p || TRUE) {
2506
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2507
+ pc_moved_p = TRUE;
2508
+ }
2509
+ if (status->local_stack_p) {
2510
+ }
2511
+ else {
2512
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2513
+ }
2514
+ fprintf(f, " {\n");
2515
+ fprintf(f, " if (NIL_P(val)) {\n");
2516
+ fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2517
+ next_pos = pos + insn_len(insn) + (unsigned int)dst;
2518
+ fprintf(f, " goto label_%d;\n", next_pos);
2519
+ fprintf(f, " }\n");
2520
+ fprintf(f, " }\n");
2521
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2522
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_branchnil(dst) + 1);
2523
+ if (!pc_moved_p) {
2524
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2525
+ }
2526
+ fprintf(f, " goto cancel;\n");
2527
+ fprintf(f, " }\n");
2528
+ b->stack_size += attr_sp_inc_branchnil(dst);
2529
+ }
2530
+ fprintf(f, "}\n");
2531
+ compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
2532
+ break;
2533
+ case BIN(opt_getinlinecache):
2534
+ fprintf(f, "{\n");
2535
+ {
2536
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2537
+ MAYBE_UNUSED(OFFSET dst) = (OFFSET)operands[0];
2538
+ MAYBE_UNUSED(IC ic) = (IC)operands[1];
2539
+ if (status->local_stack_p) {
2540
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2541
+ }
2542
+ fprintf(f, " MAYBE_UNUSED(IC) ic;\n");
2543
+ fprintf(f, " MAYBE_UNUSED(OFFSET) dst;\n");
2544
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2545
+
2546
+ fprintf(f, " dst = (OFFSET)0x%"PRIxVALUE";", operands[0]);
2547
+ fprintf(f, "\n");
2548
+ fprintf(f, " ic = (IC)0x%"PRIxVALUE";", operands[1]);
2549
+ fprintf(f, "\n");
2550
+ if (body->catch_except_p || FALSE) {
2551
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2552
+ pc_moved_p = TRUE;
2553
+ }
2554
+ if (status->local_stack_p) {
2555
+ }
2556
+ else {
2557
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2558
+ }
2559
+ fprintf(f, " {\n");
2560
+ fprintf(f, " if (vm_ic_hit_p(ic, GET_EP())) {\n");
2561
+ fprintf(f, " val = ic->ic_value.value;\n");
2562
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_getinlinecache(dst, ic) - 1);
2563
+ next_pos = pos + insn_len(insn) + (unsigned int)dst;
2564
+ fprintf(f, " goto label_%d;\n", next_pos);
2565
+ fprintf(f, " }\n");
2566
+ fprintf(f, " else {\n");
2567
+ fprintf(f, " val = Qnil;\n");
2568
+ fprintf(f, " }\n");
2569
+ fprintf(f, " }\n");
2570
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_getinlinecache(dst, ic) - 1);
2571
+ b->stack_size += attr_sp_inc_opt_getinlinecache(dst, ic);
2572
+ }
2573
+ fprintf(f, "}\n");
2574
+ compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
2575
+ break;
2576
+ case BIN(opt_setinlinecache):
2577
+ fprintf(f, "{\n");
2578
+ {
2579
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2580
+ MAYBE_UNUSED(IC ic) = (IC)operands[0];
2581
+ if (status->local_stack_p) {
2582
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2583
+ }
2584
+ fprintf(f, " MAYBE_UNUSED(IC) ic;\n");
2585
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2586
+
2587
+ fprintf(f, " ic = (IC)0x%"PRIxVALUE";", operands[0]);
2588
+ fprintf(f, "\n");
2589
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
2590
+ if (body->catch_except_p || FALSE) {
2591
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2592
+ pc_moved_p = TRUE;
2593
+ }
2594
+ if (status->local_stack_p) {
2595
+ }
2596
+ else {
2597
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2598
+ }
2599
+ fprintf(f, " {\n");
2600
+ fprintf(f, " vm_ic_update(ic, val, GET_EP());\n");
2601
+ fprintf(f, " }\n");
2602
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_setinlinecache(ic) - 1);
2603
+ b->stack_size += attr_sp_inc_opt_setinlinecache(ic);
2604
+ }
2605
+ fprintf(f, "}\n");
2606
+ break;
2607
+ case BIN(once):
2608
+ fprintf(f, "{\n");
2609
+ {
2610
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2611
+ MAYBE_UNUSED(ISEQ iseq) = (ISEQ)operands[0];
2612
+ MAYBE_UNUSED(ISE ise) = (ISE)operands[1];
2613
+ if (status->local_stack_p) {
2614
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2615
+ }
2616
+ fprintf(f, " MAYBE_UNUSED(ISE) ise;\n");
2617
+ fprintf(f, " MAYBE_UNUSED(ISEQ) iseq;\n");
2618
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2619
+
2620
+ fprintf(f, " iseq = (ISEQ)0x%"PRIxVALUE";", operands[0]);
2621
+ fprintf(f, "\n");
2622
+ fprintf(f, " ise = (ISE)0x%"PRIxVALUE";", operands[1]);
2623
+ fprintf(f, "\n");
2624
+ if (body->catch_except_p || TRUE) {
2625
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2626
+ pc_moved_p = TRUE;
2627
+ }
2628
+ if (status->local_stack_p) {
2629
+ {
2630
+ rb_snum_t i, push_size;
2631
+ push_size = -attr_sp_inc_once(iseq, ise) + 1 - 0;
2632
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2633
+ for (i = 0; i < push_size; i++) {
2634
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
2635
+ }
2636
+ }
2637
+ }
2638
+ else {
2639
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
2640
+ }
2641
+ fprintf(f, " {\n");
2642
+ fprintf(f, " val = vm_once_dispatch(ec, iseq, ise);\n");
2643
+ fprintf(f, " }\n");
2644
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_once(iseq, ise) - 1);
2645
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2646
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_once(iseq, ise) + 1);
2647
+ if (!pc_moved_p) {
2648
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2649
+ }
2650
+ fprintf(f, " goto cancel;\n");
2651
+ fprintf(f, " }\n");
2652
+ b->stack_size += attr_sp_inc_once(iseq, ise);
2653
+ }
2654
+ fprintf(f, "}\n");
2655
+ break;
2656
+ case BIN(opt_case_dispatch):
2657
+ fprintf(f, "{\n");
2658
+ {
2659
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2660
+ MAYBE_UNUSED(CDHASH hash) = (CDHASH)operands[0];
2661
+ MAYBE_UNUSED(OFFSET else_offset) = (OFFSET)operands[1];
2662
+ if (status->local_stack_p) {
2663
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2664
+ }
2665
+ fprintf(f, " MAYBE_UNUSED(CDHASH) hash;\n");
2666
+ fprintf(f, " MAYBE_UNUSED(OFFSET) else_offset;\n");
2667
+ fprintf(f, " MAYBE_UNUSED(VALUE) key;\n");
2668
+
2669
+ fprintf(f, " hash = (CDHASH)0x%"PRIxVALUE";", operands[0]);
2670
+ fprintf(f, "\n");
2671
+ fprintf(f, " else_offset = (OFFSET)0x%"PRIxVALUE";", operands[1]);
2672
+ fprintf(f, "\n");
2673
+ fprintf(f, " key = stack[%d];\n", b->stack_size - 1);
2674
+ if (body->catch_except_p || FALSE) {
2675
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2676
+ pc_moved_p = TRUE;
2677
+ }
2678
+ if (status->local_stack_p) {
2679
+ }
2680
+ else {
2681
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2682
+ }
2683
+ fprintf(f, " {\n");
2684
+ fprintf(f, " OFFSET dst = vm_case_dispatch(hash, else_offset, key);\n");
2685
+ fprintf(f, "\n");
2686
+ fprintf(f, " if (dst) {\n");
2687
+ {
2688
+ struct case_dispatch_var arg;
2689
+ arg.f = f;
2690
+ arg.base_pos = pos + insn_len(insn);
2691
+ arg.last_value = Qundef;
2692
+
2693
+ fprintf(f, " switch (dst) {\n");
2694
+ st_foreach(RHASH_TBL_RAW(hash), compile_case_dispatch_each, (VALUE)&arg);
2695
+ fprintf(f, " case %lu:\n", else_offset);
2696
+ fprintf(f, " goto label_%lu;\n", arg.base_pos + else_offset);
2697
+ fprintf(f, " }\n");
2698
+ }
2699
+ fprintf(f, " }\n");
2700
+ fprintf(f, " }\n");
2701
+ b->stack_size += attr_sp_inc_opt_case_dispatch(hash, else_offset);
2702
+ }
2703
+ fprintf(f, "}\n");
2704
+ compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
2705
+ break;
2706
+ case BIN(opt_plus):
2707
+ fprintf(f, "{\n");
2708
+ {
2709
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2710
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2711
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2712
+ if (status->local_stack_p) {
2713
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2714
+ }
2715
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2716
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2717
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
2718
+
2719
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2720
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2721
+ fprintf(f, "\n");
2722
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2723
+ fprintf(f, "\n");
2724
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
2725
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
2726
+ if (body->catch_except_p || TRUE) {
2727
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2728
+ pc_moved_p = TRUE;
2729
+ }
2730
+ if (status->local_stack_p) {
2731
+ }
2732
+ else {
2733
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2734
+ }
2735
+ fprintf(f, " {\n");
2736
+ fprintf(f, " val = vm_opt_plus(recv, obj);\n");
2737
+ fprintf(f, "\n");
2738
+ fprintf(f, " if (val == Qundef) {\n");
2739
+ if (status->local_stack_p) {
2740
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2741
+ }
2742
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2743
+ fprintf(f, " goto cancel;\n");
2744
+ fprintf(f, " }\n");
2745
+ fprintf(f, " }\n");
2746
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_plus(ci, cc) - 1);
2747
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2748
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_plus(ci, cc) + 1);
2749
+ if (!pc_moved_p) {
2750
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2751
+ }
2752
+ fprintf(f, " goto cancel;\n");
2753
+ fprintf(f, " }\n");
2754
+ b->stack_size += attr_sp_inc_opt_plus(ci, cc);
2755
+ }
2756
+ fprintf(f, "}\n");
2757
+ break;
2758
+ case BIN(opt_minus):
2759
+ fprintf(f, "{\n");
2760
+ {
2761
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2762
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2763
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2764
+ if (status->local_stack_p) {
2765
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2766
+ }
2767
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2768
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2769
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
2770
+
2771
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2772
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2773
+ fprintf(f, "\n");
2774
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2775
+ fprintf(f, "\n");
2776
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
2777
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
2778
+ if (body->catch_except_p || FALSE) {
2779
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2780
+ pc_moved_p = TRUE;
2781
+ }
2782
+ if (status->local_stack_p) {
2783
+ }
2784
+ else {
2785
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2786
+ }
2787
+ fprintf(f, " {\n");
2788
+ fprintf(f, " val = vm_opt_minus(recv, obj);\n");
2789
+ fprintf(f, "\n");
2790
+ fprintf(f, " if (val == Qundef) {\n");
2791
+ if (status->local_stack_p) {
2792
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2793
+ }
2794
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2795
+ fprintf(f, " goto cancel;\n");
2796
+ fprintf(f, " }\n");
2797
+ fprintf(f, " }\n");
2798
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_minus(ci, cc) - 1);
2799
+ b->stack_size += attr_sp_inc_opt_minus(ci, cc);
2800
+ }
2801
+ fprintf(f, "}\n");
2802
+ break;
2803
+ case BIN(opt_mult):
2804
+ fprintf(f, "{\n");
2805
+ {
2806
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2807
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2808
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2809
+ if (status->local_stack_p) {
2810
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2811
+ }
2812
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2813
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2814
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
2815
+
2816
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2817
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2818
+ fprintf(f, "\n");
2819
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2820
+ fprintf(f, "\n");
2821
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
2822
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
2823
+ if (body->catch_except_p || FALSE) {
2824
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2825
+ pc_moved_p = TRUE;
2826
+ }
2827
+ if (status->local_stack_p) {
2828
+ }
2829
+ else {
2830
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2831
+ }
2832
+ fprintf(f, " {\n");
2833
+ fprintf(f, " val = vm_opt_mult(recv, obj);\n");
2834
+ fprintf(f, "\n");
2835
+ fprintf(f, " if (val == Qundef) {\n");
2836
+ if (status->local_stack_p) {
2837
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2838
+ }
2839
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2840
+ fprintf(f, " goto cancel;\n");
2841
+ fprintf(f, " }\n");
2842
+ fprintf(f, " }\n");
2843
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_mult(ci, cc) - 1);
2844
+ b->stack_size += attr_sp_inc_opt_mult(ci, cc);
2845
+ }
2846
+ fprintf(f, "}\n");
2847
+ break;
2848
+ case BIN(opt_div):
2849
+ fprintf(f, "{\n");
2850
+ {
2851
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2852
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2853
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2854
+ if (status->local_stack_p) {
2855
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2856
+ }
2857
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2858
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2859
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
2860
+
2861
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2862
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2863
+ fprintf(f, "\n");
2864
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2865
+ fprintf(f, "\n");
2866
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
2867
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
2868
+ if (body->catch_except_p || FALSE) {
2869
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2870
+ pc_moved_p = TRUE;
2871
+ }
2872
+ if (status->local_stack_p) {
2873
+ }
2874
+ else {
2875
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2876
+ }
2877
+ fprintf(f, " {\n");
2878
+ fprintf(f, " val = vm_opt_div(recv, obj);\n");
2879
+ fprintf(f, "\n");
2880
+ fprintf(f, " if (val == Qundef) {\n");
2881
+ if (status->local_stack_p) {
2882
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2883
+ }
2884
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2885
+ fprintf(f, " goto cancel;\n");
2886
+ fprintf(f, " }\n");
2887
+ fprintf(f, " }\n");
2888
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_div(ci, cc) - 1);
2889
+ b->stack_size += attr_sp_inc_opt_div(ci, cc);
2890
+ }
2891
+ fprintf(f, "}\n");
2892
+ break;
2893
+ case BIN(opt_mod):
2894
+ fprintf(f, "{\n");
2895
+ {
2896
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2897
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2898
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2899
+ if (status->local_stack_p) {
2900
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2901
+ }
2902
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2903
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2904
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
2905
+
2906
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2907
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2908
+ fprintf(f, "\n");
2909
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2910
+ fprintf(f, "\n");
2911
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
2912
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
2913
+ if (body->catch_except_p || FALSE) {
2914
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2915
+ pc_moved_p = TRUE;
2916
+ }
2917
+ if (status->local_stack_p) {
2918
+ }
2919
+ else {
2920
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2921
+ }
2922
+ fprintf(f, " {\n");
2923
+ fprintf(f, " val = vm_opt_mod(recv, obj);\n");
2924
+ fprintf(f, "\n");
2925
+ fprintf(f, " if (val == Qundef) {\n");
2926
+ if (status->local_stack_p) {
2927
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2928
+ }
2929
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2930
+ fprintf(f, " goto cancel;\n");
2931
+ fprintf(f, " }\n");
2932
+ fprintf(f, " }\n");
2933
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_mod(ci, cc) - 1);
2934
+ b->stack_size += attr_sp_inc_opt_mod(ci, cc);
2935
+ }
2936
+ fprintf(f, "}\n");
2937
+ break;
2938
+ case BIN(opt_eq):
2939
+ fprintf(f, "{\n");
2940
+ {
2941
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2942
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2943
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2944
+ if (status->local_stack_p) {
2945
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2946
+ }
2947
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2948
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2949
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
2950
+
2951
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2952
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
2953
+ fprintf(f, "\n");
2954
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2955
+ fprintf(f, "\n");
2956
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
2957
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
2958
+ if (body->catch_except_p || TRUE) {
2959
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
2960
+ pc_moved_p = TRUE;
2961
+ }
2962
+ if (status->local_stack_p) {
2963
+ }
2964
+ else {
2965
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2966
+ }
2967
+ fprintf(f, " {\n");
2968
+ fprintf(f, " val = opt_eq_func(recv, obj, ci, cc);\n");
2969
+ fprintf(f, "\n");
2970
+ fprintf(f, " if (val == Qundef) {\n");
2971
+ if (status->local_stack_p) {
2972
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
2973
+ }
2974
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2975
+ fprintf(f, " goto cancel;\n");
2976
+ fprintf(f, " }\n");
2977
+ fprintf(f, " }\n");
2978
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_eq(ci, cc) - 1);
2979
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
2980
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_eq(ci, cc) + 1);
2981
+ if (!pc_moved_p) {
2982
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2983
+ }
2984
+ fprintf(f, " goto cancel;\n");
2985
+ fprintf(f, " }\n");
2986
+ b->stack_size += attr_sp_inc_opt_eq(ci, cc);
2987
+ }
2988
+ fprintf(f, "}\n");
2989
+ break;
2990
+ case BIN(opt_neq):
2991
+ fprintf(f, "{\n");
2992
+ {
2993
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
2994
+ MAYBE_UNUSED(CALL_INFO ci_eq) = (CALL_INFO)operands[0];
2995
+ MAYBE_UNUSED(CALL_CACHE cc_eq) = (CALL_CACHE)operands[1];
2996
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[2];
2997
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[3];
2998
+ if (status->local_stack_p) {
2999
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3000
+ }
3001
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc, cc_eq;\n");
3002
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci, ci_eq;\n");
3003
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3004
+
3005
+ fprintf(f, " ci_eq = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3006
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3007
+ fprintf(f, "\n");
3008
+ fprintf(f, " cc_eq = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3009
+ fprintf(f, "\n");
3010
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[2]);
3011
+ comment_id(f, ((CALL_INFO)operands[2])->mid);
3012
+ fprintf(f, "\n");
3013
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[3]);
3014
+ fprintf(f, "\n");
3015
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3016
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3017
+ if (body->catch_except_p || TRUE) {
3018
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3019
+ pc_moved_p = TRUE;
3020
+ }
3021
+ if (status->local_stack_p) {
3022
+ }
3023
+ else {
3024
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3025
+ }
3026
+ fprintf(f, " {\n");
3027
+ fprintf(f, " val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);\n");
3028
+ fprintf(f, "\n");
3029
+ fprintf(f, " if (val == Qundef) {\n");
3030
+ if (status->local_stack_p) {
3031
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3032
+ }
3033
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3034
+ fprintf(f, " goto cancel;\n");
3035
+ fprintf(f, " }\n");
3036
+ fprintf(f, " }\n");
3037
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_neq(ci_eq, cc_eq, ci, cc) - 1);
3038
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3039
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_neq(ci_eq, cc_eq, ci, cc) + 1);
3040
+ if (!pc_moved_p) {
3041
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3042
+ }
3043
+ fprintf(f, " goto cancel;\n");
3044
+ fprintf(f, " }\n");
3045
+ b->stack_size += attr_sp_inc_opt_neq(ci_eq, cc_eq, ci, cc);
3046
+ }
3047
+ fprintf(f, "}\n");
3048
+ break;
3049
+ case BIN(opt_lt):
3050
+ fprintf(f, "{\n");
3051
+ {
3052
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3053
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3054
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3055
+ if (status->local_stack_p) {
3056
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3057
+ }
3058
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3059
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3060
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3061
+
3062
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3063
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3064
+ fprintf(f, "\n");
3065
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3066
+ fprintf(f, "\n");
3067
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3068
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3069
+ if (body->catch_except_p || FALSE) {
3070
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3071
+ pc_moved_p = TRUE;
3072
+ }
3073
+ if (status->local_stack_p) {
3074
+ }
3075
+ else {
3076
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3077
+ }
3078
+ fprintf(f, " {\n");
3079
+ fprintf(f, " val = vm_opt_lt(recv, obj);\n");
3080
+ fprintf(f, "\n");
3081
+ fprintf(f, " if (val == Qundef) {\n");
3082
+ if (status->local_stack_p) {
3083
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3084
+ }
3085
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3086
+ fprintf(f, " goto cancel;\n");
3087
+ fprintf(f, " }\n");
3088
+ fprintf(f, " }\n");
3089
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_lt(ci, cc) - 1);
3090
+ b->stack_size += attr_sp_inc_opt_lt(ci, cc);
3091
+ }
3092
+ fprintf(f, "}\n");
3093
+ break;
3094
+ case BIN(opt_le):
3095
+ fprintf(f, "{\n");
3096
+ {
3097
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3098
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3099
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3100
+ if (status->local_stack_p) {
3101
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3102
+ }
3103
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3104
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3105
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3106
+
3107
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3108
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3109
+ fprintf(f, "\n");
3110
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3111
+ fprintf(f, "\n");
3112
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3113
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3114
+ if (body->catch_except_p || FALSE) {
3115
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3116
+ pc_moved_p = TRUE;
3117
+ }
3118
+ if (status->local_stack_p) {
3119
+ }
3120
+ else {
3121
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3122
+ }
3123
+ fprintf(f, " {\n");
3124
+ fprintf(f, " val = vm_opt_le(recv, obj);\n");
3125
+ fprintf(f, "\n");
3126
+ fprintf(f, " if (val == Qundef) {\n");
3127
+ if (status->local_stack_p) {
3128
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3129
+ }
3130
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3131
+ fprintf(f, " goto cancel;\n");
3132
+ fprintf(f, " }\n");
3133
+ fprintf(f, " }\n");
3134
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_le(ci, cc) - 1);
3135
+ b->stack_size += attr_sp_inc_opt_le(ci, cc);
3136
+ }
3137
+ fprintf(f, "}\n");
3138
+ break;
3139
+ case BIN(opt_gt):
3140
+ fprintf(f, "{\n");
3141
+ {
3142
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3143
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3144
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3145
+ if (status->local_stack_p) {
3146
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3147
+ }
3148
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3149
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3150
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3151
+
3152
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3153
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3154
+ fprintf(f, "\n");
3155
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3156
+ fprintf(f, "\n");
3157
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3158
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3159
+ if (body->catch_except_p || FALSE) {
3160
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3161
+ pc_moved_p = TRUE;
3162
+ }
3163
+ if (status->local_stack_p) {
3164
+ }
3165
+ else {
3166
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3167
+ }
3168
+ fprintf(f, " {\n");
3169
+ fprintf(f, " val = vm_opt_gt(recv, obj);\n");
3170
+ fprintf(f, "\n");
3171
+ fprintf(f, " if (val == Qundef) {\n");
3172
+ if (status->local_stack_p) {
3173
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3174
+ }
3175
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3176
+ fprintf(f, " goto cancel;\n");
3177
+ fprintf(f, " }\n");
3178
+ fprintf(f, " }\n");
3179
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_gt(ci, cc) - 1);
3180
+ b->stack_size += attr_sp_inc_opt_gt(ci, cc);
3181
+ }
3182
+ fprintf(f, "}\n");
3183
+ break;
3184
+ case BIN(opt_ge):
3185
+ fprintf(f, "{\n");
3186
+ {
3187
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3188
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3189
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3190
+ if (status->local_stack_p) {
3191
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3192
+ }
3193
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3194
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3195
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3196
+
3197
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3198
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3199
+ fprintf(f, "\n");
3200
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3201
+ fprintf(f, "\n");
3202
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3203
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3204
+ if (body->catch_except_p || FALSE) {
3205
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3206
+ pc_moved_p = TRUE;
3207
+ }
3208
+ if (status->local_stack_p) {
3209
+ }
3210
+ else {
3211
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3212
+ }
3213
+ fprintf(f, " {\n");
3214
+ fprintf(f, " val = vm_opt_ge(recv, obj);\n");
3215
+ fprintf(f, "\n");
3216
+ fprintf(f, " if (val == Qundef) {\n");
3217
+ if (status->local_stack_p) {
3218
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3219
+ }
3220
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3221
+ fprintf(f, " goto cancel;\n");
3222
+ fprintf(f, " }\n");
3223
+ fprintf(f, " }\n");
3224
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_ge(ci, cc) - 1);
3225
+ b->stack_size += attr_sp_inc_opt_ge(ci, cc);
3226
+ }
3227
+ fprintf(f, "}\n");
3228
+ break;
3229
+ case BIN(opt_ltlt):
3230
+ fprintf(f, "{\n");
3231
+ {
3232
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3233
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3234
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3235
+ if (status->local_stack_p) {
3236
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3237
+ }
3238
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3239
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3240
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3241
+
3242
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3243
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3244
+ fprintf(f, "\n");
3245
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3246
+ fprintf(f, "\n");
3247
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3248
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3249
+ if (body->catch_except_p || FALSE) {
3250
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3251
+ pc_moved_p = TRUE;
3252
+ }
3253
+ if (status->local_stack_p) {
3254
+ }
3255
+ else {
3256
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3257
+ }
3258
+ fprintf(f, " {\n");
3259
+ fprintf(f, " val = vm_opt_ltlt(recv, obj);\n");
3260
+ fprintf(f, "\n");
3261
+ fprintf(f, " if (val == Qundef) {\n");
3262
+ if (status->local_stack_p) {
3263
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3264
+ }
3265
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3266
+ fprintf(f, " goto cancel;\n");
3267
+ fprintf(f, " }\n");
3268
+ fprintf(f, " }\n");
3269
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_ltlt(ci, cc) - 1);
3270
+ b->stack_size += attr_sp_inc_opt_ltlt(ci, cc);
3271
+ }
3272
+ fprintf(f, "}\n");
3273
+ break;
3274
+ case BIN(opt_and):
3275
+ fprintf(f, "{\n");
3276
+ {
3277
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3278
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3279
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3280
+ if (status->local_stack_p) {
3281
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3282
+ }
3283
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3284
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3285
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3286
+
3287
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3288
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3289
+ fprintf(f, "\n");
3290
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3291
+ fprintf(f, "\n");
3292
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3293
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3294
+ if (body->catch_except_p || FALSE) {
3295
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3296
+ pc_moved_p = TRUE;
3297
+ }
3298
+ if (status->local_stack_p) {
3299
+ }
3300
+ else {
3301
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3302
+ }
3303
+ fprintf(f, " {\n");
3304
+ fprintf(f, " val = vm_opt_and(recv, obj);\n");
3305
+ fprintf(f, "\n");
3306
+ fprintf(f, " if (val == Qundef) {\n");
3307
+ if (status->local_stack_p) {
3308
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3309
+ }
3310
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3311
+ fprintf(f, " goto cancel;\n");
3312
+ fprintf(f, " }\n");
3313
+ fprintf(f, " }\n");
3314
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_and(ci, cc) - 1);
3315
+ b->stack_size += attr_sp_inc_opt_and(ci, cc);
3316
+ }
3317
+ fprintf(f, "}\n");
3318
+ break;
3319
+ case BIN(opt_or):
3320
+ fprintf(f, "{\n");
3321
+ {
3322
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3323
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3324
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3325
+ if (status->local_stack_p) {
3326
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3327
+ }
3328
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3329
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3330
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3331
+
3332
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3333
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3334
+ fprintf(f, "\n");
3335
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3336
+ fprintf(f, "\n");
3337
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3338
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3339
+ if (body->catch_except_p || FALSE) {
3340
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3341
+ pc_moved_p = TRUE;
3342
+ }
3343
+ if (status->local_stack_p) {
3344
+ }
3345
+ else {
3346
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3347
+ }
3348
+ fprintf(f, " {\n");
3349
+ fprintf(f, " val = vm_opt_or(recv, obj);\n");
3350
+ fprintf(f, "\n");
3351
+ fprintf(f, " if (val == Qundef) {\n");
3352
+ if (status->local_stack_p) {
3353
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3354
+ }
3355
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3356
+ fprintf(f, " goto cancel;\n");
3357
+ fprintf(f, " }\n");
3358
+ fprintf(f, " }\n");
3359
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_or(ci, cc) - 1);
3360
+ b->stack_size += attr_sp_inc_opt_or(ci, cc);
3361
+ }
3362
+ fprintf(f, "}\n");
3363
+ break;
3364
+ case BIN(opt_aref):
3365
+ {
3366
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3367
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3368
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3369
+ CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
3370
+ if (has_valid_method_type(cc_copy)) {
3371
+ const rb_iseq_t *iseq;
3372
+ unsigned int argc = ci->orig_argc; /* unlike `ci->orig_argc`, `argc` may include blockarg */
3373
+
3374
+ if (!(ci->flag & VM_CALL_TAILCALL) && /* inlining non-tailcall path */
3375
+ cc_copy->me->def->type == VM_METHOD_TYPE_ISEQ && inlinable_iseq_p(ci, cc_copy, iseq = def_iseq_ptr(cc_copy->me->def)) /* CC_SET_FASTPATH in vm_callee_setup_arg */) {
3376
+ int param_size = iseq->body->param.size; /* TODO: check calling->argc for argument_arity_error */
3377
+
3378
+ fprintf(f, "{\n");
3379
+ if (status->local_stack_p) {
3380
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3381
+ }
3382
+
3383
+ fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
3384
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
3385
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3386
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3387
+ fprintf(f, " goto cancel;\n");
3388
+ fprintf(f, " }\n");
3389
+
3390
+ if (body->catch_except_p || TRUE) {
3391
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3392
+ pc_moved_p = TRUE;
3393
+ }
3394
+ if (status->local_stack_p) {
3395
+ {
3396
+ rb_snum_t i, push_size;
3397
+ push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3398
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3399
+ for (i = 0; i < push_size; i++) {
3400
+ fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
3401
+ }
3402
+ }
3403
+ }
3404
+ else {
3405
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - 0); /* POPN(INSN_ATTR(popn)); */
3406
+ }
3407
+
3408
+ fprintf(f, " {\n");
3409
+ fprintf(f, " struct rb_calling_info calling;\n");
3410
+ fprintf(f, " calling.block_handler = VM_BLOCK_HANDLER_NONE;\n");
3411
+ fprintf(f, " calling.argc = %d;\n", ci->orig_argc);
3412
+ fprintf(f, " calling.recv = stack[%d];\n", b->stack_size - 1 - argc);
3413
+
3414
+ fprintf(f, " {\n");
3415
+ fprintf(f, " VALUE v;\n");
3416
+ fprintf(f, " vm_call_iseq_setup_normal(ec, reg_cfp, &calling, (const rb_callable_method_entry_t *)0x%"PRIxVALUE", 0, %d, %d);\n",
3417
+ (VALUE)cc_copy->me, param_size, iseq->body->local_table_size); /* rb_simple_iseq_p checks rb_simple_iseq_p, which ensures has_opt == FALSE */
3418
+ if (iseq->body->catch_except_p) {
3419
+ fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n");
3420
+ fprintf(f, " v = vm_exec(ec, TRUE);\n");
3421
+ }
3422
+ else {
3423
+ fprintf(f, " if ((v = mjit_exec(ec)) == Qundef) {\n");
3424
+ fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n"); /* This is vm_call0_body's code after vm_call_iseq_setup */
3425
+ fprintf(f, " v = vm_exec(ec, FALSE);\n");
3426
+ fprintf(f, " }\n");
3427
+ }
3428
+ fprintf(f, " stack[%d] = v;\n", b->stack_size - argc - 1);
3429
+ fprintf(f, " }\n");
3430
+
3431
+ fprintf(f, " }\n");
3432
+
3433
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3434
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) + 1);
3435
+ if (!pc_moved_p) {
3436
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3437
+ }
3438
+ fprintf(f, " goto cancel;\n");
3439
+ fprintf(f, " }\n");
3440
+
3441
+ b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3442
+
3443
+ fprintf(f, "}\n");
3444
+ break;
3445
+ }
3446
+ }
3447
+ }
3448
+ fprintf(f, "{\n");
3449
+ {
3450
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3451
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3452
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3453
+ if (status->local_stack_p) {
3454
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3455
+ }
3456
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3457
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3458
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3459
+
3460
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3461
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3462
+ fprintf(f, "\n");
3463
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3464
+ fprintf(f, "\n");
3465
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3466
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3467
+ if (body->catch_except_p || TRUE) {
3468
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3469
+ pc_moved_p = TRUE;
3470
+ }
3471
+ if (status->local_stack_p) {
3472
+ }
3473
+ else {
3474
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3475
+ }
3476
+ fprintf(f, " {\n");
3477
+ fprintf(f, " val = vm_opt_aref(recv, obj);\n");
3478
+ fprintf(f, "\n");
3479
+ fprintf(f, " if (val == Qundef) {\n");
3480
+ if (status->local_stack_p) {
3481
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3482
+ }
3483
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3484
+ fprintf(f, " goto cancel;\n");
3485
+ fprintf(f, " }\n");
3486
+ fprintf(f, " }\n");
3487
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aref(ci, cc) - 1);
3488
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3489
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aref(ci, cc) + 1);
3490
+ if (!pc_moved_p) {
3491
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3492
+ }
3493
+ fprintf(f, " goto cancel;\n");
3494
+ fprintf(f, " }\n");
3495
+ b->stack_size += attr_sp_inc_opt_aref(ci, cc);
3496
+ }
3497
+ fprintf(f, "}\n");
3498
+ break;
3499
+ case BIN(opt_aset):
3500
+ fprintf(f, "{\n");
3501
+ {
3502
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3503
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3504
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3505
+ if (status->local_stack_p) {
3506
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3507
+ }
3508
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3509
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3510
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, set, val;\n");
3511
+
3512
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3513
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3514
+ fprintf(f, "\n");
3515
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3516
+ fprintf(f, "\n");
3517
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 3);
3518
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 2);
3519
+ fprintf(f, " set = stack[%d];\n", b->stack_size - 1);
3520
+ if (body->catch_except_p || TRUE) {
3521
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3522
+ pc_moved_p = TRUE;
3523
+ }
3524
+ if (status->local_stack_p) {
3525
+ }
3526
+ else {
3527
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3528
+ }
3529
+ fprintf(f, " {\n");
3530
+ fprintf(f, " val = vm_opt_aset(recv, obj, set);\n");
3531
+ fprintf(f, "\n");
3532
+ fprintf(f, " if (val == Qundef) {\n");
3533
+ if (status->local_stack_p) {
3534
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3535
+ }
3536
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3537
+ fprintf(f, " goto cancel;\n");
3538
+ fprintf(f, " }\n");
3539
+ fprintf(f, " }\n");
3540
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aset(ci, cc) - 1);
3541
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3542
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aset(ci, cc) + 1);
3543
+ if (!pc_moved_p) {
3544
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3545
+ }
3546
+ fprintf(f, " goto cancel;\n");
3547
+ fprintf(f, " }\n");
3548
+ b->stack_size += attr_sp_inc_opt_aset(ci, cc);
3549
+ }
3550
+ fprintf(f, "}\n");
3551
+ break;
3552
+ case BIN(opt_aset_with):
3553
+ fprintf(f, "{\n");
3554
+ {
3555
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3556
+ MAYBE_UNUSED(VALUE key) = (VALUE)operands[0];
3557
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
3558
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
3559
+ if (status->local_stack_p) {
3560
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3561
+ }
3562
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3563
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3564
+ fprintf(f, " MAYBE_UNUSED(VALUE) key, recv, val;\n");
3565
+
3566
+ fprintf(f, " key = (VALUE)0x%"PRIxVALUE";", operands[0]);
3567
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
3568
+ fprintf(f, "\n");
3569
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
3570
+ comment_id(f, ((CALL_INFO)operands[1])->mid);
3571
+ fprintf(f, "\n");
3572
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
3573
+ fprintf(f, "\n");
3574
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3575
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
3576
+ if (body->catch_except_p || TRUE) {
3577
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3578
+ pc_moved_p = TRUE;
3579
+ }
3580
+ if (status->local_stack_p) {
3581
+ }
3582
+ else {
3583
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3584
+ }
3585
+ fprintf(f, " {\n");
3586
+ fprintf(f, " VALUE tmp = vm_opt_aset_with(recv, key, val);\n");
3587
+ fprintf(f, "\n");
3588
+ fprintf(f, " if (tmp != Qundef) {\n");
3589
+ fprintf(f, " val = tmp;\n");
3590
+ fprintf(f, " }\n");
3591
+ fprintf(f, " else {\n");
3592
+ fprintf(f, "#ifndef MJIT_HEADER\n");
3593
+ fprintf(f, " %s = rb_str_resurrect(key);\n",
3594
+ (status->local_stack_p ? "*(stack + (stack_size - (0) - 1))" : "TOPN(0)"));
3595
+ fprintf(f, " PUSH(val);\n");
3596
+ fprintf(f, "#endif\n");
3597
+ if (status->local_stack_p) {
3598
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3599
+ }
3600
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3601
+ fprintf(f, " goto cancel;\n");
3602
+ fprintf(f, " }\n");
3603
+ fprintf(f, " }\n");
3604
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aset_with(key, ci, cc) - 1);
3605
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3606
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aset_with(key, ci, cc) + 1);
3607
+ if (!pc_moved_p) {
3608
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3609
+ }
3610
+ fprintf(f, " goto cancel;\n");
3611
+ fprintf(f, " }\n");
3612
+ b->stack_size += attr_sp_inc_opt_aset_with(key, ci, cc);
3613
+ }
3614
+ fprintf(f, "}\n");
3615
+ break;
3616
+ case BIN(opt_aref_with):
3617
+ fprintf(f, "{\n");
3618
+ {
3619
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3620
+ MAYBE_UNUSED(VALUE key) = (VALUE)operands[0];
3621
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
3622
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
3623
+ if (status->local_stack_p) {
3624
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3625
+ }
3626
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3627
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3628
+ fprintf(f, " MAYBE_UNUSED(VALUE) key, recv, val;\n");
3629
+
3630
+ fprintf(f, " key = (VALUE)0x%"PRIxVALUE";", operands[0]);
3631
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
3632
+ fprintf(f, "\n");
3633
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
3634
+ comment_id(f, ((CALL_INFO)operands[1])->mid);
3635
+ fprintf(f, "\n");
3636
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
3637
+ fprintf(f, "\n");
3638
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
3639
+ if (body->catch_except_p || TRUE) {
3640
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3641
+ pc_moved_p = TRUE;
3642
+ }
3643
+ if (status->local_stack_p) {
3644
+ }
3645
+ else {
3646
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3647
+ }
3648
+ fprintf(f, " {\n");
3649
+ fprintf(f, " val = vm_opt_aref_with(recv, key);\n");
3650
+ fprintf(f, "\n");
3651
+ fprintf(f, " if (val == Qundef) {\n");
3652
+ fprintf(f, "#ifndef MJIT_HEADER\n");
3653
+ fprintf(f, " PUSH(rb_str_resurrect(key));\n");
3654
+ fprintf(f, "#endif\n");
3655
+ if (status->local_stack_p) {
3656
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3657
+ }
3658
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3659
+ fprintf(f, " goto cancel;\n");
3660
+ fprintf(f, " }\n");
3661
+ fprintf(f, " }\n");
3662
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aref_with(key, ci, cc) - 1);
3663
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3664
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aref_with(key, ci, cc) + 1);
3665
+ if (!pc_moved_p) {
3666
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3667
+ }
3668
+ fprintf(f, " goto cancel;\n");
3669
+ fprintf(f, " }\n");
3670
+ b->stack_size += attr_sp_inc_opt_aref_with(key, ci, cc);
3671
+ }
3672
+ fprintf(f, "}\n");
3673
+ break;
3674
+ case BIN(opt_length):
3675
+ fprintf(f, "{\n");
3676
+ {
3677
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3678
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3679
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3680
+ if (status->local_stack_p) {
3681
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3682
+ }
3683
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3684
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3685
+ fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
3686
+
3687
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3688
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3689
+ fprintf(f, "\n");
3690
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3691
+ fprintf(f, "\n");
3692
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
3693
+ if (body->catch_except_p || FALSE) {
3694
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3695
+ pc_moved_p = TRUE;
3696
+ }
3697
+ if (status->local_stack_p) {
3698
+ }
3699
+ else {
3700
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3701
+ }
3702
+ fprintf(f, " {\n");
3703
+ fprintf(f, " val = vm_opt_length(recv, BOP_LENGTH);\n");
3704
+ fprintf(f, "\n");
3705
+ fprintf(f, " if (val == Qundef) {\n");
3706
+ if (status->local_stack_p) {
3707
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3708
+ }
3709
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3710
+ fprintf(f, " goto cancel;\n");
3711
+ fprintf(f, " }\n");
3712
+ fprintf(f, " }\n");
3713
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_length(ci, cc) - 1);
3714
+ b->stack_size += attr_sp_inc_opt_length(ci, cc);
3715
+ }
3716
+ fprintf(f, "}\n");
3717
+ break;
3718
+ case BIN(opt_size):
3719
+ fprintf(f, "{\n");
3720
+ {
3721
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3722
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3723
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3724
+ if (status->local_stack_p) {
3725
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3726
+ }
3727
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3728
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3729
+ fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
3730
+
3731
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3732
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3733
+ fprintf(f, "\n");
3734
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3735
+ fprintf(f, "\n");
3736
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
3737
+ if (body->catch_except_p || FALSE) {
3738
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3739
+ pc_moved_p = TRUE;
3740
+ }
3741
+ if (status->local_stack_p) {
3742
+ }
3743
+ else {
3744
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3745
+ }
3746
+ fprintf(f, " {\n");
3747
+ fprintf(f, " val = vm_opt_length(recv, BOP_SIZE);\n");
3748
+ fprintf(f, "\n");
3749
+ fprintf(f, " if (val == Qundef) {\n");
3750
+ if (status->local_stack_p) {
3751
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3752
+ }
3753
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3754
+ fprintf(f, " goto cancel;\n");
3755
+ fprintf(f, " }\n");
3756
+ fprintf(f, " }\n");
3757
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_size(ci, cc) - 1);
3758
+ b->stack_size += attr_sp_inc_opt_size(ci, cc);
3759
+ }
3760
+ fprintf(f, "}\n");
3761
+ break;
3762
+ case BIN(opt_empty_p):
3763
+ fprintf(f, "{\n");
3764
+ {
3765
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3766
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3767
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3768
+ if (status->local_stack_p) {
3769
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3770
+ }
3771
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3772
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3773
+ fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
3774
+
3775
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3776
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3777
+ fprintf(f, "\n");
3778
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3779
+ fprintf(f, "\n");
3780
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
3781
+ if (body->catch_except_p || FALSE) {
3782
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3783
+ pc_moved_p = TRUE;
3784
+ }
3785
+ if (status->local_stack_p) {
3786
+ }
3787
+ else {
3788
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3789
+ }
3790
+ fprintf(f, " {\n");
3791
+ fprintf(f, " val = vm_opt_empty_p(recv);\n");
3792
+ fprintf(f, "\n");
3793
+ fprintf(f, " if (val == Qundef) {\n");
3794
+ if (status->local_stack_p) {
3795
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3796
+ }
3797
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3798
+ fprintf(f, " goto cancel;\n");
3799
+ fprintf(f, " }\n");
3800
+ fprintf(f, " }\n");
3801
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_empty_p(ci, cc) - 1);
3802
+ b->stack_size += attr_sp_inc_opt_empty_p(ci, cc);
3803
+ }
3804
+ fprintf(f, "}\n");
3805
+ break;
3806
+ case BIN(opt_succ):
3807
+ fprintf(f, "{\n");
3808
+ {
3809
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3810
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3811
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3812
+ if (status->local_stack_p) {
3813
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3814
+ }
3815
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3816
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3817
+ fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
3818
+
3819
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3820
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3821
+ fprintf(f, "\n");
3822
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3823
+ fprintf(f, "\n");
3824
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
3825
+ if (body->catch_except_p || FALSE) {
3826
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3827
+ pc_moved_p = TRUE;
3828
+ }
3829
+ if (status->local_stack_p) {
3830
+ }
3831
+ else {
3832
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3833
+ }
3834
+ fprintf(f, " {\n");
3835
+ fprintf(f, " val = vm_opt_succ(recv);\n");
3836
+ fprintf(f, "\n");
3837
+ fprintf(f, " if (val == Qundef) {\n");
3838
+ if (status->local_stack_p) {
3839
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3840
+ }
3841
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3842
+ fprintf(f, " goto cancel;\n");
3843
+ fprintf(f, " }\n");
3844
+ fprintf(f, " }\n");
3845
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_succ(ci, cc) - 1);
3846
+ b->stack_size += attr_sp_inc_opt_succ(ci, cc);
3847
+ }
3848
+ fprintf(f, "}\n");
3849
+ break;
3850
+ case BIN(opt_not):
3851
+ fprintf(f, "{\n");
3852
+ {
3853
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3854
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3855
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3856
+ if (status->local_stack_p) {
3857
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3858
+ }
3859
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3860
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3861
+ fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
3862
+
3863
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3864
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3865
+ fprintf(f, "\n");
3866
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3867
+ fprintf(f, "\n");
3868
+ fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
3869
+ if (body->catch_except_p || FALSE) {
3870
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3871
+ pc_moved_p = TRUE;
3872
+ }
3873
+ if (status->local_stack_p) {
3874
+ }
3875
+ else {
3876
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3877
+ }
3878
+ fprintf(f, " {\n");
3879
+ fprintf(f, " val = vm_opt_not(ci, cc, recv);\n");
3880
+ fprintf(f, "\n");
3881
+ fprintf(f, " if (val == Qundef) {\n");
3882
+ if (status->local_stack_p) {
3883
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3884
+ }
3885
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3886
+ fprintf(f, " goto cancel;\n");
3887
+ fprintf(f, " }\n");
3888
+ fprintf(f, " }\n");
3889
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_not(ci, cc) - 1);
3890
+ b->stack_size += attr_sp_inc_opt_not(ci, cc);
3891
+ }
3892
+ fprintf(f, "}\n");
3893
+ break;
3894
+ case BIN(opt_regexpmatch1):
3895
+ fprintf(f, "{\n");
3896
+ {
3897
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3898
+ MAYBE_UNUSED(VALUE recv) = (VALUE)operands[0];
3899
+ if (status->local_stack_p) {
3900
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3901
+ }
3902
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3903
+
3904
+ fprintf(f, " recv = (VALUE)0x%"PRIxVALUE";", operands[0]);
3905
+ if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
3906
+ fprintf(f, "\n");
3907
+ fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
3908
+ if (body->catch_except_p || TRUE) {
3909
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3910
+ pc_moved_p = TRUE;
3911
+ }
3912
+ if (status->local_stack_p) {
3913
+ }
3914
+ else {
3915
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3916
+ }
3917
+ fprintf(f, " {\n");
3918
+ fprintf(f, " val = vm_opt_regexpmatch1(recv, obj);\n");
3919
+ fprintf(f, " }\n");
3920
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch1(recv) - 1);
3921
+ fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
3922
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch1(recv) + 1);
3923
+ if (!pc_moved_p) {
3924
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3925
+ }
3926
+ fprintf(f, " goto cancel;\n");
3927
+ fprintf(f, " }\n");
3928
+ b->stack_size += attr_sp_inc_opt_regexpmatch1(recv);
3929
+ }
3930
+ fprintf(f, "}\n");
3931
+ break;
3932
+ case BIN(opt_regexpmatch2):
3933
+ fprintf(f, "{\n");
3934
+ {
3935
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3936
+ MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3937
+ MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3938
+ if (status->local_stack_p) {
3939
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3940
+ }
3941
+ fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3942
+ fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3943
+ fprintf(f, " MAYBE_UNUSED(VALUE) obj1, obj2, val;\n");
3944
+
3945
+ fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3946
+ comment_id(f, ((CALL_INFO)operands[0])->mid);
3947
+ fprintf(f, "\n");
3948
+ fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3949
+ fprintf(f, "\n");
3950
+ fprintf(f, " obj2 = stack[%d];\n", b->stack_size - 2);
3951
+ fprintf(f, " obj1 = stack[%d];\n", b->stack_size - 1);
3952
+ if (body->catch_except_p || FALSE) {
3953
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3954
+ pc_moved_p = TRUE;
3955
+ }
3956
+ if (status->local_stack_p) {
3957
+ }
3958
+ else {
3959
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3960
+ }
3961
+ fprintf(f, " {\n");
3962
+ fprintf(f, " val = vm_opt_regexpmatch2(obj2, obj1);\n");
3963
+ fprintf(f, "\n");
3964
+ fprintf(f, " if (val == Qundef) {\n");
3965
+ if (status->local_stack_p) {
3966
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3967
+ }
3968
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3969
+ fprintf(f, " goto cancel;\n");
3970
+ fprintf(f, " }\n");
3971
+ fprintf(f, " }\n");
3972
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch2(ci, cc) - 1);
3973
+ b->stack_size += attr_sp_inc_opt_regexpmatch2(ci, cc);
3974
+ }
3975
+ fprintf(f, "}\n");
3976
+ break;
3977
+ case BIN(bitblt):
3978
+ fprintf(f, "{\n");
3979
+ {
3980
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
3981
+ if (status->local_stack_p) {
3982
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3983
+ }
3984
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret;\n");
3985
+
3986
+ if (body->catch_except_p || FALSE) {
3987
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
3988
+ pc_moved_p = TRUE;
3989
+ }
3990
+ if (status->local_stack_p) {
3991
+ }
3992
+ else {
3993
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
3994
+ }
3995
+ fprintf(f, " {\n");
3996
+ fprintf(f, " ret = rb_str_new2(\"a bit of bacon, lettuce and tomato\");\n");
3997
+ fprintf(f, " }\n");
3998
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_bitblt() - 1);
3999
+ b->stack_size += attr_sp_inc_bitblt();
4000
+ }
4001
+ fprintf(f, "}\n");
4002
+ break;
4003
+ case BIN(answer):
4004
+ fprintf(f, "{\n");
4005
+ {
4006
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4007
+ if (status->local_stack_p) {
4008
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4009
+ }
4010
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret;\n");
4011
+
4012
+ if (body->catch_except_p || FALSE) {
4013
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4014
+ pc_moved_p = TRUE;
4015
+ }
4016
+ if (status->local_stack_p) {
4017
+ }
4018
+ else {
4019
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4020
+ }
4021
+ fprintf(f, " {\n");
4022
+ fprintf(f, " ret = INT2FIX(42);\n");
4023
+ fprintf(f, " }\n");
4024
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_answer() - 1);
4025
+ b->stack_size += attr_sp_inc_answer();
4026
+ }
4027
+ fprintf(f, "}\n");
4028
+ break;
4029
+ case BIN(getlocal_WC_0):
4030
+ fprintf(f, "{\n");
4031
+ {
4032
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4033
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
4034
+ if (status->local_stack_p) {
4035
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4036
+ }
4037
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4038
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
4039
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
4040
+
4041
+ fprintf(f, " level = 0;\n");
4042
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
4043
+ fprintf(f, "\n");
4044
+ if (body->catch_except_p || FALSE) {
4045
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4046
+ pc_moved_p = TRUE;
4047
+ }
4048
+ if (status->local_stack_p) {
4049
+ }
4050
+ else {
4051
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4052
+ }
4053
+ fprintf(f, " {\n");
4054
+ fprintf(f, " val = *(vm_get_ep(GET_EP(), level) - idx);\n");
4055
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_get);\n");
4056
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n");
4057
+ fprintf(f, " }\n");
4058
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getlocal_WC_0(idx) - 1);
4059
+ b->stack_size += attr_sp_inc_getlocal_WC_0(idx);
4060
+ }
4061
+ fprintf(f, "}\n");
4062
+ break;
4063
+ case BIN(getlocal_WC_1):
4064
+ fprintf(f, "{\n");
4065
+ {
4066
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4067
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
4068
+ if (status->local_stack_p) {
4069
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4070
+ }
4071
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4072
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
4073
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
4074
+
4075
+ fprintf(f, " level = 1;\n");
4076
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
4077
+ fprintf(f, "\n");
4078
+ if (body->catch_except_p || FALSE) {
4079
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4080
+ pc_moved_p = TRUE;
4081
+ }
4082
+ if (status->local_stack_p) {
4083
+ }
4084
+ else {
4085
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4086
+ }
4087
+ fprintf(f, " {\n");
4088
+ fprintf(f, " val = *(vm_get_ep(GET_EP(), level) - idx);\n");
4089
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_get);\n");
4090
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n");
4091
+ fprintf(f, " }\n");
4092
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_getlocal_WC_1(idx) - 1);
4093
+ b->stack_size += attr_sp_inc_getlocal_WC_1(idx);
4094
+ }
4095
+ fprintf(f, "}\n");
4096
+ break;
4097
+ case BIN(setlocal_WC_0):
4098
+ fprintf(f, "{\n");
4099
+ {
4100
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4101
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
4102
+ if (status->local_stack_p) {
4103
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4104
+ }
4105
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4106
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
4107
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
4108
+
4109
+ fprintf(f, " level = 0;\n");
4110
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
4111
+ fprintf(f, "\n");
4112
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
4113
+ if (body->catch_except_p || FALSE) {
4114
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4115
+ pc_moved_p = TRUE;
4116
+ }
4117
+ if (status->local_stack_p) {
4118
+ }
4119
+ else {
4120
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4121
+ }
4122
+ fprintf(f, " {\n");
4123
+ fprintf(f, " vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);\n");
4124
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_set);\n");
4125
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n");
4126
+ fprintf(f, " }\n");
4127
+ b->stack_size += attr_sp_inc_setlocal_WC_0(idx);
4128
+ }
4129
+ fprintf(f, "}\n");
4130
+ break;
4131
+ case BIN(setlocal_WC_1):
4132
+ fprintf(f, "{\n");
4133
+ {
4134
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4135
+ MAYBE_UNUSED(lindex_t idx) = (lindex_t)operands[0];
4136
+ if (status->local_stack_p) {
4137
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4138
+ }
4139
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4140
+ fprintf(f, " MAYBE_UNUSED(lindex_t) idx;\n");
4141
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) level;\n");
4142
+
4143
+ fprintf(f, " level = 1;\n");
4144
+ fprintf(f, " idx = (lindex_t)0x%"PRIxVALUE";", operands[0]);
4145
+ fprintf(f, "\n");
4146
+ fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
4147
+ if (body->catch_except_p || FALSE) {
4148
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4149
+ pc_moved_p = TRUE;
4150
+ }
4151
+ if (status->local_stack_p) {
4152
+ }
4153
+ else {
4154
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4155
+ }
4156
+ fprintf(f, " {\n");
4157
+ fprintf(f, " vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);\n");
4158
+ fprintf(f, " RB_DEBUG_COUNTER_INC(lvar_set);\n");
4159
+ fprintf(f, " (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n");
4160
+ fprintf(f, " }\n");
4161
+ b->stack_size += attr_sp_inc_setlocal_WC_1(idx);
4162
+ }
4163
+ fprintf(f, "}\n");
4164
+ break;
4165
+ case BIN(putobject_INT2FIX_0_):
4166
+ fprintf(f, "{\n");
4167
+ {
4168
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4169
+ if (status->local_stack_p) {
4170
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4171
+ }
4172
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4173
+
4174
+ fprintf(f, " val = INT2FIX(0);\n");
4175
+ if (body->catch_except_p || FALSE) {
4176
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4177
+ pc_moved_p = TRUE;
4178
+ }
4179
+ if (status->local_stack_p) {
4180
+ }
4181
+ else {
4182
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4183
+ }
4184
+ fprintf(f, " {\n");
4185
+ fprintf(f, " /* */\n");
4186
+ fprintf(f, " }\n");
4187
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putobject_INT2FIX_0_() - 1);
4188
+ b->stack_size += attr_sp_inc_putobject_INT2FIX_0_();
4189
+ }
4190
+ fprintf(f, "}\n");
4191
+ break;
4192
+ case BIN(putobject_INT2FIX_1_):
4193
+ fprintf(f, "{\n");
4194
+ {
4195
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
4196
+ if (status->local_stack_p) {
4197
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4198
+ }
4199
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4200
+
4201
+ fprintf(f, " val = INT2FIX(1);\n");
4202
+ if (body->catch_except_p || FALSE) {
4203
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
4204
+ pc_moved_p = TRUE;
4205
+ }
4206
+ if (status->local_stack_p) {
4207
+ }
4208
+ else {
4209
+ fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
4210
+ }
4211
+ fprintf(f, " {\n");
4212
+ fprintf(f, " /* */\n");
4213
+ fprintf(f, " }\n");
4214
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_putobject_INT2FIX_1_() - 1);
4215
+ b->stack_size += attr_sp_inc_putobject_INT2FIX_1_();
4216
+ }
4217
+ fprintf(f, "}\n");
4218
+ break;
4219
+ default:
4220
+ if (mjit_opts.warnings || mjit_opts.verbose)
4221
+ fprintf(stderr, "MJIT warning: Skipped to compile unsupported instruction: %s\n", insn_name(insn));
4222
+ status->success = FALSE;
4223
+ break;
4224
+ }