opal 0.9.4 → 0.10.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.gitignore +2 -3
  4. data/.gitmodules +5 -2
  5. data/.jshintrc +1 -8
  6. data/.rspec +1 -1
  7. data/.travis.yml +15 -23
  8. data/CHANGELOG.md +511 -326
  9. data/CODE_OF_CONDUCT.md +13 -15
  10. data/CONTRIBUTING.md +26 -216
  11. data/Gemfile +20 -12
  12. data/Guardfile +2 -2
  13. data/HACKING.md +230 -0
  14. data/README.md +6 -7
  15. data/bin/opal-mspec +1 -1
  16. data/config.ru +2 -2
  17. data/docs/faq.md +1 -1
  18. data/docs/source_maps.md +1 -1
  19. data/lib/opal.rb +1 -0
  20. data/lib/opal/builder.rb +1 -1
  21. data/lib/opal/cli.rb +30 -28
  22. data/lib/opal/cli_options.rb +3 -0
  23. data/lib/opal/cli_runners.rb +14 -1
  24. data/lib/opal/cli_runners/{apple_script.rb → applescript.rb} +3 -3
  25. data/lib/opal/cli_runners/nashorn.rb +2 -2
  26. data/lib/opal/cli_runners/nodejs.rb +2 -2
  27. data/lib/opal/cli_runners/phantom.js +24 -0
  28. data/lib/opal/cli_runners/phantomjs.rb +10 -10
  29. data/lib/opal/cli_runners/server.rb +3 -3
  30. data/lib/opal/compiler.rb +43 -4
  31. data/lib/opal/config.rb +3 -1
  32. data/lib/opal/errors.rb +13 -0
  33. data/lib/opal/fragment.rb +0 -13
  34. data/lib/opal/nodes.rb +10 -0
  35. data/lib/opal/nodes/args/initialize_kwargs.rb +28 -0
  36. data/lib/opal/nodes/args/kwarg.rb +29 -0
  37. data/lib/opal/nodes/args/kwoptarg.rb +29 -0
  38. data/lib/opal/nodes/args/kwrestarg.rb +39 -0
  39. data/lib/opal/nodes/args/mlhsarg.rb +79 -0
  40. data/lib/opal/nodes/args/normarg.rb +26 -0
  41. data/lib/opal/nodes/args/optarg.rb +27 -0
  42. data/lib/opal/nodes/args/post_args.rb +200 -0
  43. data/lib/opal/nodes/args/post_kwargs.rb +31 -0
  44. data/lib/opal/nodes/args/restarg.rb +33 -0
  45. data/lib/opal/nodes/base.rb +12 -0
  46. data/lib/opal/nodes/call.rb +92 -33
  47. data/lib/opal/nodes/def.rb +26 -169
  48. data/lib/opal/nodes/hash.rb +10 -4
  49. data/lib/opal/nodes/helpers.rb +6 -3
  50. data/lib/opal/nodes/inline_args.rb +61 -0
  51. data/lib/opal/nodes/iter.rb +73 -82
  52. data/lib/opal/nodes/logic.rb +12 -2
  53. data/lib/opal/nodes/masgn.rb +1 -2
  54. data/lib/opal/nodes/node_with_args.rb +141 -0
  55. data/lib/opal/nodes/rescue.rb +121 -43
  56. data/lib/opal/nodes/scope.rb +24 -5
  57. data/lib/opal/nodes/super.rb +122 -54
  58. data/lib/opal/nodes/top.rb +0 -12
  59. data/lib/opal/nodes/yield.rb +2 -13
  60. data/lib/opal/parser.rb +67 -39
  61. data/lib/opal/parser/grammar.rb +3319 -2961
  62. data/lib/opal/parser/grammar.y +234 -46
  63. data/lib/opal/parser/lexer.rb +105 -17
  64. data/lib/opal/parser/sexp.rb +4 -0
  65. data/lib/opal/paths.rb +4 -0
  66. data/lib/opal/regexp_anchors.rb +19 -1
  67. data/lib/opal/sprockets.rb +21 -18
  68. data/lib/opal/sprockets/environment.rb +0 -8
  69. data/lib/opal/sprockets/processor.rb +13 -16
  70. data/lib/opal/sprockets/server.rb +6 -12
  71. data/lib/opal/version.rb +1 -1
  72. data/opal.gemspec +1 -0
  73. data/opal/corelib/array.rb +209 -131
  74. data/opal/corelib/basic_object.rb +7 -3
  75. data/opal/corelib/class.rb +11 -17
  76. data/opal/corelib/constants.rb +2 -2
  77. data/opal/corelib/enumerable.rb +178 -355
  78. data/opal/corelib/enumerator.rb +3 -46
  79. data/opal/corelib/error.rb +2 -2
  80. data/opal/corelib/file.rb +13 -1
  81. data/opal/corelib/hash.rb +26 -56
  82. data/opal/corelib/helpers.rb +10 -0
  83. data/opal/corelib/kernel.rb +6 -3
  84. data/opal/corelib/module.rb +62 -31
  85. data/opal/corelib/number.rb +7 -16
  86. data/opal/corelib/proc.rb +24 -9
  87. data/opal/corelib/range.rb +4 -13
  88. data/opal/corelib/runtime.js +515 -378
  89. data/opal/corelib/string.rb +21 -49
  90. data/opal/corelib/struct.rb +50 -35
  91. data/opal/corelib/unsupported.rb +18 -30
  92. data/opal/opal.rb +0 -1
  93. data/opal/opal/mini.rb +1 -0
  94. data/spec/README.md +6 -4
  95. data/spec/filters/bugs/array.rb +0 -42
  96. data/spec/filters/bugs/basicobject.rb +0 -2
  97. data/spec/filters/bugs/bigdecimal.rb +160 -0
  98. data/spec/filters/bugs/class.rb +0 -5
  99. data/spec/filters/bugs/date.rb +1 -48
  100. data/spec/filters/bugs/enumerable.rb +4 -12
  101. data/spec/filters/bugs/enumerator.rb +0 -1
  102. data/spec/filters/bugs/exception.rb +4 -3
  103. data/spec/filters/bugs/float.rb +4 -2
  104. data/spec/filters/bugs/kernel.rb +25 -10
  105. data/spec/filters/bugs/language.rb +119 -68
  106. data/spec/filters/bugs/method.rb +135 -0
  107. data/spec/filters/bugs/module.rb +13 -28
  108. data/spec/filters/bugs/proc.rb +18 -8
  109. data/spec/filters/bugs/range.rb +0 -3
  110. data/spec/filters/bugs/rational.rb +4 -0
  111. data/spec/filters/bugs/regexp.rb +68 -36
  112. data/spec/filters/bugs/string.rb +1 -1
  113. data/spec/filters/bugs/struct.rb +0 -12
  114. data/spec/filters/bugs/time.rb +1 -0
  115. data/spec/filters/bugs/unboundmethod.rb +2 -1
  116. data/spec/filters/unsupported/freeze.rb +3 -1
  117. data/spec/filters/unsupported/language.rb +0 -7
  118. data/spec/filters/unsupported/privacy.rb +7 -6
  119. data/spec/filters/unsupported/string.rb +10 -0
  120. data/spec/filters/unsupported/struct.rb +3 -0
  121. data/spec/filters/unsupported/symbol.rb +9 -0
  122. data/spec/filters/unsupported/taint.rb +0 -3
  123. data/spec/filters/unsupported/thread.rb +1 -0
  124. data/spec/lib/cli_runners/phantomjs_spec.rb +39 -0
  125. data/spec/lib/cli_spec.rb +42 -1
  126. data/spec/lib/compiler/call_spec.rb +700 -0
  127. data/spec/lib/compiler_spec.rb +46 -28
  128. data/spec/lib/config_spec.rb +13 -0
  129. data/spec/lib/parser/call_spec.rb +18 -0
  130. data/spec/lib/parser/def_spec.rb +29 -0
  131. data/spec/lib/parser/iter_spec.rb +15 -15
  132. data/spec/lib/parser/lambda_spec.rb +153 -12
  133. data/spec/lib/parser/string_spec.rb +5 -0
  134. data/spec/lib/parser/undef_spec.rb +1 -1
  135. data/spec/lib/parser/variables_spec.rb +24 -0
  136. data/spec/lib/paths_spec.rb +12 -5
  137. data/spec/lib/spec_helper.rb +5 -0
  138. data/spec/lib/sprockets/processor_spec.rb +6 -5
  139. data/spec/lib/sprockets_spec.rb +8 -0
  140. data/spec/mspec-opal/formatters.rb +188 -0
  141. data/spec/mspec-opal/runner.rb +193 -0
  142. data/spec/opal/core/enumerator/with_index_spec.rb +6 -0
  143. data/spec/opal/core/kernel/define_singleton_method_spec.rb +1 -1
  144. data/spec/opal/core/kernel/instance_variables_spec.rb +14 -0
  145. data/spec/opal/core/kernel/loop_spec.rb +1 -1
  146. data/spec/opal/core/kernel/raise_spec.rb +1 -1
  147. data/spec/opal/core/language/heredoc_spec.rb +42 -0
  148. data/spec/opal/core/language/rescue_spec.rb +18 -0
  149. data/spec/opal/core/language_spec.rb +22 -0
  150. data/spec/opal/core/module/const_defined_spec.rb +1 -2
  151. data/spec/opal/core/module/name_spec.rb +6 -0
  152. data/spec/opal/core/runtime/bridged_classes_spec.rb +14 -2
  153. data/spec/opal/core/runtime/rescue_spec.rb +12 -2
  154. data/spec/opal/core/runtime/super_spec.rb +1 -0
  155. data/spec/opal/core/string_spec.rb +21 -0
  156. data/spec/opal/stdlib/js_spec.rb +1 -1
  157. data/spec/opal/stdlib/native/hash_spec.rb +7 -0
  158. data/spec/opal/stdlib/promise/always_spec.rb +24 -5
  159. data/spec/opal/stdlib/promise/rescue_spec.rb +15 -6
  160. data/spec/opal/stdlib/promise/then_spec.rb +13 -5
  161. data/spec/opal/stdlib/promise/trace_spec.rb +5 -6
  162. data/spec/opal/stdlib/strscan/scan_spec.rb +1 -1
  163. data/spec/ruby_specs +122 -0
  164. data/spec/spec_helper.rb +3 -15
  165. data/stdlib/base64.rb +51 -121
  166. data/stdlib/bigdecimal.rb +231 -0
  167. data/stdlib/bigdecimal/bignumber.js.rb +11 -0
  168. data/stdlib/bigdecimal/kernel.rb +5 -0
  169. data/stdlib/date.rb +252 -10
  170. data/stdlib/native.rb +38 -38
  171. data/stdlib/nodejs/dir.rb +8 -6
  172. data/stdlib/nodejs/file.rb +28 -3
  173. data/stdlib/nodejs/node_modules/.bin/js-yaml +1 -0
  174. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +1 -0
  175. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +1 -0
  176. data/stdlib/nodejs/require.rb +1 -1
  177. data/stdlib/nodejs/yaml.rb +3 -2
  178. data/stdlib/opal-parser.rb +7 -2
  179. data/stdlib/pathname.rb +23 -1
  180. data/stdlib/phantomjs.rb +10 -0
  181. data/stdlib/promise.rb +38 -23
  182. data/tasks/building.rake +3 -3
  183. data/tasks/testing.rake +27 -14
  184. data/tasks/testing/mspec_special_calls.rb +1 -1
  185. data/tasks/testing/sprockets-phantomjs.js +4 -0
  186. data/test/opal/test_keyword.rb +110 -110
  187. data/test/opal/unsupported_and_bugs.rb +30 -0
  188. data/vendored-minitest/minitest/assertions.rb +1 -1
  189. metadata +65 -15
  190. data/.spectator +0 -2
  191. data/.spectator-mspec +0 -3
  192. data/opal/corelib/array/inheritance.rb +0 -127
  193. data/spec/rubyspecs +0 -139
