Skip to content

Commit 1621565

Browse files
authored
Merge pull request #10338 from pguyot/w44/fix-extended_parse_exprs-complexity
stdlib: Fix O(n^2) algorithm in `erl_eval:extended_parse_exprs/1` OTP-19838
2 parents bc3132b + ea29761 commit 1621565

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

lib/stdlib/src/erl_eval.erl

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,11 +2012,15 @@ tokens_fixup([T|Ts]=Ts0) ->
20122012
end.
20132013

20142014
token_fixup(Ts) ->
2015-
{AnnoL, NewTs, FixupTag} = unscannable(Ts),
2016-
String = lists:append([erl_anno:text(A) || A <- AnnoL]),
2017-
_ = validate_tag(FixupTag, String),
2018-
NewAnno = erl_anno:set_text(fixup_text(FixupTag), hd(AnnoL)),
2019-
{{string, NewAnno, String}, NewTs}.
2015+
case unscannable(Ts) of
2016+
{AnnoL, NewTs, FixupTag} ->
2017+
String = lists:append([erl_anno:text(A) || A <- AnnoL]),
2018+
_ = validate_tag(FixupTag, String),
2019+
NewAnno = erl_anno:set_text(fixup_text(FixupTag), hd(AnnoL)),
2020+
{{string, NewAnno, String}, NewTs};
2021+
false ->
2022+
{hd(Ts), tl(Ts)}
2023+
end.
20202024

20212025
unscannable([{'#', A1}, {var, A2, 'Fun'}, {'<', A3}, {atom, A4, _},
20222026
{'.', A5}, {float, A6, _}, {'>', A7}|Ts]) ->
@@ -2033,7 +2037,9 @@ unscannable([{'#', A1}, {var, A2, 'Port'}, {'<', A3}, {float, A4, _},
20332037
{[A1, A2, A3, A4, A5], Ts, port};
20342038
unscannable([{'#', A1}, {var, A2, 'Ref'}, {'<', A3}, {float, A4, _},
20352039
{'.', A5}, {float, A6, _}, {'>', A7}|Ts]) ->
2036-
{[A1, A2, A3, A4, A5, A6, A7], Ts, reference}.
2040+
{[A1, A2, A3, A4, A5, A6, A7], Ts, reference};
2041+
unscannable(_) ->
2042+
false.
20372043

20382044
expr_fixup({string,A,S}=T) ->
20392045
try string_fixup(A, S, T) of

0 commit comments

Comments
 (0)