[Bug #20033] Dynamic regexp should not assign captures

This commit is contained in:
Nobuyoshi Nakada 2023-12-02 02:29:36 +09:00
Родитель ec83bd7356
Коммит a607d62d8c
3 изменённых файлов: 23 добавлений и 10 удалений

Просмотреть файл

@ -4213,11 +4213,28 @@ compile_dstr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node)
}
static int
compile_dregx(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node)
compile_dregx(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
{
int cnt;
if (!RNODE_DREGX(node)->nd_next) {
VALUE match = RNODE_DREGX(node)->nd_lit;
if (RB_TYPE_P(match, T_REGEXP)) {
if (!popped) {
ADD_INSN1(ret, node, putobject, match);
RB_OBJ_WRITTEN(iseq, Qundef, match);
}
return COMPILE_OK;
}
}
CHECK(compile_dstr_fragments(iseq, ret, node, &cnt));
ADD_INSN2(ret, node, toregexp, INT2FIX(RNODE_DREGX(node)->nd_cflag), INT2FIX(cnt));
if (popped) {
ADD_INSN(ret, node, pop);
}
return COMPILE_OK;
}
@ -9901,14 +9918,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const no
case NODE_EVSTR:
CHECK(compile_evstr(iseq, ret, RNODE_EVSTR(node)->nd_body, popped));
break;
case NODE_DREGX:{
compile_dregx(iseq, ret, node);
if (popped) {
ADD_INSN(ret, node, pop);
}
case NODE_DREGX:
compile_dregx(iseq, ret, node, popped);
break;
}
case NODE_ONCE:{
int ic_index = body->ise_size++;
const rb_iseq_t *block_iseq;

Просмотреть файл

@ -12905,8 +12905,8 @@ new_regexp(struct parser_params *p, NODE *node, int options, const YYLTYPE *loc)
}
if (!RNODE_DREGX(node)->nd_next) {
VALUE src = RNODE_DREGX(node)->nd_lit;
nd_set_type(node, NODE_LIT);
RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_LIT(node)->nd_lit = reg_compile(p, src, options));
VALUE re = reg_compile(p, src, options);
RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_DREGX(node)->nd_lit = re);
}
if (options & RE_OPTION_ONCE) {
node = NEW_ONCE(node, loc);

Просмотреть файл

@ -1071,6 +1071,7 @@ x = __ENCODING__
'(%w();/(?<a>.*)/)',
'(1; (2; 3; (4; /(?<a>.*)/)))',
'(1+1; /(?<a>.*)/)',
'/#{""}(?<a>.*)/',
) do |code, pass|
token = Random.bytes(4).unpack1("H*")
if pass