debase-ruby_core_source 0.10.0 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +1 -0
  4. data/Rakefile +2 -2
  5. data/lib/debase/ruby_core_source.rb +1 -0
  6. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/addr2line.h +21 -0
  7. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/ccan/build_assert/build_assert.h +40 -0
  8. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/ccan/check_type/check_type.h +63 -0
  9. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/ccan/container_of/container_of.h +142 -0
  10. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/ccan/list/list.h +635 -0
  11. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/ccan/str/str.h +16 -0
  12. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/constant.h +43 -0
  13. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/dln.h +51 -0
  14. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/eval_intern.h +275 -0
  15. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/gc.h +107 -0
  16. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/id.h +210 -0
  17. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/insns.inc +107 -0
  18. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/insns_info.inc +752 -0
  19. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/internal.h +1198 -0
  20. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/iseq.h +158 -0
  21. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/known_errors.inc +746 -0
  22. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/method.h +144 -0
  23. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/node.h +544 -0
  24. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/node_name.inc +212 -0
  25. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/opt_sc.inc +734 -0
  26. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/optinsn.inc +83 -0
  27. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/optunifs.inc +124 -0
  28. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/parse.h +184 -0
  29. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/probes_helper.h +67 -0
  30. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/regenc.h +237 -0
  31. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/regint.h +972 -0
  32. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/regparse.h +363 -0
  33. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/revision.h +1 -0
  34. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/ruby_atomic.h +170 -0
  35. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/siphash.h +48 -0
  36. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/symbol.h +88 -0
  37. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/thread_pthread.h +54 -0
  38. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/thread_win32.h +36 -0
  39. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/timev.h +42 -0
  40. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/transcode_data.h +123 -0
  41. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/version.h +52 -0
  42. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vm.inc +3372 -0
  43. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vm_core.h +1163 -0
  44. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vm_debug.h +37 -0
  45. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vm_exec.h +182 -0
  46. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vm_insnhelper.h +233 -0
  47. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vm_opts.h +56 -0
  48. data/lib/debase/ruby_core_source/ruby-2.2.9-p480/vmtc.inc +105 -0
  49. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/addr2line.h +21 -0
  50. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/ccan/build_assert/build_assert.h +40 -0
  51. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/ccan/check_type/check_type.h +63 -0
  52. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/ccan/container_of/container_of.h +142 -0
  53. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/ccan/list/list.h +773 -0
  54. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/ccan/str/str.h +16 -0
  55. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/constant.h +50 -0
  56. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/dln.h +51 -0
  57. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/encindex.h +67 -0
  58. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/eval_intern.h +304 -0
  59. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/gc.h +114 -0
  60. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/id.h +211 -0
  61. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/id_table.h +30 -0
  62. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/insns.inc +110 -0
  63. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/insns_info.inc +776 -0
  64. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/internal.h +1408 -0
  65. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/iseq.h +249 -0
  66. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/known_errors.inc +746 -0
  67. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/method.h +213 -0
  68. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/node.h +520 -0
  69. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/node_name.inc +208 -0
  70. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/opt_sc.inc +758 -0
  71. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/optinsn.inc +83 -0
  72. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/optunifs.inc +127 -0
  73. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/parse.h +185 -0
  74. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/probes_helper.h +43 -0
  75. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/regenc.h +237 -0
  76. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/regint.h +987 -0
  77. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/regparse.h +367 -0
  78. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/revision.h +1 -0
  79. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/ruby_atomic.h +233 -0
  80. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/siphash.h +48 -0
  81. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/symbol.h +108 -0
  82. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/thread_pthread.h +54 -0
  83. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/thread_win32.h +36 -0
  84. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/timev.h +42 -0
  85. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/transcode_data.h +139 -0
  86. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/version.h +55 -0
  87. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm.inc +3414 -0
  88. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm_call_iseq_optimized.inc +212 -0
  89. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm_core.h +1240 -0
  90. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm_debug.h +37 -0
  91. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm_exec.h +182 -0
  92. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm_insnhelper.h +243 -0
  93. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vm_opts.h +57 -0
  94. data/lib/debase/ruby_core_source/ruby-2.3.6-p384/vmtc.inc +108 -0
  95. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/addr2line.h +21 -0
  96. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ccan/build_assert/build_assert.h +40 -0
  97. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ccan/check_type/check_type.h +63 -0
  98. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ccan/container_of/container_of.h +142 -0
  99. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ccan/list/list.h +773 -0
  100. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ccan/str/str.h +16 -0
  101. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/constant.h +50 -0
  102. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/dln.h +51 -0
  103. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/encindex.h +67 -0
  104. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/eval_intern.h +315 -0
  105. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/gc.h +114 -0
  106. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/id.h +220 -0
  107. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/id_table.h +31 -0
  108. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/insns.inc +112 -0
  109. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/insns_info.inc +796 -0
  110. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/internal.h +1790 -0
  111. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/iseq.h +252 -0
  112. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/known_errors.inc +746 -0
  113. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/method.h +213 -0
  114. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/node.h +520 -0
  115. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/node_name.inc +208 -0
  116. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/opt_sc.inc +774 -0
  117. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/optinsn.inc +83 -0
  118. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/optunifs.inc +129 -0
  119. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/parse.h +185 -0
  120. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/probes_helper.h +43 -0
  121. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/regenc.h +254 -0
  122. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/regint.h +938 -0
  123. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/regparse.h +370 -0
  124. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/revision.h +1 -0
  125. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ruby_assert.h +54 -0
  126. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/ruby_atomic.h +233 -0
  127. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/siphash.h +48 -0
  128. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/symbol.h +108 -0
  129. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/thread_pthread.h +54 -0
  130. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/thread_win32.h +36 -0
  131. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/timev.h +42 -0
  132. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/transcode_data.h +139 -0
  133. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/version.h +73 -0
  134. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm.inc +3415 -0
  135. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm_call_iseq_optimized.inc +212 -0
  136. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm_core.h +1646 -0
  137. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm_debug.h +37 -0
  138. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm_exec.h +182 -0
  139. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm_insnhelper.h +243 -0
  140. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vm_opts.h +57 -0
  141. data/lib/debase/ruby_core_source/ruby-2.4.3-p205/vmtc.inc +110 -0
  142. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/addr2line.h +21 -0
  143. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ccan/build_assert/build_assert.h +40 -0
  144. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ccan/check_type/check_type.h +63 -0
  145. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ccan/container_of/container_of.h +142 -0
  146. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ccan/list/list.h +773 -0
  147. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ccan/str/str.h +16 -0
  148. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/constant.h +50 -0
  149. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/debug_counter.h +109 -0
  150. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/dln.h +51 -0
  151. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/encindex.h +67 -0
  152. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/eval_intern.h +334 -0
  153. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/gc.h +116 -0
  154. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/id.h +250 -0
  155. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/id_table.h +31 -0
  156. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/insns.inc +217 -0
  157. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/insns_info.inc +1570 -0
  158. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/internal.h +2035 -0
  159. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/iseq.h +307 -0
  160. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/known_errors.inc +746 -0
  161. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/method.h +218 -0
  162. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/node.h +540 -0
  163. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/node_name.inc +198 -0
  164. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/opt_sc.inc +1601 -0
  165. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/optinsn.inc +103 -0
  166. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/optunifs.inc +61 -0
  167. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/parse.h +206 -0
  168. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/probes_helper.h +43 -0
  169. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/regenc.h +254 -0
  170. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/regint.h +938 -0
  171. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/regparse.h +370 -0
  172. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/revision.h +1 -0
  173. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ruby_assert.h +54 -0
  174. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/ruby_atomic.h +233 -0
  175. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/siphash.h +48 -0
  176. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/symbol.h +108 -0
  177. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/thread_pthread.h +54 -0
  178. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/thread_win32.h +36 -0
  179. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/timev.h +42 -0
  180. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/transcode_data.h +139 -0
  181. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/version.h +73 -0
  182. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm.inc +3667 -0
  183. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm_call_iseq_optimized.inc +213 -0
  184. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm_core.h +1768 -0
  185. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm_debug.h +37 -0
  186. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm_exec.h +192 -0
  187. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm_insnhelper.h +255 -0
  188. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vm_opts.h +57 -0
  189. data/lib/debase/ruby_core_source/ruby-2.5.0-rc1/vmtc.inc +214 -0
  190. data/lib/debase/ruby_core_source/version.rb +1 -1
  191. metadata +186 -2
