]> git.lyx.org Git - features.git/commitdiff
Fix bug #11595
authorEnrico Forestieri <forenr@lyx.org>
Sun, 9 Jun 2019 20:35:05 +0000 (22:35 +0200)
committerEnrico Forestieri <forenr@lyx.org>
Sat, 22 Jun 2019 19:48:16 +0000 (21:48 +0200)
Avoid an endless loop when in the definition of a macro the macro
itself is used in the LyX representation part.

(cherry picked from commit 1cb2a443b5c09e3a0abc93716aceadd49eee7f56)

src/mathed/InsetMathMacro.cpp
status.23x

index d1bb67d59652e2c5376474807230892b9768ca9e..1164abf06fb0f8acfab3daa682370a43bf974fb6 100644 (file)
@@ -661,17 +661,20 @@ void InsetMathMacro::updateRepresentation(Cursor * cur, MacroContext const & mc,
                values[i].insert(0, MathAtom(proxy));
        }
        // expanding macro with the values
-       // Only update the argument macros if anything was expanded, otherwise
-       // we would get an endless loop (bug 9140). UpdateLocker does not work
-       // in this case, since MacroData::expand() creates new InsetMathMacro
-       // objects, so this would be a different recursion path than the one
-       // protected by UpdateLocker.
-       if (d->macro_->expand(values, d->expanded_)) {
+       // Only update the argument macros if anything was expanded or the LyX
+       // representation part does not contain the macro itself, otherwise we
+       // would get an endless loop (bugs 9140 and 11595). UpdateLocker does
+       // not work in this case, since MacroData::expand() creates new
+       // InsetMathMacro objects, so this would be a different recursion path
+       // than the one protected by UpdateLocker.
+       docstring const & display = d->macro_->display();
+       docstring const latexname = from_ascii("\\") + macroName();
+       if (d->macro_->expand(values, d->expanded_)
+           && !support::contains(display, latexname)) {
                if (utype == OutputUpdate && !d->expanded_.empty())
                        d->expanded_.updateMacros(cur, mc, utype, nesting);
        }
        // get definition for list edit mode
-       docstring const & display = d->macro_->display();
        asArray(display.empty() ? d->macro_->definition() : display,
                d->definition_, Parse::QUIET | Parse::MACRODEF);
 }
index 105ca85395f0cc355e41dcce3983266edf347c04..245a1cd2413eaa01dcf69f28cc7e3efa29c9d473 100644 (file)
@@ -54,6 +54,8 @@ What's new
 
 - Deal properly with orphaned bibitems (bug 7160).
 
+- Fix endless loop when a macro definition references itself (bug 11595).
+
 
 * INTERNALS