tdf#143582: Avoid error on clearing leftover return value of a method

SbxValue::Clear happens to not error out on clearing string and some
other types of objects, but for the rest, it calls SbxValue::Put, and
the latter errors out if not CanWrite(). The original test implemented
in commit 24d24debef only checked string
return value, so happened to miss this problem.

See similar code in SbiRuntime::FindElement.

Change-Id: I7c17137cc9e7ee3133ee86a9f701559df66e53b6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127248
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
This commit is contained in:
Mike Kaganski
2021-12-22 16:39:32 +01:00
parent 771e721837
commit 822998f1dc
3 changed files with 6 additions and 3 deletions
+3 -3
View File
@@ -1061,9 +1061,9 @@ void ScMacrosTest::testTdf143582()
aRet >>= aReturnValue;
// Without the fix in place, this test would have failed with
// - Expected: Test
// - Actual : TeTest
CPPUNIT_ASSERT_EQUAL(OUString("Test"), aReturnValue);
// - Expected: Test6
// - Actual : TeTest8
CPPUNIT_ASSERT_EQUAL(OUString("Test6"), aReturnValue);
css::uno::Reference<css::util::XCloseable> xCloseable(xComponent, css::uno::UNO_QUERY_THROW);
xCloseable->close(true);
Binary file not shown.
+3
View File
@@ -245,7 +245,10 @@ constexpr OUStringLiteral BASSCRIPT_PROPERTY_CALLER = u"Caller";
aOldThisComponent = m_documentBasicManager->SetGlobalUNOConstant( "ThisComponent", makeAny( m_xDocumentScriptContext ) );
// tdf#143582 - clear return value of the method before calling it
const SbxFlagBits nSavFlags = m_xMethod->GetFlags();
m_xMethod->SetFlag(SbxFlagBits::ReadWrite | SbxFlagBits::NoBroadcast);
m_xMethod->Clear();
m_xMethod->SetFlags(nSavFlags);
if ( m_caller.hasElements() && m_caller[ 0 ].hasValue() )
{
SbxVariableRef xCallerVar = new SbxVariable( SbxVARIANT );