Skip to content

Commit 0025fef

Browse files
committed
merge revision(s) 44412,44413,44414,44420,44421: [Backport ruby#9298]
test_method.rb, test_proc.rb: suppress warnings * test/ruby/test_method.rb: suppress warnings in verbose mode. * test/ruby/test_proc.rb: ditto. * proc.c (rb_iseq_min_max_arity): maximum argument is unlimited if having rest keywords argument. [ruby-core:53298] [Bug ruby#8072] * iseq.c (rb_iseq_parameters): push argument type symbol only for unnamed rest keywords argument. * compile.c (iseq_set_arguments): set arg_keyword_check from nd_cflag, which is set by parser. internal ID is used for unnamed keyword rest argument, which should be separated from no keyword check. * iseq.c (rb_iseq_parameters): if no keyword check, keyword rest is present. * parse.y (new_args_tail_gen): set keywords check to nd_cflag, which equals to that keyword rest is not present. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@45138 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent f577abf commit 0025fef

File tree

9 files changed

+129
-9
lines changed

9 files changed

+129
-9
lines changed

ChangeLog

+23
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1+
Sat Feb 22 21:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
2+
3+
* compile.c (iseq_set_arguments): set arg_keyword_check from
4+
nd_cflag, which is set by parser. internal ID is used for
5+
unnamed keyword rest argument, which should be separated from no
6+
keyword check.
7+
8+
* iseq.c (rb_iseq_parameters): if no keyword check, keyword rest is
9+
present.
10+
11+
* parse.y (new_args_tail_gen): set keywords check to nd_cflag, which
12+
equals to that keyword rest is not present.
13+
14+
Sat Feb 22 21:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
15+
16+
* iseq.c (rb_iseq_parameters): push argument type symbol only for
17+
unnamed rest keywords argument.
18+
19+
Sat Feb 22 21:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
20+
21+
* proc.c (rb_iseq_min_max_arity): maximum argument is unlimited if
22+
having rest keywords argument. [ruby-core:53298] [Bug #8072]
23+
124
Sat Feb 22 18:55:08 2014 Shugo Maeda <shugo@ruby-lang.org>
225

326
* ext/socket/init.c (wait_connectable): break if the socket is

compile.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1203,7 +1203,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node_args)
12031203
node = node->nd_next;
12041204
i += 1;
12051205
}
1206-
iseq->arg_keyword_check = (args->kw_rest_arg->nd_vid & ID_SCOPE_MASK) == ID_JUNK;
1206+
iseq->arg_keyword_check = args->kw_rest_arg->nd_cflag != 0;
12071207
iseq->arg_keywords = i;
12081208
iseq->arg_keyword_required = r;
12091209
iseq->arg_keyword_table = ALLOC_N(ID, i);

iseq.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2023,7 +2023,7 @@ rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc)
20232023
}
20242024
rb_ary_push(args, a);
20252025
}
2026-
if (rb_id2str(iseq->local_table[iseq->arg_keyword])) {
2026+
if (!iseq->arg_keyword_check) {
20272027
CONST_ID(keyrest, "keyrest");
20282028
rb_ary_push(args, PARAM(iseq->arg_keyword, keyrest));
20292029
}

parse.y

+6-1
Original file line numberDiff line numberDiff line change
@@ -9486,17 +9486,22 @@ new_args_tail_gen(struct parser_params *parser, NODE *k, ID kr, ID b)
94869486
struct rb_args_info *args;
94879487
NODE *kw_rest_arg = 0;
94889488
NODE *node;
9489+
int check = 0;
94899490

94909491
args = ALLOC(struct rb_args_info);
94919492
MEMZERO(args, struct rb_args_info, 1);
94929493
node = NEW_NODE(NODE_ARGS, 0, 0, args);
94939494

94949495
args->block_arg = b;
94959496
args->kw_args = k;
9496-
if (k && !kr) kr = internal_id();
9497+
if (k && !kr) {
9498+
check = 1;
9499+
kr = internal_id();
9500+
}
94979501
if (kr) {
94989502
arg_var(kr);
94999503
kw_rest_arg = NEW_DVAR(kr);
9504+
kw_rest_arg->nd_cflag = check;
95009505
}
95019506
args->kw_rest_arg = kw_rest_arg;
95029507

proc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,7 @@ proc_arity(VALUE self)
825825
static inline int
826826
rb_iseq_min_max_arity(const rb_iseq_t *iseq, int *max)
827827
{
828-
*max = iseq->arg_rest == -1 ?
828+
*max = (iseq->arg_rest == -1 && iseq->arg_keyword == -1) ?
829829
iseq->argc + iseq->arg_post_len + iseq->arg_opts - (iseq->arg_opts > 0)
830830
: UNLIMITED_ARGUMENTS;
831831
return iseq->argc + iseq->arg_post_len;

test/ruby/test_keyword.rb

+9
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ def test_f9
117117
assert_equal([1, 2, [3, 4], 5, :key, {str: "bar"}, nil], f9(1, 2, 3, 4, 5, str: "bar"))
118118
end
119119

120+
def f10(a: 1, **)
121+
a
122+
end
123+
124+
def test_f10
125+
assert_equal(42, f10(a: 42))
126+
assert_equal(1, f10(b: 42))
127+
end
128+
120129
def test_method_parameters
121130
assert_equal([[:key, :str], [:key, :num]], method(:f1).parameters);
122131
assert_equal([[:req, :x], [:key, :str], [:key, :num]], method(:f2).parameters);

test/ruby/test_method.rb

+54-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@ def mo4(a, *b, &c) end
2222
def mo5(a, *b, c) end
2323
def mo6(a, *b, c, &d) end
2424
def mo7(a, b = nil, *c, d, &e) end
25-
def ma1((a), &b) end
25+
def ma1((a), &b) nil && a end
26+
def mk1(**) end
27+
def mk2(**o) nil && o end
28+
def mk3(a, **o) nil && o end
29+
def mk4(a = nil, **o) nil && o end
30+
def mk5(a, b = nil, **o) nil && o end
31+
def mk6(a, b = nil, c, **o) nil && o end
32+
def mk7(a, b = nil, *c, d, **o) nil && o end
2633

2734
class Base
2835
def foo() :base end
@@ -68,6 +75,13 @@ def test_arity
6875
assert_equal(-2, method(:mo4).arity)
6976
assert_equal(-3, method(:mo5).arity)
7077
assert_equal(-3, method(:mo6).arity)
78+
assert_equal(-1, method(:mk1).arity)
79+
assert_equal(-1, method(:mk2).arity)
80+
assert_equal(-2, method(:mk3).arity)
81+
assert_equal(-1, method(:mk4).arity)
82+
assert_equal(-2, method(:mk5).arity)
83+
assert_equal(-3, method(:mk6).arity)
84+
assert_equal(-3, method(:mk7).arity)
7185
end
7286

7387
def test_arity_special
@@ -293,7 +307,7 @@ def a
293307
end
294308
end
295309

296-
assert_nothing_raised do
310+
assert_nothing_raised(bug8686) do
297311
m.define_singleton_method(:a, m.method(:a))
298312
end
299313
end
@@ -456,7 +470,14 @@ def test_default_accessibility
456470
define_method(:pmo5) {|a, *b, c|}
457471
define_method(:pmo6) {|a, *b, c, &d|}
458472
define_method(:pmo7) {|a, b = nil, *c, d, &e|}
459-
define_method(:pma1) {|(a), &b|}
473+
define_method(:pma1) {|(a), &b| nil && a}
474+
define_method(:pmk1) {|**|}
475+
define_method(:pmk2) {|**o|}
476+
define_method(:pmk3) {|a, **o|}
477+
define_method(:pmk4) {|a = nil, **o|}
478+
define_method(:pmk5) {|a, b = nil, **o|}
479+
define_method(:pmk6) {|a, b = nil, c, **o|}
480+
define_method(:pmk7) {|a, b = nil, *c, d, **o|}
460481

461482
def test_bound_parameters
462483
assert_equal([], method(:m0).parameters)
@@ -470,6 +491,13 @@ def test_bound_parameters
470491
assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:mo6).parameters)
471492
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:mo7).parameters)
472493
assert_equal([[:req], [:block, :b]], method(:ma1).parameters)
494+
assert_equal([[:keyrest]], method(:mk1).parameters)
495+
assert_equal([[:keyrest, :o]], method(:mk2).parameters)
496+
assert_equal([[:req, :a], [:keyrest, :o]], method(:mk3).parameters)
497+
assert_equal([[:opt, :a], [:keyrest, :o]], method(:mk4).parameters)
498+
assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:mk5).parameters)
499+
assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:mk6).parameters)
500+
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:mk7).parameters)
473501
end
474502

