rubyjs 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. data/README +128 -0
  2. data/Rakefile +9 -0
  3. data/bin/rubyjs +140 -0
  4. data/examples/ex1/Rakefile +7 -0
  5. data/examples/ex1/ex1.js +771 -0
  6. data/examples/ex1/ex1.rb +42 -0
  7. data/examples/ex1/index.html +7 -0
  8. data/examples/hw/Rakefile +9 -0
  9. data/examples/hw/hw.js +635 -0
  10. data/examples/hw/hw.rb +7 -0
  11. data/examples/hw/index.html +7 -0
  12. data/patches/parse_tree.rb.diff +34 -0
  13. data/rubyjs.gemspec +24 -0
  14. data/src/rubyjs.rb +4 -0
  15. data/src/rubyjs/code_generator.rb +474 -0
  16. data/src/rubyjs/compiler.rb +2007 -0
  17. data/src/rubyjs/debug_name_generator.rb +75 -0
  18. data/src/rubyjs/encoder.rb +171 -0
  19. data/src/rubyjs/eval_into.rb +59 -0
  20. data/src/rubyjs/lib/core.rb +1008 -0
  21. data/src/rubyjs/lib/json.rb +101 -0
  22. data/src/rubyjs/model.rb +287 -0
  23. data/src/rubyjs/name_generator.rb +71 -0
  24. data/src/rwt/AbsolutePanel.rb +161 -0
  25. data/src/rwt/DOM.Konqueror.rb +89 -0
  26. data/src/rwt/DOM.Opera.rb +65 -0
  27. data/src/rwt/DOM.rb +1044 -0
  28. data/src/rwt/Event.Opera.rb +35 -0
  29. data/src/rwt/Event.rb +429 -0
  30. data/src/rwt/HTTPRequest.IE6.rb +5 -0
  31. data/src/rwt/HTTPRequest.rb +74 -0
  32. data/src/rwt/Label.rb +164 -0
  33. data/src/rwt/Panel.rb +90 -0
  34. data/src/rwt/RootPanel.rb +16 -0
  35. data/src/rwt/UIObject.rb +495 -0
  36. data/src/rwt/Widget.rb +193 -0
  37. data/src/rwt/ported-from/AbsolutePanel.java +158 -0
  38. data/src/rwt/ported-from/DOM.java +571 -0
  39. data/src/rwt/ported-from/DOMImpl.java +426 -0
  40. data/src/rwt/ported-from/DOMImplOpera.java +82 -0
  41. data/src/rwt/ported-from/DOMImplStandard.java +234 -0
  42. data/src/rwt/ported-from/HTTPRequest.java +81 -0
  43. data/src/rwt/ported-from/HTTPRequestImpl.java +103 -0
  44. data/src/rwt/ported-from/Label.java +163 -0
  45. data/src/rwt/ported-from/Panel.java +99 -0
  46. data/src/rwt/ported-from/UIObject.java +614 -0
  47. data/src/rwt/ported-from/Widget.java +221 -0
  48. data/test/benchmark/bm_call_conv1.js +16 -0
  49. data/test/benchmark/bm_call_conv2.js +14 -0
  50. data/test/benchmark/bm_var_acc1.js +13 -0
  51. data/test/benchmark/bm_var_acc2.js +11 -0
  52. data/test/benchmark/bm_vm1_block.js +15 -0
  53. data/test/benchmark/bm_vm1_block.rb +15 -0
  54. data/test/benchmark/bm_vm1_const.js +13 -0
  55. data/test/benchmark/bm_vm1_const.rb +13 -0
  56. data/test/benchmark/bm_vm1_ensure.js +17 -0
  57. data/test/benchmark/bm_vm1_ensure.rb +15 -0
  58. data/test/benchmark/common.js +4 -0
  59. data/test/benchmark/common.rb +5 -0
  60. data/test/benchmark/params.yaml +7 -0
  61. data/test/browser.test.html +4059 -0
  62. data/test/browser.test.js +3225 -0
  63. data/test/common.Browser.rb +13 -0
  64. data/test/common.rb +8 -0
  65. data/test/gen_browser_test_suite.rb +129 -0
  66. data/test/gen_test_suite.rb +41 -0
  67. data/test/run_benchs.rb +58 -0
  68. data/test/run_tests.rb +22 -0
  69. data/test/test_args.rb +24 -0
  70. data/test/test_array.rb +26 -0
  71. data/test/test_case.rb +35 -0
  72. data/test/test_class.rb +55 -0
  73. data/test/test_eql.rb +9 -0
  74. data/test/test_exception.rb +61 -0
  75. data/test/test_expr.rb +12 -0
  76. data/test/test_hash.rb +29 -0
  77. data/test/test_if.rb +28 -0
  78. data/test/test_inspect.rb +10 -0
  79. data/test/test_lebewesen.rb +39 -0
  80. data/test/test_massign.rb +66 -0
  81. data/test/test_new.rb +12 -0
  82. data/test/test_range.rb +53 -0
  83. data/test/test_regexp.rb +22 -0
  84. data/test/test_send.rb +65 -0
  85. data/test/test_simple_output.rb +5 -0
  86. data/test/test_splat.rb +21 -0
  87. data/test/test_string.rb +51 -0
  88. data/test/test_yield.rb +152 -0
  89. data/utils/js/Makefile +9 -0
  90. data/utils/js/RunScript.class +0 -0
  91. data/utils/js/RunScript.java +73 -0
  92. data/utils/js/js.jar +0 -0
  93. data/utils/js/run.sh +3 -0
  94. data/utils/jsc/Makefile +7 -0
  95. data/utils/jsc/README +3 -0
  96. data/utils/jsc/RunScript.c +93 -0
  97. data/utils/jsc/run.sh +15 -0
  98. data/utils/yuicompressor/README +1 -0
  99. data/utils/yuicompressor/yuicompressor-2.2.5.jar +0 -0
  100. data/vendor/ParseTree-1.7.1-patched/History.txt +217 -0
  101. data/vendor/ParseTree-1.7.1-patched/Manifest.txt +22 -0
  102. data/vendor/ParseTree-1.7.1-patched/README.txt +110 -0
  103. data/vendor/ParseTree-1.7.1-patched/Rakefile +41 -0
  104. data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_abc +89 -0
  105. data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_audit +28 -0
  106. data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_deps +62 -0
  107. data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_show +49 -0
  108. data/vendor/ParseTree-1.7.1-patched/demo/printer.rb +20 -0
  109. data/vendor/ParseTree-1.7.1-patched/lib/composite_sexp_processor.rb +49 -0
  110. data/vendor/ParseTree-1.7.1-patched/lib/parse_tree.rb +1013 -0
  111. data/vendor/ParseTree-1.7.1-patched/lib/sexp.rb +235 -0
  112. data/vendor/ParseTree-1.7.1-patched/lib/sexp_processor.rb +330 -0
  113. data/vendor/ParseTree-1.7.1-patched/lib/unique.rb +15 -0
  114. data/vendor/ParseTree-1.7.1-patched/test/pt_testcase.rb +1221 -0
  115. data/vendor/ParseTree-1.7.1-patched/test/something.rb +53 -0
  116. data/vendor/ParseTree-1.7.1-patched/test/test_all.rb +13 -0
  117. data/vendor/ParseTree-1.7.1-patched/test/test_composite_sexp_processor.rb +69 -0
  118. data/vendor/ParseTree-1.7.1-patched/test/test_parse_tree.rb +216 -0
  119. data/vendor/ParseTree-1.7.1-patched/test/test_sexp.rb +291 -0
  120. data/vendor/ParseTree-1.7.1-patched/test/test_sexp_processor.rb +244 -0
  121. data/vendor/ParseTree-1.7.1-patched/validate.sh +31 -0
  122. data/vendor/ParseTree-1.7.1/History.txt +217 -0
  123. data/vendor/ParseTree-1.7.1/Manifest.txt +22 -0
  124. data/vendor/ParseTree-1.7.1/README.txt +110 -0
  125. data/vendor/ParseTree-1.7.1/Rakefile +41 -0
  126. data/vendor/ParseTree-1.7.1/bin/parse_tree_abc +89 -0
  127. data/vendor/ParseTree-1.7.1/bin/parse_tree_audit +28 -0
  128. data/vendor/ParseTree-1.7.1/bin/parse_tree_deps +62 -0
  129. data/vendor/ParseTree-1.7.1/bin/parse_tree_show +49 -0
  130. data/vendor/ParseTree-1.7.1/demo/printer.rb +20 -0
  131. data/vendor/ParseTree-1.7.1/lib/composite_sexp_processor.rb +49 -0
  132. data/vendor/ParseTree-1.7.1/lib/parse_tree.rb +1004 -0
  133. data/vendor/ParseTree-1.7.1/lib/sexp.rb +235 -0
  134. data/vendor/ParseTree-1.7.1/lib/sexp_processor.rb +330 -0
  135. data/vendor/ParseTree-1.7.1/lib/unique.rb +15 -0
  136. data/vendor/ParseTree-1.7.1/test/pt_testcase.rb +1221 -0
  137. data/vendor/ParseTree-1.7.1/test/something.rb +53 -0
  138. data/vendor/ParseTree-1.7.1/test/test_all.rb +13 -0
  139. data/vendor/ParseTree-1.7.1/test/test_composite_sexp_processor.rb +69 -0
  140. data/vendor/ParseTree-1.7.1/test/test_parse_tree.rb +216 -0
  141. data/vendor/ParseTree-1.7.1/test/test_sexp.rb +291 -0
  142. data/vendor/ParseTree-1.7.1/test/test_sexp_processor.rb +244 -0
  143. data/vendor/ParseTree-1.7.1/validate.sh +31 -0
  144. metadata +230 -0
@@ -0,0 +1,13 @@
1
+ module Kernel
2
+ =begin
3
+ def puts(obj="")
4
+ obj = obj.to_s.gsub("&", "&amp;").gsub("<", "&lt;").gsub(">", "&gt;") + "<br/>"
5
+ `document.getElementById('out').innerHTML += #<obj>`
6
+ end
7
+ =end
8
+
9
+ def puts(obj="")
10
+ obj = obj.to_s
11
+ `STDOUT_puts(#<obj>)`
12
+ end
13
+ end
data/test/common.rb ADDED
@@ -0,0 +1,8 @@
1
+ if $RUBYJS
2
+ module Kernel
3
+ def puts(obj="")
4
+ obj = obj.to_s
5
+ `println(#<obj>)`
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,129 @@
1
+ require 'tempfile'
2
+ require 'test/gen_test_suite'
3
+
4
+ if ARGV.empty?
5
+ tests = Dir['test/test_*.rb']
6
+ else
7
+ tests = Dir["test/test_{" + ARGV.join(',') + "}.rb"]
8
+ end
9
+
10
+ rubycode = Tempfile.new('rubyjs')
11
+ script = gen_test_suite(tests)
12
+ rubycode.write(script)
13
+ rubycode.close(false)
14
+
15
+ #
16
+ # Generate Javascript code
17
+ #
18
+
19
+ RED = '#ff8888'
20
+ GREEN = '#aaffaa'
21
+
22
+ expected = `ruby -I./test < #{rubycode.path}`.chomp. # remove last newline
23
+ gsub("&", "&amp;").
24
+ gsub("<", "&lt;").
25
+ gsub(">", "&gt;").split("\n")
26
+
27
+ jscode = `./bin/rubyjs -I./test --opt PrettyPrint -P Browser -m TestSuite #{rubycode.path}`
28
+ jscode << <<END_JS
29
+ var STDOUT_LINE_NO = 0;
30
+ var FAILURES = 0;
31
+ var TOTAL = #{expected.size};
32
+
33
+ function STDOUT_puts(str)
34
+ {
35
+ var out = document.getElementById('out_' + STDOUT_LINE_NO);
36
+ var expected = document.getElementById('exp_' + STDOUT_LINE_NO);
37
+
38
+ out.innerHTML = str.replace(/[&]/g, "&amp;").replace(/[<]/g, "&lt;").replace(/[>]/g, "&gt;");
39
+
40
+ if (out.innerHTML === expected.innerHTML)
41
+ {
42
+ document.getElementById('line_' + STDOUT_LINE_NO).style.background = '#{GREEN}';
43
+ }
44
+ else
45
+ {
46
+ FAILURES += 1;
47
+ }
48
+
49
+ STDOUT_LINE_NO += 1;
50
+
51
+ document.getElementById('status').innerHTML =
52
+ "<b>" + STDOUT_LINE_NO + "</b> / " + TOTAL + " (" + FAILURES + " failures)";
53
+ }
54
+
55
+ function start()
56
+ {
57
+ main();
58
+ }
59
+ END_JS
60
+
61
+ File.open('test/browser.test.js', 'w+') {|f| f << jscode}
62
+
63
+ html_script = script.gsub("&", "&amp;").
64
+ gsub("<", "&lt;").
65
+ gsub(">", "&gt;").gsub("\n", "<br/>")
66
+
67
+ File.open('test/browser.test.html', 'w+') do |f|
68
+ f.puts %{<html><head><script language="javascript" src="browser.test.js"></script>
69
+ <style>
70
+ #expected { background: #ccc; }
71
+ </style>
72
+ <body onload="start();">
73
+ <h1>RubyJS Test Suite Runner</h1>
74
+
75
+ <a href="#source">View Ruby source code</a>&nbsp;|&nbsp;
76
+ <a href="browser.test.js">View Javascript source code</a><br/>
77
+
78
+ <p>
79
+ Test status (tests run / total # of tests): <div id="status"></div>
80
+ </p>
81
+
82
+ <table cellspacing="5" cellpadding="5">
83
+ <thead>
84
+ <tr>
85
+ <td width="50%"><b>Output</b></td>
86
+ <td width="50%"><b>Expected</b></td>
87
+ </tr>
88
+ </thead>
89
+ <tbody>
90
+ }
91
+
92
+ expected.each_with_index do |line, i|
93
+ f.puts %{
94
+ <tr id="line_#{i}" style="background: #{RED}">
95
+ <td>
96
+ <pre id="out_#{i}"></pre>
97
+ </td>
98
+ <td>
99
+ <pre id="exp_#{i}">#{line}</pre>
100
+ </td>
101
+ </tr>
102
+ }
103
+ end
104
+
105
+ f.puts %{
106
+ <tr><td colspan="2" style="background: grey">&nbsp;</td></tr>
107
+ }
108
+
109
+ # Add some "overflow" rows, in case the RubyJS test output
110
+ # is longer as expected.
111
+ 10.times do |i|
112
+ f.puts %{
113
+ <tr id="line_#{i+expected.size}">
114
+ <td>
115
+ <pre id="out_#{i+expected.size}"></pre>
116
+ </td>
117
+ <td>
118
+ <pre id="exp_#{i+expected.size}"></pre>
119
+ </td>
120
+ </tr>
121
+ }
122
+ end
123
+
124
+ f.puts %{
125
+ </tbody>
126
+ </table>
127
+ <pre id="source">#{html_script}</pre>
128
+ </body></html>}
129
+ end
@@ -0,0 +1,41 @@
1
+ def gen_test_suite(tests)
2
+ script = ""
3
+ body = ""
4
+
5
+ script << "require 'common'\n\n"
6
+ tests.each_with_index do |file, i|
7
+ basename = File.basename(file)[0..-4]
8
+ klassname = basename.gsub(/(^|_)./) {|m| m[-1,1].upcase}
9
+ humanname = basename.gsub('_', ' ').capitalize
10
+
11
+ script << "#\n"
12
+ script << "# file: #{file}\n"
13
+ script << "#\n\n"
14
+ script << "module T_#{klassname}\n"
15
+ script << File.read(file)
16
+ script << "end\n"
17
+ script << "\n\n"
18
+ body << %{
19
+ puts '~~~~~~~~~~~~~~~~~~~~'
20
+ puts '#{humanname}'
21
+ puts '~~~~~~~~~~~~~~~~~~~~'
22
+ T_#{klassname}::#{klassname}.main
23
+ }
24
+ end
25
+
26
+ script << %{
27
+ class TestSuite
28
+ def self.main
29
+ begin
30
+ #{body}
31
+ rescue Exception => a
32
+ p "unhandled exception"
33
+ p a
34
+ end
35
+ end
36
+ end
37
+ TestSuite.main unless $RUBYJS
38
+ }
39
+
40
+ return script
41
+ end
@@ -0,0 +1,58 @@
1
+ require 'yaml'
2
+ require 'tempfile'
3
+ params = YAML.load(File.read('test/benchmark/params.yaml'))
4
+ benchs = Dir["test/benchmark/bm_*.{rb,js}"]
5
+ OPTS = "--opt NoArgumentArityChecks --opt OptimizeArithOps"
6
+
7
+ def run_rubyjs(param, klassname, file)
8
+ par = param ? param.inspect : "nil"
9
+ cmd_rubyjs_gen =
10
+ %{./rubyjs_gen -I./test -o - -o /tmp/#{klassname} -r common -r benchmark/common #{OPTS} -m #{klassname} -a "main(undefined, #{par})" #{file}}
11
+
12
+ cmd_run_js = %{/usr/bin/time ./utils/js/run.sh 2>&1}
13
+
14
+ result = `#{cmd_rubyjs_gen} | #{cmd_run_js}`
15
+ arr = result.split("\n")
16
+ time = arr.pop.split(" ")[2].sub(",", ".").to_f # user
17
+ return [file, klassname, param, time.to_f, arr.join("\n")]
18
+ end
19
+
20
+ def run_js(param, klassname, file)
21
+ par = param ? param.inspect : "null"
22
+
23
+ script = ""
24
+ script << File.read('./test/benchmark/common.js')
25
+ script << "\n"
26
+ script << File.read(file)
27
+ script << "\n"
28
+ script << "main(#{par});"
29
+
30
+ jscode = Tempfile.new('rubyjs')
31
+ jscode.write(script)
32
+ jscode.close(false)
33
+
34
+ cmd_run_js = %{/usr/bin/time ./utils/js/run.sh 2>&1}
35
+
36
+ result = `#{cmd_run_js} < #{jscode.path}`
37
+ arr = result.split("\n")
38
+ time = arr.pop.split(" ")[2].sub(",", ".").to_f # user
39
+ return [file, klassname, param, time.to_f, arr.join("\n")]
40
+ end
41
+
42
+ benchs.sort.each do |file|
43
+ basename = File.basename(file)[0..-4]
44
+ klassname = basename.gsub(/(^|_)./) {|m| m[-1,1].upcase}
45
+ humanname = basename.gsub('_', ' ').capitalize
46
+ ext = File.extname(file)
47
+
48
+ (params[klassname] || [nil]).each do |i|
49
+ case ext
50
+ when '.rb'
51
+ p run_rubyjs(i, klassname, file)
52
+ when '.js'
53
+ p run_js(i, klassname, file)
54
+ else
55
+ raise
56
+ end
57
+ end
58
+ end
data/test/run_tests.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'tempfile'
2
+ require 'test/gen_test_suite'
3
+
4
+ if ARGV.empty?
5
+ tests = Dir['test/test_*.rb']
6
+ else
7
+ tests = Dir["test/test_{" + ARGV.join(',') + "}.rb"]
8
+ end
9
+
10
+ rubycode = Tempfile.new('rubyjs')
11
+ script = gen_test_suite(tests)
12
+ rubycode.write(script)
13
+ rubycode.close(false)
14
+
15
+ jsout = `./bin/rubyjs -I./test -a ";main()" -m TestSuite #{rubycode.path} | ./utils/js/run.sh`
16
+ rbout = `ruby -I./test < #{rubycode.path}`
17
+
18
+ if jsout == rbout
19
+ else
20
+ puts "FAILED"
21
+ exit 1
22
+ end
data/test/test_args.rb ADDED
@@ -0,0 +1,24 @@
1
+ class TestArgs
2
+ def m(a, b=1, c="hallo", *args)
3
+ p a
4
+ p b
5
+ p c
6
+ p args
7
+ end
8
+
9
+ def self.main
10
+ obj = new()
11
+
12
+ obj.m(0)
13
+ puts "--"
14
+ obj.m(1,2)
15
+ puts "--"
16
+ obj.m(1,2,9)
17
+ puts "--"
18
+ obj.m(1,2,9,5)
19
+ puts "--"
20
+ obj.m(1,2,9,5,6)
21
+ puts "--"
22
+ obj.m(1,2,9,5,6,7,8,9,10,11,12)
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ class TestArray
2
+ if $RUBYJS
3
+ def array
4
+ [1, 2, `null`, [`null`, `null`, 4]]
5
+ end
6
+ else
7
+ def array
8
+ [1, 2, nil, [nil, nil, 4]]
9
+ end
10
+ end
11
+
12
+ def test
13
+ # delete
14
+ a = [ "a", "b", "b", "b", "c" ]
15
+ p a.delete("b") #=> "b"
16
+ p a #=> ["a", "c"]
17
+ p a.delete("z") #=> nil
18
+
19
+ puts "test native JS array mapping"
20
+ p array()
21
+ end
22
+
23
+ def self.main
24
+ new.test
25
+ end
26
+ end
data/test/test_case.rb ADDED
@@ -0,0 +1,35 @@
1
+ class TestCase
2
+ def test
3
+ case 1+1
4
+ when 1, 3
5
+ puts "NOT OKAY"
6
+ when 2
7
+ puts "OKAY"
8
+ else
9
+ puts "NOT OKAY"
10
+ end
11
+
12
+ p (Array === [])
13
+ p (RuntimeError === RuntimeError.new)
14
+
15
+ case 1
16
+ when Fixnum
17
+ puts "OK"
18
+ when 1
19
+ puts "OK"
20
+ end
21
+
22
+ case 4
23
+ when 0..3
24
+ puts "NOT OKAY"
25
+ when 1...4
26
+ puts "NOT OKAY"
27
+ when 2..4
28
+ puts "OKAY"
29
+ end
30
+ end
31
+
32
+ def self.main
33
+ new.test
34
+ end
35
+ end
@@ -0,0 +1,55 @@
1
+ module X
2
+ end
3
+
4
+ class A
5
+ include X
6
+ end
7
+
8
+ class B < A
9
+ end
10
+
11
+ class C < B
12
+ end
13
+
14
+ class D
15
+ end
16
+
17
+ class TestClass
18
+ def self.main
19
+ p A.new.instance_of?(A) # => true
20
+ p A.new.instance_of?(B) # => false
21
+ p B.new.instance_of?(A) # => false
22
+ p A.new.instance_of?(X) # => false
23
+ p B.new.instance_of?(X) # => false
24
+
25
+ p A.new.kind_of?(A) # => true
26
+ p A.new.kind_of?(B) # => false
27
+ p B.new.kind_of?(A) # => true
28
+ p A.new.kind_of?(X) # => true
29
+ p B.new.kind_of?(X) # => true
30
+
31
+ p C.new.kind_of?(X) # => true
32
+ p C.new.kind_of?(A) # => true
33
+ p C.new.kind_of?(B) # => true
34
+ p C.new.kind_of?(C) # => true
35
+ p C.new.kind_of?(D) # => false
36
+ p C.new.kind_of?(Object) # => true
37
+ p C.new.kind_of?(Kernel) # => true
38
+ p C.new.kind_of?(Class) # => false
39
+
40
+ p ("hallo".class.name)
41
+ p (nil.class.name)
42
+ p (nil.instance_of?(NilClass))
43
+ p ("hallo".instance_of?(String))
44
+ p ("hallo".class)
45
+ p A
46
+ p B
47
+ p C
48
+ p D
49
+ p X
50
+
51
+ p X.name
52
+ p A.name
53
+ p B.name
54
+ end
55
+ end
data/test/test_eql.rb ADDED
@@ -0,0 +1,9 @@
1
+ class TestEql
2
+ def self.main
3
+ p "a".eql?("a") # => true
4
+ p "a".eql?(1) # => false
5
+ p "1".eql?(1) # => false
6
+ p [1,2].eql?([1,2]) # => true
7
+ p 1.eql?("1") # => false
8
+ end
9
+ end
@@ -0,0 +1,61 @@
1
+ class TestException
2
+ def self.main
3
+
4
+ p "before block"
5
+ begin
6
+ p "in block"
7
+ end
8
+ p "after block"
9
+
10
+ ###
11
+ begin
12
+ p "block"
13
+ rescue
14
+ p "rescue"
15
+ rescue Exception => a
16
+ p "another rescue"
17
+ p a
18
+ else
19
+ p "else"
20
+ end
21
+
22
+ p RuntimeError.new("test")
23
+
24
+ puts "before begin"
25
+ begin
26
+ puts "before raise"
27
+ raise Exception, "blah"
28
+ puts "after raise"
29
+ rescue
30
+ puts "noooo"
31
+ rescue Exception => a
32
+ p a
33
+ puts "yes"
34
+ ensure
35
+ puts "ensure"
36
+ end
37
+ puts "after begin"
38
+
39
+ puts "--"
40
+
41
+ begin
42
+ puts "abc"
43
+ raise "r"
44
+ rescue
45
+ p $!
46
+ puts "b"
47
+ ensure
48
+ puts "e"
49
+ end
50
+
51
+ #
52
+ # Test arity checks
53
+ #
54
+
55
+ begin
56
+ p("hallo".to_s(2))
57
+ rescue ArgumentError => a
58
+ p a
59
+ end
60
+ end
61
+ end