mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	``` if L1 L0: jump L2 L1: ... L2: ``` was wrongly optimized to: ``` unless L2 L0: L1: ... L2: ``` To make it conservative, this optimization is now disabled when there is any label between `if` and `jump` instructions. Fixes [Bug #14897]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63868 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			601 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			601 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
assert_equal %q{[1, 2, 4, 5, 6, 7, 8]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each{; $a << 2
 | 
						|
    break; $a << 3
 | 
						|
  }; $a << 4
 | 
						|
  begin; $a << 5
 | 
						|
  ensure; $a << 6
 | 
						|
  end; $a << 7
 | 
						|
; $a << 8
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 6, 7, 8]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  begin; $a << 2
 | 
						|
    [1,2].each do; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    end; $a << 5
 | 
						|
  ensure; $a << 6
 | 
						|
  end; $a << 7
 | 
						|
; $a << 8
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{ok}, %q{
 | 
						|
  ["a"].inject("ng"){|x,y|
 | 
						|
    break :ok
 | 
						|
  }
 | 
						|
}
 | 
						|
assert_equal %q{ok}, %q{
 | 
						|
  unless ''.respond_to? :lines
 | 
						|
    class String
 | 
						|
      def lines
 | 
						|
        self
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  ('a').lines.map{|e|
 | 
						|
    break :ok
 | 
						|
  }
 | 
						|
}
 | 
						|
assert_equal %q{[1, 2, 4, 5]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  ["a"].inject("ng"){|x,y|; $a << 2
 | 
						|
    break :ok; $a << 3
 | 
						|
  }; $a << 4
 | 
						|
; $a << 5
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 4, 5]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  ('a'..'b').map{|e|; $a << 2
 | 
						|
    break :ok; $a << 3
 | 
						|
  }; $a << 4
 | 
						|
; $a << 5
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 7, 8]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each do; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
    end; $a << 6
 | 
						|
  end; $a << 7
 | 
						|
; $a << 8
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 6, 9, 10]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i=0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    begin; $a << 5
 | 
						|
    ensure; $a << 6
 | 
						|
      break; $a << 7
 | 
						|
    end; $a << 8
 | 
						|
  end; $a << 9
 | 
						|
; $a << 10
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 7, 10, 11]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i=0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    begin; $a << 5
 | 
						|
      raise; $a << 6
 | 
						|
    ensure; $a << 7
 | 
						|
      break; $a << 8
 | 
						|
    end; $a << 9
 | 
						|
  end; $a << 10
 | 
						|
; $a << 11
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 7, 10, 11]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i=0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    begin; $a << 5
 | 
						|
      raise; $a << 6
 | 
						|
    rescue; $a << 7
 | 
						|
      break; $a << 8
 | 
						|
    end; $a << 9
 | 
						|
  end; $a << 10
 | 
						|
; $a << 11
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each do; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      raise StandardError; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
      break; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each do; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      raise StandardError; $a << 4
 | 
						|
    rescue; $a << 5
 | 
						|
      break; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 6, 8, 10, 11]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each do; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      begin; $a << 4
 | 
						|
        break; $a << 5
 | 
						|
      ensure; $a << 6
 | 
						|
      end; $a << 7
 | 
						|
    ensure; $a << 8
 | 
						|
    end; $a << 9
 | 
						|
  end; $a << 10
 | 
						|
; $a << 11
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i = 0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    j = 0; $a << 5
 | 
						|
    while j<3; $a << 6
 | 
						|
      j+=1; $a << 7
 | 
						|
      begin; $a << 8
 | 
						|
        raise; $a << 9
 | 
						|
      rescue; $a << 10
 | 
						|
        break; $a << 11
 | 
						|
      end; $a << 12
 | 
						|
    end; $a << 13
 | 
						|
  end; $a << 14
 | 
						|
; $a << 15
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 16, 17]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i = 0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    j = 0; $a << 5
 | 
						|
    while j<3; $a << 6
 | 
						|
      j+=1; $a << 7
 | 
						|
      1.times{; $a << 8
 | 
						|
        begin; $a << 9
 | 
						|
          raise; $a << 10
 | 
						|
        rescue; $a << 11
 | 
						|
          break; $a << 12
 | 
						|
        end; $a << 13
 | 
						|
      }; $a << 14
 | 
						|
    end; $a << 15
 | 
						|
  end; $a << 16
 | 
						|
