[Libreoffice-commits] core.git: Branch 'libreoffice-6-2' - compilerplugins/clang sc/inc sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Mon Mar 4 14:23:59 UTC 2019
compilerplugins/clang/badstatics.cxx | 2 ++
sc/inc/document.hxx | 3 +--
sc/inc/global.hxx | 2 +-
sc/inc/interpretercontext.hxx | 12 +++++++++---
sc/source/core/data/table3.cxx | 4 ++--
sc/source/core/tool/interpretercontext.cxx | 7 +++++++
6 files changed, 22 insertions(+), 8 deletions(-)
New commits:
commit 233c9a12fd578e9a518cf6841d186f2f884d594d
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Mon Feb 25 15:45:43 2019 +0100
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Mon Mar 4 15:23:36 2019 +0100
do not call GetFormatTable() from GetNonThreadedContext() (tdf#121949)
ScDocument dtor calls ClearLookupCaches(), which calls GetNonThreadedContext().
But ScDocument instances used for copy&paste GetFormatTable() fails
on null mxPoolHelper, because ScDocument ctor doesn't set it in such a case.
So set up the pointer in ScInterpreterContext on demand only if actually
needed.
Change-Id: If3811da5bb00a2d7d404c089ee1bf46037a2cddb
Reviewed-on: https://gerrit.libreoffice.org/68350
Tested-by: Jenkins
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
(cherry picked from commit b5c3f38cb8d4121e3303be362e0757d3d3431059)
Reviewed-on: https://gerrit.libreoffice.org/68539
diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx
index 39b99e6de71e..d25b842da0d0 100644
--- a/compilerplugins/clang/badstatics.cxx
+++ b/compilerplugins/clang/badstatics.cxx
@@ -201,6 +201,8 @@ public:
.Class("ScDocument").GlobalNamespace()) // not owning
|| name == "s_pLOKWindowsMap" // LOK only, guarded by assert, and LOK never tries to perform a VCL cleanup
|| name == "gStaticManager" // vcl/source/graphic/Manager.cxx - stores non-owning pointers
+ || name == "aThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning
+ || name == "aNonThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning
) // these variables appear unproblematic
{
return true;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 6a584b47d0a8..3fbe9cd899d5 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -582,8 +582,7 @@ public:
ScInterpreterContext& GetNonThreadedContext() const
{
- // GetFormatTable() asserts that we are not in a threaded calculation
- maInterpreterContext.mpFormatter = GetFormatTable();
+ assert(!IsThreadedGroupCalcInProgress());
return maInterpreterContext;
}
// Uses thread_local.
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index e6a33de7830b..176cfe124518 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -809,7 +809,7 @@ public:
SvNumberFormatter* pFormatter, SvNumFormatType & rCurFmtType );
/// Calc's threaded group calculation is in progress.
- static bool bThreadedGroupCalcInProgress;
+ SC_DLLPUBLIC static bool bThreadedGroupCalcInProgress;
};
// maybe move to dbdata.hxx (?):
diff --git a/sc/inc/interpretercontext.hxx b/sc/inc/interpretercontext.hxx
index 2f3e33040702..9fb2bc3993c5 100644
--- a/sc/inc/interpretercontext.hxx
+++ b/sc/inc/interpretercontext.hxx
@@ -37,7 +37,6 @@ class ScInterpreterContextPool;
struct ScInterpreterContext
{
const ScDocument* mpDoc;
- SvNumberFormatter* mpFormatter;
size_t mnTokenCachePos;
std::vector<formula::FormulaToken*> maTokens;
std::vector<DelayedSetNumberFormat> maDelayedSetNumberFormat;
@@ -48,10 +47,10 @@ struct ScInterpreterContext
ScInterpreterContext(const ScDocument& rDoc, SvNumberFormatter* pFormatter)
: mpDoc(&rDoc)
- , mpFormatter(pFormatter)
, mnTokenCachePos(0)
, maTokens(TOKEN_CACHE_SIZE, nullptr)
, mScLookupCache(nullptr)
+ , mpFormatter(pFormatter)
{
}
@@ -59,7 +58,12 @@ struct ScInterpreterContext
~ScInterpreterContext();
- SvNumberFormatter* GetFormatTable() const { return mpFormatter; }
+ SvNumberFormatter* GetFormatTable() const
+ {
+ if (mpFormatter == nullptr)
+ const_cast<ScInterpreterContext*>(this)->initFormatTable();
+ return mpFormatter;
+ }
private:
friend class ScInterpreterContextPool;
@@ -67,6 +71,8 @@ private:
void SetDocAndFormatter(const ScDocument& rDoc, SvNumberFormatter* pFormatter);
void Cleanup();
void ClearLookupCache();
+ void initFormatTable();
+ SvNumberFormatter* mpFormatter;
};
class ScThreadedInterpreterContextGetterGuard;
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 7ffd5dfec926..f4c43af65a96 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -2409,7 +2409,7 @@ public:
{
sal_uInt32 nNumFmt = pContext ? mrTab.GetNumberFormat(*pContext, ScAddress(nCol, nRow, mrTab.GetTab())) :
mrTab.GetNumberFormat(nCol, nRow);
- SvNumberFormatter* pFormatter = pContext ? pContext->mpFormatter : mrDoc.GetFormatTable();
+ SvNumberFormatter* pFormatter = pContext ? pContext->GetFormatTable() : mrDoc.GetFormatTable();
const SvNumberformat* pEntry = pFormatter->GetEntry(nNumFmt);
if (pEntry)
{
@@ -2483,7 +2483,7 @@ public:
sal_uInt32 nFormat = pContext ? mrTab.GetNumberFormat( *pContext, ScAddress(static_cast<SCCOL>(rEntry.nField), nRow, mrTab.GetTab()) ) :
mrTab.GetNumberFormat( static_cast<SCCOL>(rEntry.nField), nRow );
OUString aStr;
- SvNumberFormatter* pFormatter = pContext ? pContext->mpFormatter : mrDoc.GetFormatTable();
+ SvNumberFormatter* pFormatter = pContext ? pContext->GetFormatTable() : mrDoc.GetFormatTable();
ScCellFormat::GetInputString(rCell, nFormat, aStr, *pFormatter, &mrDoc);
return compareByStringComparator(rEntry, rItem, nullptr, &aStr);
}
diff --git a/sc/source/core/tool/interpretercontext.cxx b/sc/source/core/tool/interpretercontext.cxx
index bc67afca039c..b997effe13c4 100644
--- a/sc/source/core/tool/interpretercontext.cxx
+++ b/sc/source/core/tool/interpretercontext.cxx
@@ -18,6 +18,8 @@
*/
#include <interpretercontext.hxx>
+
+#include <document.hxx>
#include <formula/token.hxx>
#include <lookupcache.hxx>
#include <algorithm>
@@ -47,6 +49,11 @@ void ScInterpreterContext::SetDocAndFormatter(const ScDocument& rDoc, SvNumberFo
mpFormatter = pFormatter;
}
+void ScInterpreterContext::initFormatTable()
+{
+ mpFormatter = mpDoc->GetFormatTable(); // will assert if not main thread
+}
+
void ScInterpreterContext::Cleanup()
{
// Do not disturb mScLookupCache
More information about the Libreoffice-commits
mailing list