debase-ruby_core_source 0.9.2 → 0.9.3

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