; $a << 17
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i = 0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    j = 0; $a << 5
 | 
						|
    while j<3; $a << 6
 | 
						|
      j+=1; $a << 7
 | 
						|
      begin; $a << 8
 | 
						|
        raise; $a << 9
 | 
						|
      ensure; $a << 10
 | 
						|
        break; $a << 11
 | 
						|
      end; $a << 12
 | 
						|
    end; $a << 13
 | 
						|
  end; $a << 14
 | 
						|
; $a << 15
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 16, 17]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i = 0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    j = 0; $a << 5
 | 
						|
    while j<3; $a << 6
 | 
						|
      j+=1; $a << 7
 | 
						|
      1.times{; $a << 8
 | 
						|
        begin; $a << 9
 | 
						|
          raise; $a << 10
 | 
						|
        ensure; $a << 11
 | 
						|
          break; $a << 12
 | 
						|
        end; $a << 13
 | 
						|
      }; $a << 14
 | 
						|
    end; $a << 15
 | 
						|
  end; $a << 16
 | 
						|
; $a << 17
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  while true; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
      break; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 99]}, %q{
 | 
						|
$a = [];
 | 
						|
begin; ; $a << 1
 | 
						|
  while true; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
      raise; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 6, 8, 9, 10, 11]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  begin; $a << 2
 | 
						|
    [1,2].each do; $a << 3
 | 
						|
      begin; $a << 4
 | 
						|
        break; $a << 5
 | 
						|
      ensure; $a << 6
 | 
						|
      end; $a << 7
 | 
						|
    end; $a << 8
 | 
						|
  ensure; $a << 9
 | 
						|
  end; $a << 10
 | 
						|
; $a << 11
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 4, 99]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  begin; $a << 2
 | 
						|
    raise StandardError; $a << 3
 | 
						|
  ensure; $a << 4
 | 
						|
  end; $a << 5
 | 
						|
; $a << 6
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  begin; $a << 2
 | 
						|
  ensure; $a << 3
 | 
						|
  end ; $a << 4
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 99]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each do; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
      raise StandardError; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{3}, %q{
 | 
						|
  def m a, b
 | 
						|
    a + b
 | 
						|
  end
 | 
						|
  m(1,
 | 
						|
    while true
 | 
						|
      break 2
 | 
						|
    end
 | 
						|
    )
 | 
						|
}
 | 
						|
assert_equal %q{4}, %q{
 | 
						|
  def m a, b
 | 
						|
    a + b
 | 
						|
  end
 | 
						|
  m(1,
 | 
						|
    (i=0; while i<2
 | 
						|
       i+=1
 | 
						|
       class C
 | 
						|
         next 2
 | 
						|
       end
 | 
						|
     end; 3)
 | 
						|
    )
 | 
						|
}
 | 
						|
assert_equal %q{34}, %q{
 | 
						|
  def m a, b
 | 
						|
    a+b
 | 
						|
  end
 | 
						|
  m(1, 1.times{break 3}) +
 | 
						|
  m(10, (1.times{next 3}; 20))
 | 
						|
}
 | 
						|
