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>
|
||||
|
||||
* 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 **result = (NODE **)h;
|
||||
node->nd_alen = 2;
|
||||
node->nd_next->nd_end = node->nd_next;
|
||||
node->nd_next->nd_next = 0;
|
||||
if (*result)
|
||||
list_concat(*result, node);
|
||||
else
|
||||
|
@ -9618,21 +9615,25 @@ remove_duplicate_keys(struct parser_params *parser, NODE *hash)
|
|||
NODE *result = 0;
|
||||
while (hash && hash->nd_head && hash->nd_next) {
|
||||
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;
|
||||
if (nd_type(head) == NODE_LIT) {
|
||||
key = head->nd_lit;
|
||||
if (st_lookup(literal_keys, key, &data)) {
|
||||
rb_compile_warn(ruby_sourcefile, nd_line((NODE *)data),
|
||||
"duplicated key at line %d ignored: %+"PRIsVALUE,
|
||||
nd_line(head), head->nd_lit);
|
||||
}
|
||||
hash->nd_alen = 2;
|
||||
value->nd_end = value;
|
||||
value->nd_next = 0;
|
||||
if (nd_type(head) == NODE_LIT &&
|
||||
st_lookup(literal_keys, (key = head->nd_lit), &data)) {
|
||||
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 {
|
||||
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 = hash->nd_next->nd_next;
|
||||
hash = next;
|
||||
}
|
||||
st_foreach(literal_keys, append_literal_keys, (st_data_t)&result);
|
||||
st_free_table(literal_keys);
|
||||
|
|
|
@ -120,6 +120,21 @@ class TestSyntax < Test::Unit::TestCase
|
|||
assert_raise(ArgumentError) {o.kw(**h)}
|
||||
h = {"k1"=>11, k2: 12}
|
||||
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
|
||||
|
||||
def test_keyword_self_reference
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue