mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: should not eliminate value nodes
* parse.y (remove_duplicate_keys): should not simply eliminate all value nodes, which may have side effects. [ruby-core:65625] [Bug #10315] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47894 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7fa39b2762
commit
37d0c873f6
3 changed files with 36 additions and 14 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Mon Oct 13 02:39:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (remove_duplicate_keys): should not simply eliminate all
|
||||||
|
value nodes, which may have side effects.
|
||||||
|
[ruby-core:65625] [Bug #10315]
|
||||||
|
|
||||||
Sun Oct 12 10:39:16 2014 Zachary Scott <e@zzak.io>
|
Sun Oct 12 10:39:16 2014 Zachary Scott <e@zzak.io>
|
||||||
|
|
||||||
* vm.c: [DOC] fix typo by @yui-knk [Fixes GH-738]
|
* vm.c: [DOC] fix typo by @yui-knk [Fixes GH-738]
|
||||||
|
|
29
parse.y
29
parse.y
|
@ -9601,9 +9601,6 @@ append_literal_keys(st_data_t k, st_data_t v, st_data_t h)
|
||||||
{
|
{
|
||||||
NODE *node = (NODE *)v;
|
NODE *node = (NODE *)v;
|
||||||
NODE **result = (NODE **)h;
|
NODE **result = (NODE **)h;
|
||||||
node->nd_alen = 2;
|
|
||||||
node->nd_next->nd_end = node->nd_next;
|
|
||||||
node->nd_next->nd_next = 0;
|
|
||||||
if (*result)
|
if (*result)
|
||||||
list_concat(*result, node);
|
list_concat(*result, node);
|
||||||
else
|
else
|
||||||
|
@ -9618,21 +9615,25 @@ remove_duplicate_keys(struct parser_params *parser, NODE *hash)
|
||||||
NODE *result = 0;
|
NODE *result = 0;
|
||||||
while (hash && hash->nd_head && hash->nd_next) {
|
while (hash && hash->nd_head && hash->nd_next) {
|
||||||
NODE *head = hash->nd_head;
|
NODE *head = hash->nd_head;
|
||||||
VALUE key = 0;
|
NODE *value = hash->nd_next;
|
||||||
|
NODE *next = value->nd_next;
|
||||||
|
VALUE key = (VALUE)head;
|
||||||
st_data_t data;
|
st_data_t data;
|
||||||
if (nd_type(head) == NODE_LIT) {
|
hash->nd_alen = 2;
|
||||||
key = head->nd_lit;
|
value->nd_end = value;
|
||||||
if (st_lookup(literal_keys, key, &data)) {
|
value->nd_next = 0;
|
||||||
rb_compile_warn(ruby_sourcefile, nd_line((NODE *)data),
|
if (nd_type(head) == NODE_LIT &&
|
||||||
"duplicated key at line %d ignored: %+"PRIsVALUE,
|
st_lookup(literal_keys, (key = head->nd_lit), &data)) {
|
||||||
nd_line(head), head->nd_lit);
|
rb_compile_warn(ruby_sourcefile, nd_line((NODE *)data),
|
||||||
}
|
"duplicated key at line %d ignored: %+"PRIsVALUE,
|
||||||
|
nd_line(head), head->nd_lit);
|
||||||
|
head = ((NODE *)data)->nd_next;
|
||||||
|
head->nd_head = block_append(head->nd_head, value->nd_head);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
key = (VALUE)head;
|
st_insert(literal_keys, (st_data_t)key, (st_data_t)hash);
|
||||||
}
|
}
|
||||||
st_insert(literal_keys, (st_data_t)key, (st_data_t)hash);
|
hash = next;
|
||||||
hash = hash->nd_next->nd_next;
|
|
||||||
}
|
}
|
||||||
st_foreach(literal_keys, append_literal_keys, (st_data_t)&result);
|
st_foreach(literal_keys, append_literal_keys, (st_data_t)&result);
|
||||||
st_free_table(literal_keys);
|
st_free_table(literal_keys);
|
||||||
|
|
|
@ -120,6 +120,21 @@ class TestSyntax < Test::Unit::TestCase
|
||||||
assert_raise(ArgumentError) {o.kw(**h)}
|
assert_raise(ArgumentError) {o.kw(**h)}
|
||||||
h = {"k1"=>11, k2: 12}
|
h = {"k1"=>11, k2: 12}
|
||||||
assert_raise(TypeError) {o.kw(**h)}
|
assert_raise(TypeError) {o.kw(**h)}
|
||||||
|
|
||||||
|
bug10315 = '[ruby-core:65625] [Bug #10315]'
|
||||||
|
a = []
|
||||||
|
def a.add(x) push(x); x; end
|
||||||
|
def a.f(k:) k; end
|
||||||
|
a.clear
|
||||||
|
r = nil
|
||||||
|
assert_warn(/duplicated/) {r = eval("a.f(k: a.add(1), k: a.add(2))")}
|
||||||
|
assert_equal(2, r)
|
||||||
|
assert_equal([1, 2], a, bug10315)
|
||||||
|
a.clear
|
||||||
|
r = nil
|
||||||
|
assert_warn(/duplicated/) {r = eval("a.f({k: a.add(1), k: a.add(2)})")}
|
||||||
|
assert_equal(2, r)
|
||||||
|
assert_equal([1, 2], a, bug10315)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_keyword_self_reference
|
def test_keyword_self_reference
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue