diff options
| author | yui-knk <spiketeika@gmail.com> | 2024-03-19 18:17:46 +0900 |
|---|---|---|
| committer | Yuichiro Kaneko <spiketeika@gmail.com> | 2024-03-21 11:29:09 +0900 |
| commit | 8ba4d7d75fd231b61727eb0561eb686c1d67bfd4 (patch) | |
| tree | 219f536797366539ec276ba0d6c765a632bd2250 /parse.y | |
| parent | 6650b3aecf6bd3f4bce10a9f1a615683020af186 (diff) | |
Fix unexpected node bug for `shareable_constant_value: literal`
[Bug #20339]
[Bug #20341]
`const_decl_path` changes the value of `NODE **dest`, LHS of an assignment,
with `NODE_LIT` created by `const_decl_path`. `shareable_literal_constant` calls
`const_decl_path` via `ensure_shareable_node` multiple times if RHS of an assignment
is array or hash. This means `NODE **dest` argument of `const_decl_path` can be `NODE_LIT`
from the second time then causes `[BUG] unexpected node: NODE_LIT` in
`rb_node_const_decl_val`.
This commit change to not update `NODE **dest` in `const_decl_path` to
fix the issue.
Diffstat (limited to 'parse.y')
| -rw-r--r-- | parse.y | 20 |
1 files changed, 10 insertions, 10 deletions
@@ -14068,13 +14068,13 @@ mark_lvar_used(struct parser_params *p, NODE *rhs) } static NODE * -const_decl_path(struct parser_params *p, NODE **dest) +const_decl_path(struct parser_params *p, NODE *dest) { - NODE *n = *dest; - if (!nd_type_p(n, NODE_CALL)) { - const YYLTYPE *loc = &n->nd_loc; - VALUE path = rb_node_const_decl_val(n); - *dest = n = NEW_LIT(path, loc); + NODE *n = dest; + if (!nd_type_p(dest, NODE_CALL)) { + const YYLTYPE *loc = &dest->nd_loc; + VALUE path = rb_node_const_decl_val(dest); + n = NEW_LIT(path, loc); RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_LIT(n)->nd_lit); } return n; @@ -14096,7 +14096,7 @@ make_shareable_node(struct parser_params *p, NODE *value, bool copy, const YYLTY } static NODE * -ensure_shareable_node(struct parser_params *p, NODE **dest, NODE *value, const YYLTYPE *loc) +ensure_shareable_node(struct parser_params *p, NODE *dest, NODE *value, const YYLTYPE *loc) { NODE *fcore = NEW_LIT(rb_mRubyVMFrozenCore, loc); NODE *args = NEW_LIST(value, loc); @@ -14147,7 +14147,7 @@ shareable_literal_value(struct parser_params *p, NODE *node) static NODE * shareable_literal_constant(struct parser_params *p, enum shareability shareable, - NODE **dest, NODE *value, const YYLTYPE *loc, size_t level) + NODE *dest, NODE *value, const YYLTYPE *loc, size_t level) { # define shareable_literal_constant_next(n) \ shareable_literal_constant(p, shareable, dest, (n), &(n)->nd_loc, level+1) @@ -14297,7 +14297,7 @@ shareable_constant_value(struct parser_params *p, enum shareability shareable, case shareable_literal: { - NODE *lit = shareable_literal_constant(p, shareable, &lhs, value, loc, 0); + NODE *lit = shareable_literal_constant(p, shareable, lhs, value, loc, 0); if (lit) return lit; return value; } @@ -14306,7 +14306,7 @@ shareable_constant_value(struct parser_params *p, enum shareability shareable, case shareable_copy: case shareable_everything: { - NODE *lit = shareable_literal_constant(p, shareable, &lhs, value, loc, 0); + NODE *lit = shareable_literal_constant(p, shareable, lhs, value, loc, 0); if (lit) return lit; return make_shareable_node(p, value, shareable == shareable_copy, loc); } |
