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