mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Fixed not to make non-literal expression shareable [Feature #17273]
Non-literal expression which is not a part of a literal expression is not a subject of `shareable_literal_value: literal`.
This commit is contained in:
parent
6945597f6f
commit
19a98a8791
2 changed files with 11 additions and 8 deletions
18
parse.y
18
parse.y
|
@ -11033,8 +11033,11 @@ shareable_literal_value(NODE *node)
|
||||||
VALUE rb_ractor_make_shareable(VALUE obj);
|
VALUE rb_ractor_make_shareable(VALUE obj);
|
||||||
|
|
||||||
static NODE *
|
static NODE *
|
||||||
shareable_literal_constant(struct parser_params *p, NODE *value, enum shareability shareable, const YYLTYPE *loc)
|
shareable_literal_constant(struct parser_params *p, enum shareability shareable,
|
||||||
|
NODE *value, const YYLTYPE *loc, size_t level)
|
||||||
{
|
{
|
||||||
|
# define shareable_literal_constant_next(n) \
|
||||||
|
shareable_literal_constant(p, shareable, (n), &(n)->nd_loc, level+1)
|
||||||
VALUE lit;
|
VALUE lit;
|
||||||
|
|
||||||
if (!value) return 0;
|
if (!value) return 0;
|
||||||
|
@ -11062,12 +11065,11 @@ shareable_literal_constant(struct parser_params *p, NODE *value, enum shareabili
|
||||||
lit = rb_ary_new();
|
lit = rb_ary_new();
|
||||||
for (NODE *n = value; n; n = n->nd_next) {
|
for (NODE *n = value; n; n = n->nd_next) {
|
||||||
NODE *elt = n->nd_head;
|
NODE *elt = n->nd_head;
|
||||||
if (elt && !(elt = shareable_literal_constant(p, elt, shareable, &elt->nd_loc))) {
|
if (elt && !(elt = shareable_literal_constant_next(elt))) {
|
||||||
if (lit) {
|
if (lit) {
|
||||||
rb_ary_clear(lit);
|
rb_ary_clear(lit);
|
||||||
lit = Qfalse;
|
lit = Qfalse;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if (lit) {
|
if (lit) {
|
||||||
VALUE e = shareable_literal_value(elt);
|
VALUE e = shareable_literal_value(elt);
|
||||||
|
@ -11091,13 +11093,12 @@ shareable_literal_constant(struct parser_params *p, NODE *value, enum shareabili
|
||||||
for (NODE *n = value->nd_head; n; n = n->nd_next->nd_next) {
|
for (NODE *n = value->nd_head; n; n = n->nd_next->nd_next) {
|
||||||
NODE *key = n->nd_head;
|
NODE *key = n->nd_head;
|
||||||
NODE *val = n->nd_next->nd_head;
|
NODE *val = n->nd_next->nd_head;
|
||||||
if ((key && !(key = shareable_literal_constant(p, key, shareable, &key->nd_loc))) ||
|
if ((key && !(key = shareable_literal_constant_next(key))) ||
|
||||||
(val && !(val = shareable_literal_constant(p, val, shareable, &val->nd_loc)))) {
|
(val && !(val = shareable_literal_constant_next(val)))) {
|
||||||
if (lit) {
|
if (lit) {
|
||||||
rb_hash_clear(lit);
|
rb_hash_clear(lit);
|
||||||
lit = Qfalse;
|
lit = Qfalse;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if (lit) {
|
if (lit) {
|
||||||
VALUE k = shareable_literal_value(key);
|
VALUE k = shareable_literal_value(key);
|
||||||
|
@ -11117,11 +11118,12 @@ shareable_literal_constant(struct parser_params *p, NODE *value, enum shareabili
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (shareable == shareable_literal)
|
if (shareable == shareable_literal && level > 0)
|
||||||
yyerror1(loc, "unshareable expression");
|
yyerror1(loc, "unshareable expression");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
|
# undef shareable_literal_constant_next
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE *
|
static NODE *
|
||||||
|
@ -11135,7 +11137,7 @@ shareable_constant_value(struct parser_params *p, NODE *value, enum shareability
|
||||||
case shareable_literal:
|
case shareable_literal:
|
||||||
case shareable_everything:
|
case shareable_everything:
|
||||||
{
|
{
|
||||||
NODE *lit = shareable_literal_constant(p, value, shareable, loc);
|
NODE *lit = shareable_literal_constant(p, shareable, value, loc, 0);
|
||||||
if (lit) return lit;
|
if (lit) return lit;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1189,6 +1189,7 @@ x = __ENCODING__
|
||||||
B = [[2]]
|
B = [[2]]
|
||||||
# shareable_constant_value: literal
|
# shareable_constant_value: literal
|
||||||
C = [["shareable", "constant#{nil}"]]
|
C = [["shareable", "constant#{nil}"]]
|
||||||
|
D = A
|
||||||
|
|
||||||
[A, B, C]
|
[A, B, C]
|
||||||
end;
|
end;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue