diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2019-12-09 13:06:03 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2019-12-09 14:18:25 +0100 |
commit | 62f3f3d92aa204eaaa063b30d7ade44df501b997 (patch) | |
tree | b241ad744abad62cf898947757e88617811b309c /basic/source/sbx/sbxarray.cxx | |
parent | 6303f8ac291233b1f6888a8d71e769debe0f9fb0 (diff) |
SbxArray: drop 16-bit indices
Change-Id: I43b478187636b9bb53fdf7ab938436ae364bd7a7
Reviewed-on: https://gerrit.libreoffice.org/84733
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'basic/source/sbx/sbxarray.cxx')
-rw-r--r-- | basic/source/sbx/sbxarray.cxx | 157 |
1 files changed, 16 insertions, 141 deletions
diff --git a/basic/source/sbx/sbxarray.cxx b/basic/source/sbx/sbxarray.cxx index 6a3cc720c91d..152ab5a671f4 100644 --- a/basic/source/sbx/sbxarray.cxx +++ b/basic/source/sbx/sbxarray.cxx @@ -89,13 +89,6 @@ sal_uInt32 SbxArray::Count32() const return mVarEntries.size(); } -sal_uInt16 SbxArray::Count() const -{ - sal_uInt32 nCount = mVarEntries.size(); - DBG_ASSERT( nCount <= SBX_MAXINDEX, "SBX: Array-Index > SBX_MAXINDEX" ); - return static_cast<sal_uInt16>(nCount); -} - SbxVariableRef& SbxArray::GetRef32( sal_uInt32 nIdx ) { // If necessary extend the array @@ -112,22 +105,6 @@ SbxVariableRef& SbxArray::GetRef32( sal_uInt32 nIdx ) return mVarEntries[nIdx].mpVar; } -SbxVariableRef& SbxArray::GetRef( sal_uInt16 nIdx ) -{ - // If necessary extend the array - DBG_ASSERT( nIdx <= SBX_MAXINDEX, "SBX: Array-Index > SBX_MAXINDEX" ); - // Very Hot Fix - if( nIdx > SBX_MAXINDEX ) - { - SetError( ERRCODE_BASIC_OUT_OF_RANGE ); - nIdx = 0; - } - if ( mVarEntries.size() <= nIdx ) - mVarEntries.resize(nIdx+1); - - return mVarEntries[nIdx].mpVar; -} - SbxVariable* SbxArray::Get32( sal_uInt32 nIdx ) { if( !CanRead() ) @@ -143,21 +120,6 @@ SbxVariable* SbxArray::Get32( sal_uInt32 nIdx ) return rRef.get(); } -SbxVariable* SbxArray::Get( sal_uInt16 nIdx ) -{ - if( !CanRead() ) - { - SetError( ERRCODE_BASIC_PROP_WRITEONLY ); - return nullptr; - } - SbxVariableRef& rRef = GetRef( nIdx ); - - if ( !rRef.is() ) - rRef = new SbxVariable( eType ); - - return rRef.get(); -} - void SbxArray::Put32( SbxVariable* pVar, sal_uInt32 nIdx ) { if( !CanWrite() ) @@ -170,30 +132,10 @@ void SbxArray::Put32( SbxVariable* pVar, sal_uInt32 nIdx ) if( eType != SbxOBJECT || pVar->GetClass() != SbxClassType::Object ) pVar->Convert( eType ); SbxVariableRef& rRef = GetRef32( nIdx ); - if( rRef.get() != pVar ) - { - rRef = pVar; - SetFlag( SbxFlagBits::Modified ); - } - } -} - -void SbxArray::Put( SbxVariable* pVar, sal_uInt16 nIdx ) -{ - if( !CanWrite() ) - SetError( ERRCODE_BASIC_PROP_READONLY ); - else - { - if( pVar ) - if( eType != SbxVARIANT ) - // Convert no objects - if( eType != SbxOBJECT || pVar->GetClass() != SbxClassType::Object ) - pVar->Convert( eType ); - SbxVariableRef& rRef = GetRef( nIdx ); // tdf#122250. It is possible that I hold the last reference to myself, so check, otherwise I might // call SetFlag on myself after I have died. bool removingMyself = rRef.get() && rRef->GetParameters() == this && GetRefCount() == 1; - if(rRef.get() != pVar ) + if( rRef.get() != pVar ) { rRef = pVar; if (!removingMyself) @@ -202,14 +144,14 @@ void SbxArray::Put( SbxVariable* pVar, sal_uInt16 nIdx ) } } -OUString SbxArray::GetAlias( sal_uInt16 nIdx ) +OUString SbxArray::GetAlias32( sal_uInt32 nIdx ) { if( !CanRead() ) { SetError( ERRCODE_BASIC_PROP_WRITEONLY ); return OUString(); } - SbxVarEntry& rRef = reinterpret_cast<SbxVarEntry&>(GetRef( nIdx )); + SbxVarEntry& rRef = reinterpret_cast<SbxVarEntry&>(GetRef32( nIdx )); if (!rRef.maAlias) return OUString(); @@ -217,7 +159,7 @@ OUString SbxArray::GetAlias( sal_uInt16 nIdx ) return *rRef.maAlias; } -void SbxArray::PutAlias( const OUString& rAlias, sal_uInt16 nIdx ) +void SbxArray::PutAlias32( const OUString& rAlias, sal_uInt32 nIdx ) { if( !CanWrite() ) { @@ -225,7 +167,7 @@ void SbxArray::PutAlias( const OUString& rAlias, sal_uInt16 nIdx ) } else { - SbxVarEntry& rRef = reinterpret_cast<SbxVarEntry&>( GetRef( nIdx ) ); + SbxVarEntry& rRef = reinterpret_cast<SbxVarEntry&>( GetRef32( nIdx ) ); rRef.maAlias = rAlias; } } @@ -259,16 +201,6 @@ void SbxArray::Insert32( SbxVariable* pVar, sal_uInt32 nIdx ) SetFlag( SbxFlagBits::Modified ); } -void SbxArray::Insert( SbxVariable* pVar, sal_uInt16 nIdx ) -{ - DBG_ASSERT( mVarEntries.size() <= 0x3FF0, "SBX: Array gets too big" ); - if( mVarEntries.size() > 0x3FF0 ) - { - return; - } - Insert32( pVar, nIdx ); -} - void SbxArray::Remove( sal_uInt32 nIdx ) { if( nIdx < mVarEntries.size() ) @@ -411,7 +343,7 @@ bool SbxArray::LoadData( SvStream& rStrm, sal_uInt16 /*nVer*/ ) SbxVariable* pVar = static_cast<SbxVariable*>(Load( rStrm )); if( pVar ) { - SbxVariableRef& rRef = GetRef( nIdx ); + SbxVariableRef& rRef = GetRef32( nIdx ); rRef = pVar; } else @@ -501,17 +433,6 @@ void SbxDimArray::AddDimImpl32( sal_Int32 lb, sal_Int32 ub, bool bAllowSize0 ) SetError( eRes ); } - -void SbxDimArray::AddDim( short lb, short ub ) -{ - AddDimImpl32( lb, ub, false ); -} - -void SbxDimArray::unoAddDim( short lb, short ub ) -{ - AddDimImpl32( lb, ub, true ); -} - void SbxDimArray::AddDim32( sal_Int32 lb, sal_Int32 ub ) { AddDimImpl32( lb, ub, false ); @@ -539,23 +460,6 @@ bool SbxDimArray::GetDim32( sal_Int32 n, sal_Int32& rlb, sal_Int32& rub ) const return true; } -bool SbxDimArray::GetDim( short n, short& rlb, short& rub ) const -{ - sal_Int32 rlb32, rub32; - bool bRet = GetDim32( n, rlb32, rub32 ); - rub = static_cast<short>(rub32); - rlb = static_cast<short>(rlb32); - if( bRet ) - { - if( rlb32 < -SBX_MAXINDEX || rub32 > SBX_MAXINDEX ) - { - SetError( ERRCODE_BASIC_OUT_OF_RANGE ); - return false; - } - } - return bRet; -} - // Element-Ptr with the help of an index list sal_uInt32 SbxDimArray::Offset32( const sal_Int32* pIdx ) @@ -578,37 +482,6 @@ sal_uInt32 SbxDimArray::Offset32( const sal_Int32* pIdx ) return nPos; } -sal_uInt16 SbxDimArray::Offset( const short* pIdx ) -{ - long nPos = 0; - for (auto const& vDimension : m_vDimensions) - { - short nIdx = *pIdx++; - if( nIdx < vDimension.nLbound || nIdx > vDimension.nUbound ) - { - nPos = SBX_MAXINDEX + 1; - break; - } - nPos = nPos * vDimension.nSize + nIdx - vDimension.nLbound; - } - if( m_vDimensions.empty() || nPos > SBX_MAXINDEX ) - { - SetError( ERRCODE_BASIC_OUT_OF_RANGE ); - nPos = 0; - } - return static_cast<sal_uInt16>(nPos); -} - -SbxVariable* SbxDimArray::Get( const short* pIdx ) -{ - return SbxArray::Get( Offset( pIdx ) ); -} - -void SbxDimArray::Put( SbxVariable* p, const short* pIdx ) -{ - SbxArray::Put( p, Offset( pIdx ) ); -} - SbxVariable* SbxDimArray::Get32( const sal_Int32* pIdx ) { return SbxArray::Get32( Offset32( pIdx ) ); @@ -624,7 +497,7 @@ sal_uInt32 SbxDimArray::Offset32( SbxArray* pPar ) { #if HAVE_FEATURE_SCRIPTING if (m_vDimensions.empty() || !pPar || - ((m_vDimensions.size() != sal::static_int_cast<size_t>(pPar->Count() - 1)) + ((m_vDimensions.size() != sal::static_int_cast<size_t>(pPar->Count32() - 1)) && SbiRuntime::isVBAEnabled())) { SetError( ERRCODE_BASIC_OUT_OF_RANGE ); @@ -632,10 +505,10 @@ sal_uInt32 SbxDimArray::Offset32( SbxArray* pPar ) } #endif sal_uInt32 nPos = 0; - sal_uInt16 nOff = 1; // Non element 0! + sal_uInt32 nOff = 1; // Non element 0! for (auto const& vDimension : m_vDimensions) { - sal_Int32 nIdx = pPar->Get( nOff++ )->GetLong(); + sal_Int32 nIdx = pPar->Get32( nOff++ )->GetLong(); if( nIdx < vDimension.nLbound || nIdx > vDimension.nUbound ) { nPos = sal_uInt32(SBX_MAXINDEX32)+1; @@ -666,19 +539,21 @@ bool SbxDimArray::LoadData( SvStream& rStrm, sal_uInt16 nVer ) { sal_Int16 lb(0), ub(0); rStrm.ReadInt16( lb ).ReadInt16( ub ); - AddDim( lb, ub ); + AddDim32( lb, ub ); } return SbxArray::LoadData( rStrm, nVer ); } bool SbxDimArray::StoreData( SvStream& rStrm ) const { + assert(m_vDimensions.size() <= sal::static_int_cast<size_t>(std::numeric_limits<sal_Int16>::max())); rStrm.WriteInt16( m_vDimensions.size() ); - for( short i = 0; i < static_cast<short>(m_vDimensions.size()); i++ ) + for( sal_Int32 i = 1; i <= static_cast<sal_Int32>(m_vDimensions.size()); i++ ) { - short lb, ub; - GetDim( i, lb, ub ); - rStrm.WriteInt16( lb ).WriteInt16( ub ); + sal_Int32 lb32, ub32; + GetDim32(i, lb32, ub32); + assert(lb32 >= -SBX_MAXINDEX && ub32 <= SBX_MAXINDEX); + rStrm.WriteInt16(lb32).WriteInt16(ub32); } return SbxArray::StoreData( rStrm ); } |