summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorTsutomu Uchino <hanya@apache.org>2015-01-08 16:28:11 +0000
committerCaolán McNamara <caolanm@redhat.com>2015-01-09 09:24:44 +0000
commita272f5b7b30f356418ecf28eb95d066f081d1624 (patch)
tree0bd197ceb34dc57d947c9dd8ccf6a137127b58da /basic
parent89b5423c01ab4e4f05f8d73fe7826f64197abe41 (diff)
Resolves: #i63614# fix strange type mismatch when Iif function is used
Second or later compilation uses value type returned by previous execution of code. Use the defined type as return value of the runtime function of Basic always. (cherry picked from commit 7470c682e136a4a89c1e9474bbc79b2d61f31048) Conflicts: basic/inc/basic/sbxmeth.hxx basic/inc/basic/sbxobj.hxx basic/source/runtime/stdobj.cxx basic/source/sbx/sbxobj.cxx Change-Id: I3064e8403286a9c1401ef658bf139bedeae11f17
Diffstat (limited to 'basic')
-rw-r--r--basic/source/comp/parser.cxx10
-rw-r--r--basic/source/runtime/stdobj.cxx2
-rw-r--r--basic/source/sbx/sbxobj.cxx17
3 files changed, 21 insertions, 8 deletions
diff --git a/basic/source/comp/parser.cxx b/basic/source/comp/parser.cxx
index 9ce5bdb6cc8f..ea2976a76847 100644
--- a/basic/source/comp/parser.cxx
+++ b/basic/source/comp/parser.cxx
@@ -161,7 +161,15 @@ SbiSymDef* SbiParser::CheckRTLForSym( const OUString& rSym, SbxDataType eType )
if( pVar->IsA( TYPE(SbxMethod) ) )
{
SbiProcDef* pProc_ = aRtlSyms.AddProc( rSym );
- pProc_->SetType( pVar->GetType() );
+ SbxMethod* pMethod = (SbxMethod*) pVar;
+ if ( pMethod && pMethod->IsRuntimeFunction() )
+ {
+ pProc_->SetType( pMethod->GetRuntimeFunctionReturnType() );
+ }
+ else
+ {
+ pProc_->SetType( pVar->GetType() );
+ }
pDef = pProc_;
}
else
diff --git a/basic/source/runtime/stdobj.cxx b/basic/source/runtime/stdobj.cxx
index f9f0b5424c82..2e4f2a41a589 100644
--- a/basic/source/runtime/stdobj.cxx
+++ b/basic/source/runtime/stdobj.cxx
@@ -802,7 +802,7 @@ SbxVariable* SbiStdObject::Find( const OUString& rName, SbxClassType t )
{
eCT = SbxCLASS_METHOD;
}
- pVar = Make( aName_, eCT, p->eType );
+ pVar = Make( aName_, eCT, p->eType, ( p->nArgs & _FUNCTION ) == _FUNCTION );
pVar->SetUserData( nIndex + 1 );
pVar->SetFlags( nAccess );
}
diff --git a/basic/source/sbx/sbxobj.cxx b/basic/source/sbx/sbxobj.cxx
index 35a0eb2c4858..a7d8d4bf5af3 100644
--- a/basic/source/sbx/sbxobj.cxx
+++ b/basic/source/sbx/sbxobj.cxx
@@ -377,7 +377,7 @@ SbxArray* SbxObject::FindVar( SbxVariable* pVar, sal_uInt16& nArrayIdx )
// If a new object will be established, this object will be indexed,
// if an object of this name exists already.
-SbxVariable* SbxObject::Make( const OUString& rName, SbxClassType ct, SbxDataType dt )
+SbxVariable* SbxObject::Make( const OUString& rName, SbxClassType ct, SbxDataType dt, bool bIsRuntimeFunction )
{
// Is the object already available?
SbxArray* pArray = NULL;
@@ -410,7 +410,7 @@ SbxVariable* SbxObject::Make( const OUString& rName, SbxClassType ct, SbxDataTyp
pVar = new SbxProperty( rName, dt );
break;
case SbxCLASS_METHOD:
- pVar = new SbxMethod( rName, dt );
+ pVar = new SbxMethod( rName, dt, bIsRuntimeFunction );
break;
case SbxCLASS_OBJECT:
pVar = CreateObject( rName );
@@ -964,14 +964,19 @@ void SbxObject::Dump( SvStream& rStrm, bool bFill )
--nLevel;
}
-SbxMethod::SbxMethod( const OUString& r, SbxDataType t )
- : SbxVariable( t )
+SbxMethod::SbxMethod( const OUString& r, SbxDataType t, bool bIsRuntimeFunction )
+ : SbxVariable(t)
+ , mbIsRuntimeFunction(bIsRuntimeFunction)
+ , mbRuntimeFunctionReturnType(t)
{
- SetName( r );
+ SetName(r);
}
SbxMethod::SbxMethod( const SbxMethod& r )
- : SvRefBase( r ), SbxVariable( r )
+ : SvRefBase(r)
+ , SbxVariable(r)
+ , mbIsRuntimeFunction(r.IsRuntimeFunction())
+ , mbRuntimeFunctionReturnType(r.GetRuntimeFunctionReturnType())
{
}