From 1565bcaff401366937c800d8f4617df2b4f68271 Mon Sep 17 00:00:00 2001 From: Luboš Luňák <l.lunak@collabora.com> Date: Tue, 28 Jan 2020 15:55:33 +0100 Subject: avoid compilerplugin's sharedvisitor bailing out prematurely MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The simplifyconstruct test can return false from a Visit*() function (thus ending the whole traversal) because anyPluginActive() would return false just because a plugin would be temporarily disabled in Traverse*() because of its PreTraverse*() returning false. Keep a count of temporarily disabled plugins to prevent this. Change-Id: I413d88749257acff2220182d13e8fcd0f7289540 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87636 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com> --- compilerplugins/clang/sharedvisitor/generator.cxx | 28 +++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'compilerplugins/clang') diff --git a/compilerplugins/clang/sharedvisitor/generator.cxx b/compilerplugins/clang/sharedvisitor/generator.cxx index 38e6527a7bb3..e62b27fd6422 100644 --- a/compilerplugins/clang/sharedvisitor/generator.cxx +++ b/compilerplugins/clang/sharedvisitor/generator.cxx @@ -141,7 +141,15 @@ void generateVisitor( PluginType type ) " : FilteringPlugin(rData)\n"; for( const PluginInfo& plugin : plugins[ type ] ) output << " , " << plugin.variableName << "( nullptr )\n"; - output << " {}\n"; + output << " , activeRefCount( 0 )\n"; + output << " {}\n"; + + output << +" ~SharedRecursiveASTVisitor" << pluginTypeNames[ type ] << "()\n" +" {\n" +" if( activeRefCount != 0 )\n" +" abort();\n" +" }\n"; output << " virtual bool preRun() override\n" @@ -251,7 +259,10 @@ void generateVisitor( PluginType type ) output << " if( !" << plugin.variableName << "->Pre" << traverse.name << "( arg ))\n"; // This will disable the plugin for the time of the traverse, until restored later, // just like directly returning from Traverse* would skip that part. + output << " {\n"; output << " " << plugin.variableName << " = nullptr;\n"; + output << " ++activeRefCount;\n"; + output << " }\n"; output << " }\n"; } } @@ -271,6 +282,8 @@ void generateVisitor( PluginType type ) output << " save" << plugin.className << " = nullptr;\n"; output << " }\n"; } + output << " if( " << plugin.variableName << " == nullptr && save" << plugin.className << " != nullptr )\n"; + output << " --activeRefCount;\n"; output << " " << plugin.variableName << " = save" << plugin.className << ";\n"; } output << " return ret;\n"; @@ -282,21 +295,16 @@ void generateVisitor( PluginType type ) output << " bool anyPluginActive() const\n" -" {\n"; - first = true; +" {\n" +" return activeRefCount > 0"; for( const PluginInfo& plugin : plugins[ type ] ) - { - if( first ) - output << " return " << plugin.variableName << " != nullptr"; - else - output << "\n || " << plugin.variableName << " != nullptr"; - first = false; - } + output << "\n || " << plugin.variableName << " != nullptr"; output << ";\n"; output << " }\n"; for( const PluginInfo& plugin : plugins[ type ] ) output << " " << plugin.className << "* " << plugin.variableName << ";\n"; + output << " int activeRefCount;\n"; output << "};\n" -- cgit