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.
- data/.gitignore +2 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +14 -1
- data/Gemfile +2 -5
- data/Rakefile +41 -3
- data/bin/opal +33 -0
- data/lib/opal.rb +2 -12
- data/lib/opal/core_ext.rb +5 -0
- data/lib/opal/grammar.rb +2207 -2138
- data/lib/opal/grammar.y +21 -0
- data/lib/opal/grammar_helpers.rb +360 -0
- data/lib/opal/lexer.rb +55 -401
- data/lib/opal/lexer_scope.rb +28 -0
- data/lib/opal/parser.rb +155 -171
- data/lib/opal/target_scope.rb +257 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +6 -2
- data/opal/opal-parser.js.erb +3 -2
- data/opal/opal.rb +20 -18
- data/opal/opal/array.rb +21 -12
- data/opal/opal/basic_object.rb +2 -1
- data/opal/opal/boolean.rb +3 -0
- data/opal/opal/browser_loader.js +57 -0
- data/opal/opal/class.rb +51 -13
- data/opal/opal/date.rb +1 -20
- data/opal/opal/enumerable.rb +66 -33
- data/opal/opal/error.rb +2 -0
- data/opal/opal/hash.rb +1 -1
- data/opal/opal/kernel.rb +14 -3
- data/opal/opal/nil_class.rb +4 -0
- data/opal/opal/proc.rb +9 -1
- data/opal/opal/racc.rb +2 -2
- data/opal/opal/regexp.rb +1 -1
- data/opal/opal/runtime.js +14 -4
- data/opal/opal/string.rb +21 -4
- data/opal/opal/time.rb +27 -0
- data/spec/core/array/allocate_spec.rb +7 -1
- data/spec/core/array/append_spec.rb +18 -3
- data/spec/core/array/array_spec.rb +7 -0
- data/spec/core/array/assoc_spec.rb +23 -8
- data/spec/core/array/at_spec.rb +23 -3
- data/spec/core/array/choice_spec.rb +20 -0
- data/spec/core/array/clear_spec.rb +45 -4
- data/spec/core/array/combination_spec.rb +55 -0
- data/spec/core/array/compact_spec.rb +72 -1
- data/spec/core/array/constructor_spec.rb +13 -2
- data/spec/core/array/count_spec.rb +15 -7
- data/spec/core/array/delete_at_spec.rb +44 -1
- data/spec/core/array/delete_if_spec.rb +52 -2
- data/spec/core/array/delete_spec.rb +83 -2
- data/spec/core/array/drop_spec.rb +24 -16
- data/spec/core/array/drop_while_spec.rb +17 -0
- data/spec/core/array/each_index_spec.rb +11 -1
- data/spec/core/array/each_spec.rb +20 -2
- data/spec/core/array/empty_spec.rb +4 -1
- data/spec/core/array/eql_spec.rb +14 -0
- data/spec/core/array/fetch_spec.rb +31 -2
- data/spec/core/array/find_index_spec.rb +8 -0
- data/spec/core/array/first_spec.rb +45 -8
- data/spec/core/array/fixtures/classes.rb +538 -0
- data/spec/core/array/flatten_spec.rb +200 -7
- data/spec/core/array/frozen_spec.rb +32 -0
- data/spec/core/array/include_spec.rb +16 -1
- data/spec/core/array/index_spec.rb +5 -25
- data/spec/core/array/insert_spec.rb +37 -3
- data/spec/core/array/inspect_spec.rb +6 -12
- data/spec/core/array/intersection_spec.rb +55 -4
- data/spec/core/array/join_spec.rb +29 -4
- data/spec/core/array/keep_if_spec.rb +13 -6
- data/spec/core/array/last_spec.rb +35 -1
- data/spec/core/array/length_spec.rb +7 -4
- data/spec/core/array/map_spec.rb +9 -47
- data/spec/core/array/minus_spec.rb +68 -4
- data/spec/core/array/multiply_spec.rb +138 -6
- data/spec/core/array/new_spec.rb +92 -3
- data/spec/core/array/ntimes_spec.rb +26 -0
- data/spec/core/array/plus_spec.rb +48 -2
- data/spec/core/array/pop_spec.rb +159 -39
- data/spec/core/array/push_spec.rb +29 -1
- data/spec/core/array/rassoc_spec.rb +31 -2
- data/spec/core/array/reject_spec.rb +89 -2
- data/spec/core/array/replace_spec.rb +7 -29
- data/spec/core/array/reverse_each_spec.rb +25 -1
- data/spec/core/array/reverse_spec.rb +53 -1
- data/spec/core/array/rindex_spec.rb +55 -5
- data/spec/core/array/select_spec.rb +35 -8
- data/spec/core/array/shared/collect.rb +0 -0
- data/spec/core/array/shared/enumeratorize.rb +12 -0
- data/spec/core/array/shared/eql.rb +95 -0
- data/spec/core/array/shared/index.rb +37 -0
- data/spec/core/array/shared/inspect.rb +3 -0
- data/spec/core/array/shared/join.rb +7 -0
- data/spec/core/array/shared/keep_if.rb +0 -0
- data/spec/core/array/shared/length.rb +0 -0
- data/spec/core/array/shared/replace.rb +0 -0
- data/spec/core/array/shared/slice.rb +0 -0
- data/spec/core/array/shift_spec.rb +132 -23
- data/spec/core/array/shuffle_spec.rb +82 -6
- data/spec/core/array/size_spec.rb +7 -4
- data/spec/core/array/slice_spec.rb +132 -1
- data/spec/core/array/sort_spec.rb +263 -14
- data/spec/core/array/take_spec.rb +24 -16
- data/spec/core/array/take_while_spec.rb +14 -10
- data/spec/core/array/to_a_spec.rb +18 -1
- data/spec/core/array/to_ary_spec.rb +15 -1
- data/spec/core/array/try_convert_spec.rb +39 -2
- data/spec/core/array/uniq_spec.rb +148 -3
- data/spec/core/array/unshift_spec.rb +36 -1
- data/spec/core/array/zip_spec.rb +36 -1
- data/spec/core/class/new_spec.rb +8 -6
- data/spec/core/enumerable/all_spec.rb +37 -9
- data/spec/core/enumerable/any_spec.rb +45 -7
- data/spec/core/enumerable/collect_spec.rb +4 -1
- data/spec/core/enumerable/count_spec.rb +4 -1
- data/spec/core/enumerable/detect_spec.rb +2 -2
- data/spec/core/enumerable/drop_spec.rb +4 -1
- data/spec/core/enumerable/drop_while_spec.rb +4 -1
- data/spec/core/enumerable/each_slice_spec.rb +2 -1
- data/spec/core/enumerable/each_with_index_spec.rb +4 -1
- data/spec/core/enumerable/each_with_object_spec.rb +4 -1
- data/spec/core/enumerable/entries_spec.rb +4 -1
- data/spec/core/enumerable/find_all_spec.rb +4 -1
- data/spec/core/enumerable/find_index_spec.rb +4 -1
- data/spec/core/enumerable/find_spec.rb +5 -2
- data/spec/core/enumerable/first_spec.rb +4 -1
- data/spec/core/enumerable/fixtures/classes.rb +198 -2
- data/spec/core/enumerable/grep_spec.rb +4 -1
- data/spec/core/enumerable/take_spec.rb +4 -1
- data/spec/core/enumerable/to_a_spec.rb +4 -1
- data/spec/core/false/and_spec.rb +11 -0
- data/spec/core/false/inspect_spec.rb +7 -0
- data/spec/core/false/or_spec.rb +11 -0
- data/spec/core/false/to_s_spec.rb +7 -0
- data/spec/core/false/xor_spec.rb +11 -0
- data/spec/core/kernel/rand_spec.rb +5 -5
- data/spec/core/module/const_get_spec.rb +4 -4
- data/spec/core/module/fixtures/classes.rb +434 -0
- data/spec/core/module/method_defined_spec.rb +49 -0
- data/spec/core/module/module_function_spec.rb +28 -0
- data/spec/core/nil/and_spec.rb +3 -1
- data/spec/core/nil/dup_spec.rb +7 -0
- data/spec/core/nil/inspect_spec.rb +3 -1
- data/spec/core/nil/nil_spec.rb +3 -1
- data/spec/core/nil/or_spec.rb +4 -2
- data/spec/core/nil/to_a_spec.rb +3 -1
- data/spec/core/nil/to_f_spec.rb +3 -1
- data/spec/core/nil/to_i_spec.rb +3 -1
- data/spec/core/nil/to_s_spec.rb +3 -1
- data/spec/core/nil/xor_spec.rb +4 -2
- data/spec/core/string/element_reference_spec.rb +14 -1
- data/spec/core/string/fixtures/classes.rb +0 -0
- data/spec/core/true/and_spec.rb +11 -0
- data/spec/core/true/inspect_spec.rb +7 -0
- data/spec/core/true/or_spec.rb +11 -0
- data/spec/core/true/to_s_spec.rb +7 -0
- data/spec/core/true/xor_spec.rb +11 -0
- data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
- data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
- data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
- data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
- data/spec/core_ext/basic_object/send_spec.rb +3 -3
- data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
- data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
- data/spec/core_ext/class/_inherited_spec.rb +3 -3
- data/spec/core_ext/class/proc_methods_spec.rb +2 -2
- data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
- data/spec/core_ext/method_missing_spec.rb +3 -3
- data/spec/core_ext/native/method_missing_spec.rb +3 -2
- data/spec/core_ext/native/to_native_spec.rb +3 -2
- data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
- data/spec/date.rb +0 -0
- data/spec/fileutils.rb +0 -0
- data/spec/filters/ancestors.rb +4 -0
- data/spec/filters/array_delete.rb +3 -0
- data/spec/filters/array_fetch.rb +3 -0
- data/spec/filters/array_first.rb +3 -0
- data/spec/filters/array_flatten.rb +14 -0
- data/spec/filters/array_intersection.rb +5 -0
- data/spec/filters/array_join.rb +6 -0
- data/spec/filters/array_subclasses.rb +4 -0
- data/spec/filters/block_args.rb +3 -0
- data/spec/filters/coerce_integer.rb +9 -0
- data/spec/filters/frozen.rb +4 -0
- data/spec/filters/mocks.rb +3 -0
- data/spec/filters/should_receive.rb +4 -0
- data/spec/filters/tainted.rb +7 -0
- data/spec/fixtures/class.rb +124 -0
- data/spec/fixtures/class_variables.rb +0 -0
- data/spec/fixtures/constants.rb +0 -0
- data/spec/grammar/alias_spec.rb +1 -1
- data/spec/grammar/def_spec.rb +1 -0
- data/spec/grammar/lvar_spec.rb +1 -2
- data/spec/grammar/nth_ref_spec.rb +13 -0
- data/spec/grammar/sclass_spec.rb +6 -7
- data/spec/grammar/str_spec.rb +4 -4
- data/spec/grammar/string_spec.rb +8 -0
- data/spec/grammar/xstr_spec.rb +4 -4
- data/spec/iconv.rb +0 -0
- data/spec/language/alias_spec.rb +140 -3
- data/spec/language/and_spec.rb +14 -7
- data/spec/language/array_spec.rb +57 -5
- data/spec/language/block_spec.rb +466 -49
- data/spec/language/break_spec.rb +294 -44
- data/spec/language/case_spec.rb +151 -3
- data/spec/language/class_spec.rb +196 -0
- data/spec/language/class_variable_spec.rb +56 -0
- data/spec/language/def_spec.rb +507 -4
- data/spec/language/defined_spec.rb +19 -7
- data/spec/language/ensure_spec.rb +26 -39
- data/spec/language/execution_spec.rb +15 -0
- data/spec/language/fixtures/array.rb +11 -0
- data/spec/language/fixtures/block.rb +57 -0
- data/spec/language/fixtures/break.rb +240 -0
- data/spec/language/fixtures/ensure.rb +72 -0
- data/spec/language/fixtures/literal_lambda.rb +7 -0
- data/spec/language/fixtures/metaclass.rb +33 -0
- data/spec/language/fixtures/module.rb +24 -0
- data/spec/language/fixtures/next.rb +78 -12
- data/spec/language/fixtures/return.rb +118 -0
- data/spec/language/fixtures/send.rb +110 -0
- data/spec/language/fixtures/send_1.9.rb +22 -0
- data/spec/language/fixtures/super.rb +308 -0
- data/spec/language/fixtures/variables.rb +58 -0
- data/spec/language/fixtures/yield.rb +5 -0
- data/spec/language/for_spec.rb +192 -0
- data/spec/language/hash_spec.rb +29 -5
- data/spec/language/if_spec.rb +90 -9
- data/spec/language/literal_lambda_spec.rb +1 -47
- data/spec/language/loop_spec.rb +39 -2
- data/spec/language/metaclass_spec.rb +151 -5
- data/spec/language/module_spec.rb +56 -0
- data/spec/language/next_spec.rb +370 -12
- data/spec/language/not_spec.rb +55 -0
- data/spec/language/numbers_spec.rb +56 -0
- data/spec/language/or_spec.rb +31 -3
- data/spec/language/order_spec.rb +79 -0
- data/spec/language/precedence_spec.rb +483 -0
- data/spec/language/proc_spec.rb +249 -21
- data/spec/language/redo_spec.rb +67 -0
- data/spec/language/rescue_spec.rb +121 -0
- data/spec/language/retry_spec.rb +56 -0
- data/spec/language/return_spec.rb +281 -0
- data/spec/language/send_spec.rb +141 -48
- data/spec/language/singleton_class_spec.rb +1 -1
- data/spec/language/string_spec.rb +11 -0
- data/spec/language/super_spec.rb +213 -133
- data/spec/language/symbol_spec.rb +2 -1
- data/spec/language/undef_spec.rb +3 -1
- data/spec/language/unless_spec.rb +6 -2
- data/spec/language/until_spec.rb +102 -3
- data/spec/language/variables_spec.rb +1212 -16
- data/spec/language/versions/array_1.9.rb +39 -0
- data/spec/language/versions/case_1.9.rb +20 -0
- data/spec/language/versions/hash_1.9.rb +18 -0
- data/spec/language/versions/literal_lambda_1.9.rb +143 -0
- data/spec/language/versions/not_1.9.rb +22 -0
- data/spec/language/versions/send_1.9.rb +241 -0
- data/spec/language/versions/symbol_1.9.rb +15 -0
- data/spec/language/versions/variables_1.9.rb +8 -0
- data/spec/language/while_spec.rb +70 -5
- data/spec/language/yield_spec.rb +32 -6
- data/spec/mspec/guards/block_device.rb +0 -0
- data/spec/mspec/guards/endian.rb +0 -0
- data/spec/mspec/helpers/environment.rb +0 -0
- data/spec/mspec/helpers/language_version.rb +0 -0
- data/spec/mspec/helpers/tmp.rb +0 -0
- data/spec/ospec/filter.rb +32 -0
- data/spec/ospec/main.rb.erb +18 -0
- data/spec/ospec/phantom.rb +97 -0
- data/spec/ospec/runner.rb +95 -0
- data/spec/ospec/sprockets.js +40 -0
- data/spec/pp.rb +3 -0
- data/spec/rbconfig.rb +5 -0
- data/spec/spec_helper.rb +53 -26
- data/spec/yaml.rb +0 -0
- metadata +275 -31
- data/config.ru +0 -8
- data/lib/opal/processor.rb +0 -47
- data/lib/opal/scope.rb +0 -236
- data/lib/opal/server.rb +0 -94
- data/spec/core/boolean/and_spec.rb +0 -17
- data/spec/core/boolean/inspect_spec.rb +0 -9
- data/spec/core/boolean/or_spec.rb +0 -17
- data/spec/core/boolean/to_s_spec.rb +0 -9
- 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
|
-
|
49
|
-
|
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
|
-
|
54
|
-
|
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
|
-
|
2
|
-
|
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
|
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,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
|