summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-17 13:25:14 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-17 13:25:14 +0000
commit6170db409b52e1048f68fe6a883f40e0ab72be62 (patch)
tree76ee0353d3fedd90b5427fa32789219649885499
parentb66b645230542bf2a1a782d80a7426947a9a273f (diff)
merge revision(s) 49193: [Backport #10719]
* parse.y (assocs, assoc): eliminate splatting empty literal hashes. [ruby-core:67446] [Bug #10719] * compile.c (compile_array_): supprt splatted hash in hash type. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49302 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--compile.c11
-rw-r--r--parse.y36
-rw-r--r--test/ruby/test_syntax.rb7
-rw-r--r--version.h2
5 files changed, 45 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 555a67e2f5..2da23efa28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sat Jan 17 17:56:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (assocs, assoc): eliminate splatting empty literal
+ hashes. [ruby-core:67446] [Bug #10719]
+
+ * compile.c (compile_array_): supprt splatted hash in hash type.
+
Sat Jan 17 16:49:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/readline/readline.c (readline_s_refresh_line): initialize
diff --git a/compile.c b/compile.c
index ac8fad9760..666e1acace 100644
--- a/compile.c
+++ b/compile.c
@@ -2467,11 +2467,14 @@ compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root,
rb_bug("compile_array: This node is not NODE_ARRAY, but %s", ruby_node_name(nd_type(node)));
}
- if (type == COMPILE_ARRAY_TYPE_HASH && !node->nd_head) {
- opt_p = 0;
+ if (type != COMPILE_ARRAY_TYPE_ARRAY && !node->nd_head) {
kw = node->nd_next;
- node = kw->nd_next;
- kw = kw->nd_head;
+ node = 0;
+ if (kw) {
+ opt_p = 0;
+ node = kw->nd_next;
+ kw = kw->nd_head;
+ }
break;
}
if (opt_p && nd_type(node->nd_head) != NODE_LIT) {
diff --git a/parse.y b/parse.y
index fe73627fa0..b8a7c6f864 100644
--- a/parse.y
+++ b/parse.y
@@ -2396,7 +2396,7 @@ aref_args : none
| args ',' assocs trailer
{
/*%%%*/
- $$ = arg_append($1, new_hash($3));
+ $$ = $3 ? arg_append($1, new_hash($3)) : $1;
/*%
$$ = arg_add_assocs($1, $3);
%*/
@@ -2404,7 +2404,7 @@ aref_args : none
| assocs trailer
{
/*%%%*/
- $$ = NEW_LIST(new_hash($1));
+ $$ = $1 ? NEW_LIST(new_hash($1)) : 0;
/*%
$$ = arg_add_assocs(arg_new(), $1);
%*/
@@ -2434,7 +2434,7 @@ opt_call_args : none
| args ',' assocs ','
{
/*%%%*/
- $$ = arg_append($1, new_hash($3));
+ $$ = $3 ? arg_append($1, new_hash($3)) : $1;
/*%
$$ = arg_add_assocs($1, $3);
%*/
@@ -2442,7 +2442,7 @@ opt_call_args : none
| assocs ','
{
/*%%%*/
- $$ = NEW_LIST(new_hash($1));
+ $$ = $1 ? NEW_LIST(new_hash($1)) : 0;
/*%
$$ = arg_add_assocs(arg_new(), $1);
%*/
@@ -2469,7 +2469,7 @@ call_args : command
| assocs opt_block_arg
{
/*%%%*/
- $$ = NEW_LIST(new_hash($1));
+ $$ = NEW_LIST($1 ? new_hash($1) : 0);
$$ = arg_blk_pass($$, $2);
/*%
$$ = arg_add_assocs(arg_new(), $1);
@@ -2479,7 +2479,7 @@ call_args : command
| args ',' assocs opt_block_arg
{
/*%%%*/
- $$ = arg_append($1, new_hash($3));
+ $$ = $3 ? arg_append($1, new_hash($3)) : $1;
$$ = arg_blk_pass($$, $4);
/*%
$$ = arg_add_optblock(arg_add_assocs($1, $3), $4);
@@ -5030,13 +5030,19 @@ assocs : assoc
/*%%%*/
NODE *assocs = $1;
NODE *tail = $3;
- if (assocs->nd_head &&
- !tail->nd_head && nd_type(tail->nd_next) == NODE_ARRAY &&
- nd_type(tail->nd_next->nd_head) == NODE_HASH) {
- /* DSTAR */
- tail = tail->nd_next->nd_head->nd_head;
+ if (!assocs) {
+ assocs = tail;
}
- $$ = list_concat(assocs, tail);
+ else if (tail) {
+ if (assocs->nd_head &&
+ !tail->nd_head && nd_type(tail->nd_next) == NODE_ARRAY &&
+ nd_type(tail->nd_next->nd_head) == NODE_HASH) {
+ /* DSTAR */
+ tail = tail->nd_next->nd_head->nd_head;
+ }
+ assocs = list_concat(assocs, tail);
+ }
+ $$ = assocs;
/*%
$$ = rb_ary_push($1, $3);
%*/
@@ -5074,7 +5080,11 @@ assoc : arg_value tASSOC arg_value
| tDSTAR arg_value
{
/*%%%*/
- $$ = list_append(NEW_LIST(0), $2);
+ if (nd_type($2) == NODE_HASH &&
+ !($2->nd_head && $2->nd_head->nd_alen))
+ $$ = 0;
+ else
+ $$ = list_append(NEW_LIST(0), $2);
/*%
$$ = dispatch1(assoc_splat, $2);
%*/
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index eb63e3dfa7..86c1090c30 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -136,6 +136,13 @@ class TestSyntax < Test::Unit::TestCase
assert_equal([1, 2], a, bug10315)
end
+ def test_keyword_empty_splat
+ assert_separately([], <<-'end;')
+ bug10719 = '[ruby-core:67446] [Bug #10719]'
+ assert_valid_syntax("foo(a: 1, **{})", bug10719)
+ end;
+ end
+
def test_keyword_self_reference
bug9593 = '[ruby-core:61299] [Bug #9593]'
o = Object.new
diff --git a/version.h b/version.h
index 13f71ded10..a86950b100 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.2.0"
#define RUBY_RELEASE_DATE "2015-01-17"
-#define RUBY_PATCHLEVEL 22
+#define RUBY_PATCHLEVEL 23
#define RUBY_RELEASE_YEAR 2015
#define RUBY_RELEASE_MONTH 1