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
@@ -0,0 +1,72 @@
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
20
+ @executed << :rescue
21
+ ensure
22
+ @executed << :ensure
23
+ end
24
+
25
+ def throw_in_method_with_ensure
26
+ @executed << :method
27
+ throw(:symbol)
28
+ ensure
29
+ @executed << :ensure
30
+ end
31
+
32
+ def implicit_return_in_method_with_ensure
33
+ :method
34
+ ensure
35
+ :ensure
36
+ end
37
+
38
+ def explicit_return_in_method_with_ensure
39
+ return :method
40
+ ensure
41
+ return :ensure
42
+ end
43
+ end
44
+ end
45
+
46
+ module EnsureSpec
47
+
48
+ class Test
49
+
50
+ def initialize
51
+ @values = []
52
+ end
53
+
54
+ attr_reader :values
55
+
56
+ def call_block
57
+ begin
58
+ @values << :start
59
+ yield
60
+ ensure
61
+ @values << :end
62
+ end
63
+ end
64
+
65
+ def do_test
66
+ call_block do
67
+ @values << :in_block
68
+ return :did_test
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,7 @@
1
+ module LiteralLambdaMethods
2
+ SOME_CONSTANT = "some value"
3
+ def self.literal_lambda_with_constant
4
+ ->{SOME_CONSTANT}
5
+ end
6
+ # module_function :literal_lambda_with_constant
7
+ end
@@ -0,0 +1,33 @@
1
+ module MetaClassSpecs
2
+
3
+ def self.metaclass_of obj
4
+ class << obj
5
+ self
6
+ end
7
+ end
8
+
9
+ class A
10
+ def self.cheese
11
+ 'edam'
12
+ end
13
+ end
14
+
15
+ class B < A
16
+ def self.cheese
17
+ 'stilton'
18
+ end
19
+ end
20
+
21
+ class C
22
+ class << self
23
+ class << self
24
+ def ham
25
+ 'iberico'
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ class D < C; end
32
+
33
+ end
@@ -0,0 +1,24 @@
1
+ module ModuleSpecs
2
+ module Modules
3
+ class Klass
4
+ end
5
+
6
+ A = "Module"
7
+ B = 1
8
+ C = nil
9
+ D = true
10
+ E = false
11
+ end
12
+
13
+ module Anonymous
14
+ end
15
+
16
+ module IncludedInObject
17
+ module IncludedModuleSpecs
18
+ end
19
+ end
20
+ end
21
+
22
+ class Object
23
+ include ModuleSpecs::IncludedInObject
24
+ end
@@ -8,6 +8,12 @@ class NextSpecs
8
8
  yield
9
9
  end
10
10
 
11
+ # The methods below are defined to spec the behavior of the next statement
12
+ # while specifically isolating whether the statement is in an Iter block or
13
+ # not. In a normal spec example, the code is always nested inside a block.
14
+ # Rather than rely on that implicit context in this case, the context is
15
+ # made explicit because of the interaction of next in a loop nested inside
16
+ # an Iter block.
11
17
  def self.while_next(arg)
12
18
  x = true
13
19
  while x
@@ -43,20 +49,80 @@ class NextSpecs
43
49
  end
44
50
  end
45
51
  end
46
- end
47
52
 
48
- class ChainedNextTest
49
- def self.meth_with_yield(&b)
50
- yield.should == :next_return_value
51
- :method_return_value
53
+ def self.until_next(arg)
54
+ x = false
55
+ until x
56
+ begin
57
+ ScratchPad << :begin
58
+ x = true
59
+ if arg
60
+ next 42
61
+ else
62
+ next
63
+ end
64
+ ensure
65
+ ScratchPad << :ensure
66
+ end
67
+ end
68
+ end
69
+
70
+ def self.until_within_iter(arg)
71
+ yielding do
72
+ x = false
73
+ until x
74
+ begin
75
+ ScratchPad << :begin
76
+ x = true
77
+ if arg
78
+ next 42
79
+ else
80
+ next
81
+ end
82
+ ensure
83
+ ScratchPad << :ensure
84
+ end
85
+ end
86
+ end
52
87
  end
