]> git.lyx.org Git - features.git/commitdiff
Fix LaTeXFeatures::useLayout() recursion test
authorGeorg Baum <baum@lyx.org>
Sat, 5 Jul 2014 12:37:55 +0000 (14:37 +0200)
committerGeorg Baum <baum@lyx.org>
Sat, 5 Jul 2014 12:37:55 +0000 (14:37 +0200)
It was broken in two ways: It was not threadsafe, and it did never detect
any recursion, since the counter was decremented for each non-recursive call
and never incremented again.

src/LaTeXFeatures.cpp
src/LaTeXFeatures.h

index cb35fdfb83c71beae5a11d5f47895b6cece07cd3..506af187c911d71d574e6d45f6f3f39f142040e2 100644 (file)
@@ -426,10 +426,14 @@ void LaTeXFeatures::require(set<string> const & names)
 
 
 void LaTeXFeatures::useLayout(docstring const & layoutname)
+{
+       useLayout(layoutname, 0);
+}
+
+
+void LaTeXFeatures::useLayout(docstring const & layoutname, int level)
 {
        // Some code to avoid loops in dependency definition
-       // FIXME THREAD
-       static int level = 0;
        const int maxlevel = 30;
        if (level > maxlevel) {
                lyxerr << "LaTeXFeatures::useLayout: maximum level of "
@@ -449,9 +453,7 @@ void LaTeXFeatures::useLayout(docstring const & layoutname)
                require(layout.requires());
 
                if (!layout.depends_on().empty()) {
-                       ++level;
-                       useLayout(layout.depends_on());
-                       --level;
+                       useLayout(layout.depends_on(), level + 1);
                }
                usedLayouts_.push_back(layoutname);
        } else {
@@ -459,8 +461,6 @@ void LaTeXFeatures::useLayout(docstring const & layoutname)
                       << to_utf8(layoutname) << "' does not exist in this class"
                       << endl;
        }
-
-       --level;
 }
 
 
index 71004be4cadc73c130b057f65e79a30ef0692209..be00847f7e80f60b2c5b6755281a588b20d7dea0 100644 (file)
@@ -157,6 +157,8 @@ public:
        docstring const & htmlTitle() const { return htmltitle_; }
 
 private:
+       ///
+       void useLayout(docstring const &, int);
        ///
        std::list<docstring> usedLayouts_;
        ///