opal 1.8.0 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea935af6a628e09fb047d39c25422f717a4a4b9ef442fe7ec06183134b3163a1
4
- data.tar.gz: d539d6a55c69651064a272a6110498bdba7d2146fa08704f4e759ee7693c28b2
3
+ metadata.gz: 8af8b2b4d485065e48d45e66e00075cf3b2f3d58c358355f5cbf5c97c46cd607
4
+ data.tar.gz: 87b7e4d8443eeb45953d48ca6ebb321b27269d9e7bbe2c4770c5189bcd44bcf9
5
5
  SHA512:
6
- metadata.gz: 603568ce7472d94e52edc2b4862a5cadb72313e8e1f344c723655a7a691b09cbde1d208e30935a68a2a78c59fa073724d66b24ef7cf56cf69eb8567b9aa851f4
7
- data.tar.gz: 7ea6135b1f97d50584259706244705273b429d1eff03c44742f7c165b6caec782a06d33ac209f94545ec2c4f8665c1992367aebbf5699052fc62163414c99e1d
6
+ metadata.gz: 615891333955fa65566ccad7f18d7a2a65905076db6268775bb5e9f06604b56e4ebfcb8fc05d181353c1bcfbba64c195c2eb4f71b37f805e9f7984f990e56a41
7
+ data.tar.gz: 1566eb09bf04acbcb49c7386ab9259cd13f8d94810e9dfecadf109b57ad2eaf479d1df419359a4a776b11aba2c7cc97d7df761c9ade46a2b8512d2718503ab69
data/CHANGELOG.md CHANGED
@@ -16,6 +16,38 @@ Changes are grouped as follows:
16
16
 
17
17
 
18
18
 
19
+ ## [1.8.1](https://github.com/opal/opal/compare/v1.8.0...v1.8.1) - 2023-11-09
20
+
21
+
22
+ <!--
23
+ ### Internal
24
+ ### Changed
25
+ ### Added
26
+ ### Removed
27
+ ### Deprecated
28
+ ### Performance
29
+ ### Fixed
30
+ -->
31
+
32
+
33
+ ### Fixed
34
+
35
+ - `Array` methods should handle elements inserted during the iteration ([#2602](https://github.com/opal/opal/pull/2602))
36
+ - Assign correct values to duplicated underscore parameters ([#2606](https://github.com/opal/opal/pull/2606))
37
+
38
+
39
+ ### Added
40
+
41
+ - Support an `IO` argument of `Kernel.printf` ([#2605](https://github.com/opal/opal/pull/2605))
42
+
43
+
44
+ ### Performance
45
+
46
+ - Fix a performance regression introduced by freezing support ([#2609](https://github.com/opal/opal/pull/2609))
47
+
48
+
49
+
50
+
19
51
  ## [1.8.0](https://github.com/opal/opal/compare/v1.7.4...v1.8.0) - 2023-10-26
20
52
 
21
53
 
@@ -10,25 +10,28 @@ module Opal
10
10
 
11
11
  def to_code
12
12
  stringified_parameters = @args.map do |arg|
13
- public_send(:"on_#{arg.type}", *arg)
13
+ public_send(:"on_#{arg.type}", arg)
14
14
  end
15
15
 
16
16
  "[#{stringified_parameters.compact.join(', ')}]"
17
17
  end
18
18
 
19
- def on_arg(arg_name)
19
+ def on_arg(arg)
20
+ arg_name = arg.meta[:arg_name]
20
21
  %{['req', '#{arg_name}']}
21
22
  end
22
23
 
23
- def on_mlhs(*)
24
+ def on_mlhs(_arg)
24
25
  %{['req']}
25
26
  end
26
27
 
27
- def on_optarg(arg_name, _default_value)
28
+ def on_optarg(arg)
29
+ arg_name = arg.meta[:arg_name]
28
30
  %{['opt', '#{arg_name}']}
29
31
  end
30
32
 
31
- def on_restarg(arg_name = nil)
33
+ def on_restarg(arg)
34
+ arg_name = arg.meta[:arg_name]
32
35
  if arg_name
33
36
  arg_name = :* if arg_name == :fwd_rest_arg
34
37
  %{['rest', '#{arg_name}']}
@@ -37,15 +40,18 @@ module Opal
37
40
  end
38
41
  end
39
42
 
40
- def on_kwarg(arg_name)
43
+ def on_kwarg(arg)
44
+ arg_name = arg.meta[:arg_name]
41
45
  %{['keyreq', '#{arg_name}']}
42
46
  end
43
47
 
44
- def on_kwoptarg(arg_name, _default_value)
48
+ def on_kwoptarg(arg)
49
+ arg_name = arg.meta[:arg_name]
45
50
  %{['key', '#{arg_name}']}
46
51
  end
47
52
 
48
- def on_kwrestarg(arg_name = nil)
53
+ def on_kwrestarg(arg)
54
+ arg_name = arg.meta[:arg_name]
49
55
  if arg_name
50
56
  %{['keyrest', '#{arg_name}']}
51
57
  else
@@ -53,16 +59,17 @@ module Opal
53
59
  end
54
60
  end
55
61
 
56
- def on_blockarg(arg_name)
62
+ def on_blockarg(arg)
63
+ arg_name = arg.meta[:arg_name]
57
64
  arg_name = :& if arg_name == :fwd_block_arg
58
65
  %{['block', '#{arg_name}']}
59
66
  end
60
67
 
61
- def on_kwnilarg
68
+ def on_kwnilarg(_arg)
62
69
  %{['nokey']}
63
70
  end
64
71
 
65
- def on_shadowarg(_arg_name); end
72
+ def on_shadowarg(_arg); end
66
73
  end
67
74
  end
68
75
  end
@@ -25,40 +25,12 @@ module Opal
25
25
  class ArgsNode < Base
26
26
  handle :args
27
27
 
28
- # ruby allows for args with the same name, if the arg starts with a '_', like:
29
- # def funny_method_name(_, _)
30
- # puts _
31
- # end
32
- # but javascript in strict mode does not allow for args with the same name
33
- # ruby assigns the value of the first arg given
34
- # funny_method_name(1, 2) => 1
35
- # 1. check for args starting with '_' and check if they appear multiple times
36
- # 2. leave the first appearance as it is and rename the other ones
37
- # compiler result:
38
- # function $$funny_method_name(_, __$2)
39
-
40
28
  def compile
41
- same_arg_counter = {}
42
29
  children.each_with_index do |arg, idx|
43
- if multiple_underscore?(arg)
44
- same_arg_counter[arg] ||= 0
45
- same_arg_counter[arg] += 1
46
- if same_arg_counter[arg] > 1
47
- arg = s(arg.type, :"#{arg.children[0]}_$#{same_arg_counter[arg]}")
48
- end
49
- end
50
-
51
30
  push ', ' if idx != 0
52
31
  push process(arg)
53
32
  end
54
33
  end
55
-
56
- def multiple_underscore?(arg)
57
- arg.type == :arg &&
58
- arg.children.count == 1 &&
59
- arg.children.first.to_s.start_with?('_') &&
60
- children.count(arg) > 1
61
- end
62
34
  end
63
35
  end
64
36
  end
@@ -176,7 +176,6 @@ module Opal
176
176
  def implicit_arglist
177
177
  args = []
178
178
  kwargs = []
179
- same_arg_counter = Hash.new(0)
180
179
 
181
180
  def_scope.original_args.children.each do |sexp|
182
181
  lvar_name = sexp.children[0]
@@ -184,14 +183,6 @@ module Opal
184
183
  case sexp.type
185
184
  when :arg, :optarg
186
185
  arg_node = s(:lvar, lvar_name)
187
- # def m(_, _)
188
- # is compiled to
189
- # function $$m(_, __$2)
190
- # See Opal::Node::ArgsNode
191
- if lvar_name[0] == '_'
192
- same_arg_counter[lvar_name] += 1
193
- arg_node = s(:js_tmp, "#{lvar_name}_$#{same_arg_counter[lvar_name]}") if same_arg_counter[lvar_name] > 1
194
- end
195
186
  args << arg_node
196
187
  when :restarg
197
188
  arg_node = lvar_name ? s(:lvar, lvar_name) : s(:js_tmp, '$rest_arg')
data/lib/opal/rewriter.rb CHANGED
@@ -11,6 +11,7 @@ require 'opal/rewriters/logical_operator_assignment'
11
11
  require 'opal/rewriters/binary_operator_assignment'
12
12
  require 'opal/rewriters/hashes/key_duplicates_rewriter'
13
13
  require 'opal/rewriters/dump_args'
14
+ require 'opal/rewriters/deduplicate_arg_name'
14
15
  require 'opal/rewriters/mlhs_args'
15
16
  require 'opal/rewriters/inline_args'
16
17
  require 'opal/rewriters/numblocks'
@@ -66,6 +67,7 @@ module Opal
66
67
  use Rewriters::BinaryOperatorAssignment
67
68
  use Rewriters::Hashes::KeyDuplicatesRewriter
68
69
  use Rewriters::ReturnableLogic
70
+ use Rewriters::DeduplicateArgName
69
71
  use Rewriters::DumpArgs
70
72
  use Rewriters::MlhsArgs
71
73
  use Rewriters::InlineArgs
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Opal
4
+ module Rewriters
5
+ # Ruby allows for args with the same name, if the arg starts with a '_', like:
6
+ # def funny_method_name(_, _)
7
+ # puts _
8
+ # end
9
+ # but JavaScript in strict mode does not allow for args with the same name
10
+ # Ruby assigns the value of the first arg given
11
+ # funny_method_name(1, 2) => 1
12
+ # leave the first appearance as it is and rename the other ones
13
+ # compiler result:
14
+ # function $$funny_method_name(_, __$2)
15
+ class DeduplicateArgName < Base
16
+ def on_args(node)
17
+ @arg_name_count = Hash.new(0)
18
+
19
+ children = node.children.map do |arg|
20
+ rename_arg(arg)
21
+ end
22
+
23
+ super(node.updated(nil, children))
24
+ end
25
+
26
+ def rename_arg(arg)
27
+ case arg.type
28
+ when :arg, :restarg, :kwarg, :kwrestarg, :blockarg
29
+ name = arg.children[0]
30
+ name ? arg.updated(nil, [unique_name(name)]) : arg
31
+ when :optarg, :kwoptarg
32
+ name, value = arg.children
33
+ arg.updated(nil, [unique_name(name), value])
34
+ when :mlhs
35
+ new_children = arg.children.map { |child| rename_arg(child) }
36
+ arg.updated(nil, new_children)
37
+ else
38
+ arg
39
+ end
40
+ end
41
+
42
+ def unique_name(name)
43
+ count = (@arg_name_count[name] += 1)
44
+ count > 1 ? :"#{name}_$#{count}" : name
45
+ end
46
+ end
47
+ end
48
+ end
@@ -91,7 +91,6 @@ module Opal
91
91
  @initialization = []
92
92
 
93
93
  @type = type
94
- @underscore_found = false
95
94
 
96
95
  STEPS.each do |step|
97
96
  send(step)
@@ -120,20 +119,9 @@ module Opal
120
119
  @args.args.each do |arg|
121
120
  if @type == :iter
122
121
  # block args are not required,
123
- # so we neeed to tell compiler that required args
122
+ # so we need to tell compiler that required args
124
123
  # must be initialized with nil-s
125
124
  @initialization << arg.updated(:initialize_iter_arg)
126
-
127
- if arg.children[0] == :_
128
- if @underscore_found
129
- # for proc { |_, _| _ }.call(1, 2) result must be 1
130
- # here we convert all underscore args starting from the 2nd
131
- # to a "fake" arg
132
- arg = s(:fake_arg)
133
- end
134
-
135
- @underscore_found = true
136
- end
137
125
  else
138
126
  # required inline def argument like 'def m(req)'
139
127
  # no initialization is required
data/lib/opal/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  module Opal
4
4
  # WHEN RELEASING:
5
5
  # Remember to update RUBY_ENGINE_VERSION in opal/corelib/constants.rb too!
6
- VERSION = '1.8.0'
6
+ VERSION = '1.8.1'
7
7
  end
@@ -47,7 +47,7 @@ class ::Array < `Array`
47
47
  function filterIf(self, filter, block) {
48
48
  var value, raised = null, updated = new Array(self.length);
49
49
 
50
- for (var i = 0, i2 = 0, length = self.length; i < length; i++) {
50
+ for (var i = 0, i2 = 0; i < self.length; i++) {
51
51
  if (!raised) {
52
52
  try {
53
53
  value = $yield1(block, self[i])
@@ -708,10 +708,9 @@ class ::Array < `Array`
708
708
  return enum_for(:collect) { size } unless block_given?
709
709
 
710
710
  %x{
711
- var length = self.length;
712
- var result = new Array(length);
711
+ var result = [];
713
712
 
714
- for (var i = 0; i < length; i++) {
713
+ for (var i = 0; i < self.length; i++) {
715
714
  var value = $yield1(block, self[i]);
716
715
  result[i] = value;
717
716
  }
@@ -726,7 +725,7 @@ class ::Array < `Array`
726
725
  %x{
727
726
  $deny_frozen_access(self);
728
727
 
729
- for (var i = 0, length = self.length; i < length; i++) {
728
+ for (var i = 0; i < self.length; i++) {
730
729
  var value = $yield1(block, self[i]);
731
730
  self[i] = value;
732
731
  }
@@ -988,8 +987,8 @@ class ::Array < `Array`
988
987
  return enum_for(:each) { size } unless block_given?
989
988
 
990
989
  %x{
991
- for (var i = 0, length = self.length; i < length; i++) {
992
- var value = $yield1(block, self[i]);
990
+ for (var i = 0; i < self.length; i++) {
991
+ $yield1(block, self[i]);
993
992
  }
994
993
  }
995
994
 
@@ -1000,8 +999,8 @@ class ::Array < `Array`
1000
999
  return enum_for(:each_index) { size } unless block_given?
1001
1000
 
1002
1001
  %x{
1003
- for (var i = 0, length = self.length; i < length; i++) {
1004
- var value = $yield1(block, i);
1002
+ for (var i = 0; i < self.length; i++) {
1003
+ $yield1(block, i);
1005
1004
  }
1006
1005
  }
1007
1006
 
@@ -1348,7 +1347,7 @@ class ::Array < `Array`
1348
1347
  }
1349
1348
  }
1350
1349
  else if (block !== nil) {
1351
- for (i = 0, length = self.length; i < length; i++) {
1350
+ for (i = 0; i < self.length; i++) {
1352
1351
  value = block(self[i]);
1353
1352
 
1354
1353
  if (value !== false && value !== nil) {
@@ -1789,7 +1788,7 @@ class ::Array < `Array`
1789
1788
  %x{
1790
1789
  var result = [];
1791
1790
 
1792
- for (var i = 0, length = self.length, value; i < length; i++) {
1791
+ for (var i = 0, value; i < self.length; i++) {
1793
1792
  value = block(self[i]);
1794
1793
 
1795
1794
  if (value === false || value === nil) {
@@ -1839,7 +1838,11 @@ class ::Array < `Array`
1839
1838
  def reverse_each(&block)
1840
1839
  return enum_for(:reverse_each) { size } unless block_given?
1841
1840
 
1842
- reverse.each(&block)
1841
+ %x{
1842
+ for (var i = self.length - 1; i >= 0; i--) {
1843
+ $yield1(block, self[i]);
1844
+ }
1845
+ }
1843
1846
  self
1844
1847
  end
1845
1848
 
@@ -2048,7 +2051,7 @@ class ::Array < `Array`
2048
2051
  %x{
2049
2052
  var result = [];
2050
2053
 
2051
- for (var i = 0, length = self.length, item, value; i < length; i++) {
2054
+ for (var i = 0, item, value; i < self.length; i++) {
2052
2055
  item = self[i];
2053
2056
 
2054
2057
  value = $yield1(block, item);
@@ -2293,7 +2296,7 @@ class ::Array < `Array`
2293
2296
  %x{
2294
2297
  var result = [];
2295
2298
 
2296
- for (var i = 0, length = self.length, item, value; i < length; i++) {
2299
+ for (var i = 0, item, value; i < self.length; i++) {
2297
2300
  item = self[i];
2298
2301
 
2299
2302
  value = block(item);
@@ -2389,7 +2392,7 @@ class ::Array < `Array`
2389
2392
  }
2390
2393
  }
2391
2394
  else {
2392
- for (i = 0, length = self.length; i < length; i++) {
2395
+ for (i = 0; i < self.length; i++) {
2393
2396
  item = self[i];
2394
2397
  key = $yield1(block, item);
2395
2398
  if ($hash_get(hash, key) === undefined) {
@@ -2406,23 +2409,24 @@ class ::Array < `Array`
2406
2409
  %x{
2407
2410
  $deny_frozen_access(self);
2408
2411
 
2409
- var original_length = self.length, hash = #{{}}, i, length, item, key;
2412
+ var hash = #{{}}, i, item, key, delete_indexes = [];
2410
2413
 
2411
- for (i = 0, length = original_length; i < length; i++) {
2414
+ for (i = 0; i < self.length; i++) {
2412
2415
  item = self[i];
2413
2416
  key = (block === nil ? item : $yield1(block, item));
2414
2417
 
2415
2418
  if ($hash_get(hash, key) === undefined) {
2416
2419
  $hash_put(hash, key, item);
2417
- continue;
2420
+ } else {
2421
+ delete_indexes.push(i);
2418
2422
  }
2423
+ }
2419
2424
 
2420
- self.splice(i, 1);
2421
- length--;
2422
- i--;
2425
+ for (i = delete_indexes.length - 1; i >= 0; i--) {
2426
+ self.splice(delete_indexes[i], 1);
2423
2427
  }
2424
2428
 
2425
- return self.length === original_length ? nil : self;
2429
+ return delete_indexes.length === 0 ? nil : self;
2426
2430
  }
2427
2431
  end
2428
2432
 
@@ -1,8 +1,8 @@
1
1
  ::RUBY_PLATFORM = 'opal'
2
2
  ::RUBY_ENGINE = 'opal'
3
3
  ::RUBY_VERSION = '3.2.0'
4
- ::RUBY_ENGINE_VERSION = '1.8.0'
5
- ::RUBY_RELEASE_DATE = '2023-10-26'
4
+ ::RUBY_ENGINE_VERSION = '1.8.1'
5
+ ::RUBY_RELEASE_DATE = '2023-11-09'
6
6
  ::RUBY_PATCHLEVEL = 0
7
7
  ::RUBY_REVISION = '0'
8
8
  ::RUBY_COPYRIGHT = 'opal - Copyright (C) 2011-2023 Adam Beynon and the Opal contributors'
@@ -1,4 +1,4 @@
1
- # helpers: truthy, coerce_to, respond_to, Opal, deny_frozen_access, freeze, freeze_props, jsid
1
+ # helpers: truthy, coerce_to, respond_to, Opal, deny_frozen_access, freeze, freeze_props, jsid, each_ivar
2
2
  # use_strict: true
3
3
  # backtick_javascript: true
4
4
 
@@ -369,18 +369,14 @@ module ::Kernel
369
369
 
370
370
  def instance_variables
371
371
  %x{
372
- var result = [], ivar;
372
+ var result = [], name;
373
373
 
374
- for (var name in self) {
375
- if (self.hasOwnProperty(name) && name.charAt(0) !== '$') {
376
- if (name.substr(-1) === '$') {
377
- ivar = name.slice(0, name.length - 1);
378
- } else {
379
- ivar = name;
380
- }
381
- result.push('@' + ivar);
374
+ $each_ivar(self, function(name) {
375
+ if (name.substr(-1) === '$') {
376
+ name = name.slice(0, name.length - 1);
382
377
  }
383
- }
378
+ result.push('@' + name);
379
+ });
384
380
 
385
381
  return result;
386
382
  }
@@ -610,9 +606,10 @@ module ::Kernel
610
606
  end
611
607
 
612
608
  def printf(*args)
613
- if args.any?
614
- print format(*args)
615
- end
609
+ return if args.empty?
610
+
611
+ io = `args[0].$$is_string` ? $stdout : args.shift
612
+ io.write format(*args)
616
613
 
617
614
  nil
618
615
  end
@@ -1,4 +1,4 @@
1
- # helpers: truthy, coerce_to, const_set, Object, return_ivar, assign_ivar, ivar, deny_frozen_access, freeze, prop, jsid
1
+ # helpers: truthy, coerce_to, const_set, Object, return_ivar, assign_ivar, ivar, deny_frozen_access, freeze, prop, jsid, each_ivar
2
2
  # backtick_javascript: true
3
3
 
4
4
  class ::Module
@@ -744,11 +744,11 @@ class ::Module
744
744
  %x{
745
745
  var result = [];
746
746
 
747
- for (var name in self) {
748
- if (self.hasOwnProperty(name) && name.charAt(0) !== '$' && name !== 'constructor' && !#{consts.include?(`name`)}) {
747
+ $each_ivar(self, function(name) {
748
+ if (name !== 'constructor' && !#{consts.include?(`name`)}) {
749
749
  result.push('@' + name);
750
750
  }
751
- }
751
+ });
752
752
 
753
753
  return result;
754
754
  }
data/opal/corelib/proc.rb CHANGED
@@ -1,4 +1,4 @@
1
- # helpers: slice
1
+ # helpers: slice, each_ivar
2
2
  # backtick_javascript: true
3
3
 
4
4
  class ::Proc < `Function`
@@ -181,11 +181,9 @@ class ::Proc < `Function`
181
181
  return original_proc.apply(this, arguments);
182
182
  };
183
183
 
184
- for (var prop in self) {
185
- if (self.hasOwnProperty(prop)) {
186
- proc[prop] = self[prop];
187
- }
188
- }
184
+ $each_ivar(self, function(prop) {
185
+ proc[prop] = self[prop];
186
+ });
189
187
 
190
188
  return proc;
191
189
  }
@@ -2580,33 +2580,42 @@
2580
2580
  return obj;
2581
2581
  };
2582
2582
 
2583
- // freze props, make setters of instance variables throw FrozenError
2584
- Opal.freeze_props = function(obj) {
2585
- var prop, prop_type, desc;
2583
+ // Iterate over every instance variable and call func for each one
2584
+ // giving name of the ivar and optionally the property descriptor.
2585
+ function $each_ivar(obj, func) {
2586
+ var own_props = Object.getOwnPropertyNames(obj), own_props_length = own_props.length, i, prop, desc;
2586
2587
 
2587
- for(prop in obj) {
2588
- prop_type = typeof(prop);
2588
+ for(i = 0; i < own_props_length; i++) {
2589
+ prop = own_props[i];
2589
2590
 
2590
- // prop_type "object" here is a String(), skip $ props
2591
- if ((prop_type === "string" || prop_type === "object") && prop[0] === '$') {
2592
- continue;
2593
- }
2591
+ if (prop[0] === '$') continue;
2594
2592
 
2595
2593
  desc = Object.getOwnPropertyDescriptor(obj, prop);
2596
- if (desc && desc.enumerable && desc.writable) {
2597
- // create closure to retain current value as cv
2598
- // for Opal 2.0 let for cv should do the trick, instead of a function
2599
- (function() {
2600
- // set v to undefined, as if the property is not set
2601
- var cv = obj[prop];
2602
- Object.defineProperty(obj, prop, {
2603
- get: function() { return cv; },
2604
- set: function(_val) { $deny_frozen_access(obj); },
2605
- enumerable: true
2606
- });
2607
- })();
2594
+
2595
+ if (desc && desc.enumerable) {
2596
+ func(prop, desc);
2608
2597
  }
2609
2598
  }
2599
+ }
2600
+
2601
+ Opal.each_ivar = $each_ivar;
2602
+
2603
+ // freze props, make setters of instance variables throw FrozenError
2604
+ Opal.freeze_props = function(obj) {
2605
+ var dp_template = {
2606
+ get: null,
2607
+ set: function(_val) { $deny_frozen_access(obj); },
2608
+ enumerable: true
2609
+ };
2610
+
2611
+ $each_ivar(obj, function(prop, desc) {
2612
+ if (!desc.writable) return;
2613
+
2614
+ // Redefine a property with a setter that raises an error.
2615
+ dp_template.get = $return_val(desc.value);
2616
+
2617
+ Object.defineProperty(obj, prop, dp_template);
2618
+ });
2610
2619
  };
2611
2620
 
2612
2621
  // Regexps
@@ -8,43 +8,19 @@ opal_filter "Array" do
8
8
  fails "Array#[] raises a RangeError if passed a range with a bound that is too large" # Expected RangeError but no exception was raised (nil was returned)
9
9
  fails "Array#[] raises a type error if a range is passed with a length" # Expected TypeError but no exception was raised ([2, 3] was returned)
10
10
  fails "Array#all? ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
11
- fails "Array#all? tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
12
11
  fails "Array#any? when given a pattern argument ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
13
- fails "Array#any? with a block given tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
14
- fails "Array#collect tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
15
- fails "Array#collect! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
16
- fails "Array#count when a block argument given tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
17
- fails "Array#delete_if tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
18
12
  fails "Array#drop raises a TypeError when the passed argument isn't an integer and #to_int returns non-Integer" # Expected TypeError but no exception was raised ([1, 2] was returned)
19
- fails "Array#drop_while tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
20
- fails "Array#each does not yield elements deleted from the end of the array" # Expected [2, 3, nil] == [2, 3] to be truthy but was false
21
- fails "Array#each tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
22
- fails "Array#each yields each element to the block even if the array is changed during iteration" # Expected [1, 2, 3, 4, 5] == [1, 2, 3, 4, 5, 7, 9] to be truthy but was false
23
- fails "Array#each yields elements added to the end of the array by the block" # Expected [2] == [2, 0, 0] to be truthy but was false
24
- fails "Array#each yields elements based on an internal index" # NoMethodError: undefined method `even?' for nil
25
- fails "Array#each yields only elements that are still in the array" # NoMethodError: undefined method `even?' for nil
26
- fails "Array#each yields the same element multiple times if inserting while iterating" # Expected [1, 1] == [1, 1, 2] to be truthy but was false
27
- fails "Array#each_index tolerates increasing an array size during iteration" # Expected [0, 1, 2] == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102] to be truthy but was false
28
13
  fails "Array#fill with (filler, index, length) raises a TypeError when the length is not numeric" # Expected TypeError (/no implicit conversion of Symbol into Integer/) but got: TypeError (no implicit conversion of String into Integer)
29
14
  fails "Array#fill with (filler, range) works with endless ranges" # Expected [1, 2, 3, 4] == [1, 2, 3, "x"] to be truthy but was false
30
15
  fails "Array#filter returns a new array of elements for which block is true" # Expected [1] == [1, 4, 6] to be truthy but was false
31
- fails "Array#filter tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
32
- fails "Array#filter! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
33
- fails "Array#find_index tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
34
16
  fails "Array#flatten does not call #to_ary on elements beyond the given level" # Mock '1' expected to receive to_ary("any_args") exactly 0 times but received it 1 times
35
17
  fails "Array#flatten performs respond_to? and method_missing-aware checks when coercing elements to array" # NoMethodError: undefined method `respond_to?' for #<BasicObject:0x2698>
36
18
  fails "Array#flatten with a non-Array object in the Array calls #method_missing if defined" # Expected [#<MockObject:0x2730 @name="Array#flatten", @null=nil>] == [1, 2, 3] to be truthy but was false
37
- fails "Array#index tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
38
19
  fails "Array#initialize with no arguments does not use the given block" # Expected warning to match: /ruby\/core\/array\/initialize_spec.rb:57: warning: given block not used/ but got: ""
39
20
  fails "Array#inspect does not call #to_str on the object returned from #to_s when it is not a String" # Exception: Cannot convert object to primitive value
40
21
  fails "Array#intersect? tries to convert the passed argument to an Array using #to_ary" # Expected false == true to be truthy but was false
41
- fails "Array#keep_if tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
42
- fails "Array#map tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
43
- fails "Array#map! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
44
22
  fails "Array#none? ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
45
- fails "Array#none? tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
46
23
  fails "Array#one? ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
47
- fails "Array#one? tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
48
24
  fails "Array#pack with format 'A' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
49
25
  fails "Array#pack with format 'A' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
50
26
  fails "Array#pack with format 'C' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
@@ -67,13 +43,8 @@ opal_filter "Array" do
67
43
  fails "Array#product returns converted arguments using :method_missing" # TypeError: no implicit conversion of ArraySpecs::ArrayMethodMissing into Array
68
44
  fails "Array#rassoc calls elem == obj on the second element of each contained array" # Expected [1, "foobar"] == [2, #<MockObject:0x4a6b4 @name="foobar", @null=nil>] to be truthy but was false
69
45
  fails "Array#rassoc does not check the last element in each contained but specifically the second" # Expected [1, "foobar", #<MockObject:0x4a37e @name="foobar", @null=nil>] == [2, #<MockObject:0x4a37e @name="foobar", @null=nil>, 1] to be truthy but was false
70
- fails "Array#reject tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
71
- fails "Array#reject! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
72
- fails "Array#reverse_each tolerates increasing an array size during iteration" # Expected ["c", "b", "a"] == ["c", "a", 1] to be truthy but was false
73
46
  fails "Array#sample returns nil for an empty array when called without n and a Random is given" # ArgumentError: invalid argument - 0
74
47
  fails "Array#select returns a new array of elements for which block is true" # Expected [1] == [1, 4, 6] to be truthy but was false
75
- fails "Array#select tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
76
- fails "Array#select! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
77
48
  fails "Array#shuffle! matches CRuby with random:" # Expected [7, 4, 5, 0, 3, 9, 2, 8, 10, 1, 6] == [2, 6, 8, 5, 7, 10, 3, 1, 0, 4, 9] to be truthy but was false
78
49
  fails "Array#shuffle! matches CRuby with srand" # Expected ["d", "j", "g", "f", "i", "e", "c", "k", "b", "h", "a"] == ["a", "e", "f", "h", "i", "j", "d", "b", "g", "k", "c"] to be truthy but was false
79
50
  fails "Array#slice can be sliced with Enumerator::ArithmeticSequence has endless range with start outside of array's bounds" # Expected [] == nil to be truthy but was false
@@ -81,15 +52,8 @@ opal_filter "Array" do
81
52
  fails "Array#slice raises TypeError if to_int returns non-integer" # Expected TypeError but no exception was raised ([1, 2, 3, 4] was returned)
82
53
  fails "Array#slice raises a RangeError if passed a range with a bound that is too large" # Expected RangeError but no exception was raised (nil was returned)
83
54
  fails "Array#slice raises a type error if a range is passed with a length" # Expected TypeError but no exception was raised ([2, 3] was returned)
84
- fails "Array#sort_by! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
85
55
  fails "Array#sum calls + on the init value" # NoMethodError: undefined method `-' for #<MockObject:0x7f7c2 @name="b" @null=nil>
86
- fails "Array#sum tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
87
- fails "Array#take_while tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
88
- fails "Array#to_h tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
89
56
  fails "Array#to_s does not call #to_str on the object returned from #to_s when it is not a String" # Exception: Cannot convert object to primitive value
90
- fails "Array#uniq tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
91
- fails "Array#uniq! properly handles recursive arrays" # Expected [1, "two", 3, [...], [...], [...]] == [1, "two", 3, [1, "two", 3, [...], [...], [...]]] to be truthy but was false
92
- fails "Array#uniq! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
93
57
  fails "Array#zip raises TypeError when some argument isn't Array and doesn't respond to #to_ary and #to_enum" # Expected TypeError (wrong argument type Object (must respond to :each)) but got: NoMethodError (undefined method `each' for #<Object:0x6273e>)
94
58
  fails "Array.new with no arguments does not use the given block" # Expected warning to match: /warning: given block not used/ but got: ""
95
59
  fails "Array.try_convert sends #to_ary to the argument and raises TypeError if it's not a kind of Array" # Expected TypeError (can't convert MockObject to Array (MockObject#to_ary gives Object)) but got: TypeError (can't convert MockObject into Array (MockObject#to_ary gives Object))
@@ -17,14 +17,12 @@ opal_filter "Enumerable" do
17
17
  fails "Enumerable#grep_v does not set $~ when given no block" # Expected "e" == "z" to be truthy but was false
18
18
  fails "Enumerable#inject ignores the block if two arguments" # Expected warning to match: /ruby\/core\/enumerable\/shared\/inject.rb:23: warning: given block not used/ but got: ""
19
19
  fails "Enumerable#inject raises an ArgumentError when no parameters or block is given" # Expected ArgumentError but got: Exception (Cannot read properties of undefined (reading '$inspect'))
20
- fails "Enumerable#inject tolerates increasing a collection size during iterating Array" # Expected ["a", "b", "c"] == [0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 6, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 7, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 8, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 9, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, "a", "b", "c"] to be truthy but was false
21
20
  fails "Enumerable#map reports the same arity as the given block" # Exception: Cannot read properties of undefined (reading '$$is_array')
22
21
  fails "Enumerable#map yields 2 arguments for a Hash when block arity is 2" # ArgumentError: [#register] wrong number of arguments (given 1, expected 2)
23
22
  fails "Enumerable#none? when given a pattern argument ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
24
23
  fails "Enumerable#one? when given a pattern argument ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
25
24
  fails "Enumerable#reduce ignores the block if two arguments" # Expected warning to match: /ruby\/core\/enumerable\/shared\/inject.rb:23: warning: given block not used/ but got: ""
26
25
  fails "Enumerable#reduce raises an ArgumentError when no parameters or block is given" # Expected ArgumentError but got: Exception (Cannot read properties of undefined (reading '$inspect'))
27
- fails "Enumerable#reduce tolerates increasing a collection size during iterating Array" # Expected ["a", "b", "c"] == [0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 6, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 7, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 8, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 9, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, "a", "b", "c"] to be truthy but was false
28
26
  fails "Enumerable#reverse_each gathers whole arrays as elements when each yields multiple" # Expected [6, 3, 1] == [[6, 7, 8, 9], [3, 4, 5], [1, 2]] to be truthy but was false
29
27
  fails "Enumerable#slice_when when an iterator method yields more than one value processes all yielded values" # Expected [] == [[[1, 2]]] to be truthy but was false
30
28
  fails "Enumerable#slice_when when given a block doesn't yield an empty array on a small enumerable" # Expected [] == [[42]] to be truthy but was false
@@ -34,6 +32,6 @@ opal_filter "Enumerable" do
34
32
  fails "Enumerable#tally counts values as gathered array when yielded with multiple arguments" # Expected {[]=>3, 0=>1, [0, 1]=>2, [0, 1, 2]=>3, nil=>1, "default_arg"=>1, [0]=>1} == {nil=>2, 0=>1, [0, 1]=>2, [0, 1, 2]=>3, "default_arg"=>1, []=>2, [0]=>1} to be truthy but was false
35
33
  fails "Enumerable#tally with a hash calls #to_hash to convert argument to Hash implicitly if passed not a Hash" # NoMethodError: undefined method `fetch' for #<Object:0x8def0>
36
34
  fails "Enumerable#uniq uses eql? semantics" # Expected [1] == [1, 1] to be truthy but was false
37
- fails "Enumerable#zip passes each element of the result array to a block and return nil if a block is given" # Expected [[1, 4, 7], [2, 5, 8], [3, 6, 9]] == nil to be truthy but was false
35
+ fails "Enumerable#zip passes each element of the result array to a block and return nil if a block is given" # Expected [[1, 4, 7], [2, 5, 8], [3, 6, 9]] == nil to be truthy but was false
38
36
  fails "Enumerable#zip raises TypeError when some argument isn't Array and doesn't respond to #to_ary and #to_enum" # Expected TypeError (wrong argument type Object (must respond to :each)) but got: NoMethodError (undefined method `each' for #<Object:0x2e1e6>)
39
37
  end
@@ -352,14 +352,12 @@ opal_filter "Kernel" do
352
352
  fails "Kernel.printf formatting io is not specified other formats c tries to convert argument to Integer with to_int" # NoMethodError: undefined method `respond_to?' for #<BasicObject:0x4080e>
353
353
  fails "Kernel.printf formatting io is not specified other formats c tries to convert argument to String with to_str" # NoMethodError: undefined method `respond_to?' for #<BasicObject:0x40800>
354
354
  fails "Kernel.printf formatting io is not specified other formats s preserves encoding of the format string" # Expected #<Encoding:UTF-8> == #<Encoding:US-ASCII> to be truthy but was false
355
- fails "Kernel.printf formatting io is specified other formats c raises TypeError if argument is nil" # Expected TypeError (/no implicit conversion from nil to integer/) but got: Exception (format_string.indexOf is not a function)
356
- fails "Kernel.printf formatting io is specified other formats c raises TypeError if argument is not String or Integer and cannot be converted to them" # Expected TypeError (/no implicit conversion of Array into Integer/) but got: Exception (format_string.indexOf is not a function)
357
- fails "Kernel.printf formatting io is specified other formats c raises TypeError if converting to Integer with to_int returns non-Integer" # Expected TypeError (/can't convert BasicObject to String/) but got: Exception (format_string.indexOf is not a function)
358
- fails "Kernel.printf formatting io is specified other formats c raises TypeError if converting to String with to_str returns non-String" # Expected TypeError (/can't convert BasicObject to String/) but got: Exception (format_string.indexOf is not a function)
359
- fails "Kernel.printf formatting io is specified other formats c tries to convert argument to Integer with to_int" # Exception: format_string.indexOf is not a function
360
- fails "Kernel.printf formatting io is specified other formats c tries to convert argument to String with to_str" # Exception: format_string.indexOf is not a function
361
- fails "Kernel.printf formatting io is specified other formats s formats nil with precision" # Exception: format_string.indexOf is not a function
362
- fails "Kernel.printf formatting io is specified other formats s formats nil with width" # Exception: format_string.indexOf is not a function
355
+ fails "Kernel.printf formatting io is specified other formats c raises TypeError if argument is nil" # Expected TypeError (/no implicit conversion from nil to integer/) but got: TypeError (no implicit conversion of NilClass into Integer)
356
+ fails "Kernel.printf formatting io is specified other formats c raises TypeError if argument is not String or Integer and cannot be converted to them" # Expected TypeError (/no implicit conversion of Array into Integer/) but got: ArgumentError (too few arguments)
357
+ fails "Kernel.printf formatting io is specified other formats c raises TypeError if converting to Integer with to_int returns non-Integer" # Expected TypeError (/can't convert BasicObject to Integer/) but got: NoMethodError (undefined method `respond_to?' for #<BasicObject:0x69e>)
358
+ fails "Kernel.printf formatting io is specified other formats c raises TypeError if converting to String with to_str returns non-String" # Expected TypeError (/can't convert BasicObject to String/) but got: NoMethodError (undefined method `respond_to?' for #<BasicObject:0x6cc>)
359
+ fails "Kernel.printf formatting io is specified other formats c tries to convert argument to Integer with to_int" # NoMethodError: undefined method `respond_to?' for #<BasicObject:0x6a8>
360
+ fails "Kernel.printf formatting io is specified other formats c tries to convert argument to String with to_str" # NoMethodError: undefined method `respond_to?' for #<BasicObject:0x6c2>
363
361
  fails "Kernel.printf formatting io is specified other formats s preserves encoding of the format string" # Expected #<Encoding:UTF-8> == #<Encoding:US-ASCII> to be truthy but was false
364
362
  fails "Kernel.printf writes to stdout when a string is the first argument" # NoMethodError: undefined method `tmp' for #<MSpecEnv:0x4046a @name=nil @stdout=#<IO:0xa @fd=1 @flags="w" @eof=false @closed="both" @write_proc=#<Proc:0x40474> @tty=true>>
365
363
  fails "Kernel.proc returned the passed Proc if given an existing Proc" # Expected false to be true
@@ -7,8 +7,8 @@ opal_filter "Ruby 3.2" do
7
7
  fails "Kernel#sprintf other formats c displays only the first character if argument is a string of several characters" # ArgumentError: %c requires a character
8
8
  fails "Kernel.printf formatting io is not specified other formats c displays no characters if argument is an empty string" # ArgumentError: %c requires a character
9
9
  fails "Kernel.printf formatting io is not specified other formats c displays only the first character if argument is a string of several characters" # ArgumentError: %c requires a character
10
- fails "Kernel.printf formatting io is specified other formats c displays no characters if argument is an empty string" # Exception: format_string.indexOf is not a function
11
- fails "Kernel.printf formatting io is specified other formats c displays only the first character if argument is a string of several characters" # Exception: format_string.indexOf is not a function
10
+ fails "Kernel.printf formatting io is specified other formats c displays no characters if argument is an empty string" # ArgumentError: %c requires a character
11
+ fails "Kernel.printf formatting io is specified other formats c displays only the first character if argument is a string of several characters" # ArgumentError: %c requires a character
12
12
  fails "Kernel.sprintf other formats c displays no characters if argument is an empty string" # ArgumentError: %c requires a character
13
13
  fails "Kernel.sprintf other formats c displays only the first character if argument is a string of several characters" # ArgumentError: %c requires a character
14
14
  fails "Keyword arguments delegation does not work with call(*ruby2_keyword_args) with missing ruby2_keywords in between" # Expected [[], {}] == [[{}], {}] to be truthy but was false
@@ -21,8 +21,4 @@ opal_unsupported_filter "Kernel" do
21
21
  fails "Kernel#warn is a private method" # Expected Kernel to have private instance method 'warn' but it does not
22
22
  fails "Kernel.Float raises a TypeError if #to_f returns an Integer" # Expected TypeError but no exception was raised (123 was returned)
23
23
  fails "Kernel.lambda when called without a literal block warns when proc isn't a lambda" # Expected warning: "ruby/core/kernel/lambda_spec.rb:142: warning: lambda without a literal block is deprecated; use the proc without lambda instead\n" but got: ""
24
- fails "Kernel.printf formatting io is specified other formats s formats nil with width and precision" # Exception: format_string.indexOf is not a function
25
- fails "Kernel.printf formatting io is specified other formats s formats string with width and precision" # Exception: format_string.indexOf is not a function
26
- fails "Kernel.printf formatting io is specified other formats s formats string with width" # Exception: format_string.indexOf is not a function
27
- fails "Kernel.printf formatting io is specified other formats s substitutes '' for nil" # Exception: format_string.indexOf is not a function
28
24
  end
@@ -0,0 +1,89 @@
1
+ describe 'duplicated underscore parameter' do
2
+ it 'assigns the first arg' do
3
+ klass = Class.new {
4
+ def req_req(_, _) = _
5
+ def req_rest_req(_, *, _) = _
6
+ def rest_req(*_, _) = _
7
+ def req_opt(_, _ = 0) = _
8
+ def opt_req(_ = 0, _) = _
9
+ def req_kwopt(_, _: 0) = _
10
+ def req_kwrest(_, **_) = _
11
+ def req_block(_, &_) = _
12
+ def req_mlhs(_, (_)) = _
13
+ def mlhs_req((_), _) = _
14
+ def rest_kw(*_, _:) = _
15
+ def nested_mlhs(((_), _)) = _
16
+ def nested_mlhs_rest(((*_, _))) = _
17
+ }
18
+ o = klass.new
19
+
20
+ o.req_req(1, 2).should == 1
21
+ o.req_rest_req(1, 2, 3, 4).should == 1
22
+ o.rest_req(1, 2, 3).should == [1, 2]
23
+ o.req_opt(1).should == 1
24
+ o.req_opt(1, 2).should == 1
25
+ o.opt_req(1).should == 0
26
+ o.opt_req(1, 2).should == 1
27
+ o.req_kwopt(1, _: 2).should == 1
28
+ o.req_kwrest(1, a: 2).should == 1
29
+ o.req_block(1).should == 1
30
+ o.req_block(1) {}.should == 1
31
+ o.req_mlhs(1, [2]).should == 1
32
+ o.mlhs_req([1], 2).should == 1
33
+ o.rest_kw(1, 2, _: 3).should == [1, 2]
34
+ o.nested_mlhs([[1], 2]).should == 1
35
+ o.nested_mlhs_rest([[1, 2, 3]]).should == [1, 2]
36
+ end
37
+
38
+ context 'in block parameters' do
39
+ it 'assignes the first arg' do
40
+ proc { |_, _| _ }.call(1, 2).should == 1
41
+ proc { |_, *_| _ }.call(1, 2, 3).should == 1
42
+ proc { |*_, _| _ }.call(1, 2, 3).should == [1, 2]
43
+ proc { |_, _:| _ }.call(1, _: 2).should == 1
44
+ proc { |**_, &_| _ }.call(a: 1) {}.should == {a: 1}
45
+ end
46
+ end
47
+
48
+ it 'distinguishes two arguments starting with _' do
49
+ klass = Class.new {
50
+ def foo(_a, _a, _b, _b) = [_a, _b]
51
+ }
52
+ o = klass.new
53
+ o.foo(1, 2, 3, 4).should == [1, 3]
54
+ end
55
+
56
+ it 'works with yield' do
57
+ klass = Class.new {
58
+ def foo(_, &_) = yield * 2
59
+ }
60
+ o = klass.new
61
+ o.foo(1) { 2 }.should == 4
62
+ end
63
+
64
+ it 'works with block_given?' do
65
+ klass = Class.new {
66
+ def foo(_, &_) = block_given?
67
+ }
68
+ o = klass.new
69
+
70
+ o.foo(1).should == false
71
+ o.foo(1) {}.should == true
72
+ end
73
+
74
+ it 'works with zsuper' do
75
+ parent = Class.new {
76
+ def foo(*args, **kwargs, &blk)
77
+ [args, kwargs, blk.call]
78
+ end
79
+ }
80
+ child = Class.new(parent) {
81
+ def foo(_, _ = 0, *_, _, _:, **_, &_)
82
+ super
83
+ end
84
+ }
85
+ o = child.new
86
+
87
+ o.foo(1, 2, 3, 4, _: 5, a: 6) { 7 }.should == [[1, 2, 3, 4], {_: 5, a: 6}, 7]
88
+ end
89
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elia Schito
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2023-10-26 00:00:00.000000000 Z
13
+ date: 2023-11-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ast
@@ -602,6 +602,7 @@ files:
602
602
  - lib/opal/rewriters/base.rb
603
603
  - lib/opal/rewriters/binary_operator_assignment.rb
604
604
  - lib/opal/rewriters/block_to_iter.rb
605
+ - lib/opal/rewriters/deduplicate_arg_name.rb
605
606
  - lib/opal/rewriters/dot_js_syntax.rb
606
607
  - lib/opal/rewriters/dump_args.rb
607
608
  - lib/opal/rewriters/for_rewriter.rb
@@ -909,6 +910,7 @@ files:
909
910
  - spec/opal/core/language/DATA/multiple___END___crlf_spec.rb
910
911
  - spec/opal/core/language/DATA/multiple___END___spec.rb
911
912
  - spec/opal/core/language/arguments/mlhs_arg_spec.rb
913
+ - spec/opal/core/language/arguments/underscore_arg_spec.rb
912
914
  - spec/opal/core/language/case_spec.rb
913
915
  - spec/opal/core/language/forward_args_spec.rb
914
916
  - spec/opal/core/language/if_spec.rb
@@ -1228,10 +1230,10 @@ licenses:
1228
1230
  metadata:
1229
1231
  homepage_uri: https://opalrb.com/
1230
1232
  bug_tracker_uri: https://github.com/opal/opal/issues
1231
- changelog_uri: https://github.com/opal/opal/blob/v1.8.0/CHANGELOG.md
1232
- readme_uri: https://github.com/opal/opal/blob/v1.8.0/README.md
1233
- api_documentation_uri: http://opalrb.com/docs/api/v1.8.0/index.html
1234
- guides_uri: http://opalrb.com/docs/guides/v1.8.0/index.html
1233
+ changelog_uri: https://github.com/opal/opal/blob/v1.8.1/CHANGELOG.md
1234
+ readme_uri: https://github.com/opal/opal/blob/v1.8.1/README.md
1235
+ api_documentation_uri: http://opalrb.com/docs/api/v1.8.1/index.html
1236
+ guides_uri: http://opalrb.com/docs/guides/v1.8.1/index.html
1235
1237
  chat_uri: https://gitter.im/opal/opal
1236
1238
  source_code_uri: https://github.com/opal/opal
1237
1239
  post_install_message:
@@ -1601,6 +1603,7 @@ test_files:
1601
1603
  - lib/opal/rewriters/base.rb
1602
1604
  - lib/opal/rewriters/binary_operator_assignment.rb
1603
1605
  - lib/opal/rewriters/block_to_iter.rb
1606
+ - lib/opal/rewriters/deduplicate_arg_name.rb
1604
1607
  - lib/opal/rewriters/dot_js_syntax.rb
1605
1608
  - lib/opal/rewriters/dump_args.rb
1606
1609
  - lib/opal/rewriters/for_rewriter.rb