@@ -0,0 +1,3415 @@
1
+ /* -*-c-*- *********************************************************/
2
+ /*******************************************************************/
3
+ /*******************************************************************/
4
+ /**
5
+ This file is VM main loop.
6
+
7
+ ----
8
+ This file is auto generated by insns2vm.rb
9
+ DO NOT TOUCH!
10
+
11
+ If you want to fix something, you must edit 'insns.def'
12
+ */
13
+
14
+
15
+ INSN_ENTRY(nop){
16
+ {
17
+
18
+
19
+ DEBUG_ENTER_INSN("nop");
20
+ ADD_PC(1+0);
21
+ PREFETCH(GET_PC());
22
+ #define CURRENT_INSN_nop 1
23
+ #define INSN_IS_SC() 0
24
+ #define INSN_LABEL(lab) LABEL_nop_##lab
25
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
26
+ COLLECT_USAGE_INSN(BIN(nop));
27
+ {
28
+ #line 40 "insns.def"
29
+ /* none */
30
+
31
+ #line 32 "vm.inc"
32
+ #undef CURRENT_INSN_nop
33
+ #undef INSN_IS_SC
34
+ #undef INSN_LABEL
35
+ #undef LABEL_IS_SC
36
+ END_INSN(nop);}}}
37
+ INSN_ENTRY(getlocal){
38
+ {
39
+ VALUE val;
40
+ rb_num_t level = (rb_num_t)GET_OPERAND(2);
41
+ lindex_t idx = (lindex_t)GET_OPERAND(1);
42
+
43
+ DEBUG_ENTER_INSN("getlocal");
44
+ ADD_PC(1+2);
45
+ PREFETCH(GET_PC());
46
+ #define CURRENT_INSN_getlocal 1
47
+ #define INSN_IS_SC() 0
48
+ #define INSN_LABEL(lab) LABEL_getlocal_##lab
49
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
50
+ COLLECT_USAGE_INSN(BIN(getlocal));
51
+ COLLECT_USAGE_OPERAND(BIN(getlocal), 0, idx);
52
+ COLLECT_USAGE_OPERAND(BIN(getlocal), 1, level);
53
+ {
54
+ #line 60 "insns.def"
55
+ int i, lev = (int)level;
56
+ const VALUE *ep = GET_EP();
57
+
58
+ /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
59
+ for (i = 0; i < lev; i++) {
60
+ ep = GET_PREV_EP(ep);
61
+ }
62
+ val = *(ep - idx);
63
+
64
+ #line 65 "vm.inc"
65
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
66
+ PUSH(val);
67
+ #undef CURRENT_INSN_getlocal
68
+ #undef INSN_IS_SC
69
+ #undef INSN_LABEL
70
+ #undef LABEL_IS_SC
71
+ END_INSN(getlocal);}}}
72
+ INSN_ENTRY(setlocal){
73
+ {
74
+ rb_num_t level = (rb_num_t)GET_OPERAND(2);
75
+ lindex_t idx = (lindex_t)GET_OPERAND(1);
76
+ VALUE val = TOPN(0);
77
+ DEBUG_ENTER_INSN("setlocal");
78
+ ADD_PC(1+2);
79
+ PREFETCH(GET_PC());
80
+ POPN(1);
81
+ #define CURRENT_INSN_setlocal 1
82
+ #define INSN_IS_SC() 0
83
+ #define INSN_LABEL(lab) LABEL_setlocal_##lab
84
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
85
+ COLLECT_USAGE_INSN(BIN(setlocal));
86
+ COLLECT_USAGE_OPERAND(BIN(setlocal), 0, idx);
87
+ COLLECT_USAGE_OPERAND(BIN(setlocal), 1, level);
88
+ {
89
+ #line 83 "insns.def"
90
+ int i, lev = (int)level;
91
+ const VALUE *ep = GET_EP();
92
+
93
+ /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
94
+ for (i = 0; i < lev; i++) {
95
+ ep = GET_PREV_EP(ep);
96
+ }
97
+ vm_env_write(ep, -(int)idx, val);
98
+
99
+ #line 100 "vm.inc"
100
+ #undef CURRENT_INSN_setlocal
101
+ #undef INSN_IS_SC
102
+ #undef INSN_LABEL
103
+ #undef LABEL_IS_SC
104
+ END_INSN(setlocal);}}}
105
+ INSN_ENTRY(getspecial){
106
+ {
107
+ VALUE val;
108
+ rb_num_t type = (rb_num_t)GET_OPERAND(2);
109
+ rb_num_t key = (rb_num_t)GET_OPERAND(1);
110
+
111
+ DEBUG_ENTER_INSN("getspecial");
112
+ ADD_PC(1+2);
113
+ PREFETCH(GET_PC());
114
+ #define CURRENT_INSN_getspecial 1
115
+ #define INSN_IS_SC() 0
116
+ #define INSN_LABEL(lab) LABEL_getspecial_##lab
117
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
118
+ COLLECT_USAGE_INSN(BIN(getspecial));
119
+ COLLECT_USAGE_OPERAND(BIN(getspecial), 0, key);
120
+ COLLECT_USAGE_OPERAND(BIN(getspecial), 1, type);
121
+ {
122
+ #line 104 "insns.def"
123
+ val = vm_getspecial(th, GET_LEP(), key, type);
124
+
125
+ #line 126 "vm.inc"
126
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
127
+ PUSH(val);
128
+ #undef CURRENT_INSN_getspecial
129
+ #undef INSN_IS_SC
130
+ #undef INSN_LABEL
131
+ #undef LABEL_IS_SC
132
+ END_INSN(getspecial);}}}
133
+ INSN_ENTRY(setspecial){
134
+ {
135
+ rb_num_t key = (rb_num_t)GET_OPERAND(1);
136
+ VALUE obj = TOPN(0);
137
+ DEBUG_ENTER_INSN("setspecial");
138
+ ADD_PC(1+1);
139
+ PREFETCH(GET_PC());
140
+ POPN(1);
141
+ #define CURRENT_INSN_setspecial 1
142
+ #define INSN_IS_SC() 0
143
+ #define INSN_LABEL(lab) LABEL_setspecial_##lab
144
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
145
+ COLLECT_USAGE_INSN(BIN(setspecial));
146
+ COLLECT_USAGE_OPERAND(BIN(setspecial), 0, key);
147
+ {
148
+ #line 118 "insns.def"
149
+ lep_svar_set(th, GET_LEP(), key, obj);
150
+
151
+ #line 152 "vm.inc"
152
+ #undef CURRENT_INSN_setspecial
153
+ #undef INSN_IS_SC
154
+ #undef INSN_LABEL
155
+ #undef LABEL_IS_SC
156
+ END_INSN(setspecial);}}}
157
+ INSN_ENTRY(getinstancevariable){
158
+ {
159
+ VALUE val;
160
+ IC ic = (IC)GET_OPERAND(2);
161
+ ID id = (ID)GET_OPERAND(1);
162
+
163
+ DEBUG_ENTER_INSN("getinstancevariable");
164
+ ADD_PC(1+2);
165
+ PREFETCH(GET_PC());
166
+ #define CURRENT_INSN_getinstancevariable 1
167
+ #define INSN_IS_SC() 0
168
+ #define INSN_LABEL(lab) LABEL_getinstancevariable_##lab
169
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
170
+ COLLECT_USAGE_INSN(BIN(getinstancevariable));
171
+ COLLECT_USAGE_OPERAND(BIN(getinstancevariable), 0, id);
172
+ COLLECT_USAGE_OPERAND(BIN(getinstancevariable), 1, ic);
173
+ {
174
+ #line 133 "insns.def"
175
+ val = vm_getinstancevariable(GET_SELF(), id, ic);
176
+
177
+ #line 178 "vm.inc"
178
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
179
+ PUSH(val);
180
+ #undef CURRENT_INSN_getinstancevariable
181
+ #undef INSN_IS_SC
182
+ #undef INSN_LABEL
183
+ #undef LABEL_IS_SC
184
+ END_INSN(getinstancevariable);}}}
185
+ INSN_ENTRY(setinstancevariable){
186
+ {
187
+ IC ic = (IC)GET_OPERAND(2);
188
+ ID id = (ID)GET_OPERAND(1);
189
+ VALUE val = TOPN(0);
190
+ DEBUG_ENTER_INSN("setinstancevariable");
191
+ ADD_PC(1+2);
192
+ PREFETCH(GET_PC());
193
+ POPN(1);
194
+ #define CURRENT_INSN_setinstancevariable 1
195
+ #define INSN_IS_SC() 0
196
+ #define INSN_LABEL(lab) LABEL_setinstancevariable_##lab
197
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
198
+ COLLECT_USAGE_INSN(BIN(setinstancevariable));
199
+ COLLECT_USAGE_OPERAND(BIN(setinstancevariable), 0, id);
200
+ COLLECT_USAGE_OPERAND(BIN(setinstancevariable), 1, ic);
201
+ {
202
+ #line 148 "insns.def"
203
+ vm_setinstancevariable(GET_SELF(), id, val, ic);
204
+
205
+ #line 206 "vm.inc"
206
+ #undef CURRENT_INSN_setinstancevariable
207
+ #undef INSN_IS_SC
208
+ #undef INSN_LABEL
209
+ #undef LABEL_IS_SC
210
+ END_INSN(setinstancevariable);}}}
211
+ INSN_ENTRY(getclassvariable){
212
+ {
213
+ VALUE val;
214
+ ID id = (ID)GET_OPERAND(1);
215
+
216
+ DEBUG_ENTER_INSN("getclassvariable");
217
+ ADD_PC(1+1);
218
+ PREFETCH(GET_PC());
219
+ #define CURRENT_INSN_getclassvariable 1
220
+ #define INSN_IS_SC() 0
221
+ #define INSN_LABEL(lab) LABEL_getclassvariable_##lab
222
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
223
+ COLLECT_USAGE_INSN(BIN(getclassvariable));
224
+ COLLECT_USAGE_OPERAND(BIN(getclassvariable), 0, id);
225
+ {
226
+ #line 162 "insns.def"
227
+ val = rb_cvar_get(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id);
228
+
229
+ #line 230 "vm.inc"
230
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
231
+ PUSH(val);
232
+ #undef CURRENT_INSN_getclassvariable
233
+ #undef INSN_IS_SC
234
+ #undef INSN_LABEL
235
+ #undef LABEL_IS_SC
236
+ END_INSN(getclassvariable);}}}
237
+ INSN_ENTRY(setclassvariable){
238
+ {
239
+ ID id = (ID)GET_OPERAND(1);
240
+ VALUE val = TOPN(0);
241
+ DEBUG_ENTER_INSN("setclassvariable");
242
+ ADD_PC(1+1);
243
+ PREFETCH(GET_PC());
244
+ POPN(1);
245
+ #define CURRENT_INSN_setclassvariable 1
246
+ #define INSN_IS_SC() 0
247
+ #define INSN_LABEL(lab) LABEL_setclassvariable_##lab
248
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
249
+ COLLECT_USAGE_INSN(BIN(setclassvariable));
250
+ COLLECT_USAGE_OPERAND(BIN(setclassvariable), 0, id);
251
+ {
252
+ #line 176 "insns.def"
253
+ vm_ensure_not_refinement_module(GET_SELF());
254
+ rb_cvar_set(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id, val);
255
+
256
+ #line 257 "vm.inc"
257
+ #undef CURRENT_INSN_setclassvariable
258
+ #undef INSN_IS_SC
259
+ #undef INSN_LABEL
260
+ #undef LABEL_IS_SC
261
+ END_INSN(setclassvariable);}}}
262
+ INSN_ENTRY(getconstant){
263
+ {
264
+ VALUE val;
265
+ ID id = (ID)GET_OPERAND(1);
266
+ VALUE klass = TOPN(0);
267
+ DEBUG_ENTER_INSN("getconstant");
268
+ ADD_PC(1+1);
269
+ PREFETCH(GET_PC());
270
+ POPN(1);
271
+ #define CURRENT_INSN_getconstant 1
272
+ #define INSN_IS_SC() 0
273
+ #define INSN_LABEL(lab) LABEL_getconstant_##lab
274
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
275
+ COLLECT_USAGE_INSN(BIN(getconstant));
276
+ COLLECT_USAGE_OPERAND(BIN(getconstant), 0, id);
277
+ {
278
+ #line 198 "insns.def"
279
+ val = vm_get_ev_const(th, klass, id, 0);
280
+
281
+ #line 282 "vm.inc"
282
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
283
+ PUSH(val);
284
+ #undef CURRENT_INSN_getconstant
285
+ #undef INSN_IS_SC
286
+ #undef INSN_LABEL
287
+ #undef LABEL_IS_SC
288
+ END_INSN(getconstant);}}}
289
+ INSN_ENTRY(setconstant){
290
+ {
291
+ ID id = (ID)GET_OPERAND(1);
292
+ VALUE val = TOPN(1);
293
+ VALUE cbase = TOPN(0);
294
+ DEBUG_ENTER_INSN("setconstant");
295
+ ADD_PC(1+1);
296
+ PREFETCH(GET_PC());
297
+ POPN(2);
298
+ #define CURRENT_INSN_setconstant 1
299
+ #define INSN_IS_SC() 0
300
+ #define INSN_LABEL(lab) LABEL_setconstant_##lab
301
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
302
+ COLLECT_USAGE_INSN(BIN(setconstant));
303
+ COLLECT_USAGE_OPERAND(BIN(setconstant), 0, id);
304
+ {
305
+ #line 220 "insns.def"
306
+ vm_check_if_namespace(cbase);
307
+ vm_ensure_not_refinement_module(GET_SELF());
308
+ rb_const_set(cbase, id, val);
309
+
310
+ #line 311 "vm.inc"
311
+ #undef CURRENT_INSN_setconstant
312
+ #undef INSN_IS_SC
313
+ #undef INSN_LABEL
314
+ #undef LABEL_IS_SC
315
+ END_INSN(setconstant);}}}
316
+ INSN_ENTRY(getglobal){
317
+ {
318
+ VALUE val;
319
+ GENTRY entry = (GENTRY)GET_OPERAND(1);
320
+
321
+ DEBUG_ENTER_INSN("getglobal");
322
+ ADD_PC(1+1);
323
+ PREFETCH(GET_PC());
324
+ #define CURRENT_INSN_getglobal 1
325
+ #define INSN_IS_SC() 0
326
+ #define INSN_LABEL(lab) LABEL_getglobal_##lab
327
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
328
+ COLLECT_USAGE_INSN(BIN(getglobal));
329
+ COLLECT_USAGE_OPERAND(BIN(getglobal), 0, entry);
330
+ {
331
+ #line 236 "insns.def"
332
+ val = GET_GLOBAL((VALUE)entry);
333
+
334
+ #line 335 "vm.inc"
335
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
336
+ PUSH(val);
337
+ #undef CURRENT_INSN_getglobal
338
+ #undef INSN_IS_SC
339
+ #undef INSN_LABEL
340
+ #undef LABEL_IS_SC
341
+ END_INSN(getglobal);}}}
342
+ INSN_ENTRY(setglobal){
343
+ {
344
+ GENTRY entry = (GENTRY)GET_OPERAND(1);
345
+ VALUE val = TOPN(0);
346
+ DEBUG_ENTER_INSN("setglobal");
347
+ ADD_PC(1+1);
348
+ PREFETCH(GET_PC());
349
+ POPN(1);
350
+ #define CURRENT_INSN_setglobal 1
351
+ #define INSN_IS_SC() 0
352
+ #define INSN_LABEL(lab) LABEL_setglobal_##lab
353
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
354
+ COLLECT_USAGE_INSN(BIN(setglobal));
355
+ COLLECT_USAGE_OPERAND(BIN(setglobal), 0, entry);
356
+ {
357
+ #line 250 "insns.def"
358
+ SET_GLOBAL((VALUE)entry, val);
359
+
360
+ #line 361 "vm.inc"
361
+ #undef CURRENT_INSN_setglobal
362
+ #undef INSN_IS_SC
363
+ #undef INSN_LABEL
364
+ #undef LABEL_IS_SC
365
+ END_INSN(setglobal);}}}
366
+ INSN_ENTRY(putnil){
367
+ {
368
+ VALUE val;
369
+
370
+
371
+ DEBUG_ENTER_INSN("putnil");
372
+ ADD_PC(1+0);
373
+ PREFETCH(GET_PC());
374
+ #define CURRENT_INSN_putnil 1
375
+ #define INSN_IS_SC() 0
376
+ #define INSN_LABEL(lab) LABEL_putnil_##lab
377
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
378
+ COLLECT_USAGE_INSN(BIN(putnil));
379
+ {
380
+ #line 269 "insns.def"
381
+ val = Qnil;
382
+
383
+ #line 384 "vm.inc"
384
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
385
+ PUSH(val);
386
+ #undef CURRENT_INSN_putnil
387
+ #undef INSN_IS_SC
388
+ #undef INSN_LABEL
389
+ #undef LABEL_IS_SC
390
+ END_INSN(putnil);}}}
391
+ INSN_ENTRY(putself){
392
+ {
393
+ VALUE val;
394
+
395
+
396
+ DEBUG_ENTER_INSN("putself");
397
+ ADD_PC(1+0);
398
+ PREFETCH(GET_PC());
399
+ #define CURRENT_INSN_putself 1
400
+ #define INSN_IS_SC() 0
401
+ #define INSN_LABEL(lab) LABEL_putself_##lab
402
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
403
+ COLLECT_USAGE_INSN(BIN(putself));
404
+ {
405
+ #line 283 "insns.def"
406
+ val = GET_SELF();
407
+
408
+ #line 409 "vm.inc"
409
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
410
+ PUSH(val);
411
+ #undef CURRENT_INSN_putself
412
+ #undef INSN_IS_SC
413
+ #undef INSN_LABEL
414
+ #undef LABEL_IS_SC
415
+ END_INSN(putself);}}}
416
+ INSN_ENTRY(putobject){
417
+ {
418
+ VALUE val = (VALUE)GET_OPERAND(1);
419
+
420
+ DEBUG_ENTER_INSN("putobject");
421
+ ADD_PC(1+1);
422
+ PREFETCH(GET_PC());
423
+ #define CURRENT_INSN_putobject 1
424
+ #define INSN_IS_SC() 0
425
+ #define INSN_LABEL(lab) LABEL_putobject_##lab
426
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
427
+ COLLECT_USAGE_INSN(BIN(putobject));
428
+ COLLECT_USAGE_OPERAND(BIN(putobject), 0, val);
429
+ {
430
+ #line 299 "insns.def"
431
+ /* */
432
+
433
+ #line 434 "vm.inc"
434
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
435
+ PUSH(val);
436
+ #undef CURRENT_INSN_putobject
437
+ #undef INSN_IS_SC
438
+ #undef INSN_LABEL
439
+ #undef LABEL_IS_SC
440
+ END_INSN(putobject);}}}
441
+ INSN_ENTRY(putspecialobject){
442
+ {
443
+ VALUE val;
444
+ rb_num_t value_type = (rb_num_t)GET_OPERAND(1);
445
+
446
+ DEBUG_ENTER_INSN("putspecialobject");
447
+ ADD_PC(1+1);
448
+ PREFETCH(GET_PC());
449
+ #define CURRENT_INSN_putspecialobject 1
450
+ #define INSN_IS_SC() 0
451
+ #define INSN_LABEL(lab) LABEL_putspecialobject_##lab
452
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
453
+ COLLECT_USAGE_INSN(BIN(putspecialobject));
454
+ COLLECT_USAGE_OPERAND(BIN(putspecialobject), 0, value_type);
455
+ {
456
+ #line 314 "insns.def"
457
+ enum vm_special_object_type type = (enum vm_special_object_type)value_type;
458
+
459
+ switch (type) {
460
+ case VM_SPECIAL_OBJECT_VMCORE:
461
+ val = rb_mRubyVMFrozenCore;
462
+ break;
463
+ case VM_SPECIAL_OBJECT_CBASE:
464
+ val = vm_get_cbase(GET_EP());
465
+ break;
466
+ case VM_SPECIAL_OBJECT_CONST_BASE:
467
+ val = vm_get_const_base(GET_EP());
468
+ break;
469
+ default:
470
+ rb_bug("putspecialobject insn: unknown value_type");
471
+ }
472
+
473
+ #line 474 "vm.inc"
474
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
475
+ PUSH(val);
476
+ #undef CURRENT_INSN_putspecialobject
477
+ #undef INSN_IS_SC
478
+ #undef INSN_LABEL
479
+ #undef LABEL_IS_SC
480
+ END_INSN(putspecialobject);}}}
481
+ INSN_ENTRY(putiseq){
482
+ {
483
+ VALUE ret;
484
+ ISEQ iseq = (ISEQ)GET_OPERAND(1);
485
+
486
+ DEBUG_ENTER_INSN("putiseq");
487
+ ADD_PC(1+1);
488
+ PREFETCH(GET_PC());
489
+ #define CURRENT_INSN_putiseq 1
490
+ #define INSN_IS_SC() 0
491
+ #define INSN_LABEL(lab) LABEL_putiseq_##lab
492
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
493
+ COLLECT_USAGE_INSN(BIN(putiseq));
494
+ COLLECT_USAGE_OPERAND(BIN(putiseq), 0, iseq);
495
+ {
496
+ #line 342 "insns.def"
497
+ ret = (VALUE)iseq;
498
+
499
+ #line 500 "vm.inc"
500
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
501
+ PUSH(ret);
502
+ #undef CURRENT_INSN_putiseq
503
+ #undef INSN_IS_SC
504
+ #undef INSN_LABEL
505
+ #undef LABEL_IS_SC
506
+ END_INSN(putiseq);}}}
507
+ INSN_ENTRY(putstring){
508
+ {
509
+ VALUE val;
510
+ VALUE str = (VALUE)GET_OPERAND(1);
511
+
512
+ DEBUG_ENTER_INSN("putstring");
513
+ ADD_PC(1+1);
514
+ PREFETCH(GET_PC());
515
+ #define CURRENT_INSN_putstring 1
516
+ #define INSN_IS_SC() 0
517
+ #define INSN_LABEL(lab) LABEL_putstring_##lab
518
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
519
+ COLLECT_USAGE_INSN(BIN(putstring));
520
+ COLLECT_USAGE_OPERAND(BIN(putstring), 0, str);
521
+ {
522
+ #line 356 "insns.def"
523
+ val = rb_str_resurrect(str);
524
+
525
+ #line 526 "vm.inc"
526
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
527
+ PUSH(val);
528
+ #undef CURRENT_INSN_putstring
529
+ #undef INSN_IS_SC
530
+ #undef INSN_LABEL
531
+ #undef LABEL_IS_SC
532
+ END_INSN(putstring);}}}
533
+ INSN_ENTRY(concatstrings){
534
+ {
535
+ VALUE val;
536
+ rb_num_t num = (rb_num_t)GET_OPERAND(1);
537
+
538
+ DEBUG_ENTER_INSN("concatstrings");
539
+ ADD_PC(1+1);
540
+ PREFETCH(GET_PC());
541
+ #define CURRENT_INSN_concatstrings 1
542
+ #define INSN_IS_SC() 0
543
+ #define INSN_LABEL(lab) LABEL_concatstrings_##lab
544
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
545
+ COLLECT_USAGE_INSN(BIN(concatstrings));
546
+ COLLECT_USAGE_OPERAND(BIN(concatstrings), 0, num);
547
+ {
548
+ #line 370 "insns.def"
549
+ val = rb_str_concat_literals(num, &TOPN(num-1));
550
+ POPN(num);
551
+
552
+ #line 553 "vm.inc"
553
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
554
+ PUSH(val);
555
+ #undef CURRENT_INSN_concatstrings
556
+ #undef INSN_IS_SC
557
+ #undef INSN_LABEL
558
+ #undef LABEL_IS_SC
559
+ END_INSN(concatstrings);}}}
560
+ INSN_ENTRY(tostring){
561
+ {
562
+
563
+ VALUE val = TOPN(0);
564
+ DEBUG_ENTER_INSN("tostring");
565
+ ADD_PC(1+0);
566
+ PREFETCH(GET_PC());
567
+ POPN(1);
568
+ #define CURRENT_INSN_tostring 1
569
+ #define INSN_IS_SC() 0
570
+ #define INSN_LABEL(lab) LABEL_tostring_##lab
571
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
572
+ COLLECT_USAGE_INSN(BIN(tostring));
573
+ {
574
+ #line 385 "insns.def"
575
+ val = rb_obj_as_string(val);
576
+
577
+ #line 578 "vm.inc"
578
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
579
+ PUSH(val);
580
+ #undef CURRENT_INSN_tostring
581
+ #undef INSN_IS_SC
582
+ #undef INSN_LABEL
583
+ #undef LABEL_IS_SC
584
+ END_INSN(tostring);}}}
585
+ INSN_ENTRY(freezestring){
586
+ {
587
+ VALUE debug_info = (VALUE)GET_OPERAND(1);
588
+ VALUE str = TOPN(0);
589
+ DEBUG_ENTER_INSN("freezestring");
590
+ ADD_PC(1+1);
591
+ PREFETCH(GET_PC());
592
+ POPN(1);
593
+ #define CURRENT_INSN_freezestring 1
594
+ #define INSN_IS_SC() 0
595
+ #define INSN_LABEL(lab) LABEL_freezestring_##lab
596
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
597
+ COLLECT_USAGE_INSN(BIN(freezestring));
598
+ COLLECT_USAGE_OPERAND(BIN(freezestring), 0, debug_info);
599
+ {
600
+ #line 399 "insns.def"
601
+ if (!NIL_P(debug_info)) {
602
+ rb_ivar_set(str, id_debug_created_info, debug_info);
603
+ }
604
+ rb_str_freeze(str);
605
+
606
+ #line 607 "vm.inc"
607
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
608
+ PUSH(str);
609
+ #undef CURRENT_INSN_freezestring
610
+ #undef INSN_IS_SC
611
+ #undef INSN_LABEL
612
+ #undef LABEL_IS_SC
613
+ END_INSN(freezestring);}}}
614
+ INSN_ENTRY(toregexp){
615
+ {
616
+ VALUE val;
617
+ rb_num_t cnt = (rb_num_t)GET_OPERAND(2);
618
+ rb_num_t opt = (rb_num_t)GET_OPERAND(1);
619
+
620
+ DEBUG_ENTER_INSN("toregexp");
621
+ ADD_PC(1+2);
622
+ PREFETCH(GET_PC());
623
+ #define CURRENT_INSN_toregexp 1
624
+ #define INSN_IS_SC() 0
625
+ #define INSN_LABEL(lab) LABEL_toregexp_##lab
626
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
627
+ COLLECT_USAGE_INSN(BIN(toregexp));
628
+ COLLECT_USAGE_OPERAND(BIN(toregexp), 0, opt);
629
+ COLLECT_USAGE_OPERAND(BIN(toregexp), 1, cnt);
630
+ {
631
+ #line 418 "insns.def"
632
+ VALUE rb_reg_new_ary(VALUE ary, int options);
633
+ rb_num_t i;
634
+ const VALUE ary = rb_ary_tmp_new(cnt);
635
+ for (i = 0; i < cnt; i++) {
636
+ rb_ary_store(ary, cnt-i-1, TOPN(i));
637
+ }
638
+ POPN(cnt);
639
+ val = rb_reg_new_ary(ary, (int)opt);
640
+ rb_ary_clear(ary);
641
+
642
+ #line 643 "vm.inc"
643
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
644
+ PUSH(val);
645
+ #undef CURRENT_INSN_toregexp
646
+ #undef INSN_IS_SC
647
+ #undef INSN_LABEL
648
+ #undef LABEL_IS_SC
649
+ END_INSN(toregexp);}}}
650
+ INSN_ENTRY(newarray){
651
+ {
652
+ VALUE val;
653
+ rb_num_t num = (rb_num_t)GET_OPERAND(1);
654
+
655
+ DEBUG_ENTER_INSN("newarray");
656
+ ADD_PC(1+1);
657
+ PREFETCH(GET_PC());
658
+ #define CURRENT_INSN_newarray 1
659
+ #define INSN_IS_SC() 0
660
+ #define INSN_LABEL(lab) LABEL_newarray_##lab
661
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
662
+ COLLECT_USAGE_INSN(BIN(newarray));
663
+ COLLECT_USAGE_OPERAND(BIN(newarray), 0, num);
664
+ {
665
+ #line 440 "insns.def"
666
+ val = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num));
667
+ POPN(num);
668
+
669
+ #line 670 "vm.inc"
670
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
671
+ PUSH(val);
672
+ #undef CURRENT_INSN_newarray
673
+ #undef INSN_IS_SC
674
+ #undef INSN_LABEL
675
+ #undef LABEL_IS_SC
676
+ END_INSN(newarray);}}}
677
+ INSN_ENTRY(duparray){
678
+ {
679
+ VALUE val;
680
+ VALUE ary = (VALUE)GET_OPERAND(1);
681
+
682
+ DEBUG_ENTER_INSN("duparray");
683
+ ADD_PC(1+1);
684
+ PREFETCH(GET_PC());
685
+ #define CURRENT_INSN_duparray 1
686
+ #define INSN_IS_SC() 0
687
+ #define INSN_LABEL(lab) LABEL_duparray_##lab
688
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
689
+ COLLECT_USAGE_INSN(BIN(duparray));
690
+ COLLECT_USAGE_OPERAND(BIN(duparray), 0, ary);
691
+ {
692
+ #line 455 "insns.def"
693
+ val = rb_ary_resurrect(ary);
694
+
695
+ #line 696 "vm.inc"
696
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
697
+ PUSH(val);
698
+ #undef CURRENT_INSN_duparray
699
+ #undef INSN_IS_SC
700
+ #undef INSN_LABEL
701
+ #undef LABEL_IS_SC
702
+ END_INSN(duparray);}}}
703
+ INSN_ENTRY(expandarray){
704
+ {
705
+ rb_num_t flag = (rb_num_t)GET_OPERAND(2);
706
+ rb_num_t num = (rb_num_t)GET_OPERAND(1);
707
+ VALUE ary = TOPN(0);
708
+ DEBUG_ENTER_INSN("expandarray");
709
+ ADD_PC(1+2);
710
+ PREFETCH(GET_PC());
711
+ POPN(1);
712
+ #define CURRENT_INSN_expandarray 1
713
+ #define INSN_IS_SC() 0
714
+ #define INSN_LABEL(lab) LABEL_expandarray_##lab
715
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
716
+ COLLECT_USAGE_INSN(BIN(expandarray));
717
+ COLLECT_USAGE_OPERAND(BIN(expandarray), 0, num);
718
+ COLLECT_USAGE_OPERAND(BIN(expandarray), 1, flag);
719
+ {
720
+ #line 483 "insns.def"
721
+ vm_expandarray(GET_CFP(), ary, num, (int)flag);
722
+
723
+ #line 724 "vm.inc"
724
+ #undef CURRENT_INSN_expandarray
725
+ #undef INSN_IS_SC
726
+ #undef INSN_LABEL
727
+ #undef LABEL_IS_SC
728
+ END_INSN(expandarray);}}}
729
+ INSN_ENTRY(concatarray){
730
+ {
731
+ VALUE ary;
732
+
733
+ VALUE ary1 = TOPN(1);
734
+ VALUE ary2st = TOPN(0);
735
+ DEBUG_ENTER_INSN("concatarray");
736
+ ADD_PC(1+0);
737
+ PREFETCH(GET_PC());
738
+ POPN(2);
739
+ #define CURRENT_INSN_concatarray 1
740
+ #define INSN_IS_SC() 0
741
+ #define INSN_LABEL(lab) LABEL_concatarray_##lab
742
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
743
+ COLLECT_USAGE_INSN(BIN(concatarray));
744
+ {
745
+ #line 497 "insns.def"
746
+ const VALUE ary2 = ary2st;
747
+ VALUE tmp1 = rb_check_convert_type(ary1, T_ARRAY, "Array", "to_a");
748
+ VALUE tmp2 = rb_check_convert_type(ary2, T_ARRAY, "Array", "to_a");
749
+
750
+ if (NIL_P(tmp1)) {
751
+ tmp1 = rb_ary_new3(1, ary1);
752
+ }
753
+
754
+ if (NIL_P(tmp2)) {
755
+ tmp2 = rb_ary_new3(1, ary2);
756
+ }
757
+
758
+ if (tmp1 == ary1) {
759
+ tmp1 = rb_ary_dup(ary1);
760
+ }
761
+ ary = rb_ary_concat(tmp1, tmp2);
762
+
763
+ #line 764 "vm.inc"
764
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
765
+ PUSH(ary);
766
+ #undef CURRENT_INSN_concatarray
767
+ #undef INSN_IS_SC
768
+ #undef INSN_LABEL
769
+ #undef LABEL_IS_SC
770
+ END_INSN(concatarray);}}}
771
+ INSN_ENTRY(splatarray){
772
+ {
773
+ VALUE obj;
774
+ VALUE flag = (VALUE)GET_OPERAND(1);
775
+ VALUE ary = TOPN(0);
776
+ DEBUG_ENTER_INSN("splatarray");
777
+ ADD_PC(1+1);
778
+ PREFETCH(GET_PC());
779
+ POPN(1);
780
+ #define CURRENT_INSN_splatarray 1
781
+ #define INSN_IS_SC() 0
782
+ #define INSN_LABEL(lab) LABEL_splatarray_##lab
783
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
784
+ COLLECT_USAGE_INSN(BIN(splatarray));
785
+ COLLECT_USAGE_OPERAND(BIN(splatarray), 0, flag);
786
+ {
787
+ #line 526 "insns.def"
788
+ VALUE tmp = rb_check_convert_type(ary, T_ARRAY, "Array", "to_a");
789
+ if (NIL_P(tmp)) {
790
+ tmp = rb_ary_new3(1, ary);
791
+ }
792
+ else if (RTEST(flag)) {
793
+ tmp = rb_ary_dup(tmp);
794
+ }
795
+ obj = tmp;
796
+
797
+ #line 798 "vm.inc"
798
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
799
+ PUSH(obj);
800
+ #undef CURRENT_INSN_splatarray
801
+ #undef INSN_IS_SC
802
+ #undef INSN_LABEL
803
+ #undef LABEL_IS_SC
804
+ END_INSN(splatarray);}}}
805
+ INSN_ENTRY(newhash){
806
+ {
807
+ VALUE val;
808
+ rb_num_t num = (rb_num_t)GET_OPERAND(1);
809
+
810
+ DEBUG_ENTER_INSN("newhash");
811
+ ADD_PC(1+1);
812
+ PREFETCH(GET_PC());
813
+ #define CURRENT_INSN_newhash 1
814
+ #define INSN_IS_SC() 0
815
+ #define INSN_LABEL(lab) LABEL_newhash_##lab
816
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
817
+ COLLECT_USAGE_INSN(BIN(newhash));
818
+ COLLECT_USAGE_OPERAND(BIN(newhash), 0, num);
819
+ {
820
+ #line 548 "insns.def"
821
+ rb_num_t i;
822
+
823
+ RUBY_DTRACE_CREATE_HOOK(HASH, num);
824
+
825
+ val = rb_hash_new();
826
+
827
+ for (i = num; i > 0; i -= 2) {
828
+ const VALUE v = TOPN(i - 2);
829
+ const VALUE k = TOPN(i - 1);
830
+ rb_hash_aset(val, k, v);
831
+ }
832
+ POPN(num);
833
+
834
+ #line 835 "vm.inc"
835
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
836
+ PUSH(val);
837
+ #undef CURRENT_INSN_newhash
838
+ #undef INSN_IS_SC
839
+ #undef INSN_LABEL
840
+ #undef LABEL_IS_SC
841
+ END_INSN(newhash);}}}
842
+ INSN_ENTRY(newrange){
843
+ {
844
+ VALUE val;
845
+ rb_num_t flag = (rb_num_t)GET_OPERAND(1);
846
+ VALUE low = TOPN(1);
847
+ VALUE high = TOPN(0);
848
+ DEBUG_ENTER_INSN("newrange");
849
+ ADD_PC(1+1);
850
+ PREFETCH(GET_PC());
851
+ POPN(2);
852
+ #define CURRENT_INSN_newrange 1
853
+ #define INSN_IS_SC() 0
854
+ #define INSN_LABEL(lab) LABEL_newrange_##lab
855
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
856
+ COLLECT_USAGE_INSN(BIN(newrange));
857
+ COLLECT_USAGE_OPERAND(BIN(newrange), 0, flag);
858
+ {
859
+ #line 573 "insns.def"
860
+ val = rb_range_new(low, high, (int)flag);
861
+
862
+ #line 863 "vm.inc"
863
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
864
+ PUSH(val);
865
+ #undef CURRENT_INSN_newrange
866
+ #undef INSN_IS_SC
867
+ #undef INSN_LABEL
868
+ #undef LABEL_IS_SC
869
+ END_INSN(newrange);}}}
870
+ INSN_ENTRY(pop){
871
+ {
872
+
873
+ VALUE val = TOPN(0);
874
+ DEBUG_ENTER_INSN("pop");
875
+ ADD_PC(1+0);
876
+ PREFETCH(GET_PC());
877
+ POPN(1);
878
+ #define CURRENT_INSN_pop 1
879
+ #define INSN_IS_SC() 0
880
+ #define INSN_LABEL(lab) LABEL_pop_##lab
881
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
882
+ COLLECT_USAGE_INSN(BIN(pop));
883
+ {
884
+ #line 591 "insns.def"
885
+ (void)val;
886
+ /* none */
887
+
888
+ #line 889 "vm.inc"
889
+ #undef CURRENT_INSN_pop
890
+ #undef INSN_IS_SC
891
+ #undef INSN_LABEL
892
+ #undef LABEL_IS_SC
893
+ END_INSN(pop);}}}
894
+ INSN_ENTRY(dup){
895
+ {
896
+ VALUE val2;
897
+ VALUE val1;
898
+
899
+ VALUE val = TOPN(0);
900
+ DEBUG_ENTER_INSN("dup");
901
+ ADD_PC(1+0);
902
+ PREFETCH(GET_PC());
903
+ POPN(1);
904
+ #define CURRENT_INSN_dup 1
905
+ #define INSN_IS_SC() 0
906
+ #define INSN_LABEL(lab) LABEL_dup_##lab
907
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
908
+ COLLECT_USAGE_INSN(BIN(dup));
909
+ {
910
+ #line 606 "insns.def"
911
+ val1 = val2 = val;
912
+
913
+ #line 914 "vm.inc"
914
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 2);
915
+ PUSH(val1);
916
+ PUSH(val2);
917
+ #undef CURRENT_INSN_dup
918
+ #undef INSN_IS_SC
919
+ #undef INSN_LABEL
920
+ #undef LABEL_IS_SC
921
+ END_INSN(dup);}}}
922
+ INSN_ENTRY(dupn){
923
+ {
924
+ rb_num_t n = (rb_num_t)GET_OPERAND(1);
925
+
926
+ DEBUG_ENTER_INSN("dupn");
927
+ ADD_PC(1+1);
928
+ PREFETCH(GET_PC());
929
+ #define CURRENT_INSN_dupn 1
930
+ #define INSN_IS_SC() 0
931
+ #define INSN_LABEL(lab) LABEL_dupn_##lab
932
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
933
+ COLLECT_USAGE_INSN(BIN(dupn));
934
+ COLLECT_USAGE_OPERAND(BIN(dupn), 0, n);
935
+ {
936
+ #line 620 "insns.def"
937
+ rb_num_t i;
938
+ VALUE *sp = STACK_ADDR_FROM_TOP(n);
939
+ for (i = 0; i < n; i++) {
940
+ GET_SP()[i] = sp[i];
941
+ }
942
+ INC_SP(n);
943
+
944
+ #line 945 "vm.inc"
945
+ #undef CURRENT_INSN_dupn
946
+ #undef INSN_IS_SC
947
+ #undef INSN_LABEL
948
+ #undef LABEL_IS_SC
949
+ END_INSN(dupn);}}}
950
+ INSN_ENTRY(swap){
951
+ {
952
+
953
+ VALUE val = TOPN(1);
954
+ VALUE obj = TOPN(0);
955
+ DEBUG_ENTER_INSN("swap");
956
+ ADD_PC(1+0);
957
+ PREFETCH(GET_PC());
958
+ POPN(2);
959
+ #define CURRENT_INSN_swap 1
960
+ #define INSN_IS_SC() 0
961
+ #define INSN_LABEL(lab) LABEL_swap_##lab
962
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
963
+ COLLECT_USAGE_INSN(BIN(swap));
964
+ {
965
+ #line 640 "insns.def"
966
+ /* none */
967
+
968
+ #line 969 "vm.inc"
969
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 2);
970
+ PUSH(obj);
971
+ PUSH(val);
972
+ #undef CURRENT_INSN_swap
973
+ #undef INSN_IS_SC
974
+ #undef INSN_LABEL
975
+ #undef LABEL_IS_SC
976
+ END_INSN(swap);}}}
977
+ INSN_ENTRY(reverse){
978
+ {
979
+ rb_num_t n = (rb_num_t)GET_OPERAND(1);
980
+
981
+ DEBUG_ENTER_INSN("reverse");
982
+ ADD_PC(1+1);
983
+ PREFETCH(GET_PC());
984
+ #define CURRENT_INSN_reverse 1
985
+ #define INSN_IS_SC() 0
986
+ #define INSN_LABEL(lab) LABEL_reverse_##lab
987
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
988
+ COLLECT_USAGE_INSN(BIN(reverse));
989
+ COLLECT_USAGE_OPERAND(BIN(reverse), 0, n);
990
+ {
991
+ #line 654 "insns.def"
992
+ rb_num_t i;
993
+ VALUE *sp = STACK_ADDR_FROM_TOP(n);
994
+
995
+ for (i=0; i<n/2; i++) {
996
+ VALUE v0 = sp[i];
997
+ VALUE v1 = TOPN(i);
998
+ sp[i] = v1;
999
+ TOPN(i) = v0;
1000
+ }
1001
+
1002
+ #line 1003 "vm.inc"
1003
+ #undef CURRENT_INSN_reverse
1004
+ #undef INSN_IS_SC
1005
+ #undef INSN_LABEL
1006
+ #undef LABEL_IS_SC
1007
+ END_INSN(reverse);}}}
1008
+ INSN_ENTRY(reput){
1009
+ {
1010
+
1011
+ VALUE val = TOPN(0);
1012
+ DEBUG_ENTER_INSN("reput");
1013
+ ADD_PC(1+0);
1014
+ PREFETCH(GET_PC());
1015
+ POPN(1);
1016
+ #define CURRENT_INSN_reput 1
1017
+ #define INSN_IS_SC() 0
1018
+ #define INSN_LABEL(lab) LABEL_reput_##lab
1019
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1020
+ COLLECT_USAGE_INSN(BIN(reput));
1021
+ {
1022
+ #line 676 "insns.def"
1023
+ /* none */
1024
+
1025
+ #line 1026 "vm.inc"
1026
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1027
+ PUSH(val);
1028
+ #undef CURRENT_INSN_reput
1029
+ #undef INSN_IS_SC
1030
+ #undef INSN_LABEL
1031
+ #undef LABEL_IS_SC
1032
+ END_INSN(reput);}}}
1033
+ INSN_ENTRY(topn){
1034
+ {
1035
+ VALUE val;
1036
+ rb_num_t n = (rb_num_t)GET_OPERAND(1);
1037
+
1038
+ DEBUG_ENTER_INSN("topn");
1039
+ ADD_PC(1+1);
1040
+ PREFETCH(GET_PC());
1041
+ #define CURRENT_INSN_topn 1
1042
+ #define INSN_IS_SC() 0
1043
+ #define INSN_LABEL(lab) LABEL_topn_##lab
1044
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1045
+ COLLECT_USAGE_INSN(BIN(topn));
1046
+ COLLECT_USAGE_OPERAND(BIN(topn), 0, n);
1047
+ {
1048
+ #line 690 "insns.def"
1049
+ val = TOPN(n);
1050
+
1051
+ #line 1052 "vm.inc"
1052
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1053
+ PUSH(val);
1054
+ #undef CURRENT_INSN_topn
1055
+ #undef INSN_IS_SC
1056
+ #undef INSN_LABEL
1057
+ #undef LABEL_IS_SC
1058
+ END_INSN(topn);}}}
1059
+ INSN_ENTRY(setn){
1060
+ {
1061
+ rb_num_t n = (rb_num_t)GET_OPERAND(1);
1062
+ VALUE val = TOPN(0);
1063
+ DEBUG_ENTER_INSN("setn");
1064
+ ADD_PC(1+1);
1065
+ PREFETCH(GET_PC());
1066
+ POPN(1);
1067
+ #define CURRENT_INSN_setn 1
1068
+ #define INSN_IS_SC() 0
1069
+ #define INSN_LABEL(lab) LABEL_setn_##lab
1070
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1071
+ COLLECT_USAGE_INSN(BIN(setn));
1072
+ COLLECT_USAGE_OPERAND(BIN(setn), 0, n);
1073
+ {
1074
+ #line 704 "insns.def"
1075
+ TOPN(n-1) = val;
1076
+
1077
+ #line 1078 "vm.inc"
1078
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1079
+ PUSH(val);
1080
+ #undef CURRENT_INSN_setn
1081
+ #undef INSN_IS_SC
1082
+ #undef INSN_LABEL
1083
+ #undef LABEL_IS_SC
1084
+ END_INSN(setn);}}}
1085
+ INSN_ENTRY(adjuststack){
1086
+ {
1087
+ rb_num_t n = (rb_num_t)GET_OPERAND(1);
1088
+
1089
+ DEBUG_ENTER_INSN("adjuststack");
1090
+ ADD_PC(1+1);
1091
+ PREFETCH(GET_PC());
1092
+ #define CURRENT_INSN_adjuststack 1
1093
+ #define INSN_IS_SC() 0
1094
+ #define INSN_LABEL(lab) LABEL_adjuststack_##lab
1095
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1096
+ COLLECT_USAGE_INSN(BIN(adjuststack));
1097
+ COLLECT_USAGE_OPERAND(BIN(adjuststack), 0, n);
1098
+ {
1099
+ #line 718 "insns.def"
1100
+ DEC_SP(n);
1101
+
1102
+ #line 1103 "vm.inc"
1103
+ #undef CURRENT_INSN_adjuststack
1104
+ #undef INSN_IS_SC
1105
+ #undef INSN_LABEL
1106
+ #undef LABEL_IS_SC
1107
+ END_INSN(adjuststack);}}}
1108
+ INSN_ENTRY(defined){
1109
+ {
1110
+ VALUE val;
1111
+ VALUE needstr = (VALUE)GET_OPERAND(3);
1112
+ VALUE obj = (VALUE)GET_OPERAND(2);
1113
+ rb_num_t op_type = (rb_num_t)GET_OPERAND(1);
1114
+ VALUE v = TOPN(0);
1115
+ DEBUG_ENTER_INSN("defined");
1116
+ ADD_PC(1+3);
1117
+ PREFETCH(GET_PC());
1118
+ POPN(1);
1119
+ #define CURRENT_INSN_defined 1
1120
+ #define INSN_IS_SC() 0
1121
+ #define INSN_LABEL(lab) LABEL_defined_##lab
1122
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1123
+ COLLECT_USAGE_INSN(BIN(defined));
1124
+ COLLECT_USAGE_OPERAND(BIN(defined), 0, op_type);
1125
+ COLLECT_USAGE_OPERAND(BIN(defined), 1, obj);
1126
+ COLLECT_USAGE_OPERAND(BIN(defined), 2, needstr);
1127
+ {
1128
+ #line 737 "insns.def"
1129
+ val = vm_defined(th, GET_CFP(), op_type, obj, needstr, v);
1130
+
1131
+ #line 1132 "vm.inc"
1132
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1133
+ PUSH(val);
1134
+ #undef CURRENT_INSN_defined
1135
+ #undef INSN_IS_SC
1136
+ #undef INSN_LABEL
1137
+ #undef LABEL_IS_SC
1138
+ END_INSN(defined);}}}
1139
+ INSN_ENTRY(checkmatch){
1140
+ {
1141
+ VALUE result;
1142
+ rb_num_t flag = (rb_num_t)GET_OPERAND(1);
1143
+ VALUE target = TOPN(1);
1144
+ VALUE pattern = TOPN(0);
1145
+ DEBUG_ENTER_INSN("checkmatch");
1146
+ ADD_PC(1+1);
1147
+ PREFETCH(GET_PC());
1148
+ POPN(2);
1149
+ #define CURRENT_INSN_checkmatch 1
1150
+ #define INSN_IS_SC() 0
1151
+ #define INSN_LABEL(lab) LABEL_checkmatch_##lab
1152
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1153
+ COLLECT_USAGE_INSN(BIN(checkmatch));
1154
+ COLLECT_USAGE_OPERAND(BIN(checkmatch), 0, flag);
1155
+ {
1156
+ #line 756 "insns.def"
1157
+ enum vm_check_match_type checkmatch_type =
1158
+ (enum vm_check_match_type)(flag & VM_CHECKMATCH_TYPE_MASK);
1159
+ result = Qfalse;
1160
+
1161
+ if (flag & VM_CHECKMATCH_ARRAY) {
1162
+ long i;
1163
+ for (i = 0; i < RARRAY_LEN(pattern); i++) {
1164
+ if (RTEST(check_match(RARRAY_AREF(pattern, i), target, checkmatch_type))) {
1165
+ result = Qtrue;
1166
+ break;
1167
+ }
1168
+ }
1169
+ }
1170
+ else {
1171
+ if (RTEST(check_match(pattern, target, checkmatch_type))) {
1172
+ result = Qtrue;
1173
+ }
1174
+ }
1175
+
1176
+ #line 1177 "vm.inc"
1177
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1178
+ PUSH(result);
1179
+ #undef CURRENT_INSN_checkmatch
1180
+ #undef INSN_IS_SC
1181
+ #undef INSN_LABEL
1182
+ #undef LABEL_IS_SC
1183
+ END_INSN(checkmatch);}}}
1184
+ INSN_ENTRY(checkkeyword){
1185
+ {
1186
+ VALUE ret;
1187
+ rb_num_t keyword_index = (rb_num_t)GET_OPERAND(2);
1188
+ lindex_t kw_bits_index = (lindex_t)GET_OPERAND(1);
1189
+
1190
+ DEBUG_ENTER_INSN("checkkeyword");
1191
+ ADD_PC(1+2);
1192
+ PREFETCH(GET_PC());
1193
+ #define CURRENT_INSN_checkkeyword 1
1194
+ #define INSN_IS_SC() 0
1195
+ #define INSN_LABEL(lab) LABEL_checkkeyword_##lab
1196
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1197
+ COLLECT_USAGE_INSN(BIN(checkkeyword));
1198
+ COLLECT_USAGE_OPERAND(BIN(checkkeyword), 0, kw_bits_index);
1199
+ COLLECT_USAGE_OPERAND(BIN(checkkeyword), 1, keyword_index);
1200
+ {
1201
+ #line 787 "insns.def"
1202
+ const VALUE *ep = GET_EP();
1203
+ const VALUE kw_bits = *(ep - kw_bits_index);
1204
+
1205
+ if (FIXNUM_P(kw_bits)) {
1206
+ int bits = FIX2INT(kw_bits);
1207
+ ret = (bits & (0x01 << keyword_index)) ? Qfalse : Qtrue;
1208
+ }
1209
+ else {
1210
+ VM_ASSERT(RB_TYPE_P(kw_bits, T_HASH));
1211
+ ret = rb_hash_has_key(kw_bits, INT2FIX(keyword_index)) ? Qfalse : Qtrue;
1212
+ }
1213
+
1214
+ #line 1215 "vm.inc"
1215
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1216
+ PUSH(ret);
1217
+ #undef CURRENT_INSN_checkkeyword
1218
+ #undef INSN_IS_SC
1219
+ #undef INSN_LABEL
1220
+ #undef LABEL_IS_SC
1221
+ END_INSN(checkkeyword);}}}
1222
+ INSN_ENTRY(trace){
1223
+ {
1224
+ rb_num_t nf = (rb_num_t)GET_OPERAND(1);
1225
+
1226
+ DEBUG_ENTER_INSN("trace");
1227
+ ADD_PC(1+1);
1228
+ PREFETCH(GET_PC());
1229
+ #define CURRENT_INSN_trace 1
1230
+ #define INSN_IS_SC() 0
1231
+ #define INSN_LABEL(lab) LABEL_trace_##lab
1232
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1233
+ COLLECT_USAGE_INSN(BIN(trace));
1234
+ COLLECT_USAGE_OPERAND(BIN(trace), 0, nf);
1235
+ {
1236
+ #line 811 "insns.def"
1237
+ rb_event_flag_t flag = (rb_event_flag_t)nf;
1238
+
1239
+ if (RUBY_DTRACE_METHOD_ENTRY_ENABLED() ||
1240
+ RUBY_DTRACE_METHOD_RETURN_ENABLED() ||
1241
+ RUBY_DTRACE_CMETHOD_ENTRY_ENABLED() ||
1242
+ RUBY_DTRACE_CMETHOD_RETURN_ENABLED()) {
1243
+
1244
+ switch (flag) {
1245
+ case RUBY_EVENT_CALL:
1246
+ RUBY_DTRACE_METHOD_ENTRY_HOOK(th, 0, 0);
1247
+ break;
1248
+ case RUBY_EVENT_C_CALL:
1249
+ RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, 0, 0);
1250
+ break;
1251
+ case RUBY_EVENT_RETURN:
1252
+ RUBY_DTRACE_METHOD_RETURN_HOOK(th, 0, 0);
1253
+ break;
1254
+ case RUBY_EVENT_C_RETURN:
1255
+ RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, 0, 0);
1256
+ break;
1257
+ }
1258
+ }
1259
+
1260
+ EXEC_EVENT_HOOK(th, flag, GET_SELF(), 0, 0, 0 /* id and klass are resolved at callee */,
1261
+ (flag & (RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN)) ? TOPN(0) : Qundef);
1262
+
1263
+ #line 1264 "vm.inc"
1264
+ #undef CURRENT_INSN_trace
1265
+ #undef INSN_IS_SC
1266
+ #undef INSN_LABEL
1267
+ #undef LABEL_IS_SC
1268
+ END_INSN(trace);}}}
1269
+ INSN_ENTRY(defineclass){
1270
+ {
1271
+ VALUE val;
1272
+ rb_num_t flags = (rb_num_t)GET_OPERAND(3);
1273
+ ISEQ class_iseq = (ISEQ)GET_OPERAND(2);
1274
+ ID id = (ID)GET_OPERAND(1);
1275
+ VALUE cbase = TOPN(1);
1276
+ VALUE super = TOPN(0);
1277
+ DEBUG_ENTER_INSN("defineclass");
1278
+ ADD_PC(1+3);
1279
+ PREFETCH(GET_PC());
1280
+ POPN(2);
1281
+ #define CURRENT_INSN_defineclass 1
1282
+ #define INSN_IS_SC() 0
1283
+ #define INSN_LABEL(lab) LABEL_defineclass_##lab
1284
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1285
+ COLLECT_USAGE_INSN(BIN(defineclass));
1286
+ COLLECT_USAGE_OPERAND(BIN(defineclass), 0, id);
1287
+ COLLECT_USAGE_OPERAND(BIN(defineclass), 1, class_iseq);
1288
+ COLLECT_USAGE_OPERAND(BIN(defineclass), 2, flags);
1289
+ {
1290
+ #line 857 "insns.def"
1291
+ VALUE klass;
1292
+ rb_vm_defineclass_type_t type = VM_DEFINECLASS_TYPE(flags);
1293
+
1294
+ switch (type) {
1295
+ case VM_DEFINECLASS_TYPE_CLASS:
1296
+ /* val is dummy. classdef returns class scope value */
1297
+
1298
+ if (VM_DEFINECLASS_HAS_SUPERCLASS_P(flags) &&
1299
+ !RB_TYPE_P(super, T_CLASS)) {
1300
+ rb_raise(rb_eTypeError, "superclass must be a Class (%"PRIsVALUE" given)",
1301
+ rb_obj_class(super));
1302
+ }
1303
+
1304
+ vm_check_if_namespace(cbase);
1305
+
1306
+ /* find klass */
1307
+ rb_autoload_load(cbase, id);
1308
+ if ((klass = vm_search_const_defined_class(cbase, id)) != 0) {
1309
+ /* already exist */
1310
+ klass = VM_DEFINECLASS_SCOPED_P(flags) ?
1311
+ rb_public_const_get_at(klass, id) : rb_const_get_at(klass, id);
1312
+ if (!RB_TYPE_P(klass, T_CLASS)) {
1313
+ rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a class", rb_id2str(id));
1314
+ }
1315
+
1316
+ if (VM_DEFINECLASS_HAS_SUPERCLASS_P(flags)) {
1317
+ VALUE tmp;
1318
+ tmp = rb_class_real(RCLASS_SUPER(klass));
1319
+
1320
+ if (tmp != super) {
1321
+ rb_raise(rb_eTypeError, "superclass mismatch for class %"PRIsVALUE"",
1322
+ rb_id2str(id));
1323
+ }
1324
+ }
1325
+ }
1326
+ else {
1327
+ if (!VM_DEFINECLASS_HAS_SUPERCLASS_P(flags)) {
1328
+ super = rb_cObject;
1329
+ }
1330
+ /* new class declaration */
1331
+ klass = rb_define_class_id(id, super);
1332
+ rb_set_class_path_string(klass, cbase, rb_id2str(id));
1333
+ rb_const_set(cbase, id, klass);
1334
+ rb_class_inherited(super, klass);
1335
+ }
1336
+ break;
1337
+ case VM_DEFINECLASS_TYPE_SINGLETON_CLASS:
1338
+ /* val is dummy. classdef returns class scope value */
1339
+ /* super is dummy */
1340
+ klass = rb_singleton_class(cbase);
1341
+ break;
1342
+ case VM_DEFINECLASS_TYPE_MODULE:
1343
+ /* val is dummy. classdef returns class scope value */
1344
+ /* super is dummy */
1345
+
1346
+ vm_check_if_namespace(cbase);
1347
+
1348
+ /* find klass */
1349
+ if ((klass = vm_search_const_defined_class(cbase, id)) != 0) {
1350
+ klass = VM_DEFINECLASS_SCOPED_P(flags) ?
1351
+ rb_public_const_get_at(klass, id) : rb_const_get_at(klass, id);
1352
+ /* already exist */
1353
+ if (!RB_TYPE_P(klass, T_MODULE)) {
1354
+ rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a module", rb_id2str(id));
1355
+ }
1356
+ }
1357
+ else {
1358
+ /* new module declaration */
1359
+ klass = rb_define_module_id(id);
1360
+ rb_set_class_path_string(klass, cbase, rb_id2str(id));
1361
+ rb_const_set(cbase, id, klass);
1362
+ }
1363
+ break;
1364
+ default:
1365
+ rb_bug("unknown defineclass type: %d", (int)type);
1366
+ }
1367
+
1368
+ rb_iseq_check(class_iseq);
1369
+
1370
+ /* enter scope */
1371
+ vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS | VM_ENV_FLAG_LOCAL, klass,
1372
+ GET_BLOCK_HANDLER(),
1373
+ (VALUE)vm_cref_push(th, klass, NULL, FALSE),
1374
+ class_iseq->body->iseq_encoded, GET_SP(),
1375
+ class_iseq->body->local_table_size,
1376
+ class_iseq->body->stack_max);
1377
+ RESTORE_REGS();
1378
+ NEXT_INSN();
1379
+
1380
+ #line 1381 "vm.inc"
1381
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1382
+ PUSH(val);
1383
+ #undef CURRENT_INSN_defineclass
1384
+ #undef INSN_IS_SC
1385
+ #undef INSN_LABEL
1386
+ #undef LABEL_IS_SC
1387
+ END_INSN(defineclass);}}}
1388
+ INSN_ENTRY(send){
1389
+ {
1390
+ VALUE val;
1391
+ ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
1392
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
1393
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1394
+
1395
+ DEBUG_ENTER_INSN("send");
1396
+ ADD_PC(1+3);
1397
+ PREFETCH(GET_PC());
1398
+ #define CURRENT_INSN_send 1
1399
+ #define INSN_IS_SC() 0
1400
+ #define INSN_LABEL(lab) LABEL_send_##lab
1401
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1402
+ COLLECT_USAGE_INSN(BIN(send));
1403
+ COLLECT_USAGE_OPERAND(BIN(send), 0, ci);
1404
+ COLLECT_USAGE_OPERAND(BIN(send), 1, cc);
1405
+ COLLECT_USAGE_OPERAND(BIN(send), 2, blockiseq);
1406
+ {
1407
+ #line 963 "insns.def"
1408
+ struct rb_calling_info calling;
1409
+
1410
+ vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, FALSE);
1411
+ vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));
1412
+ CALL_METHOD(&calling, ci, cc);
1413
+
1414
+ #line 1415 "vm.inc"
1415
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1416
+ PUSH(val);
1417
+ #undef CURRENT_INSN_send
1418
+ #undef INSN_IS_SC
1419
+ #undef INSN_LABEL
1420
+ #undef LABEL_IS_SC
1421
+ END_INSN(send);}}}
1422
+ INSN_ENTRY(opt_str_freeze){
1423
+ {
1424
+ VALUE val;
1425
+ VALUE str = (VALUE)GET_OPERAND(1);
1426
+
1427
+ DEBUG_ENTER_INSN("opt_str_freeze");
1428
+ ADD_PC(1+1);
1429
+ PREFETCH(GET_PC());
1430
+ #define CURRENT_INSN_opt_str_freeze 1
1431
+ #define INSN_IS_SC() 0
1432
+ #define INSN_LABEL(lab) LABEL_opt_str_freeze_##lab
1433
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1434
+ COLLECT_USAGE_INSN(BIN(opt_str_freeze));
1435
+ COLLECT_USAGE_OPERAND(BIN(opt_str_freeze), 0, str);
1436
+ {
1437
+ #line 976 "insns.def"
1438
+ if (BASIC_OP_UNREDEFINED_P(BOP_FREEZE, STRING_REDEFINED_OP_FLAG)) {
1439
+ val = str;
1440
+ }
1441
+ else {
1442
+ val = rb_funcall(rb_str_resurrect(str), idFreeze, 0);
1443
+ }
1444
+
1445
+ #line 1446 "vm.inc"
1446
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1447
+ PUSH(val);
1448
+ #undef CURRENT_INSN_opt_str_freeze
1449
+ #undef INSN_IS_SC
1450
+ #undef INSN_LABEL
1451
+ #undef LABEL_IS_SC
1452
+ END_INSN(opt_str_freeze);}}}
1453
+ INSN_ENTRY(opt_newarray_max){
1454
+ {
1455
+ VALUE val;
1456
+ rb_num_t num = (rb_num_t)GET_OPERAND(1);
1457
+
1458
+ DEBUG_ENTER_INSN("opt_newarray_max");
1459
+ ADD_PC(1+1);
1460
+ PREFETCH(GET_PC());
1461
+ #define CURRENT_INSN_opt_newarray_max 1
1462
+ #define INSN_IS_SC() 0
1463
+ #define INSN_LABEL(lab) LABEL_opt_newarray_max_##lab
1464
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1465
+ COLLECT_USAGE_INSN(BIN(opt_newarray_max));
1466
+ COLLECT_USAGE_OPERAND(BIN(opt_newarray_max), 0, num);
1467
+ {
1468
+ #line 990 "insns.def"
1469
+ #define id_cmp idCmp
1470
+ if (BASIC_OP_UNREDEFINED_P(BOP_MAX, ARRAY_REDEFINED_OP_FLAG)) {
1471
+ if (num == 0) {
1472
+ val = Qnil;
1473
+ }
1474
+ else {
1475
+ struct cmp_opt_data cmp_opt = { 0, 0 };
1476
+ VALUE result = Qundef;
1477
+ rb_num_t i = num - 1;
1478
+ result = TOPN(i);
1479
+ while (i-- > 0) {
1480
+ const VALUE v = TOPN(i);
1481
+ if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) > 0) {
1482
+ result = v;
1483
+ }
1484
+ }
1485
+ val = result == Qundef ? Qnil : result;
1486
+ }
1487
+ POPN(num);
1488
+ }
1489
+ else {
1490
+ VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num));
1491
+ val = rb_funcall(ary, idMax, 0);
1492
+ POPN(num);
1493
+ }
1494
+ #undef id_cmp
1495
+
1496
+ #line 1497 "vm.inc"
1497
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1498
+ PUSH(val);
1499
+ #undef CURRENT_INSN_opt_newarray_max
1500
+ #undef INSN_IS_SC
1501
+ #undef INSN_LABEL
1502
+ #undef LABEL_IS_SC
1503
+ END_INSN(opt_newarray_max);}}}
1504
+ INSN_ENTRY(opt_newarray_min){
1505
+ {
1506
+ VALUE val;
1507
+ rb_num_t num = (rb_num_t)GET_OPERAND(1);
1508
+
1509
+ DEBUG_ENTER_INSN("opt_newarray_min");
1510
+ ADD_PC(1+1);
1511
+ PREFETCH(GET_PC());
1512
+ #define CURRENT_INSN_opt_newarray_min 1
1513
+ #define INSN_IS_SC() 0
1514
+ #define INSN_LABEL(lab) LABEL_opt_newarray_min_##lab
1515
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1516
+ COLLECT_USAGE_INSN(BIN(opt_newarray_min));
1517
+ COLLECT_USAGE_OPERAND(BIN(opt_newarray_min), 0, num);
1518
+ {
1519
+ #line 1024 "insns.def"
1520
+ #define id_cmp idCmp
1521
+ if (BASIC_OP_UNREDEFINED_P(BOP_MIN, ARRAY_REDEFINED_OP_FLAG)) {
1522
+ if (num == 0) {
1523
+ val = Qnil;
1524
+ }
1525
+ else {
1526
+ struct cmp_opt_data cmp_opt = { 0, 0 };
1527
+ VALUE result = Qundef;
1528
+ rb_num_t i = num - 1;
1529
+ result = TOPN(i);
1530
+ while (i-- > 0) {
1531
+ const VALUE v = TOPN(i);
1532
+ if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) < 0) {
1533
+ result = v;
1534
+ }
1535
+ }
1536
+ val = result == Qundef ? Qnil : result;
1537
+ }
1538
+ POPN(num);
1539
+ }
1540
+ else {
1541
+ VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num));
1542
+ val = rb_funcall(ary, idMin, 0);
1543
+ POPN(num);
1544
+ }
1545
+ #undef id_cmp
1546
+
1547
+ #line 1548 "vm.inc"
1548
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1549
+ PUSH(val);
1550
+ #undef CURRENT_INSN_opt_newarray_min
1551
+ #undef INSN_IS_SC
1552
+ #undef INSN_LABEL
1553
+ #undef LABEL_IS_SC
1554
+ END_INSN(opt_newarray_min);}}}
1555
+ INSN_ENTRY(opt_send_without_block){
1556
+ {
1557
+ VALUE val;
1558
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
1559
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1560
+
1561
+ DEBUG_ENTER_INSN("opt_send_without_block");
1562
+ ADD_PC(1+2);
1563
+ PREFETCH(GET_PC());
1564
+ #define CURRENT_INSN_opt_send_without_block 1
1565
+ #define INSN_IS_SC() 0
1566
+ #define INSN_LABEL(lab) LABEL_opt_send_without_block_##lab
1567
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1568
+ COLLECT_USAGE_INSN(BIN(opt_send_without_block));
1569
+ COLLECT_USAGE_OPERAND(BIN(opt_send_without_block), 0, ci);
1570
+ COLLECT_USAGE_OPERAND(BIN(opt_send_without_block), 1, cc);
1571
+ {
1572
+ #line 1063 "insns.def"
1573
+ struct rb_calling_info calling;
1574
+ calling.block_handler = VM_BLOCK_HANDLER_NONE;
1575
+ vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));
1576
+ CALL_METHOD(&calling, ci, cc);
1577
+
1578
+ #line 1579 "vm.inc"
1579
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1580
+ PUSH(val);
1581
+ #undef CURRENT_INSN_opt_send_without_block
1582
+ #undef INSN_IS_SC
1583
+ #undef INSN_LABEL
1584
+ #undef LABEL_IS_SC
1585
+ END_INSN(opt_send_without_block);}}}
1586
+ INSN_ENTRY(invokesuper){
1587
+ {
1588
+ VALUE val;
1589
+ ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
1590
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
1591
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1592
+
1593
+ DEBUG_ENTER_INSN("invokesuper");
1594
+ ADD_PC(1+3);
1595
+ PREFETCH(GET_PC());
1596
+ #define CURRENT_INSN_invokesuper 1
1597
+ #define INSN_IS_SC() 0
1598
+ #define INSN_LABEL(lab) LABEL_invokesuper_##lab
1599
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1600
+ COLLECT_USAGE_INSN(BIN(invokesuper));
1601
+ COLLECT_USAGE_OPERAND(BIN(invokesuper), 0, ci);
1602
+ COLLECT_USAGE_OPERAND(BIN(invokesuper), 1, cc);
1603
+ COLLECT_USAGE_OPERAND(BIN(invokesuper), 2, blockiseq);
1604
+ {
1605
+ #line 1080 "insns.def"
1606
+ struct rb_calling_info calling;
1607
+ calling.argc = ci->orig_argc;
1608
+
1609
+ vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, TRUE);
1610
+ calling.recv = GET_SELF();
1611
+ vm_search_super_method(th, GET_CFP(), &calling, ci, cc);
1612
+ CALL_METHOD(&calling, ci, cc);
1613
+
1614
+ #line 1615 "vm.inc"
1615
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1616
+ PUSH(val);
1617
+ #undef CURRENT_INSN_invokesuper
1618
+ #undef INSN_IS_SC
1619
+ #undef INSN_LABEL
1620
+ #undef LABEL_IS_SC
1621
+ END_INSN(invokesuper);}}}
1622
+ INSN_ENTRY(invokeblock){
1623
+ {
1624
+ VALUE val;
1625
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1626
+
1627
+ DEBUG_ENTER_INSN("invokeblock");
1628
+ ADD_PC(1+1);
1629
+ PREFETCH(GET_PC());
1630
+ #define CURRENT_INSN_invokeblock 1
1631
+ #define INSN_IS_SC() 0
1632
+ #define INSN_LABEL(lab) LABEL_invokeblock_##lab
1633
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1634
+ COLLECT_USAGE_INSN(BIN(invokeblock));
1635
+ COLLECT_USAGE_OPERAND(BIN(invokeblock), 0, ci);
1636
+ {
1637
+ #line 1100 "insns.def"
1638
+ struct rb_calling_info calling;
1639
+ calling.argc = ci->orig_argc;
1640
+ calling.block_handler = VM_BLOCK_HANDLER_NONE;
1641
+ calling.recv = GET_SELF();
1642
+
1643
+ val = vm_invoke_block(th, GET_CFP(), &calling, ci);
1644
+ if (val == Qundef) {
1645
+ RESTORE_REGS();
1646
+ NEXT_INSN();
1647
+ }
1648
+
1649
+ #line 1650 "vm.inc"
1650
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1651
+ PUSH(val);
1652
+ #undef CURRENT_INSN_invokeblock
1653
+ #undef INSN_IS_SC
1654
+ #undef INSN_LABEL
1655
+ #undef LABEL_IS_SC
1656
+ END_INSN(invokeblock);}}}
1657
+ INSN_ENTRY(leave){
1658
+ {
1659
+
1660
+ VALUE val = TOPN(0);
1661
+ DEBUG_ENTER_INSN("leave");
1662
+ ADD_PC(1+0);
1663
+ PREFETCH(GET_PC());
1664
+ POPN(1);
1665
+ #define CURRENT_INSN_leave 1
1666
+ #define INSN_IS_SC() 0
1667
+ #define INSN_LABEL(lab) LABEL_leave_##lab
1668
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1669
+ COLLECT_USAGE_INSN(BIN(leave));
1670
+ {
1671
+ #line 1123 "insns.def"
1672
+ if (OPT_CHECKED_RUN) {
1673
+ const VALUE *const bp = vm_base_ptr(reg_cfp);
1674
+ if (reg_cfp->sp != bp) {
1675
+ rb_bug("Stack consistency error (sp: %"PRIdPTRDIFF", bp: %"PRIdPTRDIFF")",
1676
+ VM_SP_CNT(th, reg_cfp->sp), VM_SP_CNT(th, bp));
1677
+ }
1678
+ }
1679
+
1680
+ RUBY_VM_CHECK_INTS(th);
1681
+
1682
+ if (vm_pop_frame(th, GET_CFP(), GET_EP())) {
1683
+ #if OPT_CALL_THREADED_CODE
1684
+ th->retval = val;
1685
+ return 0;
1686
+ #else
1687
+ return val;
1688
+ #endif
1689
+ }
1690
+ else {
1691
+ RESTORE_REGS();
1692
+ }
1693
+
1694
+ #line 1695 "vm.inc"
1695
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1696
+ PUSH(val);
1697
+ #undef CURRENT_INSN_leave
1698
+ #undef INSN_IS_SC
1699
+ #undef INSN_LABEL
1700
+ #undef LABEL_IS_SC
1701
+ END_INSN(leave);}}}
1702
+ INSN_ENTRY(throw){
1703
+ {
1704
+ VALUE val;
1705
+ rb_num_t throw_state = (rb_num_t)GET_OPERAND(1);
1706
+ VALUE throwobj = TOPN(0);
1707
+ DEBUG_ENTER_INSN("throw");
1708
+ ADD_PC(1+1);
1709
+ PREFETCH(GET_PC());
1710
+ POPN(1);
1711
+ #define CURRENT_INSN_throw 1
1712
+ #define INSN_IS_SC() 0
1713
+ #define INSN_LABEL(lab) LABEL_throw_##lab
1714
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1715
+ COLLECT_USAGE_INSN(BIN(throw));
1716
+ COLLECT_USAGE_OPERAND(BIN(throw), 0, throw_state);
1717
+ {
1718
+ #line 1161 "insns.def"
1719
+ RUBY_VM_CHECK_INTS(th);
1720
+ val = vm_throw(th, GET_CFP(), throw_state, throwobj);
1721
+ THROW_EXCEPTION(val);
1722
+ /* unreachable */
1723
+
1724
+ #line 1725 "vm.inc"
1725
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1726
+ PUSH(val);
1727
+ #undef CURRENT_INSN_throw
1728
+ #undef INSN_IS_SC
1729
+ #undef INSN_LABEL
1730
+ #undef LABEL_IS_SC
1731
+ END_INSN(throw);}}}
1732
+ INSN_ENTRY(jump){
1733
+ {
1734
+ OFFSET dst = (OFFSET)GET_OPERAND(1);
1735
+
1736
+ DEBUG_ENTER_INSN("jump");
1737
+ ADD_PC(1+1);
1738
+ PREFETCH(GET_PC());
1739
+ #define CURRENT_INSN_jump 1
1740
+ #define INSN_IS_SC() 0
1741
+ #define INSN_LABEL(lab) LABEL_jump_##lab
1742
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1743
+ COLLECT_USAGE_INSN(BIN(jump));
1744
+ COLLECT_USAGE_OPERAND(BIN(jump), 0, dst);
1745
+ {
1746
+ #line 1182 "insns.def"
1747
+ RUBY_VM_CHECK_INTS(th);
1748
+ JUMP(dst);
1749
+
1750
+ #line 1751 "vm.inc"
1751
+ #undef CURRENT_INSN_jump
1752
+ #undef INSN_IS_SC
1753
+ #undef INSN_LABEL
1754
+ #undef LABEL_IS_SC
1755
+ END_INSN(jump);}}}
1756
+ INSN_ENTRY(branchif){
1757
+ {
1758
+ OFFSET dst = (OFFSET)GET_OPERAND(1);
1759
+ VALUE val = TOPN(0);
1760
+ DEBUG_ENTER_INSN("branchif");
1761
+ ADD_PC(1+1);
1762
+ PREFETCH(GET_PC());
1763
+ POPN(1);
1764
+ #define CURRENT_INSN_branchif 1
1765
+ #define INSN_IS_SC() 0
1766
+ #define INSN_LABEL(lab) LABEL_branchif_##lab
1767
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1768
+ COLLECT_USAGE_INSN(BIN(branchif));
1769
+ COLLECT_USAGE_OPERAND(BIN(branchif), 0, dst);
1770
+ {
1771
+ #line 1197 "insns.def"
1772
+ if (RTEST(val)) {
1773
+ RUBY_VM_CHECK_INTS(th);
1774
+ JUMP(dst);
1775
+ }
1776
+
1777
+ #line 1778 "vm.inc"
1778
+ #undef CURRENT_INSN_branchif
1779
+ #undef INSN_IS_SC
1780
+ #undef INSN_LABEL
1781
+ #undef LABEL_IS_SC
1782
+ END_INSN(branchif);}}}
1783
+ INSN_ENTRY(branchunless){
1784
+ {
1785
+ OFFSET dst = (OFFSET)GET_OPERAND(1);
1786
+ VALUE val = TOPN(0);
1787
+ DEBUG_ENTER_INSN("branchunless");
1788
+ ADD_PC(1+1);
1789
+ PREFETCH(GET_PC());
1790
+ POPN(1);
1791
+ #define CURRENT_INSN_branchunless 1
1792
+ #define INSN_IS_SC() 0
1793
+ #define INSN_LABEL(lab) LABEL_branchunless_##lab
1794
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1795
+ COLLECT_USAGE_INSN(BIN(branchunless));
1796
+ COLLECT_USAGE_OPERAND(BIN(branchunless), 0, dst);
1797
+ {
1798
+ #line 1214 "insns.def"
1799
+ if (!RTEST(val)) {
1800
+ RUBY_VM_CHECK_INTS(th);
1801
+ JUMP(dst);
1802
+ }
1803
+
1804
+ #line 1805 "vm.inc"
1805
+ #undef CURRENT_INSN_branchunless
1806
+ #undef INSN_IS_SC
1807
+ #undef INSN_LABEL
1808
+ #undef LABEL_IS_SC
1809
+ END_INSN(branchunless);}}}
1810
+ INSN_ENTRY(branchnil){
1811
+ {
1812
+ OFFSET dst = (OFFSET)GET_OPERAND(1);
1813
+ VALUE val = TOPN(0);
1814
+ DEBUG_ENTER_INSN("branchnil");
1815
+ ADD_PC(1+1);
1816
+ PREFETCH(GET_PC());
1817
+ POPN(1);
1818
+ #define CURRENT_INSN_branchnil 1
1819
+ #define INSN_IS_SC() 0
1820
+ #define INSN_LABEL(lab) LABEL_branchnil_##lab
1821
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1822
+ COLLECT_USAGE_INSN(BIN(branchnil));
1823
+ COLLECT_USAGE_OPERAND(BIN(branchnil), 0, dst);
1824
+ {
1825
+ #line 1231 "insns.def"
1826
+ if (NIL_P(val)) {
1827
+ RUBY_VM_CHECK_INTS(th);
1828
+ JUMP(dst);
1829
+ }
1830
+
1831
+ #line 1832 "vm.inc"
1832
+ #undef CURRENT_INSN_branchnil
1833
+ #undef INSN_IS_SC
1834
+ #undef INSN_LABEL
1835
+ #undef LABEL_IS_SC
1836
+ END_INSN(branchnil);}}}
1837
+ INSN_ENTRY(getinlinecache){
1838
+ {
1839
+ VALUE val;
1840
+ IC ic = (IC)GET_OPERAND(2);
1841
+ OFFSET dst = (OFFSET)GET_OPERAND(1);
1842
+
1843
+ DEBUG_ENTER_INSN("getinlinecache");
1844
+ ADD_PC(1+2);
1845
+ PREFETCH(GET_PC());
1846
+ #define CURRENT_INSN_getinlinecache 1
1847
+ #define INSN_IS_SC() 0
1848
+ #define INSN_LABEL(lab) LABEL_getinlinecache_##lab
1849
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1850
+ COLLECT_USAGE_INSN(BIN(getinlinecache));
1851
+ COLLECT_USAGE_OPERAND(BIN(getinlinecache), 0, dst);
1852
+ COLLECT_USAGE_OPERAND(BIN(getinlinecache), 1, ic);
1853
+ {
1854
+ #line 1253 "insns.def"
1855
+ if (ic->ic_serial == GET_GLOBAL_CONSTANT_STATE() &&
1856
+ (ic->ic_cref == NULL || ic->ic_cref == rb_vm_get_cref(GET_EP()))) {
1857
+ val = ic->ic_value.value;
1858
+ JUMP(dst);
1859
+ }
1860
+ else {
1861
+ /* none */
1862
+ val = Qnil;
1863
+ }
1864
+
1865
+ #line 1866 "vm.inc"
1866
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1867
+ PUSH(val);
1868
+ #undef CURRENT_INSN_getinlinecache
1869
+ #undef INSN_IS_SC
1870
+ #undef INSN_LABEL
1871
+ #undef LABEL_IS_SC
1872
+ END_INSN(getinlinecache);}}}
1873
+ INSN_ENTRY(setinlinecache){
1874
+ {
1875
+ IC ic = (IC)GET_OPERAND(1);
1876
+ VALUE val = TOPN(0);
1877
+ DEBUG_ENTER_INSN("setinlinecache");
1878
+ ADD_PC(1+1);
1879
+ PREFETCH(GET_PC());
1880
+ POPN(1);
1881
+ #define CURRENT_INSN_setinlinecache 1
1882
+ #define INSN_IS_SC() 0
1883
+ #define INSN_LABEL(lab) LABEL_setinlinecache_##lab
1884
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1885
+ COLLECT_USAGE_INSN(BIN(setinlinecache));
1886
+ COLLECT_USAGE_OPERAND(BIN(setinlinecache), 0, ic);
1887
+ {
1888
+ #line 1275 "insns.def"
1889
+ VM_ASSERT(ic->ic_value.value != Qundef);
1890
+ ic->ic_value.value = val;
1891
+ ic->ic_serial = GET_GLOBAL_CONSTANT_STATE() - ruby_vm_const_missing_count;
1892
+ ic->ic_cref = vm_get_const_key_cref(GET_EP());
1893
+ ruby_vm_const_missing_count = 0;
1894
+
1895
+ #line 1896 "vm.inc"
1896
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1897
+ PUSH(val);
1898
+ #undef CURRENT_INSN_setinlinecache
1899
+ #undef INSN_IS_SC
1900
+ #undef INSN_LABEL
1901
+ #undef LABEL_IS_SC
1902
+ END_INSN(setinlinecache);}}}
1903
+ INSN_ENTRY(once){
1904
+ {
1905
+ VALUE val;
1906
+ IC ic = (IC)GET_OPERAND(2);
1907
+ ISEQ iseq = (ISEQ)GET_OPERAND(1);
1908
+
1909
+ DEBUG_ENTER_INSN("once");
1910
+ ADD_PC(1+2);
1911
+ PREFETCH(GET_PC());
1912
+ #define CURRENT_INSN_once 1
1913
+ #define INSN_IS_SC() 0
1914
+ #define INSN_LABEL(lab) LABEL_once_##lab
1915
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1916
+ COLLECT_USAGE_INSN(BIN(once));
1917
+ COLLECT_USAGE_OPERAND(BIN(once), 0, iseq);
1918
+ COLLECT_USAGE_OPERAND(BIN(once), 1, ic);
1919
+ {
1920
+ #line 1293 "insns.def"
1921
+ union iseq_inline_storage_entry *is = (union iseq_inline_storage_entry *)ic;
1922
+
1923
+ #define RUNNING_THREAD_ONCE_DONE ((rb_thread_t *)(0x1))
1924
+ retry:
1925
+ if (is->once.running_thread == RUNNING_THREAD_ONCE_DONE) {
1926
+ val = is->once.value;
1927
+ }
1928
+ else if (is->once.running_thread == NULL) {
1929
+ is->once.running_thread = th;
1930
+ val = is->once.value = rb_ensure(vm_once_exec, (VALUE)iseq, vm_once_clear, (VALUE)is);
1931
+ /* is->once.running_thread is cleared by vm_once_clear() */
1932
+ is->once.running_thread = RUNNING_THREAD_ONCE_DONE; /* success */
1933
+ rb_iseq_add_mark_object(GET_ISEQ(), val);
1934
+ }
1935
+ else if (is->once.running_thread == th) {
1936
+ /* recursive once */
1937
+ val = vm_once_exec((VALUE)iseq);
1938
+ }
1939
+ else {
1940
+ /* waiting for finish */
1941
+ RUBY_VM_CHECK_INTS(th);
1942
+ rb_thread_schedule();
1943
+ goto retry;
1944
+ }
1945
+
1946
+ #line 1947 "vm.inc"
1947
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1948
+ PUSH(val);
1949
+ #undef CURRENT_INSN_once
1950
+ #undef INSN_IS_SC
1951
+ #undef INSN_LABEL
1952
+ #undef LABEL_IS_SC
1953
+ END_INSN(once);}}}
1954
+ INSN_ENTRY(opt_case_dispatch){
1955
+ {
1956
+ OFFSET else_offset = (OFFSET)GET_OPERAND(2);
1957
+ CDHASH hash = (CDHASH)GET_OPERAND(1);
1958
+ VALUE key = TOPN(0);
1959
+ DEBUG_ENTER_INSN("opt_case_dispatch");
1960
+ ADD_PC(1+2);
1961
+ PREFETCH(GET_PC());
1962
+ POPN(1);
1963
+ #define CURRENT_INSN_opt_case_dispatch 1
1964
+ #define INSN_IS_SC() 0
1965
+ #define INSN_LABEL(lab) LABEL_opt_case_dispatch_##lab
1966
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1967
+ COLLECT_USAGE_INSN(BIN(opt_case_dispatch));
1968
+ COLLECT_USAGE_OPERAND(BIN(opt_case_dispatch), 0, hash);
1969
+ COLLECT_USAGE_OPERAND(BIN(opt_case_dispatch), 1, else_offset);
1970
+ {
1971
+ #line 1330 "insns.def"
1972
+ switch (OBJ_BUILTIN_TYPE(key)) {
1973
+ case -1:
1974
+ case T_FLOAT:
1975
+ case T_SYMBOL:
1976
+ case T_BIGNUM:
1977
+ case T_STRING:
1978
+ if (BASIC_OP_UNREDEFINED_P(BOP_EQQ,
1979
+ SYMBOL_REDEFINED_OP_FLAG |
1980
+ INTEGER_REDEFINED_OP_FLAG |
1981
+ FLOAT_REDEFINED_OP_FLAG |
1982
+ NIL_REDEFINED_OP_FLAG |
1983
+ TRUE_REDEFINED_OP_FLAG |
1984
+ FALSE_REDEFINED_OP_FLAG |
1985
+ STRING_REDEFINED_OP_FLAG)) {
1986
+ st_data_t val;
1987
+ if (RB_FLOAT_TYPE_P(key)) {
1988
+ double kval = RFLOAT_VALUE(key);
1989
+ if (!isinf(kval) && modf(kval, &kval) == 0.0) {
1990
+ key = FIXABLE(kval) ? LONG2FIX((long)kval) : rb_dbl2big(kval);
1991
+ }
1992
+ }
1993
+ if (st_lookup(RHASH_TBL_RAW(hash), key, &val)) {
1994
+ JUMP(FIX2INT((VALUE)val));
1995
+ }
1996
+ else {
1997
+ JUMP(else_offset);
1998
+ }
1999
+ }
2000
+ }
2001
+
2002
+ #line 2003 "vm.inc"
2003
+ #undef CURRENT_INSN_opt_case_dispatch
2004
+ #undef INSN_IS_SC
2005
+ #undef INSN_LABEL
2006
+ #undef LABEL_IS_SC
2007
+ END_INSN(opt_case_dispatch);}}}
2008
+ INSN_ENTRY(opt_plus){
2009
+ {
2010
+ VALUE val;
2011
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2012
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2013
+ VALUE recv = TOPN(1);
2014
+ VALUE obj = TOPN(0);
2015
+ DEBUG_ENTER_INSN("opt_plus");
2016
+ ADD_PC(1+2);
2017
+ PREFETCH(GET_PC());
2018
+ POPN(2);
2019
+ #define CURRENT_INSN_opt_plus 1
2020
+ #define INSN_IS_SC() 0
2021
+ #define INSN_LABEL(lab) LABEL_opt_plus_##lab
2022
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2023
+ COLLECT_USAGE_INSN(BIN(opt_plus));
2024
+ COLLECT_USAGE_OPERAND(BIN(opt_plus), 0, ci);
2025
+ COLLECT_USAGE_OPERAND(BIN(opt_plus), 1, cc);
2026
+ {
2027
+ #line 1374 "insns.def"
2028
+ if (FIXNUM_2_P(recv, obj) &&
2029
+ BASIC_OP_UNREDEFINED_P(BOP_PLUS,INTEGER_REDEFINED_OP_FLAG)) {
2030
+ /* fixnum + fixnum */
2031
+ #ifndef LONG_LONG_VALUE
2032
+ VALUE msb = (VALUE)1 << ((sizeof(VALUE) * CHAR_BIT) - 1);
2033
+ val = recv - 1 + obj;
2034
+ if ((~(recv ^ obj) & (recv ^ val)) & msb) {
2035
+ val = rb_int2big((SIGNED_VALUE)((val>>1) | (recv & msb)));
2036
+ }
2037
+ #else
2038
+ val = LONG2NUM(FIX2LONG(recv) + FIX2LONG(obj));
2039
+ #endif
2040
+ }
2041
+ else if (FLONUM_2_P(recv, obj) &&
2042
+ BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG)) {
2043
+ val = DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj));
2044
+ }
2045
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2046
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2047
+ BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG)) {
2048
+ val = DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj));
2049
+ }
2050
+ else if (RBASIC_CLASS(recv) == rb_cString && RBASIC_CLASS(obj) == rb_cString &&
2051
+ BASIC_OP_UNREDEFINED_P(BOP_PLUS, STRING_REDEFINED_OP_FLAG)) {
2052
+ val = rb_str_plus(recv, obj);
2053
+ }
2054
+ else if (RBASIC_CLASS(recv) == rb_cArray &&
2055
+ BASIC_OP_UNREDEFINED_P(BOP_PLUS, ARRAY_REDEFINED_OP_FLAG)) {
2056
+ val = rb_ary_plus(recv, obj);
2057
+ }
2058
+ else {
2059
+ goto INSN_LABEL(normal_dispatch);
2060
+ }
2061
+ }
2062
+ else {
2063
+ INSN_LABEL(normal_dispatch):
2064
+ PUSH(recv);
2065
+ PUSH(obj);
2066
+ CALL_SIMPLE_METHOD(recv);
2067
+ }
2068
+
2069
+ #line 2070 "vm.inc"
2070
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2071
+ PUSH(val);
2072
+ #undef CURRENT_INSN_opt_plus
2073
+ #undef INSN_IS_SC
2074
+ #undef INSN_LABEL
2075
+ #undef LABEL_IS_SC
2076
+ END_INSN(opt_plus);}}}
2077
+ INSN_ENTRY(opt_minus){
2078
+ {
2079
+ VALUE val;
2080
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2081
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2082
+ VALUE recv = TOPN(1);
2083
+ VALUE obj = TOPN(0);
2084
+ DEBUG_ENTER_INSN("opt_minus");
2085
+ ADD_PC(1+2);
2086
+ PREFETCH(GET_PC());
2087
+ POPN(2);
2088
+ #define CURRENT_INSN_opt_minus 1
2089
+ #define INSN_IS_SC() 0
2090
+ #define INSN_LABEL(lab) LABEL_opt_minus_##lab
2091
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2092
+ COLLECT_USAGE_INSN(BIN(opt_minus));
2093
+ COLLECT_USAGE_OPERAND(BIN(opt_minus), 0, ci);
2094
+ COLLECT_USAGE_OPERAND(BIN(opt_minus), 1, cc);
2095
+ {
2096
+ #line 1427 "insns.def"
2097
+ if (FIXNUM_2_P(recv, obj) &&
2098
+ BASIC_OP_UNREDEFINED_P(BOP_MINUS, INTEGER_REDEFINED_OP_FLAG)) {
2099
+ long a, b, c;
2100
+
2101
+ a = FIX2LONG(recv);
2102
+ b = FIX2LONG(obj);
2103
+ c = a - b;
2104
+ val = LONG2NUM(c);
2105
+ }
2106
+ else if (FLONUM_2_P(recv, obj) &&
2107
+ BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) {
2108
+ val = DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj));
2109
+ }
2110
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2111
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2112
+ BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) {
2113
+ val = DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj));
2114
+ }
2115
+ else {
2116
+ goto INSN_LABEL(normal_dispatch);
2117
+ }
2118
+ }
2119
+ else {
2120
+ /* other */
2121
+ INSN_LABEL(normal_dispatch):
2122
+ PUSH(recv);
2123
+ PUSH(obj);
2124
+ CALL_SIMPLE_METHOD(recv);
2125
+ }
2126
+
2127
+ #line 2128 "vm.inc"
2128
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2129
+ PUSH(val);
2130
+ #undef CURRENT_INSN_opt_minus
2131
+ #undef INSN_IS_SC
2132
+ #undef INSN_LABEL
2133
+ #undef LABEL_IS_SC
2134
+ END_INSN(opt_minus);}}}
2135
+ INSN_ENTRY(opt_mult){
2136
+ {
2137
+ VALUE val;
2138
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2139
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2140
+ VALUE recv = TOPN(1);
2141
+ VALUE obj = TOPN(0);
2142
+ DEBUG_ENTER_INSN("opt_mult");
2143
+ ADD_PC(1+2);
2144
+ PREFETCH(GET_PC());
2145
+ POPN(2);
2146
+ #define CURRENT_INSN_opt_mult 1
2147
+ #define INSN_IS_SC() 0
2148
+ #define INSN_LABEL(lab) LABEL_opt_mult_##lab
2149
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2150
+ COLLECT_USAGE_INSN(BIN(opt_mult));
2151
+ COLLECT_USAGE_OPERAND(BIN(opt_mult), 0, ci);
2152
+ COLLECT_USAGE_OPERAND(BIN(opt_mult), 1, cc);
2153
+ {
2154
+ #line 1469 "insns.def"
2155
+ if (FIXNUM_2_P(recv, obj) &&
2156
+ BASIC_OP_UNREDEFINED_P(BOP_MULT, INTEGER_REDEFINED_OP_FLAG)) {
2157
+ val = rb_fix_mul_fix(recv, obj);
2158
+ }
2159
+ else if (FLONUM_2_P(recv, obj) &&
2160
+ BASIC_OP_UNREDEFINED_P(BOP_MULT, FLOAT_REDEFINED_OP_FLAG)) {
2161
+ val = DBL2NUM(RFLOAT_VALUE(recv) * RFLOAT_VALUE(obj));
2162
+ }
2163
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2164
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2165
+ BASIC_OP_UNREDEFINED_P(BOP_MULT, FLOAT_REDEFINED_OP_FLAG)) {
2166
+ val = DBL2NUM(RFLOAT_VALUE(recv) * RFLOAT_VALUE(obj));
2167
+ }
2168
+ else {
2169
+ goto INSN_LABEL(normal_dispatch);
2170
+ }
2171
+ }
2172
+ else {
2173
+ INSN_LABEL(normal_dispatch):
2174
+ PUSH(recv);
2175
+ PUSH(obj);
2176
+ CALL_SIMPLE_METHOD(recv);
2177
+ }
2178
+
2179
+ #line 2180 "vm.inc"
2180
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2181
+ PUSH(val);
2182
+ #undef CURRENT_INSN_opt_mult
2183
+ #undef INSN_IS_SC
2184
+ #undef INSN_LABEL
2185
+ #undef LABEL_IS_SC
2186
+ END_INSN(opt_mult);}}}
2187
+ INSN_ENTRY(opt_div){
2188
+ {
2189
+ VALUE val;
2190
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2191
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2192
+ VALUE recv = TOPN(1);
2193
+ VALUE obj = TOPN(0);
2194
+ DEBUG_ENTER_INSN("opt_div");
2195
+ ADD_PC(1+2);
2196
+ PREFETCH(GET_PC());
2197
+ POPN(2);
2198
+ #define CURRENT_INSN_opt_div 1
2199
+ #define INSN_IS_SC() 0
2200
+ #define INSN_LABEL(lab) LABEL_opt_div_##lab
2201
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2202
+ COLLECT_USAGE_INSN(BIN(opt_div));
2203
+ COLLECT_USAGE_OPERAND(BIN(opt_div), 0, ci);
2204
+ COLLECT_USAGE_OPERAND(BIN(opt_div), 1, cc);
2205
+ {
2206
+ #line 1505 "insns.def"
2207
+ if (FIXNUM_2_P(recv, obj) &&
2208
+ BASIC_OP_UNREDEFINED_P(BOP_DIV, INTEGER_REDEFINED_OP_FLAG)) {
2209
+ if (FIX2LONG(obj) == 0) goto INSN_LABEL(normal_dispatch);
2210
+ val = rb_fix_div_fix(recv, obj);
2211
+ }
2212
+ else if (FLONUM_2_P(recv, obj) &&
2213
+ BASIC_OP_UNREDEFINED_P(BOP_DIV, FLOAT_REDEFINED_OP_FLAG)) {
2214
+ val = DBL2NUM(RFLOAT_VALUE(recv) / RFLOAT_VALUE(obj));
2215
+ }
2216
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2217
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2218
+ BASIC_OP_UNREDEFINED_P(BOP_DIV, FLOAT_REDEFINED_OP_FLAG)) {
2219
+ val = DBL2NUM(RFLOAT_VALUE(recv) / RFLOAT_VALUE(obj));
2220
+ }
2221
+ else {
2222
+ goto INSN_LABEL(normal_dispatch);
2223
+ }
2224
+ }
2225
+ else {
2226
+ INSN_LABEL(normal_dispatch):
2227
+ PUSH(recv);
2228
+ PUSH(obj);
2229
+ CALL_SIMPLE_METHOD(recv);
2230
+ }
2231
+
2232
+ #line 2233 "vm.inc"
2233
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2234
+ PUSH(val);
2235
+ #undef CURRENT_INSN_opt_div
2236
+ #undef INSN_IS_SC
2237
+ #undef INSN_LABEL
2238
+ #undef LABEL_IS_SC
2239
+ END_INSN(opt_div);}}}
2240
+ INSN_ENTRY(opt_mod){
2241
+ {
2242
+ VALUE val;
2243
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2244
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2245
+ VALUE recv = TOPN(1);
2246
+ VALUE obj = TOPN(0);
2247
+ DEBUG_ENTER_INSN("opt_mod");
2248
+ ADD_PC(1+2);
2249
+ PREFETCH(GET_PC());
2250
+ POPN(2);
2251
+ #define CURRENT_INSN_opt_mod 1
2252
+ #define INSN_IS_SC() 0
2253
+ #define INSN_LABEL(lab) LABEL_opt_mod_##lab
2254
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2255
+ COLLECT_USAGE_INSN(BIN(opt_mod));
2256
+ COLLECT_USAGE_OPERAND(BIN(opt_mod), 0, ci);
2257
+ COLLECT_USAGE_OPERAND(BIN(opt_mod), 1, cc);
2258
+ {
2259
+ #line 1542 "insns.def"
2260
+ if (FIXNUM_2_P(recv, obj) &&
2261
+ BASIC_OP_UNREDEFINED_P(BOP_MOD, INTEGER_REDEFINED_OP_FLAG )) {
2262
+ if (FIX2LONG(obj) == 0) goto INSN_LABEL(normal_dispatch);
2263
+ val = rb_fix_mod_fix(recv, obj);
2264
+ }
2265
+ else if (FLONUM_2_P(recv, obj) &&
2266
+ BASIC_OP_UNREDEFINED_P(BOP_MOD, FLOAT_REDEFINED_OP_FLAG)) {
2267
+ val = DBL2NUM(ruby_float_mod(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj)));
2268
+ }
2269
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2270
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2271
+ BASIC_OP_UNREDEFINED_P(BOP_MOD, FLOAT_REDEFINED_OP_FLAG)) {
2272
+ val = DBL2NUM(ruby_float_mod(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj)));
2273
+ }
2274
+ else {
2275
+ goto INSN_LABEL(normal_dispatch);
2276
+ }
2277
+ }
2278
+ else {
2279
+ INSN_LABEL(normal_dispatch):
2280
+ PUSH(recv);
2281
+ PUSH(obj);
2282
+ CALL_SIMPLE_METHOD(recv);
2283
+ }
2284
+
2285
+ #line 2286 "vm.inc"
2286
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2287
+ PUSH(val);
2288
+ #undef CURRENT_INSN_opt_mod
2289
+ #undef INSN_IS_SC
2290
+ #undef INSN_LABEL
2291
+ #undef LABEL_IS_SC
2292
+ END_INSN(opt_mod);}}}
2293
+ INSN_ENTRY(opt_eq){
2294
+ {
2295
+ VALUE val;
2296
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2297
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2298
+ VALUE recv = TOPN(1);
2299
+ VALUE obj = TOPN(0);
2300
+ DEBUG_ENTER_INSN("opt_eq");
2301
+ ADD_PC(1+2);
2302
+ PREFETCH(GET_PC());
2303
+ POPN(2);
2304
+ #define CURRENT_INSN_opt_eq 1
2305
+ #define INSN_IS_SC() 0
2306
+ #define INSN_LABEL(lab) LABEL_opt_eq_##lab
2307
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2308
+ COLLECT_USAGE_INSN(BIN(opt_eq));
2309
+ COLLECT_USAGE_OPERAND(BIN(opt_eq), 0, ci);
2310
+ COLLECT_USAGE_OPERAND(BIN(opt_eq), 1, cc);
2311
+ {
2312
+ #line 1579 "insns.def"
2313
+ val = opt_eq_func(recv, obj, ci, cc);
2314
+
2315
+ if (val == Qundef) {
2316
+ /* other */
2317
+ PUSH(recv);
2318
+ PUSH(obj);
2319
+ CALL_SIMPLE_METHOD(recv);
2320
+ }
2321
+
2322
+ #line 2323 "vm.inc"
2323
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2324
+ PUSH(val);
2325
+ #undef CURRENT_INSN_opt_eq
2326
+ #undef INSN_IS_SC
2327
+ #undef INSN_LABEL
2328
+ #undef LABEL_IS_SC
2329
+ END_INSN(opt_eq);}}}
2330
+ INSN_ENTRY(opt_neq){
2331
+ {
2332
+ VALUE val;
2333
+ CALL_CACHE cc_eq = (CALL_CACHE)GET_OPERAND(4);
2334
+ CALL_INFO ci_eq = (CALL_INFO)GET_OPERAND(3);
2335
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2336
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2337
+ VALUE recv = TOPN(1);
2338
+ VALUE obj = TOPN(0);
2339
+ DEBUG_ENTER_INSN("opt_neq");
2340
+ ADD_PC(1+4);
2341
+ PREFETCH(GET_PC());
2342
+ POPN(2);
2343
+ #define CURRENT_INSN_opt_neq 1
2344
+ #define INSN_IS_SC() 0
2345
+ #define INSN_LABEL(lab) LABEL_opt_neq_##lab
2346
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2347
+ COLLECT_USAGE_INSN(BIN(opt_neq));
2348
+ COLLECT_USAGE_OPERAND(BIN(opt_neq), 0, ci);
2349
+ COLLECT_USAGE_OPERAND(BIN(opt_neq), 1, cc);
2350
+ COLLECT_USAGE_OPERAND(BIN(opt_neq), 2, ci_eq);
2351
+ COLLECT_USAGE_OPERAND(BIN(opt_neq), 3, cc_eq);
2352
+ {
2353
+ #line 1600 "insns.def"
2354
+ extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2);
2355
+ vm_search_method(ci, cc, recv);
2356
+
2357
+ val = Qundef;
2358
+
2359
+ if (check_cfunc(cc->me, rb_obj_not_equal)) {
2360
+ val = opt_eq_func(recv, obj, ci_eq, cc_eq);
2361
+
2362
+ if (val != Qundef) {
2363
+ val = RTEST(val) ? Qfalse : Qtrue;
2364
+ }
2365
+ }
2366
+
2367
+ if (val == Qundef) {
2368
+ /* other */
2369
+ PUSH(recv);
2370
+ PUSH(obj);
2371
+ CALL_SIMPLE_METHOD(recv);
2372
+ }
2373
+
2374
+ #line 2375 "vm.inc"
2375
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2376
+ PUSH(val);
2377
+ #undef CURRENT_INSN_opt_neq
2378
+ #undef INSN_IS_SC
2379
+ #undef INSN_LABEL
2380
+ #undef LABEL_IS_SC
2381
+ END_INSN(opt_neq);}}}
2382
+ INSN_ENTRY(opt_lt){
2383
+ {
2384
+ VALUE val;
2385
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2386
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2387
+ VALUE recv = TOPN(1);
2388
+ VALUE obj = TOPN(0);
2389
+ DEBUG_ENTER_INSN("opt_lt");
2390
+ ADD_PC(1+2);
2391
+ PREFETCH(GET_PC());
2392
+ POPN(2);
2393
+ #define CURRENT_INSN_opt_lt 1
2394
+ #define INSN_IS_SC() 0
2395
+ #define INSN_LABEL(lab) LABEL_opt_lt_##lab
2396
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2397
+ COLLECT_USAGE_INSN(BIN(opt_lt));
2398
+ COLLECT_USAGE_OPERAND(BIN(opt_lt), 0, ci);
2399
+ COLLECT_USAGE_OPERAND(BIN(opt_lt), 1, cc);
2400
+ {
2401
+ #line 1632 "insns.def"
2402
+ if (FIXNUM_2_P(recv, obj) &&
2403
+ BASIC_OP_UNREDEFINED_P(BOP_LT, INTEGER_REDEFINED_OP_FLAG)) {
2404
+ SIGNED_VALUE a = recv, b = obj;
2405
+
2406
+ if (a < b) {
2407
+ val = Qtrue;
2408
+ }
2409
+ else {
2410
+ val = Qfalse;
2411
+ }
2412
+ }
2413
+ else if (FLONUM_2_P(recv, obj) &&
2414
+ BASIC_OP_UNREDEFINED_P(BOP_LT, FLOAT_REDEFINED_OP_FLAG)) {
2415
+ /* flonum is not NaN */
2416
+ val = RFLOAT_VALUE(recv) < RFLOAT_VALUE(obj) ? Qtrue : Qfalse;
2417
+ }
2418
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2419
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2420
+ BASIC_OP_UNREDEFINED_P(BOP_LT, FLOAT_REDEFINED_OP_FLAG)) {
2421
+ val = double_cmp_lt(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj));
2422
+ }
2423
+ else {
2424
+ goto INSN_LABEL(normal_dispatch);
2425
+ }
2426
+ }
2427
+ else {
2428
+ INSN_LABEL(normal_dispatch):
2429
+ PUSH(recv);
2430
+ PUSH(obj);
2431
+ CALL_SIMPLE_METHOD(recv);
2432
+ }
2433
+
2434
+ #line 2435 "vm.inc"
2435
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2436
+ PUSH(val);
2437
+ #undef CURRENT_INSN_opt_lt
2438
+ #undef INSN_IS_SC
2439
+ #undef INSN_LABEL
2440
+ #undef LABEL_IS_SC
2441
+ END_INSN(opt_lt);}}}
2442
+ INSN_ENTRY(opt_le){
2443
+ {
2444
+ VALUE val;
2445
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2446
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2447
+ VALUE recv = TOPN(1);
2448
+ VALUE obj = TOPN(0);
2449
+ DEBUG_ENTER_INSN("opt_le");
2450
+ ADD_PC(1+2);
2451
+ PREFETCH(GET_PC());
2452
+ POPN(2);
2453
+ #define CURRENT_INSN_opt_le 1
2454
+ #define INSN_IS_SC() 0
2455
+ #define INSN_LABEL(lab) LABEL_opt_le_##lab
2456
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2457
+ COLLECT_USAGE_INSN(BIN(opt_le));
2458
+ COLLECT_USAGE_OPERAND(BIN(opt_le), 0, ci);
2459
+ COLLECT_USAGE_OPERAND(BIN(opt_le), 1, cc);
2460
+ {
2461
+ #line 1676 "insns.def"
2462
+ if (FIXNUM_2_P(recv, obj) &&
2463
+ BASIC_OP_UNREDEFINED_P(BOP_LE, INTEGER_REDEFINED_OP_FLAG)) {
2464
+ SIGNED_VALUE a = recv, b = obj;
2465
+
2466
+ if (a <= b) {
2467
+ val = Qtrue;
2468
+ }
2469
+ else {
2470
+ val = Qfalse;
2471
+ }
2472
+ }
2473
+ else if (FLONUM_2_P(recv, obj) &&
2474
+ BASIC_OP_UNREDEFINED_P(BOP_LE, FLOAT_REDEFINED_OP_FLAG)) {
2475
+ /* flonum is not NaN */
2476
+ val = RFLOAT_VALUE(recv) <= RFLOAT_VALUE(obj) ? Qtrue : Qfalse;
2477
+ }
2478
+ else {
2479
+ /* other */
2480
+ PUSH(recv);
2481
+ PUSH(obj);
2482
+ CALL_SIMPLE_METHOD(recv);
2483
+ }
2484
+
2485
+ #line 2486 "vm.inc"
2486
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2487
+ PUSH(val);
2488
+ #undef CURRENT_INSN_opt_le
2489
+ #undef INSN_IS_SC
2490
+ #undef INSN_LABEL
2491
+ #undef LABEL_IS_SC
2492
+ END_INSN(opt_le);}}}
2493
+ INSN_ENTRY(opt_gt){
2494
+ {
2495
+ VALUE val;
2496
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2497
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2498
+ VALUE recv = TOPN(1);
2499
+ VALUE obj = TOPN(0);
2500
+ DEBUG_ENTER_INSN("opt_gt");
2501
+ ADD_PC(1+2);
2502
+ PREFETCH(GET_PC());
2503
+ POPN(2);
2504
+ #define CURRENT_INSN_opt_gt 1
2505
+ #define INSN_IS_SC() 0
2506
+ #define INSN_LABEL(lab) LABEL_opt_gt_##lab
2507
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2508
+ COLLECT_USAGE_INSN(BIN(opt_gt));
2509
+ COLLECT_USAGE_OPERAND(BIN(opt_gt), 0, ci);
2510
+ COLLECT_USAGE_OPERAND(BIN(opt_gt), 1, cc);
2511
+ {
2512
+ #line 1711 "insns.def"
2513
+ if (FIXNUM_2_P(recv, obj) &&
2514
+ BASIC_OP_UNREDEFINED_P(BOP_GT, INTEGER_REDEFINED_OP_FLAG)) {
2515
+ SIGNED_VALUE a = recv, b = obj;
2516
+
2517
+ if (a > b) {
2518
+ val = Qtrue;
2519
+ }
2520
+ else {
2521
+ val = Qfalse;
2522
+ }
2523
+ }
2524
+ else if (FLONUM_2_P(recv, obj) &&
2525
+ BASIC_OP_UNREDEFINED_P(BOP_GT, FLOAT_REDEFINED_OP_FLAG)) {
2526
+ /* flonum is not NaN */
2527
+ val = RFLOAT_VALUE(recv) > RFLOAT_VALUE(obj) ? Qtrue : Qfalse;
2528
+ }
2529
+ else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
2530
+ if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
2531
+ BASIC_OP_UNREDEFINED_P(BOP_GT, FLOAT_REDEFINED_OP_FLAG)) {
2532
+ val = double_cmp_gt(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj));
2533
+ }
2534
+ else {
2535
+ goto INSN_LABEL(normal_dispatch);
2536
+ }
2537
+ }
2538
+ else {
2539
+ INSN_LABEL(normal_dispatch):
2540
+ PUSH(recv);
2541
+ PUSH(obj);
2542
+ CALL_SIMPLE_METHOD(recv);
2543
+ }
2544
+
2545
+ #line 2546 "vm.inc"
2546
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2547
+ PUSH(val);
2548
+ #undef CURRENT_INSN_opt_gt
2549
+ #undef INSN_IS_SC
2550
+ #undef INSN_LABEL
2551
+ #undef LABEL_IS_SC
2552
+ END_INSN(opt_gt);}}}
2553
+ INSN_ENTRY(opt_ge){
2554
+ {
2555
+ VALUE val;
2556
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2557
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2558
+ VALUE recv = TOPN(1);
2559
+ VALUE obj = TOPN(0);
2560
+ DEBUG_ENTER_INSN("opt_ge");
2561
+ ADD_PC(1+2);
2562
+ PREFETCH(GET_PC());
2563
+ POPN(2);
2564
+ #define CURRENT_INSN_opt_ge 1
2565
+ #define INSN_IS_SC() 0
2566
+ #define INSN_LABEL(lab) LABEL_opt_ge_##lab
2567
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2568
+ COLLECT_USAGE_INSN(BIN(opt_ge));
2569
+ COLLECT_USAGE_OPERAND(BIN(opt_ge), 0, ci);
2570
+ COLLECT_USAGE_OPERAND(BIN(opt_ge), 1, cc);
2571
+ {
2572
+ #line 1755 "insns.def"
2573
+ if (FIXNUM_2_P(recv, obj) &&
2574
+ BASIC_OP_UNREDEFINED_P(BOP_GE, INTEGER_REDEFINED_OP_FLAG)) {
2575
+ SIGNED_VALUE a = recv, b = obj;
2576
+
2577
+ if (a >= b) {
2578
+ val = Qtrue;
2579
+ }
2580
+ else {
2581
+ val = Qfalse;
2582
+ }
2583
+ }
2584
+ else if (FLONUM_2_P(recv, obj) &&
2585
+ BASIC_OP_UNREDEFINED_P(BOP_GE, FLOAT_REDEFINED_OP_FLAG)) {
2586
+ /* flonum is not NaN */
2587
+ val = RFLOAT_VALUE(recv) >= RFLOAT_VALUE(obj) ? Qtrue : Qfalse;
2588
+ }
2589
+ else {
2590
+ PUSH(recv);
2591
+ PUSH(obj);
2592
+ CALL_SIMPLE_METHOD(recv);
2593
+ }
2594
+
2595
+ #line 2596 "vm.inc"
2596
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2597
+ PUSH(val);
2598
+ #undef CURRENT_INSN_opt_ge
2599
+ #undef INSN_IS_SC
2600
+ #undef INSN_LABEL
2601
+ #undef LABEL_IS_SC
2602
+ END_INSN(opt_ge);}}}
2603
+ INSN_ENTRY(opt_ltlt){
2604
+ {
2605
+ VALUE val;
2606
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2607
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2608
+ VALUE recv = TOPN(1);
2609
+ VALUE obj = TOPN(0);
2610
+ DEBUG_ENTER_INSN("opt_ltlt");
2611
+ ADD_PC(1+2);
2612
+ PREFETCH(GET_PC());
2613
+ POPN(2);
2614
+ #define CURRENT_INSN_opt_ltlt 1
2615
+ #define INSN_IS_SC() 0
2616
+ #define INSN_LABEL(lab) LABEL_opt_ltlt_##lab
2617
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2618
+ COLLECT_USAGE_INSN(BIN(opt_ltlt));
2619
+ COLLECT_USAGE_OPERAND(BIN(opt_ltlt), 0, ci);
2620
+ COLLECT_USAGE_OPERAND(BIN(opt_ltlt), 1, cc);
2621
+ {
2622
+ #line 1789 "insns.def"
2623
+ if (!SPECIAL_CONST_P(recv)) {
2624
+ if (RBASIC_CLASS(recv) == rb_cString &&
2625
+ BASIC_OP_UNREDEFINED_P(BOP_LTLT, STRING_REDEFINED_OP_FLAG)) {
2626
+ val = rb_str_concat(recv, obj);
2627
+ }
2628
+ else if (RBASIC_CLASS(recv) == rb_cArray &&
2629
+ BASIC_OP_UNREDEFINED_P(BOP_LTLT, ARRAY_REDEFINED_OP_FLAG)) {
2630
+ val = rb_ary_push(recv, obj);
2631
+ }
2632
+ else {
2633
+ goto INSN_LABEL(normal_dispatch);
2634
+ }
2635
+ }
2636
+ else {
2637
+ INSN_LABEL(normal_dispatch):
2638
+ PUSH(recv);
2639
+ PUSH(obj);
2640
+ CALL_SIMPLE_METHOD(recv);
2641
+ }
2642
+
2643
+ #line 2644 "vm.inc"
2644
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2645
+ PUSH(val);
2646
+ #undef CURRENT_INSN_opt_ltlt
2647
+ #undef INSN_IS_SC
2648
+ #undef INSN_LABEL
2649
+ #undef LABEL_IS_SC
2650
+ END_INSN(opt_ltlt);}}}
2651
+ INSN_ENTRY(opt_aref){
2652
+ {
2653
+ VALUE val;
2654
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2655
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2656
+ VALUE recv = TOPN(1);
2657
+ VALUE obj = TOPN(0);
2658
+ DEBUG_ENTER_INSN("opt_aref");
2659
+ ADD_PC(1+2);
2660
+ PREFETCH(GET_PC());
2661
+ POPN(2);
2662
+ #define CURRENT_INSN_opt_aref 1
2663
+ #define INSN_IS_SC() 0
2664
+ #define INSN_LABEL(lab) LABEL_opt_aref_##lab
2665
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2666
+ COLLECT_USAGE_INSN(BIN(opt_aref));
2667
+ COLLECT_USAGE_OPERAND(BIN(opt_aref), 0, ci);
2668
+ COLLECT_USAGE_OPERAND(BIN(opt_aref), 1, cc);
2669
+ {
2670
+ #line 1821 "insns.def"
2671
+ if (!SPECIAL_CONST_P(recv)) {
2672
+ if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG) && FIXNUM_P(obj)) {
2673
+ val = rb_ary_entry(recv, FIX2LONG(obj));
2674
+ }
2675
+ else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) {
2676
+ val = rb_hash_aref(recv, obj);
2677
+ }
2678
+ else {
2679
+ goto INSN_LABEL(normal_dispatch);
2680
+ }
2681
+ }
2682
+ else {
2683
+ INSN_LABEL(normal_dispatch):
2684
+ PUSH(recv);
2685
+ PUSH(obj);
2686
+ CALL_SIMPLE_METHOD(recv);
2687
+ }
2688
+
2689
+ #line 2690 "vm.inc"
2690
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2691
+ PUSH(val);
2692
+ #undef CURRENT_INSN_opt_aref
2693
+ #undef INSN_IS_SC
2694
+ #undef INSN_LABEL
2695
+ #undef LABEL_IS_SC
2696
+ END_INSN(opt_aref);}}}
2697
+ INSN_ENTRY(opt_aset){
2698
+ {
2699
+ VALUE val;
2700
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2701
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2702
+ VALUE recv = TOPN(2);
2703
+ VALUE obj = TOPN(1);
2704
+ VALUE set = TOPN(0);
2705
+ DEBUG_ENTER_INSN("opt_aset");
2706
+ ADD_PC(1+2);
2707
+ PREFETCH(GET_PC());
2708
+ POPN(3);
2709
+ #define CURRENT_INSN_opt_aset 1
2710
+ #define INSN_IS_SC() 0
2711
+ #define INSN_LABEL(lab) LABEL_opt_aset_##lab
2712
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2713
+ COLLECT_USAGE_INSN(BIN(opt_aset));
2714
+ COLLECT_USAGE_OPERAND(BIN(opt_aset), 0, ci);
2715
+ COLLECT_USAGE_OPERAND(BIN(opt_aset), 1, cc);
2716
+ {
2717
+ #line 1851 "insns.def"
2718
+ if (!SPECIAL_CONST_P(recv)) {
2719
+ if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_ASET, ARRAY_REDEFINED_OP_FLAG) && FIXNUM_P(obj)) {
2720
+ rb_ary_store(recv, FIX2LONG(obj), set);
2721
+ val = set;
2722
+ }
2723
+ else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG)) {
2724
+ rb_hash_aset(recv, obj, set);
2725
+ val = set;
2726
+ }
2727
+ else {
2728
+ goto INSN_LABEL(normal_dispatch);
2729
+ }
2730
+ }
2731
+ else {
2732
+ INSN_LABEL(normal_dispatch):
2733
+ PUSH(recv);
2734
+ PUSH(obj);
2735
+ PUSH(set);
2736
+ CALL_SIMPLE_METHOD(recv);
2737
+ }
2738
+
2739
+ #line 2740 "vm.inc"
2740
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2741
+ PUSH(val);
2742
+ #undef CURRENT_INSN_opt_aset
2743
+ #undef INSN_IS_SC
2744
+ #undef INSN_LABEL
2745
+ #undef LABEL_IS_SC
2746
+ END_INSN(opt_aset);}}}
2747
+ INSN_ENTRY(opt_aset_with){
2748
+ {
2749
+ VALUE key = (VALUE)GET_OPERAND(3);
2750
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2751
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2752
+ VALUE recv = TOPN(1);
2753
+ VALUE val = TOPN(0);
2754
+ DEBUG_ENTER_INSN("opt_aset_with");
2755
+ ADD_PC(1+3);
2756
+ PREFETCH(GET_PC());
2757
+ POPN(2);
2758
+ #define CURRENT_INSN_opt_aset_with 1
2759
+ #define INSN_IS_SC() 0
2760
+ #define INSN_LABEL(lab) LABEL_opt_aset_with_##lab
2761
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2762
+ COLLECT_USAGE_INSN(BIN(opt_aset_with));
2763
+ COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 0, ci);
2764
+ COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 1, cc);
2765
+ COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 2, key);
2766
+ {
2767
+ #line 1884 "insns.def"
2768
+ if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash &&
2769
+ BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG) &&
2770
+ rb_hash_compare_by_id_p(recv) == Qfalse) {
2771
+ rb_hash_aset(recv, key, val);
2772
+ }
2773
+ else {
2774
+ PUSH(recv);
2775
+ PUSH(rb_str_resurrect(key));
2776
+ PUSH(val);
2777
+ CALL_SIMPLE_METHOD(recv);
2778
+ }
2779
+
2780
+ #line 2781 "vm.inc"
2781
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2782
+ PUSH(val);
2783
+ #undef CURRENT_INSN_opt_aset_with
2784
+ #undef INSN_IS_SC
2785
+ #undef INSN_LABEL
2786
+ #undef LABEL_IS_SC
2787
+ END_INSN(opt_aset_with);}}}
2788
+ INSN_ENTRY(opt_aref_with){
2789
+ {
2790
+ VALUE val;
2791
+ VALUE key = (VALUE)GET_OPERAND(3);
2792
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2793
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2794
+ VALUE recv = TOPN(0);
2795
+ DEBUG_ENTER_INSN("opt_aref_with");
2796
+ ADD_PC(1+3);
2797
+ PREFETCH(GET_PC());
2798
+ POPN(1);
2799
+ #define CURRENT_INSN_opt_aref_with 1
2800
+ #define INSN_IS_SC() 0
2801
+ #define INSN_LABEL(lab) LABEL_opt_aref_with_##lab
2802
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2803
+ COLLECT_USAGE_INSN(BIN(opt_aref_with));
2804
+ COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 0, ci);
2805
+ COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 1, cc);
2806
+ COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 2, key);
2807
+ {
2808
+ #line 1908 "insns.def"
2809
+ if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash &&
2810
+ BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG) &&
2811
+ rb_hash_compare_by_id_p(recv) == Qfalse) {
2812
+ val = rb_hash_aref(recv, key);
2813
+ }
2814
+ else {
2815
+ PUSH(recv);
2816
+ PUSH(rb_str_resurrect(key));
2817
+ CALL_SIMPLE_METHOD(recv);
2818
+ }
2819
+
2820
+ #line 2821 "vm.inc"
2821
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2822
+ PUSH(val);
2823
+ #undef CURRENT_INSN_opt_aref_with
2824
+ #undef INSN_IS_SC
2825
+ #undef INSN_LABEL
2826
+ #undef LABEL_IS_SC
2827
+ END_INSN(opt_aref_with);}}}
2828
+ INSN_ENTRY(opt_length){
2829
+ {
2830
+ VALUE val;
2831
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2832
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2833
+ VALUE recv = TOPN(0);
2834
+ DEBUG_ENTER_INSN("opt_length");
2835
+ ADD_PC(1+2);
2836
+ PREFETCH(GET_PC());
2837
+ POPN(1);
2838
+ #define CURRENT_INSN_opt_length 1
2839
+ #define INSN_IS_SC() 0
2840
+ #define INSN_LABEL(lab) LABEL_opt_length_##lab
2841
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2842
+ COLLECT_USAGE_INSN(BIN(opt_length));
2843
+ COLLECT_USAGE_OPERAND(BIN(opt_length), 0, ci);
2844
+ COLLECT_USAGE_OPERAND(BIN(opt_length), 1, cc);
2845
+ {
2846
+ #line 1931 "insns.def"
2847
+ if (!SPECIAL_CONST_P(recv)) {
2848
+ if (RBASIC_CLASS(recv) == rb_cString &&
2849
+ BASIC_OP_UNREDEFINED_P(BOP_LENGTH, STRING_REDEFINED_OP_FLAG)) {
2850
+ val = rb_str_length(recv);
2851
+ }
2852
+ else if (RBASIC_CLASS(recv) == rb_cArray &&
2853
+ BASIC_OP_UNREDEFINED_P(BOP_LENGTH, ARRAY_REDEFINED_OP_FLAG)) {
2854
+ val = LONG2NUM(RARRAY_LEN(recv));
2855
+ }
2856
+ else if (RBASIC_CLASS(recv) == rb_cHash &&
2857
+ BASIC_OP_UNREDEFINED_P(BOP_LENGTH, HASH_REDEFINED_OP_FLAG)) {
2858
+ val = INT2FIX(RHASH_SIZE(recv));
2859
+ }
2860
+ else {
2861
+ goto INSN_LABEL(normal_dispatch);
2862
+ }
2863
+ }
2864
+ else {
2865
+ INSN_LABEL(normal_dispatch):
2866
+ PUSH(recv);
2867
+ CALL_SIMPLE_METHOD(recv);
2868
+ }
2869
+
2870
+ #line 2871 "vm.inc"
2871
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2872
+ PUSH(val);
2873
+ #undef CURRENT_INSN_opt_length
2874
+ #undef INSN_IS_SC
2875
+ #undef INSN_LABEL
2876
+ #undef LABEL_IS_SC
2877
+ END_INSN(opt_length);}}}
2878
+ INSN_ENTRY(opt_size){
2879
+ {
2880
+ VALUE val;
2881
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2882
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2883
+ VALUE recv = TOPN(0);
2884
+ DEBUG_ENTER_INSN("opt_size");
2885
+ ADD_PC(1+2);
2886
+ PREFETCH(GET_PC());
2887
+ POPN(1);
2888
+ #define CURRENT_INSN_opt_size 1
2889
+ #define INSN_IS_SC() 0
2890
+ #define INSN_LABEL(lab) LABEL_opt_size_##lab
2891
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2892
+ COLLECT_USAGE_INSN(BIN(opt_size));
2893
+ COLLECT_USAGE_OPERAND(BIN(opt_size), 0, ci);
2894
+ COLLECT_USAGE_OPERAND(BIN(opt_size), 1, cc);
2895
+ {
2896
+ #line 1966 "insns.def"
2897
+ if (!SPECIAL_CONST_P(recv)) {
2898
+ if (RBASIC_CLASS(recv) == rb_cString &&
2899
+ BASIC_OP_UNREDEFINED_P(BOP_SIZE, STRING_REDEFINED_OP_FLAG)) {
2900
+ val = rb_str_length(recv);
2901
+ }
2902
+ else if (RBASIC_CLASS(recv) == rb_cArray &&
2903
+ BASIC_OP_UNREDEFINED_P(BOP_SIZE, ARRAY_REDEFINED_OP_FLAG)) {
2904
+ val = LONG2NUM(RARRAY_LEN(recv));
2905
+ }
2906
+ else if (RBASIC_CLASS(recv) == rb_cHash &&
2907
+ BASIC_OP_UNREDEFINED_P(BOP_SIZE, HASH_REDEFINED_OP_FLAG)) {
2908
+ val = INT2FIX(RHASH_SIZE(recv));
2909
+ }
2910
+ else {
2911
+ goto INSN_LABEL(normal_dispatch);
2912
+ }
2913
+ }
2914
+ else {
2915
+ INSN_LABEL(normal_dispatch):
2916
+ PUSH(recv);
2917
+ CALL_SIMPLE_METHOD(recv);
2918
+ }
2919
+
2920
+ #line 2921 "vm.inc"
2921
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2922
+ PUSH(val);
2923
+ #undef CURRENT_INSN_opt_size
2924
+ #undef INSN_IS_SC
2925
+ #undef INSN_LABEL
2926
+ #undef LABEL_IS_SC
2927
+ END_INSN(opt_size);}}}
2928
+ INSN_ENTRY(opt_empty_p){
2929
+ {
2930
+ VALUE val;
2931
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2932
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2933
+ VALUE recv = TOPN(0);
2934
+ DEBUG_ENTER_INSN("opt_empty_p");
2935
+ ADD_PC(1+2);
2936
+ PREFETCH(GET_PC());
2937
+ POPN(1);
2938
+ #define CURRENT_INSN_opt_empty_p 1
2939
+ #define INSN_IS_SC() 0
2940
+ #define INSN_LABEL(lab) LABEL_opt_empty_p_##lab
2941
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2942
+ COLLECT_USAGE_INSN(BIN(opt_empty_p));
2943
+ COLLECT_USAGE_OPERAND(BIN(opt_empty_p), 0, ci);
2944
+ COLLECT_USAGE_OPERAND(BIN(opt_empty_p), 1, cc);
2945
+ {
2946
+ #line 2001 "insns.def"
2947
+ if (!SPECIAL_CONST_P(recv)) {
2948
+ if (RBASIC_CLASS(recv) == rb_cString &&
2949
+ BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, STRING_REDEFINED_OP_FLAG)) {
2950
+ if (RSTRING_LEN(recv) == 0) val = Qtrue;
2951
+ else val = Qfalse;
2952
+ }
2953
+ else if (RBASIC_CLASS(recv) == rb_cArray &&
2954
+ BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, ARRAY_REDEFINED_OP_FLAG)) {
2955
+ if (RARRAY_LEN(recv) == 0) val = Qtrue;
2956
+ else val = Qfalse;
2957
+ }
2958
+ else if (RBASIC_CLASS(recv) == rb_cHash &&
2959
+ BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, HASH_REDEFINED_OP_FLAG)) {
2960
+ if (RHASH_EMPTY_P(recv)) val = Qtrue;
2961
+ else val = Qfalse;
2962
+ }
2963
+ else {
2964
+ goto INSN_LABEL(normal_dispatch);
2965
+ }
2966
+ }
2967
+ else {
2968
+ INSN_LABEL(normal_dispatch):
2969
+ PUSH(recv);
2970
+ CALL_SIMPLE_METHOD(recv);
2971
+ }
2972
+
2973
+ #line 2974 "vm.inc"
2974
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2975
+ PUSH(val);
2976
+ #undef CURRENT_INSN_opt_empty_p
2977
+ #undef INSN_IS_SC
2978
+ #undef INSN_LABEL
2979
+ #undef LABEL_IS_SC
2980
+ END_INSN(opt_empty_p);}}}
2981
+ INSN_ENTRY(opt_succ){
2982
+ {
2983
+ VALUE val;
2984
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2985
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2986
+ VALUE recv = TOPN(0);
2987
+ DEBUG_ENTER_INSN("opt_succ");
2988
+ ADD_PC(1+2);
2989
+ PREFETCH(GET_PC());
2990
+ POPN(1);
2991
+ #define CURRENT_INSN_opt_succ 1
2992
+ #define INSN_IS_SC() 0
2993
+ #define INSN_LABEL(lab) LABEL_opt_succ_##lab
2994
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2995
+ COLLECT_USAGE_INSN(BIN(opt_succ));
2996
+ COLLECT_USAGE_OPERAND(BIN(opt_succ), 0, ci);
2997
+ COLLECT_USAGE_OPERAND(BIN(opt_succ), 1, cc);
2998
+ {
2999
+ #line 2039 "insns.def"
3000
+ if (SPECIAL_CONST_P(recv)) {
3001
+ if (FIXNUM_P(recv) &&
3002
+ BASIC_OP_UNREDEFINED_P(BOP_SUCC, INTEGER_REDEFINED_OP_FLAG)) {
3003
+ /* fixnum + INT2FIX(1) */
3004
+ if (recv != LONG2FIX(FIXNUM_MAX)) {
3005
+ val = recv - 1 + INT2FIX(1);
3006
+ }
3007
+ else {
3008
+ val = LONG2NUM(FIXNUM_MAX + 1);
3009
+ }
3010
+ }
3011
+ else {
3012
+ goto INSN_LABEL(normal_dispatch);
3013
+ }
3014
+ }
3015
+ else {
3016
+ if (RBASIC_CLASS(recv) == rb_cString &&
3017
+ BASIC_OP_UNREDEFINED_P(BOP_SUCC, STRING_REDEFINED_OP_FLAG)) {
3018
+ val = rb_str_succ(recv);
3019
+ }
3020
+ else {
3021
+ goto INSN_LABEL(normal_dispatch);
3022
+ }
3023
+ }
3024
+ if (0) {
3025
+ INSN_LABEL(normal_dispatch):
3026
+ PUSH(recv);
3027
+ CALL_SIMPLE_METHOD(recv);
3028
+ }
3029
+
3030
+ #line 3031 "vm.inc"
3031
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3032
+ PUSH(val);
3033
+ #undef CURRENT_INSN_opt_succ
3034
+ #undef INSN_IS_SC
3035
+ #undef INSN_LABEL
3036
+ #undef LABEL_IS_SC
3037
+ END_INSN(opt_succ);}}}
3038
+ INSN_ENTRY(opt_not){
3039
+ {
3040
+ VALUE val;
3041
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3042
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3043
+ VALUE recv = TOPN(0);
3044
+ DEBUG_ENTER_INSN("opt_not");
3045
+ ADD_PC(1+2);
3046
+ PREFETCH(GET_PC());
3047
+ POPN(1);
3048
+ #define CURRENT_INSN_opt_not 1
3049
+ #define INSN_IS_SC() 0
3050
+ #define INSN_LABEL(lab) LABEL_opt_not_##lab
3051
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3052
+ COLLECT_USAGE_INSN(BIN(opt_not));
3053
+ COLLECT_USAGE_OPERAND(BIN(opt_not), 0, ci);
3054
+ COLLECT_USAGE_OPERAND(BIN(opt_not), 1, cc);
3055
+ {
3056
+ #line 2081 "insns.def"
3057
+ vm_search_method(ci, cc, recv);
3058
+
3059
+ if (check_cfunc(cc->me, rb_obj_not)) {
3060
+ val = RTEST(recv) ? Qfalse : Qtrue;
3061
+ }
3062
+ else {
3063
+ PUSH(recv);
3064
+ CALL_SIMPLE_METHOD(recv);
3065
+ }
3066
+
3067
+ #line 3068 "vm.inc"
3068
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3069
+ PUSH(val);
3070
+ #undef CURRENT_INSN_opt_not
3071
+ #undef INSN_IS_SC
3072
+ #undef INSN_LABEL
3073
+ #undef LABEL_IS_SC
3074
+ END_INSN(opt_not);}}}
3075
+ INSN_ENTRY(opt_regexpmatch1){
3076
+ {
3077
+ VALUE val;
3078
+ VALUE r = (VALUE)GET_OPERAND(1);
3079
+ VALUE obj = TOPN(0);
3080
+ DEBUG_ENTER_INSN("opt_regexpmatch1");
3081
+ ADD_PC(1+1);
3082
+ PREFETCH(GET_PC());
3083
+ POPN(1);
3084
+ #define CURRENT_INSN_opt_regexpmatch1 1
3085
+ #define INSN_IS_SC() 0
3086
+ #define INSN_LABEL(lab) LABEL_opt_regexpmatch1_##lab
3087
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3088
+ COLLECT_USAGE_INSN(BIN(opt_regexpmatch1));
3089
+ COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch1), 0, r);
3090
+ {
3091
+ #line 2104 "insns.def"
3092
+ if (BASIC_OP_UNREDEFINED_P(BOP_MATCH, REGEXP_REDEFINED_OP_FLAG)) {
3093
+ val = rb_reg_match(r, obj);
3094
+ }
3095
+ else {
3096
+ val = rb_funcall(r, idEqTilde, 1, obj);
3097
+ }
3098
+
3099
+ #line 3100 "vm.inc"
3100
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3101
+ PUSH(val);
3102
+ #undef CURRENT_INSN_opt_regexpmatch1
3103
+ #undef INSN_IS_SC
3104
+ #undef INSN_LABEL
3105
+ #undef LABEL_IS_SC
3106
+ END_INSN(opt_regexpmatch1);}}}
3107
+ INSN_ENTRY(opt_regexpmatch2){
3108
+ {
3109
+ VALUE val;
3110
+ CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3111
+ CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3112
+ VALUE obj2 = TOPN(1);
3113
+ VALUE obj1 = TOPN(0);
3114
+ DEBUG_ENTER_INSN("opt_regexpmatch2");
3115
+ ADD_PC(1+2);
3116
+ PREFETCH(GET_PC());
3117
+ POPN(2);
3118
+ #define CURRENT_INSN_opt_regexpmatch2 1
3119
+ #define INSN_IS_SC() 0
3120
+ #define INSN_LABEL(lab) LABEL_opt_regexpmatch2_##lab
3121
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3122
+ COLLECT_USAGE_INSN(BIN(opt_regexpmatch2));
3123
+ COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch2), 0, ci);
3124
+ COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch2), 1, cc);
3125
+ {
3126
+ #line 2123 "insns.def"
3127
+ if (CLASS_OF(obj2) == rb_cString &&
3128
+ BASIC_OP_UNREDEFINED_P(BOP_MATCH, STRING_REDEFINED_OP_FLAG)) {
3129
+ val = rb_reg_match(obj1, obj2);
3130
+ }
3131
+ else {
3132
+ PUSH(obj2);
3133
+ PUSH(obj1);
3134
+ CALL_SIMPLE_METHOD(obj2);
3135
+ }
3136
+
3137
+ #line 3138 "vm.inc"
3138
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3139
+ PUSH(val);
3140
+ #undef CURRENT_INSN_opt_regexpmatch2
3141
+ #undef INSN_IS_SC
3142
+ #undef INSN_LABEL
3143
+ #undef LABEL_IS_SC
3144
+ END_INSN(opt_regexpmatch2);}}}
3145
+ INSN_ENTRY(opt_call_c_function){
3146
+ {
3147
+ rb_insn_func_t funcptr = (rb_insn_func_t)GET_OPERAND(1);
3148
+
3149
+ DEBUG_ENTER_INSN("opt_call_c_function");
3150
+ ADD_PC(1+1);
3151
+ PREFETCH(GET_PC());
3152
+ #define CURRENT_INSN_opt_call_c_function 1
3153
+ #define INSN_IS_SC() 0
3154
+ #define INSN_LABEL(lab) LABEL_opt_call_c_function_##lab
3155
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3156
+ COLLECT_USAGE_INSN(BIN(opt_call_c_function));
3157
+ COLLECT_USAGE_OPERAND(BIN(opt_call_c_function), 0, funcptr);
3158
+ {
3159
+ #line 2145 "insns.def"
3160
+ reg_cfp = (funcptr)(th, reg_cfp);
3161
+
3162
+ if (reg_cfp == 0) {
3163
+ VALUE err = th->errinfo;
3164
+ th->errinfo = Qnil;
3165
+ THROW_EXCEPTION(err);
3166
+ }
3167
+
3168
+ RESTORE_REGS();
3169
+ NEXT_INSN();
3170
+
3171
+ #line 3172 "vm.inc"
3172
+ #undef CURRENT_INSN_opt_call_c_function
3173
+ #undef INSN_IS_SC
3174
+ #undef INSN_LABEL
3175
+ #undef LABEL_IS_SC
3176
+ END_INSN(opt_call_c_function);}}}
3177
+ INSN_ENTRY(bitblt){
3178
+ {
3179
+ VALUE ret;
3180
+
3181
+
3182
+ DEBUG_ENTER_INSN("bitblt");
3183
+ ADD_PC(1+0);
3184
+ PREFETCH(GET_PC());
3185
+ #define CURRENT_INSN_bitblt 1
3186
+ #define INSN_IS_SC() 0
3187
+ #define INSN_LABEL(lab) LABEL_bitblt_##lab
3188
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3189
+ COLLECT_USAGE_INSN(BIN(bitblt));
3190
+ {
3191
+ #line 2168 "insns.def"
3192
+ ret = rb_str_new2("a bit of bacon, lettuce and tomato");
3193
+
3194
+ #line 3195 "vm.inc"
3195
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3196
+ PUSH(ret);
3197
+ #undef CURRENT_INSN_bitblt
3198
+ #undef INSN_IS_SC
3199
+ #undef INSN_LABEL
3200
+ #undef LABEL_IS_SC
3201
+ END_INSN(bitblt);}}}
3202
+ INSN_ENTRY(answer){
3203
+ {
3204
+ VALUE ret;
3205
+
3206
+
3207
+ DEBUG_ENTER_INSN("answer");
3208
+ ADD_PC(1+0);
3209
+ PREFETCH(GET_PC());
3210
+ #define CURRENT_INSN_answer 1
3211
+ #define INSN_IS_SC() 0
3212
+ #define INSN_LABEL(lab) LABEL_answer_##lab
3213
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3214
+ COLLECT_USAGE_INSN(BIN(answer));
3215
+ {
3216
+ #line 2182 "insns.def"
3217
+ ret = INT2FIX(42);
3218
+
3219
+ #line 3220 "vm.inc"
3220
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3221
+ PUSH(ret);
3222
+ #undef CURRENT_INSN_answer
3223
+ #undef INSN_IS_SC
3224
+ #undef INSN_LABEL
3225
+ #undef LABEL_IS_SC
3226
+ END_INSN(answer);}}}
3227
+ INSN_ENTRY(getlocal_OP__WC__0){
3228
+ {
3229
+ VALUE val;
3230
+ #define level 0
3231
+ lindex_t idx = (lindex_t)GET_OPERAND(1);
3232
+
3233
+ DEBUG_ENTER_INSN("getlocal_OP__WC__0");
3234
+ ADD_PC(1+1);
3235
+ PREFETCH(GET_PC());
3236
+ #define CURRENT_INSN_getlocal_OP__WC__0 1
3237
+ #define INSN_IS_SC() 0
3238
+ #define INSN_LABEL(lab) LABEL_getlocal_OP__WC__0_##lab
3239
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3240
+ COLLECT_USAGE_INSN(BIN(getlocal_OP__WC__0));
3241
+ COLLECT_USAGE_OPERAND(BIN(getlocal_OP__WC__0), 0, idx);
3242
+ {
3243
+ #line 60 "insns.def"
3244
+ int i, lev = (int)level;
3245
+ const VALUE *ep = GET_EP();
3246
+
3247
+ /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3248
+ for (i = 0; i < lev; i++) {
3249
+ ep = GET_PREV_EP(ep);
3250
+ }
3251
+ val = *(ep - idx);
3252
+
3253
+ #line 3254 "vm.inc"
3254
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3255
+ PUSH(val);
3256
+ #undef level
3257
+ #undef CURRENT_INSN_getlocal_OP__WC__0
3258
+ #undef INSN_IS_SC
3259
+ #undef INSN_LABEL
3260
+ #undef LABEL_IS_SC
3261
+ END_INSN(getlocal_OP__WC__0);}}}
3262
+ INSN_ENTRY(getlocal_OP__WC__1){
3263
+ {
3264
+ VALUE val;
3265
+ #define level 1
3266
+ lindex_t idx = (lindex_t)GET_OPERAND(1);
3267
+
3268
+ DEBUG_ENTER_INSN("getlocal_OP__WC__1");
3269
+ ADD_PC(1+1);
3270
+ PREFETCH(GET_PC());
3271
+ #define CURRENT_INSN_getlocal_OP__WC__1 1
3272
+ #define INSN_IS_SC() 0
3273
+ #define INSN_LABEL(lab) LABEL_getlocal_OP__WC__1_##lab
3274
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3275
+ COLLECT_USAGE_INSN(BIN(getlocal_OP__WC__1));
3276
+ COLLECT_USAGE_OPERAND(BIN(getlocal_OP__WC__1), 0, idx);
3277
+ {
3278
+ #line 60 "insns.def"
3279
+ int i, lev = (int)level;
3280
+ const VALUE *ep = GET_EP();
3281
+
3282
+ /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3283
+ for (i = 0; i < lev; i++) {
3284
+ ep = GET_PREV_EP(ep);
3285
+ }
3286
+ val = *(ep - idx);
3287
+
3288
+ #line 3289 "vm.inc"
3289
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3290
+ PUSH(val);
3291
+ #undef level
3292
+ #undef CURRENT_INSN_getlocal_OP__WC__1
3293
+ #undef INSN_IS_SC
3294
+ #undef INSN_LABEL
3295
+ #undef LABEL_IS_SC
3296
+ END_INSN(getlocal_OP__WC__1);}}}
3297
+ INSN_ENTRY(setlocal_OP__WC__0){
3298
+ {
3299
+ #define level 0
3300
+ lindex_t idx = (lindex_t)GET_OPERAND(1);
3301
+ VALUE val = TOPN(0);
3302
+ DEBUG_ENTER_INSN("setlocal_OP__WC__0");
3303
+ ADD_PC(1+1);
3304
+ PREFETCH(GET_PC());
3305
+ POPN(1);
3306
+ #define CURRENT_INSN_setlocal_OP__WC__0 1
3307
+ #define INSN_IS_SC() 0
3308
+ #define INSN_LABEL(lab) LABEL_setlocal_OP__WC__0_##lab
3309
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3310
+ COLLECT_USAGE_INSN(BIN(setlocal_OP__WC__0));
3311
+ COLLECT_USAGE_OPERAND(BIN(setlocal_OP__WC__0), 0, idx);
3312
+ {
3313
+ #line 83 "insns.def"
3314
+ int i, lev = (int)level;
3315
+ const VALUE *ep = GET_EP();
3316
+
3317
+ /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3318
+ for (i = 0; i < lev; i++) {
3319
+ ep = GET_PREV_EP(ep);
3320
+ }
3321
+ vm_env_write(ep, -(int)idx, val);
3322
+
3323
+ #line 3324 "vm.inc"
3324
+ #undef level
3325
+ #undef CURRENT_INSN_setlocal_OP__WC__0
3326
+ #undef INSN_IS_SC
3327
+ #undef INSN_LABEL
3328
+ #undef LABEL_IS_SC
3329
+ END_INSN(setlocal_OP__WC__0);}}}
3330
+ INSN_ENTRY(setlocal_OP__WC__1){
3331
+ {
3332
+ #define level 1
3333
+ lindex_t idx = (lindex_t)GET_OPERAND(1);
3334
+ VALUE val = TOPN(0);
3335
+ DEBUG_ENTER_INSN("setlocal_OP__WC__1");
3336
+ ADD_PC(1+1);
3337
+ PREFETCH(GET_PC());
3338
+ POPN(1);
3339
+ #define CURRENT_INSN_setlocal_OP__WC__1 1
3340
+ #define INSN_IS_SC() 0
3341
+ #define INSN_LABEL(lab) LABEL_setlocal_OP__WC__1_##lab
3342
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3343
+ COLLECT_USAGE_INSN(BIN(setlocal_OP__WC__1));
3344
+ COLLECT_USAGE_OPERAND(BIN(setlocal_OP__WC__1), 0, idx);
3345
+ {
3346
+ #line 83 "insns.def"
3347
+ int i, lev = (int)level;
3348
+ const VALUE *ep = GET_EP();
3349
+
3350
+ /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3351
+ for (i = 0; i < lev; i++) {
3352
+ ep = GET_PREV_EP(ep);
3353
+ }
3354
+ vm_env_write(ep, -(int)idx, val);
3355
+
3356
+ #line 3357 "vm.inc"
3357
+ #undef level
3358
+ #undef CURRENT_INSN_setlocal_OP__WC__1
3359
+ #undef INSN_IS_SC
3360
+ #undef INSN_LABEL
3361
+ #undef LABEL_IS_SC
3362
+ END_INSN(setlocal_OP__WC__1);}}}
3363
+ INSN_ENTRY(putobject_OP_INT2FIX_O_0_C_){
3364
+ {
3365
+ #define val INT2FIX(0)
3366
+
3367
+
3368
+ DEBUG_ENTER_INSN("putobject_OP_INT2FIX_O_0_C_");
3369
+ ADD_PC(1+0);
3370
+ PREFETCH(GET_PC());
3371
+ #define CURRENT_INSN_putobject_OP_INT2FIX_O_0_C_ 1
3372
+ #define INSN_IS_SC() 0
3373
+ #define INSN_LABEL(lab) LABEL_putobject_OP_INT2FIX_O_0_C__##lab
3374
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3375
+ COLLECT_USAGE_INSN(BIN(putobject_OP_INT2FIX_O_0_C_));
3376
+ {
3377
+ #line 299 "insns.def"
3378
+ /* */
3379
+
3380
+ #line 3381 "vm.inc"
3381
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3382
+ PUSH(val);
3383
+ #undef val
3384
+ #undef CURRENT_INSN_putobject_OP_INT2FIX_O_0_C_
3385
+ #undef INSN_IS_SC
3386
+ #undef INSN_LABEL
3387
+ #undef LABEL_IS_SC
3388
+ END_INSN(putobject_OP_INT2FIX_O_0_C_);}}}
3389
+ INSN_ENTRY(putobject_OP_INT2FIX_O_1_C_){
3390
+ {
3391
+ #define val INT2FIX(1)
3392
+
3393
+
3394
+ DEBUG_ENTER_INSN("putobject_OP_INT2FIX_O_1_C_");
3395
+ ADD_PC(1+0);
3396
+ PREFETCH(GET_PC());
3397
+ #define CURRENT_INSN_putobject_OP_INT2FIX_O_1_C_ 1
3398
+ #define INSN_IS_SC() 0
3399
+ #define INSN_LABEL(lab) LABEL_putobject_OP_INT2FIX_O_1_C__##lab
3400
+ #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3401
+ COLLECT_USAGE_INSN(BIN(putobject_OP_INT2FIX_O_1_C_));
3402
+ {
3403
+ #line 299 "insns.def"
3404
+ /* */
3405
+
3406
+ #line 3407 "vm.inc"
3407
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3408
+ PUSH(val);
3409
+ #undef val
3410
+ #undef CURRENT_INSN_putobject_OP_INT2FIX_O_1_C_
3411
+ #undef INSN_IS_SC
3412
+ #undef INSN_LABEL
3413
+ #undef LABEL_IS_SC
3414
+ END_INSN(putobject_OP_INT2FIX_O_1_C_);}}}
3415
+