debugger-ruby_core_source 1.3.7 → 1.3.8

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