summaryrefslogtreecommitdiff
path: root/patches/vba/vba-basic-array-erase.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/vba/vba-basic-array-erase.diff')
-rw-r--r--patches/vba/vba-basic-array-erase.diff119
1 files changed, 119 insertions, 0 deletions
diff --git a/patches/vba/vba-basic-array-erase.diff b/patches/vba/vba-basic-array-erase.diff
new file mode 100644
index 000000000..328b1d6d3
--- /dev/null
+++ b/patches/vba/vba-basic-array-erase.diff
@@ -0,0 +1,119 @@
+--- basic/inc/sbx.hxx 2006-10-09 09:57:23.000000000 +0100
++++ basic/inc/sbx.hxx 2006-10-13 11:10:27.000000000 +0100
+@@ -308,6 +309,10 @@ public:
+ void AddDim32( INT32, INT32 );
+ void unoAddDim32( INT32, INT32 );
+ BOOL GetDim32( INT32, INT32&, INT32& ) const;
++ bool hasFixedSize() { return mbHasFixedSize; };
++ void setHasFixedSize( bool bHasFixedSize ) {mbHasFixedSize = bHasFixedSize; };
++private:
++ bool mbHasFixedSize;
+ };
+
+ #endif
+dummy line to avoid confusing diff-mode
+--- basic/source/sbx/sbxarray.cxx 2006-06-19 18:48:50.000000000 +0100
++++ basic/source/sbx/sbxarray.cxx 2006-10-13 11:07:20.000000000 +0100
+@@ -590,7 +590,7 @@ void SbxArray::PutDirect( SbxVariable* p
+ //
+ //////////////////////////////////////////////////////////////////////////
+
+-SbxDimArray::SbxDimArray( SbxDataType t ) : SbxArray( t )
++SbxDimArray::SbxDimArray( SbxDataType t ) : SbxArray( t ), mbHasFixedSize( false )
+ {
+ pFirst = pLast = NULL;
+ nDim = 0;
+@@ -615,6 +615,7 @@ SbxDimArray& SbxDimArray::operator=( con
+ AddDim32( p->nLbound, p->nUbound );
+ p = p->pNext;
+ }
++ this->mbHasFixedSize = rArray.mbHasFixedSize;
+ }
+ return *this;
+ }
+--- basic/source/runtime/step0.cxx 2006-10-09 16:37:40.000000000 +0100
++++ basic/source/runtime/step0.cxx 2006-10-13 11:37:03.000000000 +0100
+@@ -49,6 +49,13 @@
+ #include <com/sun/star/uno/Any.hxx>
+
+ #include <algorithm>
++#include <slist>
++
++struct aDim
++{
++ INT32 lb;
++ INT32 ub;
++};
+
+ SbxVariable* getDefaultProp( SbxVariable* pRef );
+
+@@ -506,7 +513,6 @@ void SbiRuntime::StepDIM()
+ SbxVariableRef refVar = PopVar();
+ DimImpl( refVar );
+ }
+-
+ // #56204 DIM-Funktionalitaet in Hilfsmethode auslagern (step0.cxx)
+ void SbiRuntime::DimImpl( SbxVariableRef refVar )
+ {
+@@ -529,6 +535,8 @@ void SbiRuntime::DimImpl( SbxVariableRef
+ if( ub < lb )
+ Error( SbERR_OUT_OF_RANGE ), ub = lb;
+ pArray->AddDim32( lb, ub );
++ if ( lb != ub )
++ pArray->setHasFixedSize( true );
+ }
+ }
+ else
+@@ -713,11 +721,47 @@ void SbiRuntime::StepERASE()
+ // Typ hart auf den Array-Typ setzen, da eine Variable mit Array
+ // SbxOBJECT ist. Bei REDIM entsteht dann ein SbxOBJECT-Array und
+ // der ursruengliche Typ geht verloren -> Laufzeitfehler
+- USHORT nSavFlags = refVar->GetFlags();
+- refVar->ResetFlag( SBX_FIXED );
+- refVar->SetType( SbxDataType(eType & 0x0FFF) );
+- refVar->SetFlags( nSavFlags );
+- refVar->Clear();
++ //if( SbiRuntime::isVBAEnabled() )
++ bool bCompat = ( pINST && pINST->IsCompatibility() );
++ bool bErase = !bCompat; // default = true if compatibiltiy is off
++ if( bCompat )
++ {
++ SbxBase* pElemObj = refVar->GetObject();
++ SbxDimArray* pDimArray = PTR_CAST(SbxDimArray,pElemObj);
++ if( pDimArray )
++ {
++ if ( pDimArray->hasFixedSize() )
++ {
++ INT32 nDims = pDimArray->GetDims();
++ std::slist< aDim > vDims;
++ std::slist< aDim >::iterator back = vDims.previous(vDims.end());
++ for ( INT32 index=1; index<=nDims; ++index )
++ {
++ aDim dim;
++ if ( pDimArray->GetDim32( index, dim.lb, dim.ub ) )
++ back = vDims.insert_after( back, dim );
++ }
++ // Clear all Value(s) and dims
++ pDimArray->Clear();
++ std::slist< aDim >::iterator pIt = vDims.begin();;
++ std::slist< aDim >::iterator pEnd = vDims.end();;
++ for ( ; pIt != pEnd; ++pIt )
++ pDimArray->AddDim32( pIt->lb, pIt->ub );
++ }
++ else
++ bErase = true;
++ }
++ else
++ bErase = true;
++ }
++ if ( bErase )
++ {
++ USHORT nSavFlags = refVar->GetFlags();
++ refVar->ResetFlag( SBX_FIXED );
++ refVar->SetType( SbxDataType(eType & 0x0FFF) );
++ refVar->SetFlags( nSavFlags );
++ refVar->Clear();
++ }
+ }
+ else
+ if( refVar->IsFixed() )