forked from LibreOffice/core
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
look for places we should be using std::as_const on for-range loops over uno::Sequence, to avoid triggering a copy Change-Id: I7efb641bf09d37c87946f03428ee4eec90298c8a Reviewed-on: https://gerrit.libreoffice.org/77441 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
- Loading branch information
Noel Grandin
committed
Aug 16, 2019
1 parent
abeab40
commit 7d7a786
Showing
17 changed files
with
138 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | ||
/* | ||
* This file is part of the LibreOffice project. | ||
* | ||
* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
|
||
#include <cassert> | ||
#include <string> | ||
#include <iostream> | ||
#include <fstream> | ||
#include <set> | ||
|
||
#include <clang/AST/CXXInheritance.h> | ||
#include "plugin.hxx" | ||
#include "check.hxx" | ||
|
||
/** | ||
When used in "for" loops, css::uno::Sequence objects tend to end up calling the non-const begin()/end(), | ||
which is considerably more expensive than the const variants because it forces a local copy | ||
of the internal ref-counted impl object. | ||
*/ | ||
|
||
namespace | ||
{ | ||
class SequenceLoop : public loplugin::FilteringPlugin<SequenceLoop> | ||
{ | ||
public: | ||
explicit SequenceLoop(loplugin::InstantiationData const& data) | ||
: FilteringPlugin(data) | ||
{ | ||
} | ||
|
||
virtual void run() override | ||
{ | ||
if (preRun()) | ||
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); | ||
} | ||
|
||
bool VisitCXXForRangeStmt(CXXForRangeStmt const*); | ||
}; | ||
|
||
bool SequenceLoop::VisitCXXForRangeStmt(CXXForRangeStmt const* forStmt) | ||
{ | ||
if (ignoreLocation(forStmt)) | ||
return true; | ||
|
||
auto tc = loplugin::TypeCheck(forStmt->getRangeInit()->getType()); | ||
if (tc.Const()) | ||
return true; | ||
if (!tc.Class("Sequence") | ||
.Namespace("uno") | ||
.Namespace("star") | ||
.Namespace("sun") | ||
.Namespace("com") | ||
.GlobalNamespace()) | ||
return true; | ||
const VarDecl* varDecl = forStmt->getLoopVariable(); | ||
auto tc2 = loplugin::TypeCheck(varDecl->getType()); | ||
if (!tc2.LvalueReference().Const()) | ||
return true; | ||
|
||
report(DiagnosticsEngine::Warning, | ||
"use std::as_const, or make range var const, to avoid creating a copy of the Sequence", | ||
compat::getBeginLoc(forStmt)) | ||
<< forStmt->getSourceRange(); | ||
return true; | ||
} | ||
|
||
loplugin::Plugin::Registration<SequenceLoop> X("sequenceloop"); | ||
|
||
} // namespace | ||
|
||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ | ||
/* | ||
* This file is part of the LibreOffice project. | ||
* | ||
* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
|
||
#include <com/sun/star/uno/Sequence.hxx> | ||
#include <com/sun/star/uno/XInterface.hpp> | ||
#include <utility> | ||
|
||
namespace test1 | ||
{ | ||
void foo(css::uno::Sequence<css::uno::Reference<css::uno::XInterface>>& aSeq) | ||
{ | ||
// expected-error@+1 {{use std::as_const, or make range var const, to avoid creating a copy of the Sequence [loplugin:sequenceloop]}} | ||
for (const auto& x : aSeq) | ||
x.get(); | ||
// no warning expected | ||
for (auto& x : aSeq) | ||
x.get(); | ||
for (const auto& x : std::as_const(aSeq)) | ||
x.get(); | ||
} | ||
// no warning expected | ||
void foo2(const css::uno::Sequence<css::uno::Reference<css::uno::XInterface>>& aSeq) | ||
{ | ||
for (const auto& x : aSeq) | ||
x.get(); | ||
} | ||
}; | ||
|
||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters