Fix infinite loop in running macro to EOF
To test fix, try making file ``` f f ``` and recording macro of find/replace form searching for f, then running until EOF. This does not break any existing behavior, including: - macros where the cursor moves towards EOF but line num doesn't change (those already stopped after one iteration) - macros where line(s) are deleted with every iteration (even if line number doesn't change, they run until file empty) - macros where the line number increases with each iteration - macros where the cursor advances up or down with each iteration but would eventually stop anyway (those end at the correct time) Fix #13342, close #13587
This commit is contained in:
parent
61503a2dcd
commit
96ff66b225
|
@ -1471,6 +1471,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
|
||||||
int indexMacro = _runMacroDlg.getMacro2Exec();
|
int indexMacro = _runMacroDlg.getMacro2Exec();
|
||||||
intptr_t deltaLastLine = 0;
|
intptr_t deltaLastLine = 0;
|
||||||
intptr_t deltaCurrLine = 0;
|
intptr_t deltaCurrLine = 0;
|
||||||
|
bool cursorMovedUp = false;
|
||||||
|
|
||||||
Macro m = _macro;
|
Macro m = _macro;
|
||||||
|
|
||||||
|
@ -1492,7 +1493,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
|
||||||
}
|
}
|
||||||
else // run until eof
|
else // run until eof
|
||||||
{
|
{
|
||||||
bool cursorMovedUp = deltaCurrLine < 0;
|
if (counter > 2 && cursorMovedUp != (deltaCurrLine < 0) && deltaLastLine >= 0)
|
||||||
|
{
|
||||||
|
// the current line must be monotonically increasing or monotonically
|
||||||
|
// decreasing. Otherwise we don't know that the loop will end,
|
||||||
|
// unless the number of lines is decreasing with every iteration.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cursorMovedUp = deltaCurrLine < 0;
|
||||||
deltaLastLine = _pEditView->execute(SCI_GETLINECOUNT) - 1 - lastLine;
|
deltaLastLine = _pEditView->execute(SCI_GETLINECOUNT) - 1 - lastLine;
|
||||||
deltaCurrLine = _pEditView->getCurrentLineNumber() - currLine;
|
deltaCurrLine = _pEditView->getCurrentLineNumber() - currLine;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue