[331] | 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
|
---|
[439] | 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
|
---|