1assert_equal %q{ok}, %q{ 2 def m 3 :ng1 4 mm{ 5 yield 6 } 7 :ng2 8 end 9 10 def mm 11 :ng3 12 yield 13 :ng4 14 end 15 16 m{ 17 break :ok 18 } 19} 20assert_equal %q{ok}, %q{ 21 3.times{ 22 break :ok 23 } 24} 25assert_equal %q{}, %q{ 26 catch(:foo){ 27 throw :foo 28 } 29} 30assert_equal %q{false}, %q{ 31 catch(:foo){ 32 throw :foo, false 33 } 34} 35assert_equal %q{}, %q{ 36 catch(:foo){ 37 throw :foo, nil 38 } 39} 40assert_equal %q{ok}, %q{ 41 catch(:foo){ 42 throw :foo, :ok 43 } 44} 45assert_equal %q{}, %q{ 46 catch(:foo){ 47 1.times{ 48 throw :foo 49 } 50 } 51} 52assert_equal %q{ok}, %q{ 53 catch(:foo){ 54 1.times{ 55 throw :foo, :ok 56 } 57 } 58} 59assert_equal %q{ok}, %q{ 60 catch(:foo){ 61 catch(:bar){ 62 throw :foo, :ok 63 } 64 :ng 65 } 66} 67assert_equal %q{ok}, %q{ 68 catch(:foo){ 69 catch(:bar){ 70 1.times{ 71 throw :foo, :ok 72 } 73 } 74 :ng 75 } 76} 77assert_equal %q{2}, %q{ 78 module Enumerable 79 def all_? 80 self.each{|e| 81 unless yield(e) 82 return false 83 end 84 } 85 true 86 end 87 end 88 89 xxx = 0 90 [1,2].each{|bi| 91 [3,4].each{|bj| 92 [true, nil, true].all_?{|be| be} 93 break 94 } 95 xxx += 1 96 } 97 xxx 98} 99assert_equal %q{ok}, %q{ 100 def m 101 yield 102 end 103 104 m{ 105 begin 106 ensure 107 break :ok 108 end 109 } 110} 111assert_equal %q{ok}, %q{ 112 def m 113 yield 114 :ok 115 end 116 i=0 117 m{ 118 if i>10 119 i*i 120 else 121 i+=1 122 next 123 end 124 } 125} 126assert_equal %q{ok}, %q{ 127 def m 128 yield 129 end 130 131 m{ 132 next :ok 133 } 134} 135assert_equal %q{131}, %q{ 136 def m 137 yield + 10 138 end 139 i=0 140 m{ 141 if i>10 142 i*i 143 else 144 i+=1 145 redo 146 end 147 } 148} 149assert_equal %q{ok}, %q{ 150begin 151 eval %q{ 152 1.times{ 153 retry 154 } 155 } 156rescue SyntaxError 157 :ok 158end 159} 160assert_equal %q{3}, %q{ 161 def m 162 return 3 163 end 164 m 165} 166assert_equal %q{ok}, %q{ 167 def m 168 :ng1 169 mm{ 170 return :ok 171 } 172 :ng2 173 end 174 175 def mm 176 :ng3 177 yield 178 :ng4 179 end 180 m 181} 182assert_equal %q{100}, %q{ 183 $i = 0 184 def m 185 begin 186 iter{ 187 return 188 } 189 ensure 190 $i = 100 191 end 192 end 193 194 def iter 195 yield 196 end 197 m 198 $i 199} 200assert_equal %q{ok}, %q{ 201 def m 202 begin 203 raise 204 rescue 205 return :ok 206 end 207 :ng 208 end 209 m 210} 211assert_equal %q{1}, %q{ 212 def m 213 begin 214 raise 215 rescue 216 return 1 217 end 218 end 219 220 m 221} 222assert_equal %q{1}, %q{ 223 def m 224 begin 225 # 226 ensure 227 return 1 228 end 229 end 230 231 m 232} 233assert_equal 'ok', %q{ 234 begin 235 catch {|t| throw t, :ok } 236 rescue ArgumentError 237 :ng 238 end 239}, '[ruby-dev:31609]' 240 241assert_equal "1", %q{ 242 catch do |t| 243 begin 244 throw t, 1 245 2 246 ensure 247 3 248 end 249 end 250}, "[ruby-dev:31698]" 251 252assert_normal_exit %q{ 253 f = 0 254 1.times do 255 begin 256 f += 1 257 ensure 258 redo unless f > 2 259 end 260 end 261} 262 263assert_normal_exit %q{ 264 -> do 265 1.times do 266 begin 267 raise 268 rescue 269 return 270 end 271 end 272 end.call 273} 274 275assert_normal_exit %q{ 276 while true 277 begin 278 raise 279 next 280 rescue 281 end 282 break 283 end 284}, '[ruby-core:28172]' 285 286assert_equal "true", %q{ 287 class Object 288 def return_eigenclass 289 class << self 290 return self 291 end 292 end 293 end 294 s = "foo" 295 s.return_eigenclass == class << s; self; end 296}, '[ruby-core:21379]' 297 298assert_equal "true", %q{ 299 class Object 300 def yield_eigenclass 301 class << self 302 yield self 303 end 304 end 305 end 306 s = "foo" 307 s.yield_eigenclass {|c| c == class << s; self; end } 308}, '[ruby-dev:40975]' 309