@@ -52,9 +52,13 @@ class BasicObject
52
52
 
53
53
  string, file, _lineno = *args
54
54
  compiled = Opal.compile string, file: (file || '(eval)'), eval: true
55
- wrapper = `function() {return eval(compiled)}`
56
-
57
- block = Kernel.lambda { `wrapper.call(#{self})` }
55
+ block = Kernel.lambda do
56
+ %x{
57
+ return (function(self) {
58
+ return eval(compiled);
59
+ })(self)
60
+ }
61
+ end
58
62
  elsif args.size > 0
59
63
  Kernel.raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
60
64
  end
@@ -1,29 +1,23 @@
1
1
  require 'corelib/module'
2
2
 
3
3
  class Class
4
- def self.new(sup = Object, &block)
4
+ def self.new(superclass = Object, &block)
5
5
  %x{
6
- if (!sup.$$is_class) {
7
- #{raise TypeError, "superclass must be a Class"};
6
+ if (!superclass.$$is_class) {
7
+ throw Opal.TypeError.$new("superclass must be a Class");
8
8
  }
9
9
 
10
- function AnonClass(){};
11
- var klass = Opal.boot_class(sup, AnonClass)
12
- klass.$$name = nil;
13
- klass.$$parent = sup;
14
- klass.$$is_class = true;
10
+ var alloc = Opal.boot_class_alloc(null, function(){}, superclass)
11
+ var klass = Opal.setup_class_object(null, alloc, superclass.$$name, superclass.constructor);
15
12
 
16
- // inherit scope from parent
17
- Opal.create_scope(sup.$$scope, klass);
13
+ klass.$$super = superclass;
14
+ klass.$$parent = superclass;
18
15
 
19
- sup.$inherited(klass);
16
+ // inherit scope from parent
17
+ Opal.create_scope(superclass.$$scope, klass);
20
18
 
21
- if (block !== nil) {
22
- var block_self = block.$$s;
23
- block.$$s = null;
24
- block.call(klass);
25
- block.$$s = block_self;
26
- }
19
+ superclass.$inherited(klass);
20
+ Opal.module_initialize(klass, block);
27
21
 
28
22
  return klass;
29
23
  }
@@ -1,8 +1,8 @@
1
1
  RUBY_PLATFORM = 'opal'
2
2
  RUBY_ENGINE = 'opal'
3
3
  RUBY_VERSION = '2.2.3'
4
- RUBY_ENGINE_VERSION = '0.9.4'
5
- RUBY_RELEASE_DATE = '2016-06-21'
4
+ RUBY_ENGINE_VERSION = '0.10.0.beta1'
5
+ RUBY_RELEASE_DATE = '2015-12-20'
6
6
  RUBY_PATCHLEVEL = 0
7
7
  RUBY_REVISION = 0
8
8
  RUBY_COPYRIGHT = 'opal - Copyright (C) 2013-2015 Adam Beynon'
@@ -1,70 +1,54 @@
1
1
  module Enumerable
2
2
  def all?(&block)
3
- %x{
4
- var result = true;
3
+ result = true
5
4
 
6
- if (block !== nil) {
7
- self.$each.$$p = function() {
8
- var value = Opal.yieldX(block, arguments);
5
+ if block_given?
9
6
 
10
- if (value === $breaker) {
11
- result = $breaker.$v;
12
- return $breaker;
13
- }
7
+ each do |*value|
8
+ unless yield(*value)
9
+ result = false
10
+ break
11
+ end
12
+ end
14
13
 
15
- if (#{Opal.falsy?(`value`)}) {
16
- result = false;
17
- return $breaker;
18
- }
19
- };
20
- }
21
- else {
22
- self.$each.$$p = function(obj) {
23
- if (arguments.length == 1 && #{Opal.falsy?(`obj`)}) {
24
- result = false;
25
- return $breaker;
26
- }
27
- };
28
- }
14
+ else
29
15
 
30
- self.$each();
16
+ each do |*value|
17
+ unless Opal.destructure(value)
18
+ result = false
19
+ break
20
+ end
21
+ end
31
22
 
32
- return result;
33
- }
23
+ end
24
+
25
+ result
34
26
  end
35
27
 
36
28
  def any?(&block)
37
- %x{
38
- var result = false;
29
+ result = false
39
30
 
40
- if (block !== nil) {
41
- self.$each.$$p = function() {
42
- var value = Opal.yieldX(block, arguments);
31
+ if block_given?
43
32
 
44
- if (value === $breaker) {
45
- result = $breaker.$v;
46
- return $breaker;
47
- }
33
+ each do |*value|
34
+ if yield(*value)
35
+ result = true
36
+ break
37
+ end
38
+ end
48
39
 
49
- if (#{Opal.truthy?(`value`)}) {
50
- result = true;
51
- return $breaker;
52
- }
53
- };
54
- }
55
- else {
56
- self.$each.$$p = function(obj) {
57
- if (arguments.length != 1 || #{Opal.truthy?(`obj`)}) {
58
- result = true;
59
- return $breaker;
60
- }
61
- }
62
- }
40
+ else
63
41
 
64
- self.$each();
42
+ each do |*value|
43
+ if Opal.destructure(value)
44
+ result = true
45
+ break
46
+ end
47
+ end
65
48
 
66
- return result;
67
- }
49
+ end
50
+
51
+ result
68
52
  end
69
53
 
70
54
  def chunk(state = undefined, &original_block)
@@ -89,10 +73,6 @@ module Enumerable
89
73
  self.$each.$$p = function(value) {
90
74
  var key = Opal.yield1(block, value);
91
75
 
92
- if (key === $breaker) {
93
- return $breaker;
94
- }
95
-
96
76
  if (key === nil) {
97
77
  releaseAccumulate();
98
78
  accumulate = [];
@@ -125,11 +105,6 @@ module Enumerable
125
105
  self.$each.$$p = function() {
126
106
  var value = Opal.yieldX(block, arguments);
127
107
 
128
- if (value === $breaker) {
129
- result = $breaker.$v;
130
- return $breaker;
131
- }
132
-
133
108
  result.push(value);
134
109
  };
135
110
 
@@ -160,11 +135,6 @@ module Enumerable
160
135
  self.$each.$$p = function() {
161
136
  var value = Opal.yieldX(block, arguments);
162
137
 
163
- if (value === $breaker) {
164
- result = $breaker.$v;
165
- return $breaker;
166
- }
167
-
168
138
  if (#{Opal.truthy?(`value`)}) {
169
139
  result++;
170
140
  }
@@ -200,11 +170,6 @@ module Enumerable
200
170
  var param = #{Opal.destructure(`arguments`)},
201
171
  value = Opal.yield1(block, param);
202
172
 
203
- if (value === $breaker) {
204
- result = $breaker.$v;
205
- return $breaker;
206
- }
207
-
208
173
  all.push(param);
209
174
  }
210
175
 
@@ -222,10 +187,6 @@ module Enumerable
222
187
  while (true) {
223
188
  for (i = 0, length = all.length; i < length; i++) {
224
189
  value = Opal.yield1(block, all[i]);
225
-
226
- if (value === $breaker) {
227
- return $breaker.$v;
228
- }
229
190
  }
230
191
  }
231
192
  }
@@ -233,10 +194,6 @@ module Enumerable
233
194
  while (n > 1) {
234
195
  for (i = 0, length = all.length; i < length; i++) {
235
196
  value = Opal.yield1(block, all[i]);
236
-
237
- if (value === $breaker) {
238
- return $breaker.$v;
239
- }
240
197
  }
241
198
 
242
199
  n--;
@@ -247,27 +204,17 @@ module Enumerable
247
204
 
248
205
  def detect(ifnone = undefined, &block)
249
206
  return enum_for :detect, ifnone unless block_given?
207
+ result = `undefined`
250
208
 
251
- %x{
252
- var result;
253
-
254
- self.$each.$$p = function() {
255
- var params = #{Opal.destructure(`arguments`)},
256
- value = Opal.yield1(block, params);
257
-
258
- if (value === $breaker) {
259
- result = $breaker.$v;
260
- return $breaker;
261
- }
262
-
263
- if (#{Opal.truthy?(`value`)}) {
264
- result = params;
265
- return $breaker;
266
- }
267
- };
268
-
269
- self.$each();
209
+ each do |*args|
210
+ value = Opal.destructure(args)
211
+ if yield(value)
212
+ result = value
213
+ break
214
+ end
215
+ end
270
216
 
217
+ %x{
271
218
  if (result === undefined && ifnone !== undefined) {
272
219
  if (typeof(ifnone) === 'function') {
273
220
  result = ifnone();
@@ -319,11 +266,6 @@ module Enumerable
319
266
  if (dropping) {
320
267
  var value = Opal.yield1(block, param);
321
268
 
322
- if (value === $breaker) {
323
- result = $breaker.$v;
324
- return $breaker;
325
- }
326
-
327
269
  if (#{Opal.falsy?(`value`)}) {
328
270
  dropping = false;
329
271
  result.push(param);
@@ -374,12 +316,7 @@ module Enumerable
374
316
  buffer.shift();
375
317
  }
376
318
  if (buffer.length == n) {
377
- var value = Opal.yield1(block, buffer.slice(0, n));
378
-
379
- if (value == $breaker) {
380
- result = $breaker.$v;
381
- return $breaker;
382
- }
319
+ Opal.yield1(block, buffer.slice(0, n));
383
320
  }
384
321
  }
385
322
 
@@ -389,8 +326,22 @@ module Enumerable
389
326
  }
390
327
  end
391
328
 
392
- def each_entry(&block)
393
- raise NotImplementedError
329
+ def each_entry(*data, &block)
330
+ unless block_given?
331
+ return to_enum(:each_entry, *data) { enumerator_size }
332
+ end
333
+
334
+ %x{
335
+ self.$each.$$p = function() {
336
+ var item = #{Opal.destructure(`arguments`)};
337
+
338
+ Opal.yield1(block, item);
339
+ }
340
+
341
+ self.$each.apply(self, data);
342
+
343
+ return self;
344
+ }
394
345
  end
395
346
 
396
347
  def each_slice(n, &block)
@@ -412,11 +363,7 @@ module Enumerable
412
363
  slice.push(param);
413
364
 
414
365
  if (slice.length === n) {
415
- if (Opal.yield1(block, slice) === $breaker) {
416
- result = $breaker.$v;
417
- return $breaker;
418
- }
419
-
366
+ Opal.yield1(block, slice);
420
367
  slice = [];
421
368
  }
422
369
  };
@@ -429,9 +376,7 @@ module Enumerable
429
376
 
430
377
  // our "last" group, if smaller than n then won't have been yielded
431
378
  if (slice.length > 0) {
432
- if (Opal.yield1(block, slice) === $breaker) {
433
- return $breaker.$v;
434
- }
379
+ Opal.yield1(block, slice);
435
380
  }
436
381
  }
437
382
 
@@ -446,13 +391,9 @@ module Enumerable
446
391
  index = 0;
447
392
 
448
393
  self.$each.$$p = function() {
449
- var param = #{Opal.destructure(`arguments`)},
450
- value = block(param, index);
394
+ var param = #{Opal.destructure(`arguments`)};
451
395
 
452
- if (value === $breaker) {
453
- result = $breaker.$v;
454
- return $breaker;
455
- }
396
+ block(param, index);
456
397
 
457
398
  index++;
458
399
  };
@@ -474,13 +415,9 @@ module Enumerable
474
415
  var result;
475
416
 
476
417
  self.$each.$$p = function() {
477
- var param = #{Opal.destructure(`arguments`)},
478
- value = block(param, object);
418
+ var param = #{Opal.destructure(`arguments`)};
479
419
 
480
- if (value === $breaker) {
481
- result = $breaker.$v;
482
- return $breaker;
483
- }
420
+ block(param, object);
484
421
  };
485
422
 
486
423
  self.$each();
@@ -519,11 +456,6 @@ module Enumerable
519
456
  var param = #{Opal.destructure(`arguments`)},
520
457
  value = Opal.yield1(block, param);
521
458
 
522
- if (value === $breaker) {
523
- result = $breaker.$v;
524
- return $breaker;
525
- }
526
-
527
459
  if (#{Opal.truthy?(`value`)}) {
528
460
  result.push(param);
529
461
  }
@@ -538,59 +470,39 @@ module Enumerable
538
470
  def find_index(object = undefined, &block)
539
471
  return enum_for :find_index if `object === undefined && block === nil`
540
472
 
541
- %x{
542
- var result = nil,
543
- index = 0;
544
-
545
- if (object != null) {
546
- self.$each.$$p = function() {
547
- var param = #{Opal.destructure(`arguments`)};
548
-
549
- if (#{`param` == `object`}) {
550
- result = index;
551
- return $breaker;
552
- }
553
-
554
- index += 1;
555
- };
556
- }
557
- else if (block !== nil) {
558
- self.$each.$$p = function() {
559
- var value = Opal.yieldX(block, arguments);
560
-
561
- if (value === $breaker) {
562
- result = $breaker.$v;
563
- return $breaker;
564
- }
473
+ result = nil
474
+ index = 0
565
475
 
566
- if (#{Opal.truthy?(`value`)}) {
567
- result = index;
568
- return $breaker;
569
- }
476
+ if `object != null`
477
+ each do |*value|
478
+ if Opal.destructure(value) == object
479
+ result = index
480
+ break
481
+ end
570
482
 
571
- index += 1;
572
- };
573
- }
483
+ `index += 1`
484
+ end
485
+ else
486
+ each do |*value|
487
+ if yield(*value)
488
+ result = index
489
+ break
490
+ end
574
491
 
575
- self.$each();
492
+ `index += 1`
493
+ end
494
+ end
576
495
 
577
- return result;
578
- }
496
+ result
579
497
  end
580
498
 
581
499
  def first(number = undefined)
582
500
  if `number === undefined`
583
501
  result = nil
584
-
585
- %x{
586
- self.$each.$$p = function() {
587
- result = #{Opal.destructure(`arguments`)};
588
-
589
- return $breaker;
590
- };
591
-
592
- self.$each();
593
- }
502
+ each do |value|
503
+ result = value
504
+ break
505
+ end
594
506
  else
595
507
  result = []
596
508
  number = Opal.coerce_to number, Integer, :to_int
@@ -603,20 +515,15 @@ module Enumerable
603
515
  return []
604
516
  end
605
517
 
606
- %x{
607
- var current = 0;
608
- number = #{Opal.coerce_to number, Integer, :to_int};
518
+ current = 0
609
519
 
610
- self.$each.$$p = function() {
611
- result.push(#{Opal.destructure(`arguments`)});
520
+ each do |*args|
521
+ `result.push(#{Opal.destructure(args)})`
612
522
 
613
- if (number <= ++current) {
614
- return $breaker;
615
- }
616
- };
617
-
618
- self.$each();
619
- }
523
+ if `number <= ++current`
524
+ break
525
+ end
526
+ end
620
527
  end
621
528
 
622
529
  result
@@ -636,11 +543,6 @@ module Enumerable
636
543
  if (#{Opal.truthy?(`value`)}) {
637
544
  value = Opal.yield1(block, param);
638
545
 
639
- if (value === $breaker) {
640
- result = $breaker.$v;
641
- return $breaker;
642
- }
643
-
644
546
  result.push(value);
645
547
  }
646
548
  };
@@ -674,11 +576,6 @@ module Enumerable
674
576
  var param = #{Opal.destructure(`arguments`)},
675
577
  value = Opal.yield1(block, param);
676
578
 
677
- if (value === $breaker) {
678
- result = $breaker.$v;
679
- return $breaker;
680
- }
681
-
682
579
  #{(hash[`value`] ||= []) << `param`};
683
580
  }
684
581
 
@@ -693,22 +590,15 @@ module Enumerable
693
590
  end
694
591
 
695
592
  def include?(obj)
696
- %x{
697
- var result = false;
698
-
699
- self.$each.$$p = function() {
700
- var param = #{Opal.destructure(`arguments`)};
701
-
702
- if (#{`param` == obj}) {
703
- result = true;
704
- return $breaker;
705
- }
706
- }
707
-
708
- self.$each();
593
+ result = false
594
+ each do |*args|
595
+ if Opal.destructure(args) == obj
596
+ result = true
597
+ break
598
+ end
599
+ end
709
600
 
710
- return result;
711
- }
601
+ result
712
602
  end
713
603
 
714
604
  def inject(object = undefined, sym = undefined, &block)
@@ -726,11 +616,6 @@ module Enumerable
726
616
 
727
617
  value = Opal.yieldX(block, [result, value]);
728
618
 
729
- if (value === $breaker) {
730
- result = $breaker.$v;
731
- return $breaker;
732
- }
733
-
734
619
  result = value;
735
620
  };
736
621
  }
@@ -774,24 +659,23 @@ module Enumerable
774
659
 
775
660
  alias map collect
776
661
 
777
- def max(&block)
662
+ def max(n = undefined, &block)
778
663
  %x{
779
- var result;
664
+ if (n === undefined || n === nil) {
665
+ var result, value;
780
666
 
781
- if (block !== nil) {
782
667
  self.$each.$$p = function() {
783
- var param = #{Opal.destructure(`arguments`)};
668
+ var item = #{Opal.destructure(`arguments`)};
784
669
 
785
670
  if (result === undefined) {
786
- result = param;
671
+ result = item;
787
672
  return;
788
673
  }
789
674
 
790
- var value = block(param, result);
791
-
792
- if (value === $breaker) {
793
- result = $breaker.$v;
794
- return $breaker;
675
+ if (block !== nil) {
676
+ value = Opal.yieldX(block, [item, result]);
677
+ } else {
678
+ value = #{`item` <=> `result`};
795
679
  }
796
680
 
797
681
  if (value === nil) {
@@ -799,29 +683,23 @@ module Enumerable
799
683
  }
800
684
 
801
685
  if (value > 0) {
802
- result = param;
686
+ result = item;
803
687
  }
804
- };
805
- }
806
- else {
807
- self.$each.$$p = function() {
808
- var param = #{Opal.destructure(`arguments`)};
688
+ }
809
689
 
810
- if (result === undefined) {
811
- result = param;
812
- return;
813
- }
690
+ self.$each();
814
691
 
815
- if (#{Opal.compare(`param`, `result`)} > 0) {
816
- result = param;
817
- }
818
- };
692
+ if (result === undefined) {
693
+ return nil;
694
+ } else {
695
+ return result;
696
+ }
819
697
  }
698
+ }
820
699
 
821
- self.$each();
700
+ n = Opal.coerce_to(n, Integer, :to_int)
822
701
 
823
- return result === undefined ? nil : result;
824
- }
702
+ sort(&block).reverse.first(n)
825
703
  end
826
704
 
827
705
  def max_by(&block)
@@ -841,11 +719,6 @@ module Enumerable
841
719
  return;
842
720
  }