assert_equal %q{[1, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  3.times{; $a << 2
 | 
						|
    class C; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    end; $a << 5
 | 
						|
  }; $a << 6
 | 
						|
; $a << 7
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  3.times{; $a << 2
 | 
						|
    class A; $a << 3
 | 
						|
      class B; $a << 4
 | 
						|
        break; $a << 5
 | 
						|
      end; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  }; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 2, 3, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  3.times{; $a << 2
 | 
						|
    class C; $a << 3
 | 
						|
      next; $a << 4
 | 
						|
    end; $a << 5
 | 
						|
  }; $a << 6
 | 
						|
; $a << 7
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  3.times{; $a << 2
 | 
						|
    class C; $a << 3
 | 
						|
      class D; $a << 4
 | 
						|
        next; $a << 5
 | 
						|
      end; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  }; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  while true; $a << 2
 | 
						|
    class C; $a << 3
 | 
						|
      break; $a << 4
 | 
						|
    end; $a << 5
 | 
						|
  end; $a << 6
 | 
						|
; $a << 7
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  while true; $a << 2
 | 
						|
    class C; $a << 3
 | 
						|
      class D; $a << 4
 | 
						|
        break; $a << 5
 | 
						|
      end; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  i=0; $a << 2
 | 
						|
  while i<3; $a << 3
 | 
						|
    i+=1; $a << 4
 | 
						|
    class C; $a << 5
 | 
						|
      next 10; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{1}, %q{
 | 
						|
  1.times{
 | 
						|
    while true
 | 
						|
      class C
 | 
						|
        begin
 | 
						|
          break
 | 
						|
        ensure
 | 
						|
          break
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  }
 | 
						|
}
 | 
						|
assert_equal %q{[1, 2, 3, 5, 2, 3, 5, 7, 8]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  [1,2].each do; $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      next; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
    end; $a << 6
 | 
						|
  end; $a << 7
 | 
						|
; $a << 8
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 2, 6, 3, 5, 7, 8]}, %q{$a = []; begin;  ; $a << 1
 | 
						|
  o = "test"; $a << 2
 | 
						|
  def o.test(a); $a << 3
 | 
						|
    return a; $a << 4
 | 
						|
  ensure; $a << 5
 | 
						|
  end; $a << 6
 | 
						|
  o.test(123); $a << 7
 | 
						|
; $a << 8
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 4, 7, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  def m1 *args; $a << 2
 | 
						|
    ; $a << 3
 | 
						|
  end; $a << 4
 | 
						|
  def m2; $a << 5
 | 
						|
    m1(:a, :b, (return 1; :c)); $a << 6
 | 
						|
  end; $a << 7
 | 
						|
  m2; $a << 8
 | 
						|
; $a << 9
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 8, 2, 3, 4, 5, 9, 10]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  def m(); $a << 2
 | 
						|
    begin; $a << 3
 | 
						|
      2; $a << 4
 | 
						|
    ensure; $a << 5
 | 
						|
      return 3; $a << 6
 | 
						|
    end; $a << 7
 | 
						|
  end; $a << 8
 | 
						|
  m; $a << 9
 | 
						|
; $a << 10
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 3, 11, 4, 5, 6, 7, 12, 13]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  def m2; $a << 2
 | 
						|
  end; $a << 3
 | 
						|
  def m(); $a << 4
 | 
						|
    m2(begin; $a << 5
 | 
						|
         2; $a << 6
 | 
						|
       ensure; $a << 7
 | 
						|
         return 3; $a << 8
 | 
						|
       end); $a << 9
 | 
						|
    4; $a << 10
 | 
						|
  end; $a << 11
 | 
						|
  m(); $a << 12
 | 
						|
; $a << 13
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[1, 16, 2, 3, 4, 5, 6, 7, 10, 11, 17, 18]}, %q{$a = []; begin; ; $a << 1
 | 
						|
  def m; $a << 2
 | 
						|
    1; $a << 3
 | 
						|
    1.times{; $a << 4
 | 
						|
      2; $a << 5
 | 
						|
      begin; $a << 6
 | 
						|
        3; $a << 7
 | 
						|
        return; $a << 8
 | 
						|
        4; $a << 9
 | 
						|
      ensure; $a << 10
 | 
						|
        5; $a << 11
 | 
						|
      end; $a << 12
 | 
						|
      6; $a << 13
 | 
						|
    }; $a << 14
 | 
						|
    7; $a << 15
 | 
						|
  end; $a << 16
 | 
						|
  m(); $a << 17
 | 
						|
; $a << 18
 | 
						|
; rescue Exception; $a << 99; end; $a}
 | 
						|
assert_equal %q{[:ok, :ok2, :last]}, %q{
 | 
						|
  a = []
 | 
						|
  i = 0
 | 
						|
  begin
 | 
						|
    while i < 1
 | 
						|
      i+=1
 | 
						|
      begin
 | 
						|
        begin
 | 
						|
          next
 | 
						|
        ensure
 | 
						|
          a << :ok
 | 
						|
        end
 | 
						|
      ensure
 | 
						|
        a << :ok2
 | 
						|
      end
 | 
						|
    end
 | 
						|
  ensure
 | 
						|
    a << :last
 | 
						|
  end
 | 
						|
  a
 | 
						|
}
 | 
						|
assert_equal %q{[:ok, :ok2, :last]}, %q{
 | 
						|
  a = []
 | 
						|
  i = 0
 | 
						|
  begin
 | 
						|
    while i < 1
 | 
						|
      i+=1
 | 
						|
      begin
 | 
						|
        begin
 | 
						|
          break
 | 
						|
        ensure
 | 
						|
          a << :ok
 | 
						|
        end
 | 
						|
      ensure
 | 
						|
        a << :ok2
 | 
						|
      end
 | 
						|
    end
 | 
						|
  ensure
 | 
						|
    a << :last
 | 
						|
  end
 | 
						|
  a
 | 
						|
}
 | 
						|
assert_equal %q{[:ok, :ok2, :last]}, %q{
 | 
						|
  a = []
 | 
						|
  i = 0
 | 
						|
  begin
 | 
						|
    while i < 1
 | 
						|
      if i>0
 | 
						|
        break
 | 
						|
      end
 | 
						|
      i+=1
 | 
						|
      begin
 | 
						|
        begin
 | 
						|
          redo
 | 
						|
        ensure
 | 
						|
          a << :ok
 | 
						|
        end
 | 
						|
      ensure
 | 
						|
        a << :ok2
 | 
						|
      end
 | 
						|
    end
 | 
						|
  ensure
 | 
						|
    a << :last
 | 
						|
  end
 | 
						|
  a
 | 
						|
}
 | 
						|
assert_equal %Q{ENSURE\n}, %q{
 | 
						|
  def test
 | 
						|
    while true
 | 
						|
      return
 | 
						|
    end
 | 
						|
  ensure
 | 
						|
    puts("ENSURE")
 | 
						|
  end
 | 
						|
  test
 | 
						|
}, '[ruby-dev:37967]'
 | 
						|
 | 
						|
[['[ruby-core:28129]', %q{
 | 
						|
  class Bug2728
 | 
						|
    include Enumerable
 | 
						|
    define_method(:dynamic_method) do
 | 
						|
      "dynamically defined method"
 | 
						|
    end
 | 
						|
    def each
 | 
						|
      begin
 | 
						|
        yield :foo
 | 
						|
      ensure
 | 
						|
        dynamic_method
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  e = Bug2728.new
 | 
						|
}],
 | 
						|
 ['[ruby-core:28132]', %q{
 | 
						|
  class Bug2729
 | 
						|
    include Enumerable
 | 
						|
    def each
 | 
						|
      begin
 | 
						|
        yield :foo
 | 
						|
      ensure
 | 
						|
        proc {}.call
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  e = Bug2729.new
 | 
						|
}],
 | 
						|
 ['[ruby-core:39125]', %q{
 | 
						|
  class Bug5234
 | 
						|
    include Enumerable
 | 
						|
    def each
 | 
						|
      begin
 | 
						|
        yield :foo
 | 
						|
      ensure
 | 
						|
        proc
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  e = Bug5234.new
 | 
						|
}],
 | 
						|
 ['[ruby-dev:45656]', %q{
 | 
						|
  class Bug6460
 | 
						|
    include Enumerable
 | 
						|
    def each
 | 
						|
      begin
 | 
						|
        yield :foo
 | 
						|
      ensure
 | 
						|
        1.times { Proc.new }
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  e = Bug6460.new
 | 
						|
}]].each do |bug, src|
 | 
						|
  assert_equal "foo", src + %q{e.detect {true}}, bug
 | 
						|
  assert_equal "true", src + %q{e.any? {true}}, bug
 | 
						|
  assert_equal "false", src + %q{e.all? {false}}, bug
 | 
						|
  assert_equal "true", src + %q{e.include?(:foo)}, bug
 | 
						|
end
 | 
						|
 | 
						|
assert_equal "foo", %q{
 | 
						|
  class Bug6460
 | 
						|
    def m1
 | 
						|
      m2 {|e|
 | 
						|
        return e
 | 
						|
      }
 | 
						|
    end
 | 
						|
 | 
						|
    def m2
 | 
						|
      begin
 | 
						|
        yield :foo
 | 
						|
      ensure
 | 
						|
        begin
 | 
						|
          begin
 | 
						|
            yield :foo
 | 
						|
          ensure
 | 
						|
            Proc.new
 | 
						|
            raise ''
 | 
						|
          end
 | 
						|
        rescue
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  Bug6460.new.m1
 | 
						|
}, '[ruby-dev:46372]'
 | 
						|
 | 
						|
assert_equal "foo", %q{
 | 
						|
  obj = "foo"
 | 
						|
  if obj || any1
 | 
						|
    any2 = any2
 | 
						|
  else
 | 
						|
    raise obj.inspect
 | 
						|
  end
 | 
						|
  obj
 | 
						|
}, '[ruby-core:87830]'
 |