diff options
author | Tsutomu Uchino <hanya@apache.org> | 2015-01-08 16:28:11 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-01-09 09:24:44 +0000 |
commit | a272f5b7b30f356418ecf28eb95d066f081d1624 (patch) | |
tree | 0bd197ceb34dc57d947c9dd8ccf6a137127b58da | |
parent | 89b5423c01ab4e4f05f8d73fe7826f64197abe41 (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
-rw-r--r-- | basic/source/comp/parser.cxx | 10 | ||||
-rw-r--r-- | basic/source/runtime/stdobj.cxx | 2 | ||||
-rw-r--r-- | basic/source/sbx/sbxobj.cxx | 17 | ||||
-rw-r--r-- | include/basic/sbxmeth.hxx | 6 | ||||
-rw-r--r-- | include/basic/sbxobj.hxx | 2 |
5 files changed, 27 insertions, 10 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()) { } diff --git a/include/basic/sbxmeth.hxx b/include/basic/sbxmeth.hxx index 6d8be5c51d62..e7d9cae5c17e 100644 --- a/include/basic/sbxmeth.hxx +++ b/include/basic/sbxmeth.hxx @@ -25,14 +25,18 @@ class BASIC_DLLPUBLIC SbxMethod : public SbxVariable { + bool mbIsRuntimeFunction; + SbxDataType mbRuntimeFunctionReturnType; public: SBX_DECL_PERSIST_NODATA(SBXCR_SBX,SBXID_METHOD,1); TYPEINFO_OVERRIDE(); - SbxMethod( const OUString& r, SbxDataType t ); + SbxMethod( const OUString& r, SbxDataType t, bool bIsRuntimeFunction=false ); SbxMethod( const SbxMethod& r ); virtual ~SbxMethod(); SbxMethod& operator=( const SbxMethod& r ) { SbxVariable::operator=( r ); return *this; } virtual SbxClassType GetClass() const SAL_OVERRIDE; + bool IsRuntimeFunction() const { return mbIsRuntimeFunction; } + SbxDataType GetRuntimeFunctionReturnType() const{ return mbRuntimeFunctionReturnType; } }; #endif diff --git a/include/basic/sbxobj.hxx b/include/basic/sbxobj.hxx index c6c09cf5ffe8..004e14b34d3d 100644 --- a/include/basic/sbxobj.hxx +++ b/include/basic/sbxobj.hxx @@ -68,7 +68,7 @@ public: SbxVariable* Execute( const OUString& ); // Manage elements virtual bool GetAll( SbxClassType ) { return true; } - SbxVariable* Make( const OUString&, SbxClassType, SbxDataType ); + SbxVariable* Make( const OUString&, SbxClassType, SbxDataType, bool bIsRuntimeFunction = false ); virtual SbxObject* MakeObject( const OUString&, const OUString& ); virtual void Insert( SbxVariable* ); // AB 23.4.1997, Optimization, Insertion without check for duplicate Entries and |