843
721
 
844
- if (value === $breaker) {
845
- result = $breaker.$v;
846
- return $breaker;
847
- }
848
-
849
722
  if (#{`value` <=> `by`} > 0) {
850
723
  result = param
851
724
  by = value;
@@ -875,11 +748,6 @@ module Enumerable
875
748
 
876
749
  var value = block(param, result);
877
750
 
878
- if (value === $breaker) {
879
- result = $breaker.$v;
880
- return $breaker;
881
- }
882
-
883
751
  if (value === nil) {
884
752
  #{raise ArgumentError, "comparison failed"};
885
753
  }
@@ -927,11 +795,6 @@ module Enumerable
927
795
  return;
928
796
  }
929
797
 
930
- if (value === $breaker) {
931
- result = $breaker.$v;
932
- return $breaker;
933
- }
934
-
935
798
  if (#{`value` <=> `by`} < 0) {
936
799
  result = param
937
800
  by = value;
@@ -985,83 +848,63 @@ module Enumerable
985
848
  end
986
849
 
987
850
  def none?(&block)
988
- %x{
989
- var result = true;
851
+ result = true
990
852
 
991
- if (block !== nil) {
992
- self.$each.$$p = function() {
993
- var value = Opal.yieldX(block, arguments);
853
+ if block_given?
994
854
 
995
- if (value === $breaker) {
996
- result = $breaker.$v;
997
- return $breaker;
998
- }
855
+ each do |*value|
856
+ if yield(*value)
857
+ result = false
858
+ break
859
+ end
860
+ end
999
861
 
1000
- if (#{Opal.truthy?(`value`)}) {
1001
- result = false;
1002
- return $breaker;
1003
- }
1004
- }
1005
- }
1006
- else {
1007
- self.$each.$$p = function() {
1008
- var value = #{Opal.destructure(`arguments`)};
862
+ else
1009
863
 
1010
- if (#{Opal.truthy?(`value`)}) {
1011
- result = false;
1012
- return $breaker;
1013
- }
1014
- };
1015
- }
864
+ each do |*value|
865
+ if Opal.destructure(value)
866
+ result = false
867
+ break
868
+ end
869
+ end
1016
870
 
1017
- self.$each();
871
+ end
1018
872
 
1019
- return result;
1020
- }
873
+ result
1021
874
  end
1022
875
 
1023
876
  def one?(&block)
1024
- %x{
1025
- var result = false;
877
+ result = false
1026
878
 
1027
- if (block !== nil) {
1028
- self.$each.$$p = function() {
1029
- var value = Opal.yieldX(block, arguments);
879
+ if block_given?
1030
880
 
1031
- if (value === $breaker) {
1032
- result = $breaker.$v;
1033
- return $breaker;
1034
- }
881
+ each do |*value|
882
+ if yield(*value)
883
+ if result
884
+ result = false
885
+ break
886
+ end
1035
887
 
1036
- if (#{Opal.truthy?(`value`)}) {
1037
- if (result === true) {
1038
- result = false;
1039
- return $breaker;
1040
- }
888
+ result = true
889
+ end
890
+ end
1041
891
 
1042
- result = true;
1043
- }
1044
- }
1045
- }
1046
- else {
1047
- self.$each.$$p = function() {
1048
- var value = #{Opal.destructure(`arguments`)};
892
+ else
1049
893
 
1050
- if (#{Opal.truthy?(`value`)}) {
1051
- if (result === true) {
1052
- result = false;
1053
- return $breaker;
1054
- }
894
+ each do |*value|
895
+ if Opal.destructure(value)
896
+ if result
897
+ result = false
898
+ break
899
+ end
1055
900
 
1056
- result = true;
1057
- }
1058
- }
1059
- }
901
+ result = true
902
+ end
903
+ end
1060
904
 
1061
- self.$each();
905
+ end
1062
906
 
1063
- return result;
1064
- }
907
+ result
1065
908
  end
1066
909
 
1067
910
  def partition(&block)
@@ -1074,11 +917,6 @@ module Enumerable
1074
917
  var param = #{Opal.destructure(`arguments`)},
1075
918
  value = Opal.yield1(block, param);
1076
919
 
1077
- if (value === $breaker) {
1078
- result = $breaker.$v;
1079
- return $breaker;
1080
- }
1081
-
1082
920
  if (#{Opal.truthy?(`value`)}) {
1083
921
  truthy.push(param);
1084
922
  }
@@ -1105,11 +943,6 @@ module Enumerable
1105
943
  var param = #{Opal.destructure(`arguments`)},
1106
944
  value = Opal.yield1(block, param);
1107
945
 
1108
- if (value === $breaker) {
1109
- result = $breaker.$v;
1110
- return $breaker;
1111
- }
1112
-
1113
946
  if (#{Opal.falsy?(`value`)}) {
1114
947
  result.push(param);
1115
948
  }
@@ -1206,7 +1039,7 @@ module Enumerable
1206
1039
  def sort(&block)
1207
1040
  ary = to_a
1208
1041
  block = -> a,b {a <=> b} unless block_given?
1209
- return `ary.sort(block)`
1042
+ return ary.sort(&block)
1210
1043
  end
1211
1044
 
1212
1045
  def sort_by(&block)
@@ -1214,7 +1047,7 @@ module Enumerable
1214
1047
 
1215
1048
  dup = map {
1216
1049
  arg = Opal.destructure(`arguments`)
1217
- [block.call(arg), arg]
1050
+ [yield(arg), arg]
1218
1051
  }
1219
1052
  dup.sort! { |a, b| `a[0]` <=> `b[0]` }
1220
1053
  dup.map! { |i| `i[1]` }
@@ -1227,29 +1060,19 @@ module Enumerable
1227
1060
  def take_while(&block)
1228
1061
  return enum_for :take_while unless block
1229
1062
 
1230
- %x{
1231
- var result = [];
1063
+ result = []
1232
1064
 
1233
- self.$each.$$p = function() {
1234
- var param = #{Opal.destructure(`arguments`)},
1235
- value = Opal.yield1(block, param);
1065
+ each do |*args|
1066
+ value = Opal.destructure(args)
1236
1067
 
1237
- if (value === $breaker) {
1238
- result = $breaker.$v;
1239
- return $breaker;
1240
- }
1241
-
1242
- if (#{Opal.falsy?(`value`)}) {
1243
- return $breaker;
1244
- }
1245
-
1246
- result.push(param);
1247
- };
1068
+ unless yield(value)
1069
+ break
1070
+ end
1248
1071
 
1249
- self.$each();
1072
+ `result.push(value)`
1073
+ end
1250
1074
 
1251
- return result;
1252
- }
1075
+ result
1253
1076
  end
1254
1077
 
1255
1078
  alias to_a entries