53
- def self.invoking_method(&b)
54
- meth_with_yield(&b)
88
+
89
+ def self.loop_next(arg)
90
+ x = 1
91
+ loop do
92
+ break if x == 2
93
+
94
+ begin
95
+ ScratchPad << :begin
96
+ x += 1
97
+ if arg
98
+ next 42
99
+ else
100
+ next
101
+ end
102
+ ensure
103
+ ScratchPad << :ensure
104
+ end
105
+ end
55
106
  end
56
- def self.enclosing_method
57
- invoking_method do
58
- next :next_return_value
59
- :wrong_return_value
107
+
108
+ def self.loop_within_iter(arg)
109
+ yielding do
110
+ x = 1
111
+ loop do
112
+ break if x == 2
113
+
114
+ begin
115
+ ScratchPad << :begin
116
+ x += 1
117
+ if arg
118
+ next 42
119
+ else
120
+ next
121
+ end
122
+ ensure
123
+ ScratchPad << :ensure
124
+ end
125
+ end
60
126
  end
61
127
  end
62
- end
128
+ end
@@ -0,0 +1,118 @@
1
+ module ReturnSpecs
2
+ class Blocks
3
+ def yielding_method
4
+ yield
5
+ ScratchPad.record :after_yield
6
+ end
7
+
8
+ def enclosing_method
9
+ yielding_method do
10
+ ScratchPad.record :before_return
11
+ return :return_value
12
+ ScratchPad.record :after_return
13
+ end
14
+
15
+ ScratchPad.record :after_call
16
+ end
17
+ end
18
+
19
+ class NestedCalls < Blocks
20
+ def invoking_method(&b)
21
+ yielding_method(&b)
22
+ ScratchPad.record :after_invoke
23
+ end
24
+
25
+ def enclosing_method
26
+ invoking_method do
27
+ ScratchPad.record :before_return
28
+ return :return_value
29
+ ScratchPad.record :after_return
30
+ end
31
+ ScratchPad.record :after_invoke
32
+ end
33
+ end
34
+
35
+ class NestedBlocks < Blocks
36
+ def enclosing_method
37
+ yielding_method do
38
+ yielding_method do
39
+ ScratchPad.record :before_return
40
+ return :return_value
41
+ ScratchPad.record :after_return
42
+ end
43
+ ScratchPad.record :after_invoke1
44
+ end
45
+ ScratchPad.record :after_invoke2
46
+ end
47
+ end
48
+
49
+ class SavedInnerBlock
50
+ def add(&b)
51
+ @block = b
52
+ end
53
+
54
+ def outer
55
+ yield
56
+ @block.call
57
+ end
58
+
59
+ def inner
60
+ yield
61
+ end
62
+
63
+ def start
64
+ outer do
65
+ inner do
66
+ add do
67
+ ScratchPad.record :before_return
68
+ return :return_value
69
+ end
70
+ end
71
+ end
72
+
73
+ ScratchPad.record :bottom_of_start
74
+
75
+ return false
76
+ end
77
+ end
78
+
79
+ class ThroughDefineMethod
80
+ lamb = proc { |x| x.call }
81
+ define_method :foo, lamb
82
+
83
+ def mp(&b); b; end
84
+
85
+ def outer
86
+ pr = mp { return :good }
87
+
88
+ foo(pr)
89
+ return :bad
90
+ end
91
+ end
92
+
93
+ class DefineMethod
94
+ lamb = proc { return :good }
95
+ define_method :foo, lamb
96
+
97
+ def outer
98
+ val = :bad
99
+
100
+ # This is tricky, but works. If lamb properly returns, then the
101
+ # return value will go into val before we run the ensure.
102
+ #
103
+ # If lamb's return keeps unwinding incorrectly, val will still
104
+ # have it's old value.
105
+ #
106
+ # We can therefore use val to figure out what happened.
107
+ begin
108
+ val = foo()
109
+ ensure
110
+ if val != :good
111
+ return :bad
112
+ end
113
+ end
114
+
115
+ return val
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,110 @@
1
+ module LangSendSpecs
2
+ # module_function
3
+
4
+ def self.fooM0; 100 end
5
+ def self.fooM1(a); [a]; end
6
+ def self.fooM2(a,b); [a,b]; end
7
+ def self.fooM3(a,b,c); [a,b,c]; end
8
+ def self.fooM4(a,b,c,d); [a,b,c,d]; end
9
+ def self.fooM5(a,b,c,d,e); [a,b,c,d,e]; end
10
+ def self.fooM0O1(a=1); [a]; end
11
+ def self.fooM1O1(a,b=1); [a,b]; end
12
+ def self.fooM2O1(a,b,c=1); [a,b,c]; end
13
+ def self.fooM3O1(a,b,c,d=1); [a,b,c,d]; end
14
+ def self.fooM4O1(a,b,c,d,e=1); [a,b,c,d,e]; end
15
+ def self.fooM0O2(a=1,b=2); [a,b]; end
16
+ def self.fooM0R(*r); r; end
17
+ def self.fooM1R(a, *r); [a, r]; end
18
+ def self.fooM0O1R(a=1, *r); [a, r]; end
19
+ def self.fooM1O1R(a, b=1, *r); [a, b, r]; end
20
+
21
+ def self.one(a); a; end
22
+ # def oneb(a,&b); [a,yield(b)]; end
23
+ # def twob(a,b,&c); [a,b,yield(c)]; end
24
+ def self.makeproc(&b) b end
25
+
26
+ # def yield_now; yield; end
27
+
28
+ def self.double(x); x * 2 end
29
+ def self.weird_parens
30
+ # means double((5).to_s)
31
+ # NOT (double(5)).to_s
32
+ double (5).to_s
33
+ end
34
+
35
+ def self.rest_len(*a); a.size; end
36
+
37
+ def self.twos(a,b,*c)
38
+ [c.size, c.last]
39
+ end
40
+
41
+ class PrivateSetter
42
+ attr_reader :foo
43
+ attr_writer :foo
44
+ private :foo=
45
+
46
+ def call_self_foo_equals(value)
47
+ self.foo = value
48
+ end
49
+
50
+ def call_self_foo_equals_masgn(value)
51
+ a, self.foo = 1, value
52
+ end
53
+ end
54
+
55
+ class PrivateGetter
56
+ attr_reader :foo
57
+ private :foo
58
+
59
+ def call_self_foo
60
+ self.foo
61
+ end
62
+
63
+ def call_self_foo_or_equals(value)
64
+ # self.foo ||= 6
65
+ end
66
+ end
67
+
68
+ class AttrSet
69
+ attr_reader :result
70
+ def []=(a, b, c, d); @result = [a,b,c,d]; end
71
+ end
72
+
73
+ class ToProc
74
+ def initialize(val)
75
+ @val = val
76
+ end
77
+
78
+ def to_proc
79
+ Proc.new { @val }
80
+ end
81
+ end
82
+
83
+ class ToAry
84
+ def initialize(obj)
85
+ @obj = obj
86
+ end
87
+
88
+ def to_ary
89
+ @obj
90
+ end
91
+ end
92
+
93
+ class MethodMissing
94
+ def initialize
95
+ @message = nil
96
+ @args = nil
97
+ end
98
+
99
+ attr_reader :message, :args
100
+
101
+ def method_missing(m, *a)
102
+ @message = m
103
+ @args = a
104
+ end
105
+ end
106
+ end
107
+
108
+ def lang_send_rest_len(*a)
109
+ a.size
110
+ end