summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorLaurent Godard <lgodard.libre@laposte.net>2015-09-18 17:06:29 +0200
committerCaolán McNamara <caolanm@redhat.com>2015-10-01 16:36:05 +0100
commitddb45261590939d884ac2bcb1fd258de7b2370da (patch)
treea3d3e5c7117c48355429dbf80b421a2df3ede2a5 /basic
parentcb81ca35d4d4db27f8bd3322fc16aa73d9cf38bb (diff)
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 Reviewed-on: https://gerrit.libreoffice.org/18926 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit db17079fcff6f9a068c499b17f2501cc4c82d10b) Change-Id: Iaa037982d828fef7195615e6eda546b7199a4fe8
Diffstat (limited to 'basic')
-rw-r--r--basic/source/classes/sbxmod.cxx44
-rw-r--r--basic/source/inc/filefmt.hxx3
2 files changed, 41 insertions, 6 deletions
diff --git a/basic/source/classes/sbxmod.cxx b/basic/source/classes/sbxmod.cxx
index 1dc43ff20dae..167a172f0c73 100644
--- a/basic/source/classes/sbxmod.cxx
+++ b/basic/source/classes/sbxmod.cxx
@@ -75,6 +75,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;
@@ -1064,6 +1066,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 );
@@ -1171,7 +1174,9 @@ void SbModule::Run( SbMethod* pMeth )
{
GetSbData()->pInst->EnableCompatibility( true );
}
+
while( pRt->Step() ) {}
+
if( pRt->pNext )
pRt->pNext->unblock();
@@ -2031,14 +2036,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( SbxFlagBits::NoModify );
- nStart = nTempStart;
+
return true;
}
@@ -2046,11 +2072,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;
}
diff --git a/basic/source/inc/filefmt.hxx b/basic/source/inc/filefmt.hxx
index db0b1f6e919f..c9d6ba7c8f95 100644
--- a/basic/source/inc/filefmt.hxx
+++ b/basic/source/inc/filefmt.hxx
@@ -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