tdf#123025 - ReDim Preserve fails if array is filled by Split
The Split function sets the datatype of the array to SbxVARIANT instead
of SbxSTRING preventing any subsequent assignments to the array and to
the elements itself.
Change-Id: Ib099eee7bfd222c97520ac8970352bcf2b44bc3e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104039
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/basic/qa/basic_coverage/test_split_method.vb b/basic/qa/basic_coverage/test_split_method.vb
index d09e8c3..8f3701e 100644
--- a/basic/qa/basic_coverage/test_split_method.vb
+++ b/basic/qa/basic_coverage/test_split_method.vb
@@ -6,10 +6,27 @@
'
Function doUnitTest as Integer
doUnitTest = 0
' SPLIT
If ( Split( "Hello world" )(1) <> "world" ) Then
doUnitTest = 0
Else
doUnitTest = 1
End If
If ( Split( "Hello world" )(1) <> "world" ) Then Exit Function
' tdf#123025 - split function sets the datatype of the array to empty,
' preventing any subsequent assignments of values to the array and to the elements itself.
Dim arr(1) As String
arr = Split("a/b", "/")
If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
ReDim Preserve arr(1)
If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
ReDim arr(1)
If ( arr(0) <> "" Or arr(1) <> "" ) Then Exit Function
arr(0) = "a"
arr(1) = "b"
If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
ReDim Preserve arr(1)
If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
doUnitTest = 1
End Function
diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx
index 807806e..1dee293 100644
--- a/basic/source/runtime/methods1.cxx
+++ b/basic/source/runtime/methods1.cxx
@@ -1627,13 +1627,15 @@ void SbRtl_Split(StarBASIC *, SbxArray & rPar, bool)
}
}
SbxDimArray* pArray = new SbxDimArray( SbxVARIANT );
// tdf#123025 - split returns an array of substrings
SbxDimArray* pArray = new SbxDimArray( SbxSTRING );
pArray->unoAddDim32( 0, nArraySize-1 );
// insert parameter(s) into the array
for(sal_Int32 i = 0 ; i < nArraySize ; i++ )
{
SbxVariableRef xVar = new SbxVariable( SbxVARIANT );
// tdf#123025 - split returns an array of substrings
SbxVariableRef xVar = new SbxVariable( SbxSTRING );
xVar->PutString( vRet[i] );
pArray->Put32( xVar.get(), &i );
}