475503
def test_unbound_parameters
@@ -484,6 +512,13 @@ def test_unbound_parameters
484512
assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], self.class.instance_method(:mo6).parameters)
485513
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], self.class.instance_method(:mo7).parameters)
486514
assert_equal([[:req], [:block, :b]], self.class.instance_method(:ma1).parameters)
515+
assert_equal([[:keyrest]], self.class.instance_method(:mk1).parameters)
516+
assert_equal([[:keyrest, :o]], self.class.instance_method(:mk2).parameters)
517+
assert_equal([[:req, :a], [:keyrest, :o]], self.class.instance_method(:mk3).parameters)
518+
assert_equal([[:opt, :a], [:keyrest, :o]], self.class.instance_method(:mk4).parameters)
519+
assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], self.class.instance_method(:mk5).parameters)
520+
assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], self.class.instance_method(:mk6).parameters)
521+
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], self.class.instance_method(:mk7).parameters)
487522
end
488523

489524
def test_bmethod_bound_parameters
@@ -498,6 +533,13 @@ def test_bmethod_bound_parameters
498533
assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:pmo6).parameters)
499534
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:pmo7).parameters)
500535
assert_equal([[:req], [:block, :b]], method(:pma1).parameters)
536+
assert_equal([[:keyrest]], method(:pmk1).parameters)
537+
assert_equal([[:keyrest, :o]], method(:pmk2).parameters)
538+
assert_equal([[:req, :a], [:keyrest, :o]], method(:pmk3).parameters)
539+
assert_equal([[:opt, :a], [:keyrest, :o]], method(:pmk4).parameters)
540+
assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:pmk5).parameters)
541+
assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:pmk6).parameters)
542+
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:pmk7).parameters)
501543
end
502544

