Reduce parser stack usage at pattern matching

This commit is contained in:
Nobuyoshi Nakada 2021-10-31 13:49:21 +09:00
Родитель a46c220320
Коммит 1b59ad57ae
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7CD2805BFA3770C6
1 изменённых файлов: 12 добавлений и 12 удалений

24
parse.y
Просмотреть файл

@ -1758,36 +1758,36 @@ expr : command_call
value_expr($1);
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
$<ctxt>$ = p->ctxt;
$<ctxt>2 = p->ctxt;
p->ctxt.in_kwarg = 1;
$<tbl>$ = push_pvtbl(p);
}
{$<tbl>$ = push_pvtbl(p);}
p_top_expr_body
{pop_pvtbl(p, $<tbl>4);}
{
p->ctxt.in_kwarg = $<ctxt>3.in_kwarg;
pop_pvtbl(p, $<tbl>3);
p->ctxt.in_kwarg = $<ctxt>2.in_kwarg;
/*%%%*/
$$ = NEW_CASE3($1, NEW_IN($5, 0, 0, &@5), &@$);
$$ = NEW_CASE3($1, NEW_IN($4, 0, 0, &@4), &@$);
/*% %*/
/*% ripper: case!($1, in!($5, Qnil, Qnil)) %*/
/*% ripper: case!($1, in!($4, Qnil, Qnil)) %*/
}
| arg keyword_in
{
value_expr($1);
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
$<ctxt>$ = p->ctxt;
$<ctxt>2 = p->ctxt;
p->ctxt.in_kwarg = 1;
$<tbl>$ = push_pvtbl(p);
}
{$<tbl>$ = push_pvtbl(p);}
p_top_expr_body
{pop_pvtbl(p, $<tbl>4);}
{
p->ctxt.in_kwarg = $<ctxt>3.in_kwarg;
pop_pvtbl(p, $<tbl>3);
p->ctxt.in_kwarg = $<ctxt>1.in_kwarg;
/*%%%*/
$$ = NEW_CASE3($1, NEW_IN($5, NEW_TRUE(&@5), NEW_FALSE(&@5), &@5), &@$);
$$ = NEW_CASE3($1, NEW_IN($4, NEW_TRUE(&@4), NEW_FALSE(&@4), &@4), &@$);
/*% %*/
/*% ripper: case!($1, in!($5, Qnil, Qnil)) %*/
/*% ripper: case!($1, in!($4, Qnil, Qnil)) %*/
}
| arg %prec tLBRACE_ARG
;