File: RecursiveBreak.rb

package info (click to toggle)
dlr-languages 20090805%2Bgit.e6b28d27%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 51,484 kB
  • ctags: 59,257
  • sloc: cs: 298,829; ruby: 159,643; xml: 19,872; python: 2,820; yacc: 1,960; makefile: 96; sh: 65
file content (93 lines) | stat: -rw-r--r-- 1,576 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
def f1
  puts 'foo-begin'
  f2 { puts 'break'; break }  # break jumps after this statement
  puts 'foo-end'
end

def f2 &p
  puts 'bar-begin'
  f3 &p
  puts 'bar-end'
end

def f3
  puts 'baz-begin'
  yield                       # unwinds to f1
  puts 'baz-end'
end

f1

puts '------------'
# not all call-sites need to pass block thru
# proc.call also works, not only yield

def h1
  puts 'foo-begin'
  h2 { puts 'break'; break }  # break jumps after this statement
  puts 'foo-end'
end

def h2 &p
  puts 'bar-begin'
  $p = p
  h3
  puts 'bar-end'
end

def h3
  puts 'baz-begin'
  $p[]                        # unwinds to h1
  puts 'baz-end'
end

h1

puts '------------'
# owner of proc != owner of block
# 

def defp &p
  $p = p
  g2 &p                               # this is ok
end  

def g1
  puts 'foo-begin'
  #$p = lambda do                     # the same error result if the following line is replaced by lambda call
  defp do
	begin
		puts 'break'                  # break from proc-closure error
		break
	rescue LocalJumpError
		puts 'ERROR 1'
	end	
  end
  puts 'foo-mid'
  
  g2 &$p                              # this raises an error #3            
  puts 'foo-end'
rescue LocalJumpError
	puts 'ERROR 4'
end

def g2 &p
	puts 'bar-begin'
	g3 &p
	puts 'bar-end'
rescue LocalJumpError
	puts 'ERROR 2'
end

def g3 &p
	puts 'baz-begin'
	1.times &p                      # break returns here, we need to decide now whether we can unwind or not
	puts 'baz-end'
rescue LocalJumpError => e
	puts 'ERROR 3'                  # rescued here
	puts e
	puts e.backtrace
end

g1