Kaydet (Commit) 8fb177b8 authored tarafından Laurent Godard's avatar Laurent Godard Kaydeden (comit) Andras Timar

tdf#94617 allow to store nStart information greater than sal_Int16 limit

- preserve backward compatibility
- nDebugFlag is stored but not used when loaded
- Flag nDebugFlag set the top bit to 1
- stores the multiplier of sal_Int16 limit to reach nStart
- in load, test this flag bit
- rebuild correct nStart
- new B_CURVERSION file format for binary storage macro
- unit test for big modules

Change-Id: Iaa037982d828fef7195615e6eda546b7199a4fe8
Reviewed-on: https://gerrit.libreoffice.org/18926Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
(cherry picked from commit db17079f)
üst 97c393bf
......@@ -77,6 +77,8 @@
#include "sbxmod.hxx"
#include "parser.hxx"
#include <limits>
using namespace com::sun::star;
using namespace com::sun::star::lang;
using namespace com::sun::star::reflection;
......@@ -1068,6 +1070,7 @@ void SbModule::SetVBACompat( bool bCompat )
void SbModule::Run( SbMethod* pMeth )
{
SAL_INFO("basic","About to run " << OUStringToOString( pMeth->GetName(), RTL_TEXTENCODING_UTF8 ).getStr() << ", vba compatmode is " << mbVBACompat );
static sal_uInt16 nMaxCallLevel = 0;
bool bDelInst = ( GetSbData()->pInst == NULL );
......@@ -1175,7 +1178,9 @@ void SbModule::Run( SbMethod* pMeth )
{
GetSbData()->pInst->EnableCompatibility( true );
}
while( pRt->Step() ) {}
if( pRt->pNext )
pRt->pNext->unblock();
......@@ -2035,14 +2040,35 @@ bool SbMethod::LoadData( SvStream& rStrm, sal_uInt16 nVer )
{
if( !SbxMethod::LoadData( rStrm, 1 ) )
return false;
sal_Int16 n;
rStrm.ReadInt16( n );
sal_uInt16 nFlag;
rStrm.ReadUInt16( nFlag );
sal_Int16 nTempStart = (sal_Int16)nStart;
if( nVer == 2 )
{
rStrm.ReadUInt16( nLine1 ).ReadUInt16( nLine2 ).ReadInt16( nTempStart ).ReadCharAsBool( bInvalid );
//tdf#94617
if (nFlag & 0x8000)
{
sal_uInt16 nMult = nFlag & 0x7FFF;
sal_Int16 nMax = std::numeric_limits<sal_Int16>::max();
nStart = nMult * nMax + nTempStart;
}
else
{
nStart = nTempStart;
}
}
else
{
nStart = nTempStart;
}
// HACK ue to 'Referenz could not be saved'
SetFlag( SBX_NO_MODIFY );
nStart = nTempStart;
return true;
}
......@@ -2050,11 +2076,19 @@ bool SbMethod::StoreData( SvStream& rStrm ) const
{
if( !SbxMethod::StoreData( rStrm ) )
return false;
rStrm.WriteInt16( nDebugFlags )
//tdf#94617
sal_Int16 nMax = std::numeric_limits<sal_Int16>::max();
sal_Int16 nStartTemp = nStart % nMax;
sal_uInt16 nDebugFlagsTemp = nStart / nMax;
nDebugFlagsTemp |= 0x8000;
rStrm.WriteUInt16( nDebugFlagsTemp )
.WriteInt16( nLine1 )
.WriteInt16( nLine2 )
.WriteInt16( nStart )
.WriteInt16( nStartTemp )
.WriteBool( bInvalid );
return true;
}
......
......@@ -40,11 +40,12 @@ class SvStream;
// Version 11: #29955 force anew compilation because of build-inconsistences
// Version 12: aoo#64377 increase code size that basic can handle
// tdf#75973 support user defined types B_USERTYPES in password protected macros
// Version 13: tdf#94617 store methods nStart information greater than sal_Int16 limit
//
#define B_LEGACYVERSION 0x00000011L
#define B_EXT_IMG_VERSION 0x00000012L
#define B_CURVERSION 0x00000012L
#define B_CURVERSION 0x00000013L
// The file contains either a module- or a library-record.
// Those records contain further records. Every record's got
......
......@@ -118,13 +118,37 @@ void ScMacrosTest::testPasswordProtectedStarBasic()
ScDocShell* xDocSh = static_cast<ScDocShell*>(pFoundShell);
ScDocument& rDoc = xDocSh->GetDocument();
// User defined types
SfxObjectShell::CallXScript(
xComponent,
"vnd.sun.Star.script:MyLibrary.Module1.Main?language=Basic&location=document",
aParams, aRet, aOutParamIndex, aOutParam);
OUString aValue = rDoc.GetString(0,0,0);
CPPUNIT_ASSERT_MESSAGE("script did not change the value of Sheet1.A1", aValue == "success");
CPPUNIT_ASSERT_MESSAGE("User defined types script did not change the value of Sheet1.A1", aValue == "success");
// Big Module
SfxObjectShell::CallXScript(
xComponent,
"vnd.sun.Star.script:MyLibrary.BigModule.bigMethod?language=Basic&location=document",
aParams, aRet, aOutParamIndex, aOutParam);
aValue = rDoc.GetString(1,0,0);
CPPUNIT_ASSERT_MESSAGE("Big module script did not change the value of Sheet1.B1", aValue == "success");
// far big method tdf#94617
SfxObjectShell::CallXScript(
xComponent,
"vnd.sun.Star.script:MyLibrary.BigModule.farBigMethod?language=Basic&location=document",
aParams, aRet, aOutParamIndex, aOutParam);
aValue = rDoc.GetString(2,0,0);
CPPUNIT_ASSERT_MESSAGE("Far Method script did not change the value of Sheet1.C1", aValue == "success");
xDocSh->DoClose();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment