opal 0.3.41 → 0.3.42

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 (285) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +14 -1
  4. data/Gemfile +2 -5
  5. data/Rakefile +41 -3
  6. data/bin/opal +33 -0
  7. data/lib/opal.rb +2 -12
  8. data/lib/opal/core_ext.rb +5 -0
  9. data/lib/opal/grammar.rb +2207 -2138
  10. data/lib/opal/grammar.y +21 -0
  11. data/lib/opal/grammar_helpers.rb +360 -0
  12. data/lib/opal/lexer.rb +55 -401
  13. data/lib/opal/lexer_scope.rb +28 -0
  14. data/lib/opal/parser.rb +155 -171
  15. data/lib/opal/target_scope.rb +257 -0
  16. data/lib/opal/version.rb +1 -1
  17. data/opal.gemspec +6 -2
  18. data/opal/opal-parser.js.erb +3 -2
  19. data/opal/opal.rb +20 -18
  20. data/opal/opal/array.rb +21 -12
  21. data/opal/opal/basic_object.rb +2 -1
  22. data/opal/opal/boolean.rb +3 -0
  23. data/opal/opal/browser_loader.js +57 -0
  24. data/opal/opal/class.rb +51 -13
  25. data/opal/opal/date.rb +1 -20
  26. data/opal/opal/enumerable.rb +66 -33
  27. data/opal/opal/error.rb +2 -0
  28. data/opal/opal/hash.rb +1 -1
  29. data/opal/opal/kernel.rb +14 -3
  30. data/opal/opal/nil_class.rb +4 -0
  31. data/opal/opal/proc.rb +9 -1
  32. data/opal/opal/racc.rb +2 -2
  33. data/opal/opal/regexp.rb +1 -1
  34. data/opal/opal/runtime.js +14 -4
  35. data/opal/opal/string.rb +21 -4
  36. data/opal/opal/time.rb +27 -0
  37. data/spec/core/array/allocate_spec.rb +7 -1
  38. data/spec/core/array/append_spec.rb +18 -3
  39. data/spec/core/array/array_spec.rb +7 -0
  40. data/spec/core/array/assoc_spec.rb +23 -8
  41. data/spec/core/array/at_spec.rb +23 -3
  42. data/spec/core/array/choice_spec.rb +20 -0
  43. data/spec/core/array/clear_spec.rb +45 -4
  44. data/spec/core/array/combination_spec.rb +55 -0
  45. data/spec/core/array/compact_spec.rb +72 -1
  46. data/spec/core/array/constructor_spec.rb +13 -2
  47. data/spec/core/array/count_spec.rb +15 -7
  48. data/spec/core/array/delete_at_spec.rb +44 -1
  49. data/spec/core/array/delete_if_spec.rb +52 -2
  50. data/spec/core/array/delete_spec.rb +83 -2
  51. data/spec/core/array/drop_spec.rb +24 -16
  52. data/spec/core/array/drop_while_spec.rb +17 -0
  53. data/spec/core/array/each_index_spec.rb +11 -1
  54. data/spec/core/array/each_spec.rb +20 -2
  55. data/spec/core/array/empty_spec.rb +4 -1
  56. data/spec/core/array/eql_spec.rb +14 -0
  57. data/spec/core/array/fetch_spec.rb +31 -2
  58. data/spec/core/array/find_index_spec.rb +8 -0
  59. data/spec/core/array/first_spec.rb +45 -8
  60. data/spec/core/array/fixtures/classes.rb +538 -0
  61. data/spec/core/array/flatten_spec.rb +200 -7
  62. data/spec/core/array/frozen_spec.rb +32 -0
  63. data/spec/core/array/include_spec.rb +16 -1
  64. data/spec/core/array/index_spec.rb +5 -25
  65. data/spec/core/array/insert_spec.rb +37 -3
  66. data/spec/core/array/inspect_spec.rb +6 -12
  67. data/spec/core/array/intersection_spec.rb +55 -4
  68. data/spec/core/array/join_spec.rb +29 -4
  69. data/spec/core/array/keep_if_spec.rb +13 -6
  70. data/spec/core/array/last_spec.rb +35 -1
  71. data/spec/core/array/length_spec.rb +7 -4
  72. data/spec/core/array/map_spec.rb +9 -47
  73. data/spec/core/array/minus_spec.rb +68 -4
  74. data/spec/core/array/multiply_spec.rb +138 -6
  75. data/spec/core/array/new_spec.rb +92 -3
  76. data/spec/core/array/ntimes_spec.rb +26 -0
  77. data/spec/core/array/plus_spec.rb +48 -2
  78. data/spec/core/array/pop_spec.rb +159 -39
  79. data/spec/core/array/push_spec.rb +29 -1
  80. data/spec/core/array/rassoc_spec.rb +31 -2
  81. data/spec/core/array/reject_spec.rb +89 -2
  82. data/spec/core/array/replace_spec.rb +7 -29
  83. data/spec/core/array/reverse_each_spec.rb +25 -1
  84. data/spec/core/array/reverse_spec.rb +53 -1
  85. data/spec/core/array/rindex_spec.rb +55 -5
  86. data/spec/core/array/select_spec.rb +35 -8
  87. data/spec/core/array/shared/collect.rb +0 -0
  88. data/spec/core/array/shared/enumeratorize.rb +12 -0
  89. data/spec/core/array/shared/eql.rb +95 -0
  90. data/spec/core/array/shared/index.rb +37 -0
  91. data/spec/core/array/shared/inspect.rb +3 -0
  92. data/spec/core/array/shared/join.rb +7 -0
  93. data/spec/core/array/shared/keep_if.rb +0 -0
  94. data/spec/core/array/shared/length.rb +0 -0
  95. data/spec/core/array/shared/replace.rb +0 -0
  96. data/spec/core/array/shared/slice.rb +0 -0
  97. data/spec/core/array/shift_spec.rb +132 -23
  98. data/spec/core/array/shuffle_spec.rb +82 -6
  99. data/spec/core/array/size_spec.rb +7 -4
  100. data/spec/core/array/slice_spec.rb +132 -1
  101. data/spec/core/array/sort_spec.rb +263 -14
  102. data/spec/core/array/take_spec.rb +24 -16
  103. data/spec/core/array/take_while_spec.rb +14 -10
  104. data/spec/core/array/to_a_spec.rb +18 -1
  105. data/spec/core/array/to_ary_spec.rb +15 -1
  106. data/spec/core/array/try_convert_spec.rb +39 -2
  107. data/spec/core/array/uniq_spec.rb +148 -3
  108. data/spec/core/array/unshift_spec.rb +36 -1
  109. data/spec/core/array/zip_spec.rb +36 -1
  110. data/spec/core/class/new_spec.rb +8 -6
  111. data/spec/core/enumerable/all_spec.rb +37 -9
  112. data/spec/core/enumerable/any_spec.rb +45 -7
  113. data/spec/core/enumerable/collect_spec.rb +4 -1
  114. data/spec/core/enumerable/count_spec.rb +4 -1
  115. data/spec/core/enumerable/detect_spec.rb +2 -2
  116. data/spec/core/enumerable/drop_spec.rb +4 -1
  117. data/spec/core/enumerable/drop_while_spec.rb +4 -1
  118. data/spec/core/enumerable/each_slice_spec.rb +2 -1
  119. data/spec/core/enumerable/each_with_index_spec.rb +4 -1
  120. data/spec/core/enumerable/each_with_object_spec.rb +4 -1
  121. data/spec/core/enumerable/entries_spec.rb +4 -1
  122. data/spec/core/enumerable/find_all_spec.rb +4 -1
  123. data/spec/core/enumerable/find_index_spec.rb +4 -1
  124. data/spec/core/enumerable/find_spec.rb +5 -2
  125. data/spec/core/enumerable/first_spec.rb +4 -1
  126. data/spec/core/enumerable/fixtures/classes.rb +198 -2
  127. data/spec/core/enumerable/grep_spec.rb +4 -1
  128. data/spec/core/enumerable/take_spec.rb +4 -1
  129. data/spec/core/enumerable/to_a_spec.rb +4 -1
  130. data/spec/core/false/and_spec.rb +11 -0
  131. data/spec/core/false/inspect_spec.rb +7 -0
  132. data/spec/core/false/or_spec.rb +11 -0
  133. data/spec/core/false/to_s_spec.rb +7 -0
  134. data/spec/core/false/xor_spec.rb +11 -0
  135. data/spec/core/kernel/rand_spec.rb +5 -5
  136. data/spec/core/module/const_get_spec.rb +4 -4
  137. data/spec/core/module/fixtures/classes.rb +434 -0
  138. data/spec/core/module/method_defined_spec.rb +49 -0
  139. data/spec/core/module/module_function_spec.rb +28 -0
  140. data/spec/core/nil/and_spec.rb +3 -1
  141. data/spec/core/nil/dup_spec.rb +7 -0
  142. data/spec/core/nil/inspect_spec.rb +3 -1
  143. data/spec/core/nil/nil_spec.rb +3 -1
  144. data/spec/core/nil/or_spec.rb +4 -2
  145. data/spec/core/nil/to_a_spec.rb +3 -1
  146. data/spec/core/nil/to_f_spec.rb +3 -1
  147. data/spec/core/nil/to_i_spec.rb +3 -1
  148. data/spec/core/nil/to_s_spec.rb +3 -1
  149. data/spec/core/nil/xor_spec.rb +4 -2
  150. data/spec/core/string/element_reference_spec.rb +14 -1
  151. data/spec/core/string/fixtures/classes.rb +0 -0
  152. data/spec/core/true/and_spec.rb +11 -0
  153. data/spec/core/true/inspect_spec.rb +7 -0
  154. data/spec/core/true/or_spec.rb +11 -0
  155. data/spec/core/true/to_s_spec.rb +7 -0
  156. data/spec/core/true/xor_spec.rb +11 -0
  157. data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
  158. data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
  159. data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
  160. data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
  161. data/spec/core_ext/basic_object/send_spec.rb +3 -3
  162. data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
  163. data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
  164. data/spec/core_ext/class/_inherited_spec.rb +3 -3
  165. data/spec/core_ext/class/proc_methods_spec.rb +2 -2
  166. data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
  167. data/spec/core_ext/method_missing_spec.rb +3 -3
  168. data/spec/core_ext/native/method_missing_spec.rb +3 -2
  169. data/spec/core_ext/native/to_native_spec.rb +3 -2
  170. data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
  171. data/spec/date.rb +0 -0
  172. data/spec/fileutils.rb +0 -0
  173. data/spec/filters/ancestors.rb +4 -0
  174. data/spec/filters/array_delete.rb +3 -0
  175. data/spec/filters/array_fetch.rb +3 -0
  176. data/spec/filters/array_first.rb +3 -0
  177. data/spec/filters/array_flatten.rb +14 -0
  178. data/spec/filters/array_intersection.rb +5 -0
  179. data/spec/filters/array_join.rb +6 -0
  180. data/spec/filters/array_subclasses.rb +4 -0
  181. data/spec/filters/block_args.rb +3 -0
  182. data/spec/filters/coerce_integer.rb +9 -0
  183. data/spec/filters/frozen.rb +4 -0
  184. data/spec/filters/mocks.rb +3 -0
  185. data/spec/filters/should_receive.rb +4 -0
  186. data/spec/filters/tainted.rb +7 -0
  187. data/spec/fixtures/class.rb +124 -0
  188. data/spec/fixtures/class_variables.rb +0 -0
  189. data/spec/fixtures/constants.rb +0 -0
  190. data/spec/grammar/alias_spec.rb +1 -1
  191. data/spec/grammar/def_spec.rb +1 -0
  192. data/spec/grammar/lvar_spec.rb +1 -2
  193. data/spec/grammar/nth_ref_spec.rb +13 -0
  194. data/spec/grammar/sclass_spec.rb +6 -7
  195. data/spec/grammar/str_spec.rb +4 -4
  196. data/spec/grammar/string_spec.rb +8 -0
  197. data/spec/grammar/xstr_spec.rb +4 -4
  198. data/spec/iconv.rb +0 -0
  199. data/spec/language/alias_spec.rb +140 -3
  200. data/spec/language/and_spec.rb +14 -7
  201. data/spec/language/array_spec.rb +57 -5
  202. data/spec/language/block_spec.rb +466 -49
  203. data/spec/language/break_spec.rb +294 -44
  204. data/spec/language/case_spec.rb +151 -3
  205. data/spec/language/class_spec.rb +196 -0
  206. data/spec/language/class_variable_spec.rb +56 -0
  207. data/spec/language/def_spec.rb +507 -4
  208. data/spec/language/defined_spec.rb +19 -7
  209. data/spec/language/ensure_spec.rb +26 -39
  210. data/spec/language/execution_spec.rb +15 -0
  211. data/spec/language/fixtures/array.rb +11 -0
  212. data/spec/language/fixtures/block.rb +57 -0
  213. data/spec/language/fixtures/break.rb +240 -0
  214. data/spec/language/fixtures/ensure.rb +72 -0
  215. data/spec/language/fixtures/literal_lambda.rb +7 -0
  216. data/spec/language/fixtures/metaclass.rb +33 -0
  217. data/spec/language/fixtures/module.rb +24 -0
  218. data/spec/language/fixtures/next.rb +78 -12
  219. data/spec/language/fixtures/return.rb +118 -0
  220. data/spec/language/fixtures/send.rb +110 -0
  221. data/spec/language/fixtures/send_1.9.rb +22 -0
  222. data/spec/language/fixtures/super.rb +308 -0
  223. data/spec/language/fixtures/variables.rb +58 -0
  224. data/spec/language/fixtures/yield.rb +5 -0
  225. data/spec/language/for_spec.rb +192 -0
  226. data/spec/language/hash_spec.rb +29 -5
  227. data/spec/language/if_spec.rb +90 -9
  228. data/spec/language/literal_lambda_spec.rb +1 -47
  229. data/spec/language/loop_spec.rb +39 -2
  230. data/spec/language/metaclass_spec.rb +151 -5
  231. data/spec/language/module_spec.rb +56 -0
  232. data/spec/language/next_spec.rb +370 -12
  233. data/spec/language/not_spec.rb +55 -0
  234. data/spec/language/numbers_spec.rb +56 -0
  235. data/spec/language/or_spec.rb +31 -3
  236. data/spec/language/order_spec.rb +79 -0
  237. data/spec/language/precedence_spec.rb +483 -0
  238. data/spec/language/proc_spec.rb +249 -21
  239. data/spec/language/redo_spec.rb +67 -0
  240. data/spec/language/rescue_spec.rb +121 -0
  241. data/spec/language/retry_spec.rb +56 -0
  242. data/spec/language/return_spec.rb +281 -0
  243. data/spec/language/send_spec.rb +141 -48
  244. data/spec/language/singleton_class_spec.rb +1 -1
  245. data/spec/language/string_spec.rb +11 -0
  246. data/spec/language/super_spec.rb +213 -133
  247. data/spec/language/symbol_spec.rb +2 -1
  248. data/spec/language/undef_spec.rb +3 -1
  249. data/spec/language/unless_spec.rb +6 -2
  250. data/spec/language/until_spec.rb +102 -3
  251. data/spec/language/variables_spec.rb +1212 -16
  252. data/spec/language/versions/array_1.9.rb +39 -0
  253. data/spec/language/versions/case_1.9.rb +20 -0
  254. data/spec/language/versions/hash_1.9.rb +18 -0
  255. data/spec/language/versions/literal_lambda_1.9.rb +143 -0
  256. data/spec/language/versions/not_1.9.rb +22 -0
  257. data/spec/language/versions/send_1.9.rb +241 -0
  258. data/spec/language/versions/symbol_1.9.rb +15 -0
  259. data/spec/language/versions/variables_1.9.rb +8 -0
  260. data/spec/language/while_spec.rb +70 -5
  261. data/spec/language/yield_spec.rb +32 -6
  262. data/spec/mspec/guards/block_device.rb +0 -0
  263. data/spec/mspec/guards/endian.rb +0 -0
  264. data/spec/mspec/helpers/environment.rb +0 -0
  265. data/spec/mspec/helpers/language_version.rb +0 -0
  266. data/spec/mspec/helpers/tmp.rb +0 -0
  267. data/spec/ospec/filter.rb +32 -0
  268. data/spec/ospec/main.rb.erb +18 -0
  269. data/spec/ospec/phantom.rb +97 -0
  270. data/spec/ospec/runner.rb +95 -0
  271. data/spec/ospec/sprockets.js +40 -0
  272. data/spec/pp.rb +3 -0
  273. data/spec/rbconfig.rb +5 -0
  274. data/spec/spec_helper.rb +53 -26
  275. data/spec/yaml.rb +0 -0
  276. metadata +275 -31
  277. data/config.ru +0 -8
  278. data/lib/opal/processor.rb +0 -47
  279. data/lib/opal/scope.rb +0 -236
  280. data/lib/opal/server.rb +0 -94
  281. data/spec/core/boolean/and_spec.rb +0 -17
  282. data/spec/core/boolean/inspect_spec.rb +0 -9
  283. data/spec/core/boolean/or_spec.rb +0 -17
  284. data/spec/core/boolean/to_s_spec.rb +0 -9
  285. data/spec/core/boolean/xor_spec.rb +0 -17
@@ -45,14 +45,12 @@ describe "The defined? keyword when called with a method name" do
45
45
  defined?(Kernel.puts).should == "method"
46
46
  end
47
47
 
48
- it "returns nil if the method is private" do
49
- # FIXME: should opal-spec have some special not_opal_compatible error that is similar to skip?
50
- #defined?(Object.print).should be_nil
48
+ pending "returns nil if the method is private" do
49
+ defined?(Object.print).should be_nil
51
50
  end
52
51
 
53
- it "returns nil if the method is protected" do
54
- # FIXME: see above
55
- # defined?(DefinedSpecs::Basic.new.protected_method).should be_nil
52
+ pending "returns nil if the method is protected" do
53
+ defined?(DefinedSpecs::Basic.new.protected_method).should be_nil
56
54
  end
57
55
 
58
56
  it "returns nil if the method is not defined" do
@@ -83,4 +81,18 @@ describe "The defined? keyword when called with a method name" do
83
81
  defined?(@defined_specs_obj.an_undefined_method).should be_nil
84
82
  end
85
83
  end
86
- end
84
+ end
85
+
86
+ describe "The defined? keyword for ivars" do
87
+ it "returns 'instace-variable' if assigned" do
88
+ @assigned_ivar = "some value"
89
+ ret = defined?(@assigned_ivar)
90
+ ret.should == "instance-variable"
91
+ end
92
+
93
+ it "returns 'instace-variable' if not assigned" do
94
+ ret = defined?(@unassigned_ivar)
95
+ ret.should == "nil"
96
+ end
97
+ end
98
+
@@ -1,40 +1,5 @@
1
- module EnsureSpec
2
- class Container
3
- attr_reader :executed
4
-
5
- def initialize
6
- @executed = []
7
- end
8
-
9
- def raise_in_method_with_ensure
10
- @executed << :method
11
- raise "An Exception"
12
- ensure
13
- @executed << :ensure
14
- end
15
-
16
- def raise_and_rescue_in_method_with_ensure
17
- @executed << :method
18
- raise "An Exception"
19
- rescue => e
20
- @executed << :rescue
21
- ensure
22
- @executed << :ensure
23
- end
24
-
25
- def implicit_return_in_method_with_ensure
26
- :method
27
- ensure
28
- :ensure
29
- end
30
-
31
- def explicit_return_in_method_with_ensure
32
- return :method
33
- ensure
34
- return :ensure
35
- end
36
- end
37
- end
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/ensure', __FILE__)
38
3
 
39
4
  describe "An ensure block inside a begin block" do
40
5
  before :each do
@@ -61,7 +26,7 @@ describe "An ensure block inside a begin block" do
61
26
  begin
62
27
  ScratchPad << :begin
63
28
  raise "An exception occured!"
64
- rescue => e
29
+ rescue
65
30
  ScratchPad << :rescue
66
31
  ensure
67
32
  ScratchPad << :ensure
@@ -71,6 +36,23 @@ describe "An ensure block inside a begin block" do
71
36
  end
72
37
  end
73
38
 
39
+ pending "is executed even when a symbol is thrown in it's corresponding begin block" do
40
+ begin
41
+ catch(:symbol) do
42
+ begin
43
+ ScratchPad << :begin
44
+ throw(:symbol)
45
+ rescue
46
+ ScratchPad << :rescue
47
+ ensure
48
+ ScratchPad << :ensure
49
+ end
50
+ end
51
+
52
+ ScratchPad.recorded.should == [:begin, :ensure]
53
+ end
54
+ end
55
+
74
56
  it "is executed when nothing is raised or thrown in it's corresponding begin block" do
75
57
  begin
76
58
  ScratchPad << :begin
@@ -107,6 +89,11 @@ describe "An ensure block inside a method" do
107
89
  @obj.executed.should == [:method, :rescue, :ensure]
108
90
  end
109
91
 
92
+ pending "is executed even when a symbol is thrown in the method" do
93
+ catch(:symbol) { @obj.throw_in_method_with_ensure }
94
+ @obj.executed.should == [:method, :ensure]
95
+ end
96
+
110
97
  it "has no impact on the method's implicit return value" do
111
98
  @obj.implicit_return_in_method_with_ensure.should == :method
112
99
  end
@@ -114,4 +101,4 @@ describe "An ensure block inside a method" do
114
101
  it "has an impact on the method's explicit return value" do
115
102
  @obj.explicit_return_in_method_with_ensure.should == :ensure
116
103
  end
117
- end
104
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "``" do
4
+ pending "returns the output of the executed sub-process" do
5
+ ip = 'world'
6
+ # `echo disc #{ip}`.should == "disc world\n"
7
+ end
8
+ end
9
+
10
+ describe "%x" do
11
+ pending "is the same as ``" do
12
+ ip = 'world'
13
+ # %x(echo disc #{ip}).should == "disc world\n"
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module ArraySpec
2
+ class Splat
3
+ def unpack_3args(a, b, c)
4
+ [a, b, c]
5
+ end
6
+
7
+ def unpack_4args(a, b, c, d)
8
+ [a, b, c, d]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ module BlockSpecs
2
+ class Yielder
3
+ def z
4
+ yield
5
+ end
6
+
7
+ def m(*a)
8
+ yield(*a)
9
+ end
10
+
11
+ def s(a)
12
+ yield(a)
13
+ end
14
+
15
+ def r(a)
16
+ yield(*a)
17
+ end
18
+ end
19
+
20
+ # TODO: rewrite all specs that use Yield to use Yielder
21
+
22
+ class Yield
23
+ def splat(*args)
24
+ yield *args
25
+ end
26
+
27
+ def two_args
28
+ yield 1, 2
29
+ end
30
+
31
+ def two_arg_array
32
+ yield [1, 2]
33
+ end
34
+
35
+ def yield_splat_inside_block
36
+ [1, 2].send(:each_with_index) {|*args| yield(*args)}
37
+ end
38
+
39
+ def yield_this(obj)
40
+ yield obj
41
+ end
42
+ end
43
+
44
+ class OverwriteBlockVariable
45
+ def initialize
46
+ @y = Yielder.new
47
+ end
48
+
49
+ def method_missing(method, *args, &block)
50
+ self.class.send :define_method, method do |*args, &block|
51
+ @y.send method, *args, &block
52
+ end
53
+
54
+ send method, *args, &block
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,240 @@
1
+ module BreakSpecs
2
+ class Driver
3
+ def initialize(ensures=false)
4
+ @ensures = ensures
5
+ end
6
+
7
+ def note(value)
8
+ ScratchPad << value
9
+ end
10
+ end
11
+
12
+ class Block < Driver
13
+ def break_nil
14
+ note :a
15
+ note yielding {
16
+ note :b
17
+ break
18
+ note :c
19
+ }
20
+ note :d
21
+ end
22
+
23
+ def break_value
24
+ note :a
25
+ note yielding {
26
+ note :b
27
+ break :break
28
+ note :c
29
+ }
30
+ note :d
31
+ end
32
+
33
+ def yielding
34
+ note :aa
35
+ note yield
36
+ note :bb
37
+ end
38
+
39
+ def create_block
40
+ note :za
41
+ b = capture_block do
42
+ note :zb
43
+ break :break
44
+ note :zc
45
+ end
46
+ note :zd
47
+ b
48
+ end
49
+
50
+ def capture_block(&b)
51
+ note :xa
52
+ b
53
+ end
54
+
55
+ def break_in_method_captured
56
+ note :a
57
+ create_block.call
58
+ note :b
59
+ end
60
+
61
+ def break_in_yield_captured
62
+ note :a
63
+ yielding(&create_block)
64
+ note :b
65
+ end
66
+
67
+ def break_in_method
68
+ note :a
69
+ b = capture_block {
70
+ note :b
71
+ break :break
72
+ note :c
73
+ }
74
+ note :d
75
+ note b.call
76
+ note :e
77
+ end
78
+
79
+ def call_method(b)
80
+ note :aa
81
+ note b.call
82
+ note :bb
83
+ end
84
+
85
+ def break_in_nested_method
86
+ note :a
87
+ b = capture_block {
88
+ note :b
89
+ break :break
90
+ note :c
91
+ }
92
+ note :c
93
+ note call_method(b)
94
+ note :d
95
+ end
96
+
97
+ def break_in_yielding_method
98
+ note :a
99
+ b = capture_block {
100
+ note :b
101
+ break :break
102
+ note :c
103
+ }
104
+ note :c
105
+ note yielding(&b)
106
+ note :d
107
+ end
108
+ end
109
+
110
+ class Lambda < Driver
111
+ # Cases for the invocation of the scope defining the lambda still active
112
+ # on the call stack when the lambda is invoked.
113
+ def break_in_defining_scope(value=true)
114
+ note :a
115
+ note lambda {
116
+ note :b
117
+ if value
118
+ break :break
119
+ else
120
+ break
121
+ end
122
+ note :c
123
+ }.call
124
+ note :d
125
+ end
126
+
127
+ def break_in_nested_scope
128
+ note :a
129
+ l = lambda do
130
+ note :b
131
+ break :break
132
+ note :c
133
+ end
134
+ note :d
135
+
136
+ invoke_lambda l
137
+
138
+ note :e
139
+ end
140
+
141
+ def invoke_lambda(l)
142
+ note :aa
143
+ note l.call
144
+ note :bb
145
+ end
146
+
147
+ def break_in_nested_scope_yield
148
+ note :a
149
+ l = lambda do
150
+ note :b
151
+ break :break
152
+ note :c
153
+ end
154
+ note :d
155
+
156
+ note invoke_yield(&l)
157
+
158
+ note :e
159
+ end
160
+
161
+ def note_invoke_yield
162
+ note :aa
163
+ note yield
164
+ note :bb
165
+ end
166
+
167
+ def break_in_nested_scope_block
168
+ note :a
169
+ l = lambda do
170
+ note :b
171
+ break :break
172
+ note :c
173
+ end
174
+ note :d
175
+
176
+ invoke_lambda_block l
177
+
178
+ note :e
179
+ end
180
+
181
+ def invoke_yield
182
+ note :aaa
183
+ yield
184
+ note :bbb
185
+ end
186
+
187
+ def invoke_lambda_block(b)
188
+ note :aa
189
+ invoke_yield do
190
+ note :bb
191
+
192
+ note b.call
193
+
194
+ note :cc
195
+ end
196
+ note :dd
197
+ end
198
+
199
+ # Cases for the invocation of the scope defining the lambda NOT still
200
+ # active on the call stack when the lambda is invoked.
201
+ def create_lambda
202
+ note :la
203
+ l = lambda do
204
+ note :lb
205
+ break :break
206
+ note :lc
207
+ end
208
+ note :ld
209
+ l
210
+ end
211
+
212
+ def break_in_method
213
+ note :a
214
+
215
+ note create_lambda.call
216
+
217
+ note :b
218
+ end
219
+
220
+ def break_in_block_in_method
221
+ note :a
222
+ invoke_yield do
223
+ note :b
224
+
225
+ note create_lambda.call
226
+
227
+ note :c
228
+ end
229
+ note :d
230
+ end
231
+
232
+ def break_in_method_yield
233
+ note :a
234
+
235
+ invoke_yield(&create_lambda)
236
+
237
+ note :b
238
+ end
239
+ end
240
+ end