From d475caf27819313a22e13a990de1feae818626f6 Mon Sep 17 00:00:00 2001 From: Vincent van Ravesteijn Date: Mon, 14 May 2012 15:04:54 +0200 Subject: [PATCH] Fix bug #7641: Freeze when removing itemized first paragraph Text::outerFont looks recursively for paragraphs before the current one which has a lower depth. If such a paragraph cannot be found, depthHook and outerHook return the current paragraph. As such, we end up in an infinite loop. So, if we find a par_depth that was the same as the previous one, we apparently can't find a suitable paragraph and we should quit the loop. (cherry picked from commit b17250d7eb46cdc58c7288e177282c3ab4448dac) --- src/Text.cpp | 4 +++- src/Text.h | 9 +++++++-- status.20x | 3 +++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Text.cpp b/src/Text.cpp index c1d782f342..1953d163e1 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -243,11 +243,13 @@ Font const Text::outerFont(pit_type par_offset) const { depth_type par_depth = pars_[par_offset].getDepth(); FontInfo tmpfont = inherit_font; - + depth_type prev_par_depth = 0; // Resolve against environment font information while (par_offset != pit_type(pars_.size()) + && par_depth != prev_par_depth && par_depth && !tmpfont.resolved()) { + prev_par_depth = par_depth; par_offset = outerHook(par_offset); if (par_offset != pit_type(pars_.size())) { tmpfont.realize(pars_[par_offset].layout().font); diff --git a/src/Text.h b/src/Text.h index c4da020cce..7b9ca3d05e 100644 --- a/src/Text.h +++ b/src/Text.h @@ -324,9 +324,14 @@ public: bool insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/); /// docstring completionPrefix(Cursor const & cur) const; - /// for the environments + /// find a paragraph before \p par with the given \p depth, if such + /// a paragraph cannot be found, \p par is returned pit_type depthHook(pit_type par, depth_type depth) const; - /// + /// find a paragraph before \p par with depth less than the + /// depth of \p par. If such paragraph cannot be found because + /// \p par already has depth 0, lastpar + 1 is returned. If + /// such paragraph cannot be found because there isn't a par + /// with less depth before this one, \p par is returned. pit_type outerHook(pit_type par) const; /// Is it the first par with same depth and layout? bool isFirstInSequence(pit_type par) const; diff --git a/status.20x b/status.20x index 3bcbb8bb22..8e43bdacf6 100644 --- a/status.20x +++ b/status.20x @@ -130,6 +130,9 @@ What's new - Fixed an infinite loop when pasting '\\ ' into math (bug 8089). +- Fixed an infinite loop after removing the first paragraph of the + document if it had a non-zero depth (bug 7641). + - Fixed problem when setting working directory on Windows to root of a disk, e.g., C:\ (bug 7982). -- 2.39.5