Skip to content

Commit

Permalink
process_inlines: remove closers from delim stack when possible.
Browse files Browse the repository at this point in the history
When they have no matching openers and cannot be openers themselves,
we can safely remove them.

This helps with a performance case: "a_ " * 20000.

See commonmark/commonmark.js#43.
  • Loading branch information
jgm committed Jun 10, 2015
1 parent a79b2ed commit e1db44b
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/inlines.c
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,8 @@ static void process_emphasis(subject *subj, delimiter *start_delim)
{
delimiter *closer = subj->last_delim;
delimiter *opener;
delimiter *old_closer;
bool opener_not_found;

// move back to first relevant delim.
while (closer != NULL && closer->previous != start_delim) {
Expand All @@ -459,6 +461,9 @@ static void process_emphasis(subject *subj, delimiter *start_delim)
}
opener = opener->previous;
}
opener_not_found = opener == NULL ||
opener == start_delim;
old_closer = closer;
if (closer->delim_char == '*' || closer->delim_char == '_') {
if (opener != NULL && opener != start_delim) {
closer = S_insert_emph(subj, opener, closer);
Expand Down Expand Up @@ -486,6 +491,12 @@ static void process_emphasis(subject *subj, delimiter *start_delim)
}
closer = closer->next;
}
if (opener_not_found && !old_closer->can_open) {
// we can remove a closer that can't be an
// opener, once we've seen there's no
// matching opener:
remove_delimiter(subj, old_closer);
}
} else {
closer = closer->next;
}
Expand Down

0 comments on commit e1db44b

Please sign in to comment.