basic/inc/basic/sbxmeth.hxx     |   11 ++++++++---
 basic/inc/basic/sbxobj.hxx      |    2 +-
 basic/source/comp/parser.cxx    |   10 +++++++++-
 basic/source/runtime/stdobj.cxx |    2 +-
 basic/source/sbx/sbxobj.cxx     |    4 ++--
 5 files changed, 21 insertions(+), 8 deletions(-)

New commits:
commit 7470c682e136a4a89c1e9474bbc79b2d61f31048
Author: Tsutomu Uchino <ha...@apache.org>
Date:   Thu Jan 8 16:28:11 2015 +0000

    #i63614# fix strange type missmatch when Iif runtime 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.

diff --git a/basic/inc/basic/sbxmeth.hxx b/basic/inc/basic/sbxmeth.hxx
index dc25ee9..7fa7eed 100644
--- a/basic/inc/basic/sbxmeth.hxx
+++ b/basic/inc/basic/sbxmeth.hxx
@@ -31,17 +31,22 @@ class SbxMethodImpl;
 class SbxMethod : public SbxVariable
 {
     SbxMethodImpl* mpSbxMethodImpl; // Impl data
+    bool           mbIsRuntimeFunction;
+    SbxDataType    mbRuntimeFunctionReturnType;
 
 public:
     SBX_DECL_PERSIST_NODATA(SBXCR_SBX,SBXID_METHOD,1);
     TYPEINFO();
-    SbxMethod( const String& r, SbxDataType t )
-    : SbxVariable( t ) { SetName( r ); }
-    SbxMethod( const SbxMethod& r ) : SvRefBase( r ), SbxVariable( r ) {}
+    SbxMethod( const String& r, SbxDataType t, bool bIsRuntimeFunction=false )
+    : SbxVariable( t ), mbIsRuntimeFunction( bIsRuntimeFunction ), 
mbRuntimeFunctionReturnType( t ) { SetName( r ); }
+    SbxMethod( const SbxMethod& r )
+    : SvRefBase( r ), SbxVariable( r ), mbIsRuntimeFunction( 
r.IsRuntimeFunction() ) {}
     SbxMethod& operator=( const SbxMethod& r )
     { SbxVariable::operator=( r ); return *this; }
     sal_Bool Run( SbxValues* pValues = NULL );
     virtual SbxClassType GetClass() const;
+    bool IsRuntimeFunction() const { return mbIsRuntimeFunction; }
+    SbxDataType GetRuntimeFunctionReturnType() const{ return 
mbRuntimeFunctionReturnType; }
 };
 
 #ifndef __SBX_SBXMETHODREF_HXX
diff --git a/basic/inc/basic/sbxobj.hxx b/basic/inc/basic/sbxobj.hxx
index 989ea40..f78d453 100644
--- a/basic/inc/basic/sbxobj.hxx
+++ b/basic/inc/basic/sbxobj.hxx
@@ -80,7 +80,7 @@ public:
     SbxVariable* Execute( const String& );
     // Manage elements
     virtual sal_Bool GetAll( SbxClassType ) { return sal_True; }
-    SbxVariable* Make( const String&, SbxClassType, SbxDataType );
+    SbxVariable* Make( const String&, SbxClassType, SbxDataType, bool 
bIsRuntimeFunction = false );
     virtual SbxObject* MakeObject( const String&, const String& );
     virtual void Insert( SbxVariable* );
     // AB 23.4.1997, Optimization, Insertion without check for duplicate 
Entries and
diff --git a/basic/source/comp/parser.cxx b/basic/source/comp/parser.cxx
index 85c4920..b06e997 100644
--- a/basic/source/comp/parser.cxx
+++ b/basic/source/comp/parser.cxx
@@ -169,7 +169,15 @@ SbiSymDef* SbiParser::CheckRTLForSym( const String& 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 8e1058a..eb3cdcc 100644
--- a/basic/source/runtime/stdobj.cxx
+++ b/basic/source/runtime/stdobj.cxx
@@ -715,7 +715,7 @@ SbxVariable* SbiStdObject::Find( const String& rName, 
SbxClassType t )
                 eCT = SbxCLASS_PROPERTY;
             else if( nType & _METHOD )
                 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 9934331..ce30eed 100644
--- a/basic/source/sbx/sbxobj.cxx
+++ b/basic/source/sbx/sbxobj.cxx
@@ -376,7 +376,7 @@ SbxArray* SbxObject::FindVar( SbxVariable* pVar, 
sal_uInt16& nArrayIdx )
 // Falls ein neues Objekt eingerichtet wird, wird es, falls es bereits
 // eines mit diesem Namen gibt, indiziert.
 
-SbxVariable* SbxObject::Make( const XubString& rName, SbxClassType ct, 
SbxDataType dt )
+SbxVariable* SbxObject::Make( const XubString& rName, SbxClassType ct, 
SbxDataType dt, bool bIsRuntimeFunction )
 {
     // Ist das Objekt bereits vorhanden?
     SbxArray* pArray = NULL;
@@ -422,7 +422,7 @@ SbxVariable* SbxObject::Make( const XubString& rName, 
SbxClassType ct, SbxDataTy
             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 );
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to