1 | ##
|
---|
2 | # Codegen tests
|
---|
3 |
|
---|
4 | assert('peephole optimization does not eliminate move whose result is reused') do
|
---|
5 | assert_raise LocalJumpError do
|
---|
6 | def method
|
---|
7 | yield
|
---|
8 | end
|
---|
9 | method(&a &&= 0)
|
---|
10 | end
|
---|
11 | end
|
---|
12 |
|
---|
13 | assert('empty condition in ternary expression parses correctly') do
|
---|
14 | assert_equal(() ? 1 : 2, 2)
|
---|
15 | end
|
---|
16 |
|
---|
17 | assert('method call with exactly 127 arguments') do
|
---|
18 | def args_to_ary(*args)
|
---|
19 | args
|
---|
20 | end
|
---|
21 |
|
---|
22 | assert_equal [0]*127, args_to_ary(
|
---|
23 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
|
---|
24 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
|
---|
25 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
|
---|
26 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
|
---|
27 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
|
---|
28 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
---|
29 | )
|
---|
30 | end
|
---|
31 |
|
---|
32 | assert('nested empty heredoc') do
|
---|
33 | _, a = nil, <<B
|
---|
34 | #{<<A}
|
---|
35 | A
|
---|
36 | B
|
---|
37 | assert_equal "\n", a
|
---|
38 | end
|
---|
39 |
|
---|
40 | assert('splat in case splat') do
|
---|
41 | a = *case
|
---|
42 | when 0
|
---|
43 | * = 1
|
---|
44 | end
|
---|
45 |
|
---|
46 | assert_equal [1], a
|
---|
47 | end
|
---|
48 |
|
---|
49 | assert('undef with 127 or more arguments') do
|
---|
50 | assert_raise NameError do
|
---|
51 | undef
|
---|
52 | a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,
|
---|
53 | a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,
|
---|
54 | a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,
|
---|
55 | a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a
|
---|
56 | end
|
---|
57 | end
|
---|
58 |
|
---|
59 | assert('next in normal loop with 127 arguments') do
|
---|
60 | assert_raise NameError do
|
---|
61 | while true
|
---|
62 | next A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A
|
---|
63 | end
|
---|
64 | end
|
---|
65 | end
|
---|
66 |
|
---|
67 | assert('negate literal register alignment') do
|
---|
68 | a = *case
|
---|
69 | when 0
|
---|
70 | -0.0
|
---|
71 | 2
|
---|
72 | end
|
---|
73 |
|
---|
74 | assert_equal [2], a
|
---|
75 | end
|
---|
76 |
|
---|
77 | assert('register window of calls (#3783)') do
|
---|
78 | # NODE_FOR
|
---|
79 | assert_nothing_raised do
|
---|
80 | for i in []; end
|
---|
81 | end
|
---|
82 |
|
---|
83 | # NODE_SYMBOLS
|
---|
84 | assert_nothing_raised do
|
---|
85 | %i(sym)
|
---|
86 | end
|
---|
87 |
|
---|
88 | # NODE_SCALL
|
---|
89 | assert_nothing_raised do
|
---|
90 | Object.new&.__id__
|
---|
91 | end
|
---|
92 |
|
---|
93 | # NODE_RESCUE with splat
|
---|
94 | assert_nothing_raised do
|
---|
95 | begin
|
---|
96 | raise
|
---|
97 | rescue *[Exception]
|
---|
98 | end
|
---|
99 | end
|
---|
100 |
|
---|
101 | # NODE_CASE
|
---|
102 | assert_nothing_raised do
|
---|
103 | case 1
|
---|
104 | when nil
|
---|
105 | end
|
---|
106 | end
|
---|
107 |
|
---|
108 | # NODE_CASE with splat
|
---|
109 | assert_nothing_raised do
|
---|
110 | case 1
|
---|
111 | when *nil
|
---|
112 | end
|
---|
113 | end
|
---|
114 |
|
---|
115 | # NODE_HASH
|
---|
116 | assert_nothing_raised do
|
---|
117 | {}.merge(
|
---|
118 | 0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9,
|
---|
119 | 10=>10, 11=>11, 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, 17=>17, 18=>18, 19=>19,
|
---|
120 | 20=>20, 21=>21, 22=>22, 23=>23, 24=>24, 25=>25, 26=>26, 27=>27, 28=>28, 29=>29,
|
---|
121 | 30=>30, 31=>31, 32=>32, 33=>33, 34=>34, 35=>35, 36=>36, 37=>37, 38=>38, 39=>39,
|
---|
122 | 40=>40, 41=>41, 42=>42, 43=>43, 44=>44, 45=>45, 46=>46, 47=>47, 48=>48, 49=>49,
|
---|
123 | 50=>50, 51=>51, 52=>52, 53=>53, 54=>54, 55=>55, 56=>56, 57=>57, 58=>58, 59=>59,
|
---|
124 | 60=>60, 61=>61, 62=>62, 63=>63, 64=>64, 65=>65, 66=>66, 67=>67, 68=>68, 69=>69,
|
---|
125 | 70=>70, 71=>71, 72=>72, 73=>73, 74=>74, 75=>75, 76=>76, 77=>77, 78=>78, 79=>79,
|
---|
126 | 80=>80, 81=>81, 82=>82, 83=>83, 84=>84, 85=>85, 86=>86, 87=>87, 88=>88, 89=>89,
|
---|
127 | 90=>90, 91=>91, 92=>92, 93=>93, 94=>94, 95=>95, 96=>96, 97=>97, 98=>98, 99=>99,
|
---|
128 | 100=>100, 101=>101, 102=>102, 103=>103, 104=>104, 105=>105, 106=>106, 107=>107, 108=>108, 109=>109,
|
---|
129 | 110=>110, 111=>111, 112=>112, 113=>113, 114=>114, 115=>115, 116=>116, 117=>117, 118=>118, 119=>119,
|
---|
130 | 120=>120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126)
|
---|
131 | end
|
---|
132 |
|
---|
133 | # NODE_OP_ASGN
|
---|
134 | o = Object.new
|
---|
135 | class << o
|
---|
136 | attr_accessor :a
|
---|
137 | end
|
---|
138 |
|
---|
139 | o.a = 1
|
---|
140 | assert_nothing_raised{ o.a += 1 }
|
---|
141 | o.a = 1
|
---|
142 | assert_nothing_raised{ o.a <<= 1 }
|
---|
143 | o.a = 1
|
---|
144 | assert_nothing_raised{ o.a &&= 1 }
|
---|
145 |
|
---|
146 | o = { k: 1 }
|
---|
147 | assert_nothing_raised{ o[:k] += 1 }
|
---|
148 | o = { k: 1 }
|
---|
149 | assert_nothing_raised{ o[:k] <<= 1 }
|
---|
150 | o = { k: 1 }
|
---|
151 | assert_nothing_raised{ o[:k] &&= 1 }
|
---|
152 |
|
---|
153 | o = { k: 1 }
|
---|
154 | assert_nothing_raised{ o[*[:k]] += 1 }
|
---|
155 | o = { k: 1 }
|
---|
156 | assert_nothing_raised{ o[*[:k]] <<= 1 }
|
---|
157 | o = { k: 1 }
|
---|
158 | assert_nothing_raised{ o[*[:k]] &&= 1 }
|
---|
159 |
|
---|
160 | # NODE_YIELD
|
---|
161 | def check_node_yield
|
---|
162 | yield
|
---|
163 | end
|
---|
164 | assert_nothing_raised do
|
---|
165 | check_node_yield{}
|
---|
166 | end
|
---|
167 |
|
---|
168 | # NODE_DXSTR
|
---|
169 | assert_raise(NotImplementedError){ `#{:dynamic}` }
|
---|
170 |
|
---|
171 | # NODE_XSTR
|
---|
172 | assert_raise(NotImplementedError){ `static` }
|
---|
173 |
|
---|
174 | # NODE_DREGX
|
---|
175 | class Regexp; end
|
---|
176 | assert_raise(NoMethodError){ /#{'dynamic'}tail/ }
|
---|
177 | assert_raise(NoMethodError){ /#{'dynamic'}tail/iu }
|
---|
178 |
|
---|
179 | # NODE_REGX
|
---|
180 | assert_raise(NoMethodError){ /static/ }
|
---|
181 | assert_raise(NoMethodError){ /static/iu }
|
---|
182 | Object.remove_const :Regexp
|
---|
183 |
|
---|
184 | # NODE_UNDEF
|
---|
185 | assert_nothing_raised do
|
---|
186 | class << Object.new
|
---|
187 | undef inspect
|
---|
188 | end
|
---|
189 | end
|
---|
190 |
|
---|
191 | # NODE_ALIAS
|
---|
192 | assert_nothing_raised do
|
---|
193 | class << Object.new
|
---|
194 | alias inspect2 inspect
|
---|
195 | end
|
---|
196 | end
|
---|
197 | end
|
---|