debase-ruby_core_source 0.8.5 → 0.8.6

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