From 8a80afcab546f0f183f458f6432f7b91a82fa0ae Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sun, 9 Jun 2019 22:35:05 +0200 Subject: [PATCH] Fix bug #11595 Avoid an endless loop when in the definition of a macro the macro itself is used in the LyX representation part. --- src/mathed/InsetMathMacro.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp index 5269df005f..5e72eecdc2 100644 --- a/src/mathed/InsetMathMacro.cpp +++ b/src/mathed/InsetMathMacro.cpp @@ -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); } -- 2.39.5