503545
def test_bmethod_unbound_parameters
@@ -512,6 +554,14 @@ def test_bmethod_unbound_parameters
512554
assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], self.class.instance_method(:pmo6).parameters)
513555
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], self.class.instance_method(:pmo7).parameters)
514556
assert_equal([[:req], [:block, :b]], self.class.instance_method(:pma1).parameters)
557+
assert_equal([[:req], [:block, :b]], self.class.instance_method(:pma1).parameters)
558+
assert_equal([[:keyrest]], self.class.instance_method(:pmk1).parameters)
559+
assert_equal([[:keyrest, :o]], self.class.instance_method(:pmk2).parameters)
560+
assert_equal([[:req, :a], [:keyrest, :o]], self.class.instance_method(:pmk3).parameters)
561+
assert_equal([[:opt, :a], [:keyrest, :o]], self.class.instance_method(:pmk4).parameters)
562+
assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], self.class.instance_method(:pmk5).parameters)
563+
assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], self.class.instance_method(:pmk6).parameters)
564+
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], self.class.instance_method(:pmk7).parameters)
515565
end
516566

517567
def test_public_method_with_zsuper_method
@@ -659,6 +709,7 @@ def foo
659709
prepend m
660710
}
661711
assert_raise(NameError, bug7988) {Module.new{prepend m}.instance_method(:bar)}
712+
true || c || bug7836
662713
end
663714

664715
def test_gced_bmethod

test/ruby/test_proc.rb

+33-1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ def test_arity
7777
assert_equal(2, proc{|(x, y), z|[x,y]}.arity)
7878
assert_equal(1, proc{|(x, y), z=0|[x,y]}.arity)
7979
assert_equal(-4, proc{|x, *y, z, a|}.arity)
80+
assert_equal(-1, proc{|**|}.arity)
81+
assert_equal(-1, proc{|**o|}.arity)
82+
assert_equal(-2, proc{|x, **o|}.arity)
83+
assert_equal(-1, proc{|x=0, **o|}.arity)
84+
assert_equal(-2, proc{|x, y=0, **o|}.arity)
85+
assert_equal(-3, proc{|x, y=0, z, **o|}.arity)
86+
assert_equal(-3, proc{|x, y=0, *z, w, **o|}.arity)
8087

8188
assert_equal(0, lambda{}.arity)
8289
assert_equal(0, lambda{||}.arity)
@@ -95,6 +102,13 @@ def test_arity
95102
assert_equal(2, lambda{|(x, y), z|[x,y]}.arity)
96103
assert_equal(-2, lambda{|(x, y), z=0|[x,y]}.arity)
97104
assert_equal(-4, lambda{|x, *y, z, a|}.arity)
105+
assert_equal(-1, lambda{|**|}.arity)
106+
assert_equal(-1, lambda{|**o|}.arity)
107+
assert_equal(-2, lambda{|x, **o|}.arity)
108+
assert_equal(-1, lambda{|x=0, **o|}.arity)
109+
assert_equal(-2, lambda{|x, y=0, **o|}.arity)
110+
assert_equal(-3, lambda{|x, y=0, z, **o|}.arity)
111+
assert_equal(-3, lambda{|x, y=0, *z, w, **o|}.arity)
98112

99113
assert_arity(0) {}
100114
assert_arity(0) {||}
@@ -104,6 +118,10 @@ def test_arity
104118
assert_arity(-3) {|x, *y, z|}
105119
assert_arity(-1) {|*x|}
106120
assert_arity(-1) {|*|}
121+
assert_arity(-1) {|**o|}
122+
assert_arity(-1) {|**|}
123+
assert_arity(-2) {|x, *y, **|}
124+
assert_arity(-3) {|x, *y, z, **|}
107125
end
108126

109127
def m(x)
@@ -1086,6 +1104,13 @@ def pmo5(a, *b, c) end
10861104
def pmo6(a, *b, c, &d) end
10871105
def pmo7(a, b = :b, *c, d, &e) end
10881106
def pma1((a), &b) a; end
1107+
def pmk1(**) end
1108+
def pmk2(**o) nil && o end
1109+
def pmk3(a, **o) nil && o end
1110+
def pmk4(a = nil, **o) nil && o end
1111+
def pmk5(a, b = nil, **o) nil && o end
1112+
def pmk6(a, b = nil, c, **o) nil && o end
1113+
def pmk7(a, b = nil, *c, d, **o) nil && o end
10891114

10901115

10911116
def test_bound_parameters
@@ -1100,6 +1125,13 @@ def test_bound_parameters
11001125
assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:pmo6).to_proc.parameters)
11011126
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:pmo7).to_proc.parameters)
11021127
assert_equal([[:req], [:block, :b]], method(:pma1).to_proc.parameters)
1128+
assert_equal([[:keyrest]], method(:pmk1).to_proc.parameters)
1129+
assert_equal([[:keyrest, :o]], method(:pmk2).to_proc.parameters)
1130+
assert_equal([[:req, :a], [:keyrest, :o]], method(:pmk3).to_proc.parameters)
1131+
assert_equal([[:opt, :a], [:keyrest, :o]], method(:pmk4).to_proc.parameters)
1132+
assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:pmk5).to_proc.parameters)
1133+
assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:pmk6).to_proc.parameters)
1134+
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:pmk7).to_proc.parameters)
11031135

11041136
assert_equal([], "".method(:upcase).to_proc.parameters)
11051137
assert_equal([[:rest]], "".method(:gsub).to_proc.parameters)
@@ -1209,7 +1241,7 @@ def test_overridden_proc
12091241
end
12101242

12111243
def get_binding if: 1, case: 2, when: 3, begin: 4, end: 5
1212-
a = 0
1244+
a ||= 0
12131245
binding
12141246
end
12151247

version.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define RUBY_VERSION "2.1.1"
22
#define RUBY_RELEASE_DATE "2014-02-22"
3-
#define RUBY_PATCHLEVEL 73
3+
#define RUBY_PATCHLEVEL 74
44

55
#define RUBY_RELEASE_YEAR 2014
66
#define RUBY_RELEASE_MONTH 2

0 commit comments

Comments
 (0)