[Libreoffice-commits] .: 11 commits - bridges/prj bridges/source cppu/source idlc/source io/source jvmfwk/distributions jvmfwk/source pyuno/zipcore sal/inc sal/osl sal/rtl ure/source xml2cmp/source
Caolán McNamara
caolan at kemper.freedesktop.org
Wed Oct 13 12:37:53 PDT 2010
bridges/prj/build.lst | 1
bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx | 663 ++++++++++++++++++++
bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx | 291 ++++++++
bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk | 81 ++
bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx | 102 +++
bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx | 502 +++++++++++++++
cppu/source/typelib/static_types.cxx | 15
cppu/source/typelib/typelib.cxx | 17
idlc/source/idlccompile.cxx | 2
io/source/stm/opipe.cxx | 6
io/source/stm/streamhelper.cxx | 16
io/source/stm/streamhelper.hxx | 28
jvmfwk/distributions/OpenOfficeorg/makefile.mk | 2
jvmfwk/source/fwkutil.cxx | 4
pyuno/zipcore/makefile.mk | 6
pyuno/zipcore/python.sh | 6
sal/inc/osl/endian.h | 10
sal/inc/rtl/uuid.h | 2
sal/inc/sal/alloca.h | 2
sal/inc/sal/config.h | 2
sal/inc/sal/main.h | 4
sal/osl/unx/backtrace.c | 11
sal/osl/unx/file_error_transl.cxx | 2
sal/osl/unx/file_volume.cxx | 13
sal/osl/unx/interlck.c | 2
sal/osl/unx/makefile.mk | 2
sal/osl/unx/module.c | 66 +
sal/osl/unx/nlsupport.c | 8
sal/osl/unx/process.c | 2
sal/osl/unx/security.c | 3
sal/osl/unx/socket.c | 4
sal/osl/unx/system.c | 1
sal/osl/unx/system.h | 19
sal/osl/unx/tempfile.c | 18
sal/rtl/source/alloc.c | 4
sal/rtl/source/alloc_global.c | 2
sal/rtl/source/macro.hxx | 2
sal/rtl/source/makefile.mk | 6
ure/source/startup.sh | 13
xml2cmp/source/xcd/filebuff.cxx | 4
40 files changed, 1865 insertions(+), 79 deletions(-)
New commits:
commit 613f70a6b06494bf5d9f8b23d7337ffa94274eff
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 15:41:46 2010 +0100
tweaks for AIX
diff --git a/xml2cmp/source/xcd/filebuff.cxx b/xml2cmp/source/xcd/filebuff.cxx
index b39b205..1530fb5 100644
--- a/xml2cmp/source/xcd/filebuff.cxx
+++ b/xml2cmp/source/xcd/filebuff.cxx
@@ -25,6 +25,10 @@
*
************************************************************************/
+#ifdef AIX
+# undef _THREAD_SAFE
+#endif
+
#include "filebuff.hxx"
#include <string.h>
commit 75e6bac5a7faa098f69988580c187a16d9f7ddb3
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 15:40:45 2010 +0100
fixes for AIX
diff --git a/ure/source/startup.sh b/ure/source/startup.sh
index 7f973c5..88301c2 100644
--- a/ure/source/startup.sh
+++ b/ure/source/startup.sh
@@ -39,8 +39,17 @@ epath=`dirname "$0"`
if [ -x "${epath}/javaldx" ] ; then
jpath=`"${epath}/javaldx" $my_envargs`
if [ -n "${jpath}" ]; then
- LD_LIBRARY_PATH=${jpath}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
- export LD_LIBRARY_PATH
+ sd_platform=`uname -s`
+ case $sd_platform in
+ AIX)
+ LIBPAT=${jpath}${LIBPATH:+:${LIBPATH}}
+ export LIBPATH
+ ;;
+ *)
+ LD_LIBRARY_PATH=${jpath}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+ export LD_LIBRARY_PATH
+ ;;
+ esac
fi
fi
commit 9907c0e112cd8baf3b865e348a4c0eb46ec0d04a
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 15:34:27 2010 +0100
fix typo
diff --git a/sal/inc/sal/main.h b/sal/inc/sal/main.h
index dd29769..01d14c8 100644
--- a/sal/inc/sal/main.h
+++ b/sal/inc/sal/main.h
@@ -47,7 +47,7 @@ int SAL_CALL main(int argc, char ** argv) \
sal_detail_initialize(argc, argv); \
ret = sal_main_with_args(argc, argv); \
sal_detail_deinitialize(); \
- return x; \
+ return ret; \
}
#define SAL_MAIN_IMPL \
@@ -57,7 +57,7 @@ int SAL_CALL main(int argc, char ** argv) \
sal_detail_initialize(argc, argv); \
ret = sal_main(); \
sal_detail_deinitialize(); \
- return x; \
+ return ret; \
}
/* Definition macros for CRT entries */
commit 3d0878b7aa90786eee0a95f68b130a06494d028c
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 15:06:44 2010 +0100
AIX port
diff --git a/sal/inc/osl/endian.h b/sal/inc/osl/endian.h
index e8ed472..fbb8479 100644
--- a/sal/inc/osl/endian.h
+++ b/sal/inc/osl/endian.h
@@ -104,11 +104,15 @@ extern "C" {
#endif
#ifdef AIX
-# include <sys/machine.h>
+# include <sys/machine.h>
# if BYTE_ORDER == LITTLE_ENDIAN
-# define _LITTLE_ENDIAN
+# ifndef _LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# endif
# elif BYTE_ORDER == BIG_ENDIAN
-# define _BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN
# endif
diff --git a/sal/inc/rtl/uuid.h b/sal/inc/rtl/uuid.h
index efc6d83..30018be 100644
--- a/sal/inc/rtl/uuid.h
+++ b/sal/inc/rtl/uuid.h
@@ -198,6 +198,8 @@ void SAL_CALL rtl_createNamedUuid(
#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
#elif MACOSX
#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 100000
+#elif AIX
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
#else
#error "System time resolution must be calculated!"
#endif
diff --git a/sal/inc/sal/alloca.h b/sal/inc/sal/alloca.h
index 8214f92..2879431 100644
--- a/sal/inc/sal/alloca.h
+++ b/sal/inc/sal/alloca.h
@@ -28,7 +28,7 @@
#ifndef INCLUDED_SAL_ALLOCA_H
#define INCLUDED_SAL_ALLOCA_H
-#if defined (SOLARIS) || defined (LINUX) || defined(__EMX__)
+#if defined (SOLARIS) || defined (LINUX) || defined(__EMX__) || defined(AIX)
#ifndef INCLUDED_ALLOCA_H
#include <alloca.h>
diff --git a/sal/inc/sal/config.h b/sal/inc/sal/config.h
index ada8cbd..ac600fd 100644
--- a/sal/inc/sal/config.h
+++ b/sal/inc/sal/config.h
@@ -91,7 +91,7 @@
#define SAL_SYSCONFIGFILE( name ) name ".ini"
#endif
-#if defined(SOLARIS) || defined(LINUX) || defined(NETBSD) || defined(FREEBSD) || defined(SCO)
+#if defined(SOLARIS) || defined(LINUX) || defined(NETBSD) || defined(FREEBSD) || defined(SCO) || defined(AIX)
#define SAL_UNX
#define SAL_DLLEXTENSION ".so"
#define SAL_DLLPREFIX "lib"
diff --git a/sal/inc/sal/main.h b/sal/inc/sal/main.h
index 7f70432..dd29769 100644
--- a/sal/inc/sal/main.h
+++ b/sal/inc/sal/main.h
@@ -29,6 +29,9 @@
#define _SAL_MAIN_H_
#include <sal/types.h>
+#if defined(AIX)
+# include <unistd.h>
+#endif
#ifdef __cplusplus
extern "C" {
@@ -44,7 +47,7 @@ int SAL_CALL main(int argc, char ** argv) \
sal_detail_initialize(argc, argv); \
ret = sal_main_with_args(argc, argv); \
sal_detail_deinitialize(); \
- return ret; \
+ return x; \
}
#define SAL_MAIN_IMPL \
@@ -54,10 +57,9 @@ int SAL_CALL main(int argc, char ** argv) \
sal_detail_initialize(argc, argv); \
ret = sal_main(); \
sal_detail_deinitialize(); \
- return ret; \
+ return x; \
}
-
/* Definition macros for CRT entries */
#ifdef SAL_W32
diff --git a/sal/osl/unx/backtrace.c b/sal/osl/unx/backtrace.c
index c779059..b0a9de3 100755
--- a/sal/osl/unx/backtrace.c
+++ b/sal/osl/unx/backtrace.c
@@ -357,3 +357,14 @@ void backtrace_symbols_fd( void **buffer, int size, int fd )
}
#endif /* defined MACOSX */
+
+#if defined(AIX)
+int backtrace( void **buffer, int max_frames )
+{
+ return 0;
+}
+
+void backtrace_symbols_fd( void **buffer, int size, int fd )
+{
+}
+#endif
diff --git a/sal/osl/unx/file_error_transl.cxx b/sal/osl/unx/file_error_transl.cxx
index 2905794..9131614 100644
--- a/sal/osl/unx/file_error_transl.cxx
+++ b/sal/osl/unx/file_error_transl.cxx
@@ -206,9 +206,11 @@ oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno)
osl_error = osl_File_E_NOSYS;
break;
+#if !defined(AIX) || !(defined(_ALL_SOURCE) && !defined(_LINUX_SOURCE_COMPAT))
case ENOTEMPTY:
osl_error = osl_File_E_NOTEMPTY;
break;
+#endif
case ELOOP:
osl_error = osl_File_E_LOOP;
diff --git a/sal/osl/unx/file_volume.cxx b/sal/osl/unx/file_volume.cxx
index 3243eb0..8daacc0 100644
--- a/sal/osl/unx/file_volume.cxx
+++ b/sal/osl/unx/file_volume.cxx
@@ -252,7 +252,7 @@ oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeI
#else /* no statfs available */
# define __OSL_STATFS_STRUCT struct dummy {int i;}
-# define __OSL_STATFS_INIT(a) ((void)0)
+# define __OSL_STATFS_INIT(a) ((void)a)
# define __OSL_STATFS(dir, sfs) (1)
# define __OSL_STATFS_ISREMOTE(sfs) (0)
# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
@@ -540,7 +540,7 @@ oslFileError osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
return osl_File_E_None;
}
-#ifndef MACOSX
+#if !defined(MACOSX) && !defined(AIX)
/*****************************************
* osl_newVolumeDeviceHandleImpl
@@ -1116,23 +1116,26 @@ osl_isFloppyMounted (oslVolumeDeviceHandleImpl* pDevice)
*
*****************************************************************************/
-#if (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+#if (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(AIX))
static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath)
{
+ (void)pszPath;
return NULL;
}
#endif /* MACOSX */
-#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(AIX))
static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
{
+ (void)hFloppy;
return osl_File_E_BUSY;
}
#endif /* MACOSX */
-#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(AIX))
static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
{
+ (void)hFloppy;
return osl_File_E_BUSY;
}
#endif /* MACOSX */
diff --git a/sal/osl/unx/interlck.c b/sal/osl/unx/interlck.c
index dc1eade..436f6f5 100644
--- a/sal/osl/unx/interlck.c
+++ b/sal/osl/unx/interlck.c
@@ -93,7 +93,7 @@ oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount*
return --nCount;
}
-#elif defined ( GCC ) && defined ( POWERPC )
+#elif defined ( GCC ) && defined ( POWERPC ) && !defined( AIX )
/*****************************************************************************/
/* osl_incrementInterlockedCount */
diff --git a/sal/osl/unx/makefile.mk b/sal/osl/unx/makefile.mk
index 1dd47fb..d41a887 100644
--- a/sal/osl/unx/makefile.mk
+++ b/sal/osl/unx/makefile.mk
@@ -118,7 +118,7 @@ OBJFILES= $(OBJ)$/conditn.obj \
SLOFILES += $(SLO)$/osxlocale.obj
.ENDIF
-.IF "$(OS)"=="SOLARIS" || "$(OS)"=="FREEBSD" || "$(OS)"=="NETBSD" || "$(OS)$(CPU)"=="LINUXS" || "$(OS)"=="MACOSX"
+.IF "$(OS)"=="SOLARIS" || "$(OS)"=="FREEBSD" || "$(OS)"=="NETBSD" || "$(OS)$(CPU)"=="LINUXS" || "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
SLOFILES += $(SLO)$/backtrace.obj
OBJFILES += $(OBJ)$/backtrace.obj
.ENDIF
diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c
index ba859ec..3a5533f 100644
--- a/sal/osl/unx/module.c
+++ b/sal/osl/unx/module.c
@@ -38,6 +38,10 @@
#include <stdio.h>
#endif
+#ifdef AIX
+#include <sys/ldr.h>
+#endif
+
/* implemented in file.c */
extern int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
@@ -201,6 +205,67 @@ osl_getFunctionSymbol(oslModule module, rtl_uString *puFunctionSymbolName)
sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl)
{
sal_Bool result = sal_False;
+#if defined(AIX)
+ int i;
+ int size = 4 * 1024;
+ char *buf, *filename=NULL;
+ struct ld_info *lp;
+
+ if ((buf = malloc(size)) == NULL)
+ return result;
+
+ while((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM)
+ {
+ size += 4 * 1024;
+ if ((buf = malloc(size)) == NULL)
+ break;
+ }
+
+ lp = (struct ld_info*) buf;
+ while (lp)
+ {
+ unsigned long start = (unsigned long)lp->ldinfo_dataorg;
+ unsigned long end = start + lp->ldinfo_datasize;
+ if (start <= (unsigned long)addr && end > (unsigned long)addr)
+ {
+ filename = lp->ldinfo_filename;
+ break;
+ }
+ if (!lp->ldinfo_next)
+ break;
+ lp = (struct ld_info*) ((char *) lp + lp->ldinfo_next);
+ }
+
+ if (filename)
+ {
+ rtl_uString * workDir = NULL;
+ osl_getProcessWorkingDir(&workDir);
+ if (workDir)
+ {
+#if OSL_DEBUG_LEVEL > 1
+ OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", filaname);
+#endif
+ rtl_string2UString(ppLibraryUrl,
+ filename,
+ strlen(filename),
+ osl_getThreadTextEncoding(),
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+
+ OSL_ASSERT(*ppLibraryUrl != NULL);
+ osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl);
+ osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl);
+
+ rtl_uString_release(workDir);
+ result = sal_True;
+ }
+ else
+ {
+ result = sal_False;
+ }
+ }
+
+ free(buf);
+#else
Dl_info dl_info;
if ((result = dladdr(addr, &dl_info)) != 0)
@@ -230,6 +295,7 @@ sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibr
result = sal_False;
}
}
+#endif
return result;
}
diff --git a/sal/osl/unx/nlsupport.c b/sal/osl/unx/nlsupport.c
index 9fe944b..b1bab72 100644
--- a/sal/osl/unx/nlsupport.c
+++ b/sal/osl/unx/nlsupport.c
@@ -924,7 +924,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
{
/* only change env vars that exist already */
if( getenv( "LC_ALL" ) ) {
-#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined ( AIX )
setenv( "LC_ALL", locale_buf, 1);
#else
setenv( "LC_ALL", locale_buf );
@@ -932,7 +932,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
}
if( getenv( "LC_CTYPE" ) ) {
-#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined ( AIX )
setenv("LC_CTYPE", locale_buf, 1 );
#else
setenv( "LC_CTYPE", locale_buf );
@@ -940,7 +940,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
}
if( getenv( "LANG" ) ) {
-#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined (AIX )
setenv("LC_CTYPE", locale_buf, 1 );
#else
setenv( "LANG", locale_buf );
@@ -951,6 +951,6 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
return 0;
}
-#endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */
+#endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD || AIX */
diff --git a/sal/osl/unx/process.c b/sal/osl/unx/process.c
index e756256..02f0208 100644
--- a/sal/osl/unx/process.c
+++ b/sal/osl/unx/process.c
@@ -70,7 +70,7 @@
#define MAX_ARGS 255
#define MAX_ENVS 255
-#if defined(MACOSX) || defined(IORESOURCE_TRANSFER_BSD)
+#if defined(MACOSX) || defined(IORESOURCE_TRANSFER_BSD) || defined(AIX)
#define CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int))
#endif
diff --git a/sal/osl/unx/security.c b/sal/osl/unx/security.c
index 4dcef03..92bc432 100644
--- a/sal/osl/unx/security.c
+++ b/sal/osl/unx/security.c
@@ -504,6 +504,9 @@ osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd,
{
#if defined NETBSD || defined SCO || defined AIX || defined FREEBSD || \
defined MACOSX
+ (void)pszUserName;
+ (void)pszPasswd;
+ (void)pSecurity;
return osl_Security_E_None;
diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c
index 7f7a2b2..847f3dc 100644
--- a/sal/osl/unx/socket.c
+++ b/sal/osl/unx/socket.c
@@ -802,6 +802,10 @@ static struct hostent* _osl_gethostbyname_r (
__error = gethostbyname_r (name, result, buffer, buflen,
&__result, h_errnop);
return __error ? NULL : __result ;
+#elif defined(AIX)
+ *h_errnop = gethostbyname_r (name, result, (struct hostent_data *)buffer);
+ (void)buflen;
+ return *h_errnop ? NULL : result ;
#else
return gethostbyname_r( name, result, buffer, buflen, h_errnop);
#endif
diff --git a/sal/osl/unx/system.c b/sal/osl/unx/system.c
index f70e839..7d17f02 100644
--- a/sal/osl/unx/system.c
+++ b/sal/osl/unx/system.c
@@ -485,6 +485,7 @@ pid_t getpid(void)
#ifdef NO_PTHREAD_SEMAPHORES
int sem_init(sem_t* sem, int pshared, unsigned int value)
{
+ (void)pshared;
pthread_mutex_init(&sem->mutex, PTHREAD_MUTEXATTR_DEFAULT);
pthread_cond_init(&sem->increased, PTHREAD_CONDATTR_DEFAULT);
diff --git a/sal/osl/unx/system.h b/sal/osl/unx/system.h
index c7dec21..c86ed96 100644
--- a/sal/osl/unx/system.h
+++ b/sal/osl/unx/system.h
@@ -110,9 +110,13 @@
# include <dlfcn.h>
# include <endian.h>
# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define _LITTLE_ENDIAN
+# ifndef _LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# endif
# elif __BYTE_ORDER == __BIG_ENDIAN
-# define _BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
# elif __BYTE_ORDER == __PDP_ENDIAN
# define _PDP_ENDIAN
# endif
@@ -230,22 +234,25 @@ extern unsigned int nanosleep(unsigned int);
# define AF_IPX -1
# include <strings.h>
# include <pthread.h>
+# include <dlfcn.h>
# include <sys/time.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# include <sys/machine.h>
# if BYTE_ORDER == LITTLE_ENDIAN
-# define _LITTLE_ENDIAN
+# ifndef _LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# endif
# elif BYTE_ORDER == BIG_ENDIAN
-# define _BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN
# endif
-# define sched_yield() pthread_yield()
# define SLEEP_TIMESPEC(timespec) nsleep(×pec, 0)
# define LIBPATH "LIBPATH"
# define NO_PTHREAD_SEMAPHORES
-# define NO_DL_FUNCTIONS
#endif
#ifdef HPUX
diff --git a/sal/osl/unx/tempfile.c b/sal/osl/unx/tempfile.c
index 7973033..1c3ec8f 100644
--- a/sal/osl/unx/tempfile.c
+++ b/sal/osl/unx/tempfile.c
@@ -66,16 +66,18 @@ oslFileError SAL_CALL osl_getTempDirURL( rtl_uString** pustrTempDir )
const char *pValue = getenv( "TEMP" );
if ( !pValue )
- {
pValue = getenv( "TMP" );
-#if defined(SOLARIS) || defined (LINUX) || defined (FREEBSD)
- if ( !pValue )
- pValue = P_tmpdir;
-#elif defined(NETBSD)
- if ( !pValue )
- pValue = _PATH_TMP;
+
+#if defined(NETBSD)
+ if ( !pValue )
+ pValue = _PATH_TMP;
+#else
+ if ( !pValue )
+ pValue = P_tmpdir;
#endif
- }
+
+ if ( !pValue )
+ pValue = "/tmp";
#endif /* MACOSX */
if ( pValue )
diff --git a/sal/rtl/source/alloc.c b/sal/rtl/source/alloc.c
index 5fdbec5..87c1b75 100644
--- a/sal/rtl/source/alloc.c
+++ b/sal/rtl/source/alloc.c
@@ -75,7 +75,7 @@ static sal_Size __rtl_memory_vmpagesize (void)
/* xBSD */
return (sal_Size)(getpagesize());
}
-#elif defined(LINUX) || defined(SOLARIS)
+#elif defined(LINUX) || defined(SOLARIS) || defined(AIX)
static sal_Size __rtl_memory_vmpagesize (void)
{
/* POSIX */
@@ -87,7 +87,7 @@ static sal_Size __rtl_memory_vmpagesize (void)
/* other */
return (sal_Size)(0x2000);
}
-#endif /* FREEBSD || NETBSD || MACOSX || LINUX || SOLARIS */
+#endif /* FREEBSD || NETBSD || MACOSX || LINUX || SOLARIS || AIX */
#ifndef PROT_HEAP
#define PROT_HEAP (PROT_READ | PROT_WRITE | PROT_EXEC)
diff --git a/sal/rtl/source/alloc_global.c b/sal/rtl/source/alloc_global.c
index e3ba392..b7612bc 100644
--- a/sal/rtl/source/alloc_global.c
+++ b/sal/rtl/source/alloc_global.c
@@ -157,7 +157,7 @@ rtl_memory_init (void)
Delegated the call to "rtl_memory_fini" into a dummy C++ object,
see memory_fini.cxx .
*/
-#if defined(__GNUC__) && !defined(MACOSX)
+#if defined(__GNUC__) && !defined(MACOSX) && !defined(AIX)
static void rtl_memory_fini (void) __attribute__((destructor));
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
#pragma fini(rtl_memory_fini)
diff --git a/sal/rtl/source/macro.hxx b/sal/rtl/source/macro.hxx
index 6899a2f..3374e97 100644
--- a/sal/rtl/source/macro.hxx
+++ b/sal/rtl/source/macro.hxx
@@ -50,6 +50,8 @@
#define THIS_OS "NetBSD"
#elif defined FREEBSD
#define THIS_OS "FreeBSD"
+#elif defined AIX
+#define THIS_OS "AIX"
#endif
#if ! defined THIS_OS
diff --git a/sal/rtl/source/makefile.mk b/sal/rtl/source/makefile.mk
index 517d2c2..b8f4017 100644
--- a/sal/rtl/source/makefile.mk
+++ b/sal/rtl/source/makefile.mk
@@ -61,7 +61,9 @@ UWINAPILIB:=
.IF "$(header)" == ""
+.IF "$(OS)" != "AIX"
ALWAYSDBGFILES=$(SLO)$/debugprint.obj
+.ENDIF
.IF "$(ALWAYSDBGFILES)" != ""
ALWAYSDBGTARGET=do_it_alwaysdebug
@@ -95,7 +97,7 @@ SLOFILES= \
$(SLO)$/alloc_cache.obj \
$(SLO)$/alloc_arena.obj
-.IF "$(OS)"=="MACOSX"
+.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
SLOFILES+=$(SLO)$/memory_fini.obj
.ENDIF
@@ -128,7 +130,7 @@ OBJFILES= \
$(OBJ)$/alloc_cache.obj \
$(OBJ)$/alloc_arena.obj
-.IF "$(OS)"=="MACOSX"
+.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
OBJFILES+=$(OBJ)$/memory_fini.obj
.ENDIF
commit c018a95eef7a978a9e0d5e403c2e10a02d89e4c9
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 14:46:52 2010 +0100
tweak this for AIX
diff --git a/pyuno/zipcore/makefile.mk b/pyuno/zipcore/makefile.mk
index 06241da..bad3058 100755
--- a/pyuno/zipcore/makefile.mk
+++ b/pyuno/zipcore/makefile.mk
@@ -81,7 +81,7 @@ ALLTAR : $(BIN)$/python.sh
$(BIN)$/python.sh : python.sh
-rm -f $@
cat $? > $@
- sed 's/%%PYVERSION%%/$(PYVERSION)/g' < $@ > $@.new
+ sed 's/%%PYVERSION%%/$(PYVERSION)/g' < $@ | sed 's/%%OOO_LIBRARY_PATH_VAR%%/$(OOO_LIBRARY_PATH_VAR)/g' > $@.new
mv $@.new $@
chmod +x $@
.ENDIF
@@ -93,7 +93,7 @@ $(OUT)$/inc$/pyversion.hxx: pyversion.inc
$(BIN)$/$(PYDIRNAME).zip : $(FILES)
.IF "$(GUI)" == "UNX"
-.IF "$(OS)" != "MACOSX"
+.IF "$(OS)" != "MACOSX" && "$(OS)" != "AIX"
cd $(DESTROOT) && find . -name '*$(DLLPOST)' | xargs strip
.ENDIF
.ENDIF
@@ -110,7 +110,7 @@ $(BIN)$/python$(EXECPOST).bin : $(SOLARBINDIR)$/python$(EXECPOST)
-$(MKDIRHIER) $(@:d)
-rm -f $@
cat $< > $@
-.IF "$(OS)" != "MACOSX"
+.IF "$(OS)" != "MACOSX" && "$(OS)" != "AIX"
strip $@
.ENDIF
chmod +x $@
diff --git a/pyuno/zipcore/python.sh b/pyuno/zipcore/python.sh
index b53e369..219e737 100644
--- a/pyuno/zipcore/python.sh
+++ b/pyuno/zipcore/python.sh
@@ -43,9 +43,9 @@ cd "$sd_cwd"
PATH=$sd_prog${PATH+:$PATH}
export PATH
-# Set LD_LIBRARY_PATH so that "import pyuno" finds libpyuno.so:
-LD_LIBRARY_PATH=$sd_prog/../basis-link/program:$sd_prog/../basis-link/ure-link/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
-export LD_LIBRARY_PATH
+# Set %%OOO_LIBRARY_PATH_VAR%% so that "import pyuno" finds libpyuno.so:
+%%OOO_LIBRARY_PATH_VAR%%=$sd_prog/../basis-link/program:$sd_prog/../basis-link/ure-link/lib${%%OOO_LIBRARY_PATH_VAR%%:+:$%%OOO_LIBRARY_PATH_VAR%%}
+export %%OOO_LIBRARY_PATH_VAR%%
# Set UNO_PATH so that "officehelper.bootstrap()" can find soffice executable:
: ${UNO_PATH=$sd_prog}
commit 4d91f9c645d1da1a52d699d33e47259873ce6202
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 13:39:57 2010 +0100
rename IFIFO due to AIX conflict
diff --git a/io/source/stm/opipe.cxx b/io/source/stm/opipe.cxx
index f87d98c..1e82b01 100644
--- a/io/source/stm/opipe.cxx
+++ b/io/source/stm/opipe.cxx
@@ -134,7 +134,7 @@ private:
oslCondition m_conditionBytesAvail;
Mutex m_mutexAccess;
- IFIFO *m_pFIFO;
+ I_FIFO *m_pFIFO;
};
@@ -346,13 +346,13 @@ void OPipeImpl::writeBytes(const Sequence< sal_Int8 >& aData)
}
m_nBytesToSkip = 0;
}
- catch ( IFIFO_OutOfBoundsException & )
+ catch ( I_FIFO_OutOfBoundsException & )
{
throw BufferSizeExceededException(
OUString( RTL_CONSTASCII_USTRINGPARAM( "Pipe::writeBytes BufferSizeExceededException" )),
*this );
}
- catch ( IFIFO_OutOfMemoryException & )
+ catch ( I_FIFO_OutOfMemoryException & )
{
throw BufferSizeExceededException(
OUString( RTL_CONSTASCII_USTRINGPARAM( "Pipe::writeBytes BufferSizeExceededException" )),
commit aba4270b310fb32cc96e2094c6b72794890e1260
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 13:29:21 2010 +0100
tweaks for AIX
diff --git a/jvmfwk/distributions/OpenOfficeorg/makefile.mk b/jvmfwk/distributions/OpenOfficeorg/makefile.mk
index a6ba7a2..36e8e8d 100755
--- a/jvmfwk/distributions/OpenOfficeorg/makefile.mk
+++ b/jvmfwk/distributions/OpenOfficeorg/makefile.mk
@@ -43,7 +43,7 @@ $(BIN)$/javavendors.xml: javavendors_unx.xml javavendors_wnt.xml javavendors_mac
-$(COPY) javavendors_freebsd.xml $(BIN)$/javavendors.xml
.ELIF "$(OS)"=="MACOSX"
-$(COPY) javavendors_macosx.xml $(BIN)$/javavendors.xml
-.ELIF "$(OS)"=="LINUX"
+.ELIF "$(OS)"=="LINUX" || "$(OS)"=="AIX"
-$(COPY) javavendors_linux.xml $(BIN)$/javavendors.xml
.ELSE
-$(COPY) javavendors_unx.xml $(BIN)$/javavendors.xml
diff --git a/jvmfwk/source/fwkutil.cxx b/jvmfwk/source/fwkutil.cxx
index a50ed09..51a0d26 100644
--- a/jvmfwk/source/fwkutil.cxx
+++ b/jvmfwk/source/fwkutil.cxx
@@ -270,8 +270,10 @@ rtl::OUString findPlugin(
{
rtl::OUString url;
#ifdef UNX
-#ifdef MACOSX
+#if defined(MACOSX)
rtl::OUString path = rtl::OUString::createFromAscii("DYLD_LIBRARY_PATH");
+#elif defined(AIX)
+ rtl::OUString path = rtl::OUString::createFromAscii("LIBPATH");
#else
rtl::OUString path = rtl::OUString::createFromAscii("LD_LIBRARY_PATH");
#endif
commit da307f47614d485aa241a9d7fa13d06aa248aeac
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 13:28:46 2010 +0100
rename IFIFO due to AIX conflict
diff --git a/io/source/stm/streamhelper.cxx b/io/source/stm/streamhelper.cxx
index acd687d..143dd1d 100644
--- a/io/source/stm/streamhelper.cxx
+++ b/io/source/stm/streamhelper.cxx
@@ -43,8 +43,8 @@ using namespace ::com::sun::star::uno;
namespace io_stm {
void MemFIFO::write( const Sequence< sal_Int8 > &seq )
- throw ( IFIFO_OutOfMemoryException,
- IFIFO_OutOfBoundsException )
+ throw ( I_FIFO_OutOfMemoryException,
+ I_FIFO_OutOfBoundsException )
{
try
{
@@ -52,15 +52,15 @@ void MemFIFO::write( const Sequence< sal_Int8 > &seq )
}
catch( IRingBuffer_OutOfMemoryException & )
{
- throw IFIFO_OutOfMemoryException();
+ throw I_FIFO_OutOfMemoryException();
}
catch( IRingBuffer_OutOfBoundsException & )
{
- throw IFIFO_OutOfBoundsException();
+ throw I_FIFO_OutOfBoundsException();
}
}
-void MemFIFO::read( Sequence<sal_Int8> &seq , sal_Int32 nBufferLen ) throw (IFIFO_OutOfBoundsException)
+void MemFIFO::read( Sequence<sal_Int8> &seq , sal_Int32 nBufferLen ) throw (I_FIFO_OutOfBoundsException)
{
try
{
@@ -69,11 +69,11 @@ void MemFIFO::read( Sequence<sal_Int8> &seq , sal_Int32 nBufferLen ) throw (IFIF
}
catch ( IRingBuffer_OutOfBoundsException & )
{
- throw IFIFO_OutOfBoundsException();
+ throw I_FIFO_OutOfBoundsException();
}
}
-void MemFIFO::skip( sal_Int32 nBytesToSkip ) throw ( IFIFO_OutOfBoundsException )
+void MemFIFO::skip( sal_Int32 nBytesToSkip ) throw ( I_FIFO_OutOfBoundsException )
{
try
{
@@ -81,7 +81,7 @@ void MemFIFO::skip( sal_Int32 nBytesToSkip ) throw ( IFIFO_OutOfBoundsException
}
catch( IRingBuffer_OutOfBoundsException & )
{
- throw IFIFO_OutOfBoundsException();
+ throw I_FIFO_OutOfBoundsException();
}
}
diff --git a/io/source/stm/streamhelper.hxx b/io/source/stm/streamhelper.hxx
index 6257698..32a1509 100644
--- a/io/source/stm/streamhelper.hxx
+++ b/io/source/stm/streamhelper.hxx
@@ -41,30 +41,30 @@
namespace io_stm {
-class IFIFO_OutOfBoundsException :
+class I_FIFO_OutOfBoundsException :
public Exception
{};
-class IFIFO_OutOfMemoryException :
+class I_FIFO_OutOfMemoryException :
public Exception
{};
-class IFIFO
+class I_FIFO
{
public:
- virtual void write( const Sequence<sal_Int8> &) throw( IFIFO_OutOfMemoryException,
- IFIFO_OutOfBoundsException )=0;
+ virtual void write( const Sequence<sal_Int8> &) throw( I_FIFO_OutOfMemoryException,
+ I_FIFO_OutOfBoundsException )=0;
virtual void read( Sequence<sal_Int8> & , sal_Int32 nBytesToRead )
- throw( IFIFO_OutOfBoundsException )=0;
+ throw( I_FIFO_OutOfBoundsException )=0;
virtual void skip( sal_Int32 nBytesToSkip )
- throw( IFIFO_OutOfBoundsException )=0;
+ throw( I_FIFO_OutOfBoundsException )=0;
virtual sal_Int32 getSize() const throw( ) =0;
virtual void shrink() throw() = 0;
- virtual ~IFIFO() {};
+ virtual ~I_FIFO() {};
};
@@ -136,15 +136,15 @@ private:
class MemFIFO :
- public IFIFO,
- private MemRingBuffer
+ public I_FIFO,
+ private MemRingBuffer
{
public:
- virtual void write( const Sequence<sal_Int8> &) throw( IFIFO_OutOfMemoryException,
- IFIFO_OutOfBoundsException );
+ virtual void write( const Sequence<sal_Int8> &) throw( I_FIFO_OutOfMemoryException,
+ I_FIFO_OutOfBoundsException );
virtual void read( Sequence<sal_Int8> & , sal_Int32 nBytesToRead )
- throw( IFIFO_OutOfBoundsException );
- virtual void skip( sal_Int32 nBytesToSkip ) throw( IFIFO_OutOfBoundsException );
+ throw( I_FIFO_OutOfBoundsException );
+ virtual void skip( sal_Int32 nBytesToSkip ) throw( I_FIFO_OutOfBoundsException );
virtual sal_Int32 getSize() const throw( )
{ return MemRingBuffer::getSize(); }
virtual void shrink() throw()
commit 4787e5b770f08693c4c065c3b37338a1b56f3120
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 13:24:28 2010 +0100
fix for AIX
diff --git a/idlc/source/idlccompile.cxx b/idlc/source/idlccompile.cxx
index 18af1fa..d9b251a 100644
--- a/idlc/source/idlccompile.cxx
+++ b/idlc/source/idlccompile.cxx
@@ -41,7 +41,7 @@
#ifdef SAL_UNX
#include <unistd.h>
-#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD)
+#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD) || defined(AIX)
#include <sys/wait.h>
#else
#include <wait.h>
commit 8ffcc7eb4621de311ce38aa0317f5e674b526bfb
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 13:11:08 2010 +0100
AIX cppu quirks
diff --git a/cppu/source/typelib/static_types.cxx b/cppu/source/typelib/static_types.cxx
index a952643..185f757 100644
--- a/cppu/source/typelib/static_types.cxx
+++ b/cppu/source/typelib/static_types.cxx
@@ -79,8 +79,15 @@ void SAL_CALL typelib_typedescriptionreference_getByName(
*/
struct AlignSize_Impl
{
- sal_Int16 nInt16;
- double dDouble;
+ sal_Int16 nInt16;
+#ifdef AIX
+ //double: doubleword aligned if -qalign=natural/-malign=natural
+ //which isn't the default ABI. Otherwise word aligned, While a long long int
+ //is always doubleword aligned, so use that instead.
+ sal_Int64 dDouble;
+#else
+ double dDouble;
+#endif
};
#ifdef SAL_W32
@@ -253,7 +260,7 @@ typelib_TypeDescriptionReference ** SAL_CALL typelib_static_type_getByTypeClass(
::typelib_typedescription_register( &pTD1 );
::typelib_typedescription_release( pTD1 );
}
- // XInterface members
+ // XInterface members
typelib_InterfaceMethodTypeDescription * pMethod = 0;
typelib_Parameter_Init aParameters[1];
OUString sParamName0( RTL_CONSTASCII_USTRINGPARAM("aType") );
@@ -492,7 +499,7 @@ void SAL_CALL typelib_static_mi_interface_type_init(
OUString aTypeName( OUString::createFromAscii( pTypeName ) );
*ppRef = igetTypeByName( aTypeName.pData );
if (!*ppRef)
- {
+ {
typelib_InterfaceTypeDescription * pIface = 0;
::typelib_typedescription_newEmpty(
(typelib_TypeDescription **)&pIface, typelib_TypeClass_INTERFACE, aTypeName.pData );
diff --git a/cppu/source/typelib/typelib.cxx b/cppu/source/typelib/typelib.cxx
index 1745dd6..ae68792 100644
--- a/cppu/source/typelib/typelib.cxx
+++ b/cppu/source/typelib/typelib.cxx
@@ -69,8 +69,15 @@ using namespace osl;
*/
struct AlignSize_Impl
{
- sal_Int16 nInt16;
- double dDouble;
+ sal_Int16 nInt16;
+#ifdef AIX
+ //double: doubleword aligned if -qalign=natural/-malign=natural
+ //which isn't the default ABI. Otherwise word aligned, While a long long int
+ //is always doubleword aligned, so use that instead.
+ sal_Int64 dDouble;
+#else
+ double dDouble;
+#endif
};
#ifdef SAL_W32
@@ -1941,7 +1948,13 @@ extern "C" sal_Int32 SAL_CALL typelib_typedescription_getAlignedUnoSize(
nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( float ));
break;
case typelib_TypeClass_DOUBLE:
+#ifdef AIX
+ //See previous AIX ifdef comment for an explanation
+ nSize = (sal_Int32)(sizeof(double));
+ rMaxIntegralTypeSize = (sal_Int32)(sizeof(void*));
+#else
nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( double ));
+#endif
break;
case typelib_TypeClass_BYTE:
nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Int8 ));
commit 3b4365e86483b8447a95491cbdf71957cba68457
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Oct 13 13:07:43 2010 +0100
add AIX uno bridge
diff --git a/bridges/prj/build.lst b/bridges/prj/build.lst
index d771566..51c342a 100644
--- a/bridges/prj/build.lst
+++ b/bridges/prj/build.lst
@@ -13,6 +13,7 @@ br bridges\source\cpp_uno\gcc3_freebsd_intel nmake - u br_gcc3fi br_cppuno_share
br bridges\source\cpp_uno\gcc3_linux_x86-64 nmake - u br_gcc3lx br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_freebsd_x86-64 nmake - u br_gcc3fx br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_powerpc nmake - u br_gcc3lp br_cppuno_shared br_unotypes br_inc NULL
+br bridges\source\cpp_uno\gcc3_aix_powerpc nmake - u br_gcc3ap br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_powerpc64 nmake - u br_gcc3lp_64 br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_mips nmake - u br_gcc3lmips br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_m68k nmake - u br_gcc3lm68k br_cppuno_shared br_unotypes br_inc NULL
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx
new file mode 100644
index 0000000..e77c732
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx
@@ -0,0 +1,663 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: cpp2uno.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+#include <typelib/typedescription.hxx>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+
+#include "share.hxx"
+
+#include <string.h>
+
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+static typelib_TypeClass cpp2uno_call(
+ bridges::cpp_uno::shared::CppInterfaceProxy * pThis,
+ const typelib_TypeDescription * pMemberTypeDescr,
+ typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return
+ sal_Int32 nParams, typelib_MethodParameter * pParams,
+ void ** gpreg, double * fpreg, void ** ovrflw,
+ sal_uInt64 * pRegisterReturn /* space for register return */ )
+{
+ // gpreg: [ret *], this, [gpr params]
+ // fpreg: [fpr params]
+ // ovrflw: [remainder of params]
+
+ // return
+ typelib_TypeDescription * pReturnTypeDescr = 0;
+ if (pReturnTypeRef)
+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+
+ void * pUnoReturn = 0;
+ void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need
+
+ sal_Int32 ng = 0;
+ sal_Int32 nf = 0;
+
+ ovrflw -= ppc::MAX_GPR_REGS;
+
+ if (pReturnTypeDescr)
+ {
+ if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+ pUnoReturn = pRegisterReturn; // direct way for simple types
+ else // complex return via ptr (pCppReturn)
+ {
+ pCppReturn = *gpreg;
+ ++gpreg;
+ ++ng;
+ ++ovrflw;
+
+ pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+ ? __builtin_alloca( pReturnTypeDescr->nSize )
+ : pCppReturn); // direct way
+ }
+ }
+ // pop this
+ ++gpreg;
+ ++ng;
+ ++ovrflw;
+
+ // stack space
+ OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+ // parameters
+ void ** pUnoArgs = (void **)__builtin_alloca( 4 * sizeof(void *) * nParams );
+ void ** pCppArgs = pUnoArgs + nParams;
+
+ // indizes of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+
+ // type descriptions for reconversions
+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
+
+ sal_Int32 nTempIndizes = 0;
+
+ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+ {
+ const typelib_MethodParameter & rParam = pParams[nPos];
+ typelib_TypeDescription * pParamTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+ // value
+ {
+ switch (pParamTypeDescr->eTypeClass)
+ {
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ *ovrflw = *gpreg++;
+ ++ng;
+ }
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-1));
+ ++ovrflw;
+ break;
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ *ovrflw = *gpreg++;
+ ++ng;
+ }
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-2));
+ ++ovrflw;
+ break;
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+ for (int i = 0; i < 2; ++i)
+ {
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ *ovrflw = *gpreg++;
+ ++ng;
+ }
+ ++ovrflw;
+ }
+ break;
+ case typelib_TypeClass_DOUBLE:
+ if (nf < ppc::MAX_SSE_REGS)
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = fpreg;
+ ++fpreg;
+ ++nf;
+ }
+ else
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+ }
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ ng+=2;
+ gpreg+=2;
+ }
+ ovrflw+=2;
+ break;
+ case typelib_TypeClass_FLOAT:
+ if (nf < ppc::MAX_SSE_REGS)
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = fpreg;
+ ++fpreg;
+ ++nf;
+ }
+ else
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+ }
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ ++gpreg;
+ ++ng;
+ }
+ ++ovrflw;
+ break;
+ default:
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ *ovrflw = *gpreg++;
+ ++ng;
+ }
+ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+ ++ovrflw;
+ break;
+ }
+
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ else // ptr to complex value | ref
+ {
+ void *pCppStack; //temporary stack pointer
+
+ if (ng < ppc::MAX_GPR_REGS)
+ {
+ *ovrflw = *gpreg++;
+ ++ng;
+ }
+ pCppArgs[nPos] = pCppStack = *ovrflw++;
+
+ if (! rParam.bIn) // is pure out
+ {
+ // uno out is unconstructed mem!
+ pUnoArgs[nPos] = __builtin_alloca( pParamTypeDescr->nSize );
+ pTempIndizes[nTempIndizes] = nPos;
+ // will be released at reconversion
+ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ }
+ // is in/inout
+ else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+ {
+ uno_copyAndConvertData( pUnoArgs[nPos] = __builtin_alloca( pParamTypeDescr->nSize ),
+ pCppStack, pParamTypeDescr,
+ pThis->getBridge()->getCpp2Uno() );
+ pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+ // will be released at reconversion
+ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ }
+ else // direct way
+ {
+ pUnoArgs[nPos] = pCppStack;
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ }
+ }
+
+ // ExceptionHolder
+ uno_Any aUnoExc; // Any will be constructed by callee
+ uno_Any * pUnoExc = &aUnoExc;
+
+ // invoke uno dispatch call
+ (*pThis->getUnoI()->pDispatcher)(
+ pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+
+ // in case an exception occured...
+ if (pUnoExc)
+ {
+ // destruct temporary in/inout params
+ for ( ; nTempIndizes--; )
+ {
+ sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+
+ if (pParams[nIndex].bIn) // is in/inout => was constructed
+ uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 );
+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+ }
+ if (pReturnTypeDescr)
+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+
+ CPPU_CURRENT_NAMESPACE::raiseException(
+ &aUnoExc, pThis->getBridge()->getUno2Cpp() );
+ // has to destruct the any
+ // is here for dummy
+ return typelib_TypeClass_VOID;
+ }
+ else // else no exception occured...
+ {
+ // temporary params
+ for ( ; nTempIndizes--; )
+ {
+ sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+
+ if (pParams[nIndex].bOut) // inout/out
+ {
+ // convert and assign
+ uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+ uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+ }
+ // destroy temp uno param
+ uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
+
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ // return
+ if (pCppReturn) // has complex return
+ {
+ if (pUnoReturn != pCppReturn) // needs reconversion
+ {
+ uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+ // destroy temp uno return
+ uno_destructData( pUnoReturn, pReturnTypeDescr, 0 );
+ }
+ // complex return ptr is set to return reg
+ *(void **)pRegisterReturn = pCppReturn;
+ }
+ if (pReturnTypeDescr)
+ {
+ typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+ return eRet;
+ }
+ else
+ return typelib_TypeClass_VOID;
+ }
+}
+
+
+//==================================================================================================
+static typelib_TypeClass cpp_mediate(
+ sal_Int32 nFunctionIndex,
+ sal_Int32 nVtableOffset,
+ void ** gpreg, double * fpreg, void ** ovrflw,
+ sal_uInt64 * pRegisterReturn /* space for register return */ )
+{
+ OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
+
+ // gpreg: [ret *], this, [other gpr params]
+ // fpreg: [fpr params]
+ // ovrflw: [gpr or fpr params (in space allocated for all params properly aligned)]
+
+ void * pThis;
+ if( nFunctionIndex & 0x8000 )
+ {
+ nFunctionIndex &= 0x7fff;
+ pThis = gpreg[1];
+ }
+ else
+ {
+ pThis = gpreg[0];
+ }
+
+ pThis = static_cast< char * >(pThis) - nVtableOffset;
+
+ bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
+ = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(pThis);
+
+ typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
+
+ OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" );
+ if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
+ {
+ throw RuntimeException(
+ rtl::OUString::createFromAscii("illegal vtable index!"),
+ (XInterface *)pThis );
+ }
+
+ // determine called method
+ sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
+ OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
+
+ TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
+
+ typelib_TypeClass eRet;
+ switch (aMemberDescr.get()->eTypeClass)
+ {
+ case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+ {
+ if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex)
+ {
+ // is GET method
+ eRet = cpp2uno_call(
+ pCppI, aMemberDescr.get(),
+ ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef,
+ 0, 0, // no params
+ gpreg, fpreg, ovrflw, pRegisterReturn );
+ }
+ else
+ {
+ // is SET method
+ typelib_MethodParameter aParam;
+ aParam.pTypeRef =
+ ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef;
+ aParam.bIn = sal_True;
+ aParam.bOut = sal_False;
+
+ eRet = cpp2uno_call(
+ pCppI, aMemberDescr.get(),
+ 0, // indicates void return
+ 1, &aParam,
+ gpreg, fpreg, ovrflw, pRegisterReturn );
+ }
+ break;
+ }
+ case typelib_TypeClass_INTERFACE_METHOD:
+ {
+ // is METHOD
+ switch (nFunctionIndex)
+ {
+ case 1: // acquire()
+ pCppI->acquireProxy(); // non virtual call!
+ eRet = typelib_TypeClass_VOID;
+ break;
+ case 2: // release()
+ pCppI->releaseProxy(); // non virtual call!
+ eRet = typelib_TypeClass_VOID;
+ break;
+ case 0: // queryInterface() opt
+ {
+ typelib_TypeDescription * pTD = 0;
+ TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( gpreg[2] )->getTypeLibType() );
+ if (pTD)
+ {
+ XInterface * pInterface = 0;
+ (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
+ pCppI->getBridge()->getCppEnv(),
+ (void **)&pInterface, pCppI->getOid().pData, (typelib_InterfaceTypeDescription *)pTD );
+
+ if (pInterface)
+ {
+ ::uno_any_construct(
+ reinterpret_cast< uno_Any * >( gpreg[0] ),
+ &pInterface, pTD, cpp_acquire );
+ pInterface->release();
+ TYPELIB_DANGER_RELEASE( pTD );
+ *(void **)pRegisterReturn = gpreg[0];
+ eRet = typelib_TypeClass_ANY;
+ break;
+ }
+ TYPELIB_DANGER_RELEASE( pTD );
+ }
+ } // else perform queryInterface()
+ default:
+ eRet = cpp2uno_call(
+ pCppI, aMemberDescr.get(),
+ ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef,
+ ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams,
+ ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams,
+ gpreg, fpreg, ovrflw, pRegisterReturn );
+ }
+ break;
+ }
+ default:
+ {
+ throw RuntimeException(
+ rtl::OUString::createFromAscii("no member description found!"),
+ (XInterface *)pThis );
+ // is here for dummy
+ eRet = typelib_TypeClass_VOID;
+ }
+ }
+
+ return eRet;
+}
+
+//==================================================================================================
+/**
+ * is called on incoming vtable calls
+ * (called by asm snippets)
+ */
+static sal_uInt64 cpp_vtable_call(sal_Int32 r3, sal_Int32 r4, sal_Int32 r5,
+ sal_Int32 r6, sal_Int32 r7, sal_Int32 r8, sal_Int32 r9,
+ sal_Int32 r10, sal_Int32 firstonstack)
+{
+ volatile unsigned long nOffsetAndIndex;
+
+ __asm__ __volatile__(
+ "mr %0, 11\n\t"
+ : "=r" (nOffsetAndIndex) : );
+
+ sal_Int32 nVtableOffset = (nOffsetAndIndex >> 16);
+ sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFF);
+
+ void ** ovrflw = (void**)&firstonstack;
+
+ sal_Int32 gpreg[ppc::MAX_GPR_REGS];
+ gpreg[0] = r3;
+ gpreg[1] = r4;
+ gpreg[2] = r5;
+ gpreg[3] = r6;
+ gpreg[4] = r7;
+ gpreg[5] = r8;
+ gpreg[6] = r9;
+ gpreg[7] = r10;
+
+ double fpreg[ppc::MAX_SSE_REGS];
+ register double d0 asm("fr1"); fpreg[0] = d0;
+ register double d1 asm("fr2"); fpreg[1] = d1;
+ register double d2 asm("fr3"); fpreg[2] = d2;
+ register double d3 asm("fr4"); fpreg[3] = d3;
+ register double d4 asm("fr5"); fpreg[4] = d4;
+ register double d5 asm("fr6"); fpreg[5] = d5;
+ register double d6 asm("fr7"); fpreg[6] = d6;
+ register double d7 asm("fr8"); fpreg[7] = d7;
+ register double d8 asm("fr9"); fpreg[8] = d8;
+ register double d9 asm("fr10"); fpreg[9] = d9;
+ register double d10 asm("fr11"); fpreg[10] = d10;
+ register double d11 asm("fr12"); fpreg[11] = d11;
+ register double d12 asm("fr13"); fpreg[12] = d12;
+
+#if CMC_DEBUG
+ for(int i = 0; i < 8; ++i)
+ {
+ fprintf(stderr, "general reg %d is %x\n", i, gpreg[i]);
+ }
+ for(int i = 0; i < 13; ++i)
+ {
+ fprintf(stderr, "sse reg %d is %f\n", i, fpreg[i]);
+ fprintf(stderr, "sse reg %d is %llx\n", i, fpreg[i]);
+ }
+ for(int i = -8; i < 8; ++i)
+ {
+ fprintf(stderr, "overflow arg %d is %x\n", i, ovrflw[i]);
+ }
+#endif
+ sal_uInt64 nRegReturn=0;
+
+ typelib_TypeClass aType =
+ cpp_mediate( nFunctionIndex, nVtableOffset, (void**)gpreg, fpreg, ovrflw, &nRegReturn );
+
+ sal_uInt32 *pRegReturn = (sal_uInt32*)&nRegReturn;
+ switch( aType )
+ {
+ case typelib_TypeClass_BOOLEAN:
+ pRegReturn[0] = (sal_uInt32)(*(char *)pRegReturn);
+ break;
+ case typelib_TypeClass_BYTE:
+ pRegReturn[0] = (sal_Int32)(*(unsigned char *)pRegReturn);
+ break;
+ case typelib_TypeClass_SHORT:
+ pRegReturn[0] = (sal_Int32)(*(short *)pRegReturn);
+ break;
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ pRegReturn[0] = (sal_uInt32)(*(unsigned short *)pRegReturn);
+ break;
+ case typelib_TypeClass_FLOAT:
+ __asm__("lfs 1,%0\n\t" : : "m"(*((float*)&nRegReturn)));
+ break;
+ case typelib_TypeClass_DOUBLE:
+ __asm__("lfd 1,%0\n\t" : : "m"(*((double*)&nRegReturn)));
+ break;
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ break;
+ default:
+ pRegReturn[0] = (sal_uInt32)(*(unsigned int*)pRegReturn);
+ break;
+ }
+ return nRegReturn;
+}
+
+
+int const codeSnippetSize = 3 * sizeof(void*);
+
+unsigned char * codeSnippet( unsigned char * code, sal_Int16 functionIndex,
+ sal_Int16 vtableOffset, bool simpleRetType )
+{
+ sal_uInt32 nOffsetAndIndex = ( ( vtableOffset ) << 16 ) | (functionIndex );
+ if (! simpleRetType )
+ nOffsetAndIndex |= 0x8000;
+
+ void **raw = (void**)&code[0];
+ memcpy(raw, (char*)cpp_vtable_call, 2 * sizeof(void*));
+ raw[2] = (void*)nOffsetAndIndex;
+
+ return (code + codeSnippetSize);
+}
+
+}
+
+void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const * bptr, unsigned char const * eptr)
+{
+ int const lineSize = 32;
+ for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+ __asm__ volatile ("dcbst 0, %0" : : "r"(p) : "memory");
+ }
+ __asm__ volatile ("sync" : : : "memory");
+ for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+ __asm__ volatile ("icbi 0, %0" : : "r"(p) : "memory");
+ }
+ __asm__ volatile ("isync" : : : "memory");
+}
+
+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+{
+ return static_cast< Slot * >(block) + 2;
+}
+
+sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+ sal_Int32 slotCount)
+{
+ return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+}
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::initializeBlock(
+ void * block, sal_Int32 slotCount)
+{
+ Slot * slots = mapBlockToVtable(block);
+ slots[-2].fn = 0;
+ slots[-1].fn = 0;
+ return slots + slotCount;
+}
+
+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+ Slot ** slots, unsigned char * code,
+ typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+ sal_Int32 functionCount, sal_Int32 vtableOffset)
+{
+ (*slots) -= functionCount;
+ Slot * s = *slots;
+
+ for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+ typelib_TypeDescription * member = 0;
+ TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+ OSL_ASSERT(member != 0);
+ switch (member->eTypeClass) {
+ case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+ // Getter:
+ (s++)->fn = code;
+ code = codeSnippet(
+ code, functionOffset++, vtableOffset,
+ bridges::cpp_uno::shared::isSimpleType(
+ reinterpret_cast<
+ typelib_InterfaceAttributeTypeDescription * >(
+ member)->pAttributeTypeRef));
+
+ // Setter:
+ if (!reinterpret_cast<
+ typelib_InterfaceAttributeTypeDescription * >(
+ member)->bReadOnly)
+ {
+ (s++)->fn = code;
+ code = codeSnippet(code, functionOffset++, vtableOffset, true);
+ }
+ break;
+
+ case typelib_TypeClass_INTERFACE_METHOD:
+ (s++)->fn = code;
+ code = codeSnippet(
+ code, functionOffset++, vtableOffset,
+ bridges::cpp_uno::shared::isSimpleType(
+ reinterpret_cast<
+ typelib_InterfaceMethodTypeDescription * >(
+ member)->pReturnTypeRef));
+ break;
+
+ default:
+ OSL_ASSERT(false);
+ break;
+ }
+ TYPELIB_DANGER_RELEASE(member);
+ }
+ return code;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
new file mode 100644
index 0000000..b40bfde
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
@@ -0,0 +1,291 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: except.cxx,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <stdio.h>
+#include <dlfcn.h>
+#include <cxxabi.h>
+#include <hash_map>
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <osl/diagnose.h>
+#include <osl/mutex.hxx>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <typelib/typedescription.hxx>
+#include <uno/any2.h>
+
+#include "share.hxx"
+#include <string.h>
+
+
+using namespace ::std;
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+using namespace ::__cxxabiv1;
+
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+void dummy_can_throw_anything( char const * )
+{
+}
+
+//==================================================================================================
+static OUString toUNOname( char const * p ) SAL_THROW( () )
+{
+#ifdef DEBUG
+ char const * start = p;
+#endif
+
+ // example: N3com3sun4star4lang24IllegalArgumentExceptionE
+
+ OUStringBuffer buf( 64 );
+ OSL_ASSERT( 'N' == *p );
+ ++p; // skip N
+
+ while ('E' != *p)
+ {
+ // read chars count
+ long n = (*p++ - '0');
+ while ('0' <= *p && '9' >= *p)
+ {
+ n *= 10;
+ n += (*p++ - '0');
+ }
+ buf.appendAscii( p, n );
+ p += n;
+ if ('E' != *p)
+ buf.append( (sal_Unicode)'.' );
+ }
+
+#ifdef DEBUG
+ OUString ret( buf.makeStringAndClear() );
+ OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
+ fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
+ return ret;
+#else
+ return buf.makeStringAndClear();
+#endif
+}
+
+//==================================================================================================
+class RTTI
+{
+ typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map;
+
+ Mutex m_mutex;
+ t_rtti_map m_rttis;
+ t_rtti_map m_generatedRttis;
+
+ void * m_hApp;
+
+public:
+ RTTI() SAL_THROW( () );
+ ~RTTI() SAL_THROW( () );
+
+ type_info * getRTTI( typelib_CompoundTypeDescription * ) SAL_THROW( () );
+};
+//__________________________________________________________________________________________________
+RTTI::RTTI() SAL_THROW( () )
+ : m_hApp( dlopen( 0, RTLD_LAZY ) )
+{
+}
+//__________________________________________________________________________________________________
+RTTI::~RTTI() SAL_THROW( () )
+{
+ dlclose( m_hApp );
+}
+
+//__________________________________________________________________________________________________
+type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () )
+{
+ type_info * rtti;
+
+ OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName;
+
+ MutexGuard guard( m_mutex );
+ t_rtti_map::const_iterator iFind( m_rttis.find( unoName ) );
+ if (iFind == m_rttis.end())
+ {
+ // RTTI symbol
+ OStringBuffer buf( 64 );
+ buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") );
+ sal_Int32 index = 0;
+ do
+ {
+ OUString token( unoName.getToken( 0, '.', index ) );
+ buf.append( token.getLength() );
+ OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) );
+ buf.append( c_token );
+ }
+ while (index >= 0);
+ buf.append( 'E' );
+
+ OString symName( buf.makeStringAndClear() );
+ rtti = (type_info *)dlsym( m_hApp, symName.getStr() );
+
+ if (rtti)
+ {
+ pair< t_rtti_map::iterator, bool > insertion(
+ m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+ OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" );
+ }
+ else
+ {
+ // try to lookup the symbol in the generated rtti map
+ t_rtti_map::const_iterator iiFind( m_generatedRttis.find( unoName ) );
+ if (iiFind == m_generatedRttis.end())
+ {
+ // we must generate it !
+ // symbol and rtti-name is nearly identical,
+ // the symbol is prefixed with _ZTI
+ char const * rttiName = symName.getStr() +4;
+#ifdef DEBUG
+ fprintf( stderr,"generated rtti for %s\n", rttiName );
+#endif
+ if (pTypeDescr->pBaseTypeDescription)
+ {
+ // ensure availability of base
+ type_info * base_rtti = getRTTI(
+ (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription );
+ rtti = new __si_class_type_info(
+ strdup( rttiName ), (__class_type_info *)base_rtti );
+ }
+ else
+ {
+ // this class has no base class
+ rtti = new __class_type_info( strdup( rttiName ) );
+ }
+
+ pair< t_rtti_map::iterator, bool > insertion(
+ m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+ OSL_ENSURE( insertion.second, "### inserting new generated rtti failed?!" );
+ }
+ else // taking already generated rtti
+ {
+ rtti = iiFind->second;
+ }
+ }
+ }
+ else
+ {
+ rtti = iFind->second;
+ }
+ return rtti;
+}
+
+//--------------------------------------------------------------------------------------------------
+static void deleteException( void * pExc )
+{
+ __cxa_exception const * header = ((__cxa_exception const *)pExc - 1);
+ typelib_TypeDescription * pTD = 0;
+ OUString unoName( toUNOname( header->exceptionType->name() ) );
+ ::typelib_typedescription_getByName( &pTD, unoName.pData );
+ OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" );
+ if (pTD)
+ {
+ ::uno_destructData( pExc, pTD, cpp_release );
+ ::typelib_typedescription_release( pTD );
+ }
+}
+
+//==================================================================================================
+void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
+{
+ void * pCppExc;
+ type_info * rtti;
+
+ {
+ // construct cpp exception object
+ typelib_TypeDescription * pTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
+ OSL_ASSERT( pTypeDescr );
+ if (! pTypeDescr)
+ terminate();
+
+ pCppExc = __cxa_allocate_exception( pTypeDescr->nSize );
+ ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
+
+ // destruct uno exception
+ ::uno_any_destruct( pUnoExc, 0 );
+ // avoiding locked counts
+ static RTTI * s_rtti = 0;
+ if (! s_rtti)
+ {
+ MutexGuard guard( Mutex::getGlobalMutex() );
+ if (! s_rtti)
+ {
+#ifdef LEAK_STATIC_DATA
+ s_rtti = new RTTI();
+#else
+ static RTTI rtti_data;
+ s_rtti = &rtti_data;
+#endif
+ }
+ }
+ rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr );
+ TYPELIB_DANGER_RELEASE( pTypeDescr );
+ OSL_ENSURE( rtti, "### no rtti for throwing exception!" );
+ if (! rtti)
+ terminate();
+ }
+
+ __cxa_throw( pCppExc, rtti, deleteException );
+}
+
+//==================================================================================================
+void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+{
+ OSL_ENSURE( header, "### no exception header!!!" );
+ if (! header)
+ terminate();
+
+ typelib_TypeDescription * pExcTypeDescr = 0;
+ OUString unoName( toUNOname( header->exceptionType->name() ) );
+ ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
+ OSL_ENSURE( pExcTypeDescr, "### can not get type description for exception!!!" );
+ if (! pExcTypeDescr)
+ terminate();
+
+ // construct uno exception any
+ ::uno_any_constructAndConvert( pExc, header->adjustedPtr, pExcTypeDescr, pCpp2Uno );
+ ::typelib_typedescription_release( pExcTypeDescr );
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk b/bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk
new file mode 100644
index 0000000..a543640
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk
@@ -0,0 +1,81 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.8 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=bridges
+TARGET=gcc3_uno
+LIBTARGET=no
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCAIXPgcc3"
+
+.IF "$(cppu_no_leak)" == ""
+CFLAGS += -DLEAK_STATIC_DATA
+.ENDIF
+
+NOOPTFILES= \
+ $(SLO)$/uno2cpp.obj \
+ $(SLO)$/cpp2uno.obj
+
+CFLAGSNOOPT=-O0
+
+SLOFILES= \
+ $(SLO)$/except.obj \
+ $(SLO)$/cpp2uno.obj \
+ $(SLO)$/uno2cpp.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1IMPLIB=i$(TARGET)
+SHL1VERSIONMAP=..$/..$/bridge_exports.map
+SHL1RPATH=URELIB
+
+SHL1OBJS= $(SLOFILES)
+SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
+
+SHL1STDLIBS= \
+ $(CPPULIB) \
+ $(SALLIB) \
+ -ldl
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
new file mode 100644
index 0000000..0d7e627
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: share.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "uno/mapping.h"
+
+#include <typeinfo>
+#include <exception>
+#include <cstddef>
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+ void dummy_can_throw_anything( char const * );
+
+
+// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
+
+struct _Unwind_Exception
+{
+ unsigned exception_class __attribute__((__mode__(__DI__)));
+ void * exception_cleanup;
+ unsigned private_1 __attribute__((__mode__(__word__)));
+ unsigned private_2 __attribute__((__mode__(__word__)));
+} __attribute__((__aligned__));
+
+struct __cxa_exception
+{
+ ::std::type_info *exceptionType;
+ void (*exceptionDestructor)(void *);
+
+ ::std::unexpected_handler unexpectedHandler;
+ ::std::terminate_handler terminateHandler;
+
+ __cxa_exception *nextException;
+
+ int handlerCount;
+
+ int handlerSwitchValue;
+ const unsigned char *actionRecord;
+ const unsigned char *languageSpecificData;
+ void *catchTemp;
+ void *adjustedPtr;
+
+ _Unwind_Exception unwindHeader;
+};
+
+extern "C" void *__cxa_allocate_exception(
+ std::size_t thrown_size ) throw();
+extern "C" void __cxa_throw (
+ void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn));
+
+struct __cxa_eh_globals
+{
+ __cxa_exception *caughtExceptions;
+ unsigned int uncaughtExceptions;
+};
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+
+// -----
+
+//==================================================================================================
+void raiseException(
+ uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
+//==================================================================================================
+void fillUnoException(
+ __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+}
+
+namespace ppc
+{
+ enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
new file mode 100644
index 0000000..6937289
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
@@ -0,0 +1,502 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: uno2cpp.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <sys/types.h>
+#include <sys/malloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/vtables.hxx"
+
+#include "share.hxx"
+#include <stdio.h>
+#include <string.h>
+
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+void MapReturn(sal_uInt32 r3, sal_uInt32 r4, double dret, typelib_TypeClass eReturnType, void *pRegisterReturn)
+{
+ switch( eReturnType )
+ {
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ ((long*)pRegisterReturn)[1] = r4;
+ // fall through on purpose
+ case typelib_TypeClass_LONG:
+ case typelib_TypeClass_UNSIGNED_LONG:
+ case typelib_TypeClass_ENUM:
+ ((long*)pRegisterReturn)[0] = r3;
+ break;
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ *(unsigned short*)pRegisterReturn = (unsigned short)r3;
+ break;
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ *(unsigned char*)pRegisterReturn = (unsigned char)r3;
+ break;
+ case typelib_TypeClass_FLOAT:
+ *(float*)pRegisterReturn = (float)dret;
+ break;
+ case typelib_TypeClass_DOUBLE:
+ *(double*)pRegisterReturn = dret;
+ break;
+ default:
+ break;
+ }
+}
+
+#define DISPLACEMENT -2
+
+static void callVirtualMethod(
+ void * pThis,
+ sal_uInt32 nVtableIndex,
+ void * pRegisterReturn,
+ typelib_TypeClass eReturnType,
+ sal_uInt32 * pStack,
+ sal_uInt32 nStack,
+ double *pFPR,
+ sal_uInt32 nFPR)
+{
+ sal_uInt32 nStackWords = nStack;
+ if (nStackWords < ppc::MAX_GPR_REGS)
+ nStackWords = 0;
+ else
+ nStackWords-=ppc::MAX_GPR_REGS;
+ if (nStackWords)
+ nStackWords = ( nStackWords + 1) & ~1;
+ sal_uInt32 *stack = (sal_uInt32*)__builtin_alloca( nStackWords * sizeof(sal_uInt32) );
+ memcpy(stack+DISPLACEMENT, pStack+ppc::MAX_GPR_REGS, nStack * sizeof(sal_uInt32));
+
+ // Get pointer to method
+ sal_uInt32 pMethod = *((sal_uInt32 *)pThis);
+ pMethod += 4 * nVtableIndex;
+ pMethod = *((sal_uInt32 *)pMethod);
+
+ typedef void (* FunctionCall )( sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32 );
+ FunctionCall pFunc = (FunctionCall)pMethod;
+
+ register double d0 asm("fr1"); d0 = pFPR[0];
+ register double d1 asm("fr2"); d1 = pFPR[1];
+ register double d2 asm("fr3"); d2 = pFPR[2];
+ register double d3 asm("fr4"); d3 = pFPR[3];
+ register double d4 asm("fr5"); d4 = pFPR[4];
+ register double d5 asm("fr6"); d5 = pFPR[5];
+ register double d6 asm("fr7"); d6 = pFPR[6];
+ register double d7 asm("fr8"); d7 = pFPR[7];
+ register double d8 asm("fr9"); d8 = pFPR[8];
+ register double d9 asm("fr10"); d9 = pFPR[9];
+ register double d10 asm("fr11"); d10 = pFPR[10];
+ register double d11 asm("fr12"); d11 = pFPR[11];
+ register double d12 asm("fr13"); d12 = pFPR[12];
+
+ (*pFunc)(pStack[0], pStack[1], pStack[2], pStack[3], pStack[4], pStack[5], pStack[6], pStack[7]);
+
+ register sal_uInt32 r3 asm("r3");
+ register sal_uInt32 r4 asm("r4");
+ MapReturn(r3, r4, d0, eReturnType, pRegisterReturn);
+}
+
+#define INSERT_INT32(pSV, pDS) \
+{ \
+ *pDS++ = *reinterpret_cast<sal_uInt32 *>(pSV); \
+}
+
+#define INSERT_INT16(pSV, pDS) \
+{ \
+ *pDS++ = *reinterpret_cast<sal_uInt16 *>(pSV); \
+}
+
+#define INSERT_INT8(pSV, pDS) \
+{ \
+ *pDS++ = *reinterpret_cast<sal_uInt8 *>(pSV); \
+}
+
+#define INSERT_FLOAT(pSV, nr, pFPR, pDS) \
+{ \
+ if (nr < ppc::MAX_SSE_REGS) \
+ { \
+ sal_uInt32 *pDouble = (sal_uInt32 *)&(pFPR[nr++]); \
+ pDouble[0] = *reinterpret_cast<sal_uInt32 *>(pSV); \
+ } \
+ *pDS++ = *reinterpret_cast<sal_uInt32 *>(pSV); \
+}
+
+#define INSERT_DOUBLE(pSV, nr, pFPR, pDS) \
+{ \
+ if (nr < ppc::MAX_SSE_REGS) \
+ { \
+ pFPR[nr++] = *reinterpret_cast<double *>(pSV); \
+ } \
+ *pDS++ = reinterpret_cast<sal_uInt32 *>(pSV)[1]; \
+ *pDS++ = reinterpret_cast<sal_uInt32 *>(pSV)[0]; \
+}
+
+#define INSERT_INT64(pSV, pDS) \
+{ \
+ INSERT_INT32(pSV, pDS) \
+ INSERT_INT32(((sal_uInt32*)pSV)+1, pDS) \
+}
+//==================================================================================================
+static void cpp_call(
+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+ bridges::cpp_uno::shared::VtableSlot aVtableSlot,
+ typelib_TypeDescriptionReference * pReturnTypeRef,
+ sal_Int32 nParams, typelib_MethodParameter * pParams,
+ void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
+{
+ // max space for: [complex ret ptr], values|ptr ...
+ sal_uInt32 * pStack = (sal_uInt32*)__builtin_alloca( sizeof(sal_Int32) + ((nParams+2) * sizeof(sal_Int64)) );
+ sal_uInt32 * pStackStart = pStack;
+
+ double pFPR[ppc::MAX_SSE_REGS];
+ sal_uInt32 nFPR = 0;
+
+ // return
+ typelib_TypeDescription * pReturnTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+ OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
+
+ void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
+
+ if (pReturnTypeDescr)
+ {
+ if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+ {
+ pCppReturn = pUnoReturn; // direct way for simple types
+ }
+ else
+ {
+ // complex return via ptr
+ pCppReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+ ? __builtin_alloca( pReturnTypeDescr->nSize )
+ : pUnoReturn); // direct way
+ INSERT_INT32(&pCppReturn, pStack);
+ }
+ }
+ // push this
+ void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset;
+ INSERT_INT32(&pAdjustedThisPtr, pStack);
+
+ // stack space
+ OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+ // args
+ void ** pCppArgs = (void **)__builtin_alloca( 3 * sizeof(void *) * nParams );
+ // indizes of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams);
+ // type descriptions for reconversions
+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams));
+
+ sal_Int32 nTempIndizes = 0;
+
+ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+ {
+ const typelib_MethodParameter & rParam = pParams[nPos];
+ typelib_TypeDescription * pParamTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+ if (!rParam.bOut
+ && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+ {
+ uno_copyAndConvertData( pCppArgs[nPos] = pStack, pUnoArgs[nPos], pParamTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+
+ switch (pParamTypeDescr->eTypeClass)
+ {
+ case typelib_TypeClass_LONG:
+ case typelib_TypeClass_UNSIGNED_LONG:
+ case typelib_TypeClass_ENUM:
+ INSERT_INT32(pCppArgs[nPos], pStack);
+ break;
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ INSERT_INT16(pCppArgs[nPos], pStack);
+ break;
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ INSERT_INT8(pCppArgs[nPos], pStack);
+ break;
+ case typelib_TypeClass_FLOAT:
+ INSERT_FLOAT(pCppArgs[nPos], nFPR, pFPR, pStack);
+ break;
+ case typelib_TypeClass_DOUBLE:
+ INSERT_DOUBLE(pCppArgs[nPos], nFPR, pFPR, pStack);
+ break;
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ INSERT_INT64(pCppArgs[nPos], pStack);
+ break;
+ default:
+ break;
+ }
+
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ else // ptr to complex value | ref
+ {
+ if (! rParam.bIn) // is pure out
+ {
+ // cpp out is constructed mem, uno out is not!
+ uno_constructData(
+ pCppArgs[nPos] = __builtin_alloca( pParamTypeDescr->nSize ),
+ pParamTypeDescr );
+ pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+ // will be released at reconversion
+ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ }
+ // is in/inout
+ else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+ {
+ uno_copyAndConvertData(
+ pCppArgs[nPos] = __builtin_alloca( pParamTypeDescr->nSize ),
+ pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
+
+ pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+ // will be released at reconversion
+ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ }
+ else // direct way
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos];
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ INSERT_INT32(&(pCppArgs[nPos]), pStack);
+ }
+ }
+
+ try
+ {
+ OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 3), "UNALIGNED STACK !!! (Please DO panic)" );
+ callVirtualMethod(
+ pAdjustedThisPtr, aVtableSlot.index,
+ pCppReturn, pReturnTypeDescr->eTypeClass,
+ pStackStart, (pStack - pStackStart), pFPR, nFPR );
+ // NO exception occured...
+ *ppUnoExc = 0;
+
+ // reconvert temporary params
+ for ( ; nTempIndizes--; )
+ {
+ sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+
+ if (pParams[nIndex].bIn)
+ {
+ if (pParams[nIndex].bOut) // inout
+ {
+ uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value
+ uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+ pThis->getBridge()->getCpp2Uno() );
+ }
+ }
+ else // pure out
+ {
+ uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+ pThis->getBridge()->getCpp2Uno() );
+ }
+ // destroy temp cpp param => cpp: every param was constructed
+ uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ // return value
+ if (pCppReturn && pUnoReturn != pCppReturn)
+ {
+ uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr,
+ pThis->getBridge()->getCpp2Uno() );
+ uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
+ }
+ }
+ catch (...)
+ {
+ // fill uno exception
+ fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+
+ // temporary params
+ for ( ; nTempIndizes--; )
+ {
+ sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+ // destroy temp cpp param => cpp: every param was constructed
+ uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release );
+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+ }
+ // return type
+ if (pReturnTypeDescr)
+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+ }
+}
+
+}
+
+namespace bridges { namespace cpp_uno { namespace shared {
+
+void unoInterfaceProxyDispatch(
+ uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
+ void * pReturn, void * pArgs[], uno_Any ** ppException )
+{
+ // is my surrogate
+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
+ = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI);
+ // typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
+
+ switch (pMemberDescr->eTypeClass)
+ {
+ case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+ {
+
+ VtableSlot aVtableSlot(
+ getVtableSlot(
+ reinterpret_cast<
+ typelib_InterfaceAttributeTypeDescription const * >(
+ pMemberDescr)));
+
+ if (pReturn)
+ {
+ // dependent dispatch
+ cpp_call(
+ pThis, aVtableSlot,
+ ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef,
+ 0, 0, // no params
+ pReturn, pArgs, ppException );
+ }
+ else
+ {
+ // is SET
+ typelib_MethodParameter aParam;
+ aParam.pTypeRef =
+ ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef;
+ aParam.bIn = sal_True;
+ aParam.bOut = sal_False;
+
+ typelib_TypeDescriptionReference * pReturnTypeRef = 0;
+ OUString aVoidName( RTL_CONSTASCII_USTRINGPARAM("void") );
+ typelib_typedescriptionreference_new(
+ &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
+
+ // dependent dispatch
+ aVtableSlot.index += 1; //get then set method
+ cpp_call(
+ pThis, aVtableSlot,
+ pReturnTypeRef,
+ 1, &aParam,
+ pReturn, pArgs, ppException );
+
+ typelib_typedescriptionreference_release( pReturnTypeRef );
+ }
+
+ break;
+ }
+ case typelib_TypeClass_INTERFACE_METHOD:
+ {
+
+ VtableSlot aVtableSlot(
+ getVtableSlot(
+ reinterpret_cast<
+ typelib_InterfaceMethodTypeDescription const * >(
+ pMemberDescr)));
+ switch (aVtableSlot.index)
+ {
+ // standard calls
+ case 1: // acquire uno interface
+ (*pUnoI->acquire)( pUnoI );
+ *ppException = 0;
+ break;
+ case 2: // release uno interface
+ (*pUnoI->release)( pUnoI );
+ *ppException = 0;
+ break;
+ case 0: // queryInterface() opt
+ {
+ typelib_TypeDescription * pTD = 0;
+ TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() );
+ if (pTD)
+ {
+ uno_Interface * pInterface = 0;
+ (*pThis->pBridge->getUnoEnv()->getRegisteredInterface)(
+ pThis->pBridge->getUnoEnv(),
+ (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD );
+
+ if (pInterface)
+ {
+ ::uno_any_construct(
+ reinterpret_cast< uno_Any * >( pReturn ),
+ &pInterface, pTD, 0 );
+ (*pInterface->release)( pInterface );
+ TYPELIB_DANGER_RELEASE( pTD );
+ *ppException = 0;
+ break;
+ }
+ TYPELIB_DANGER_RELEASE( pTD );
+ }
+ } // else perform queryInterface()
+ default:
+ // dependent dispatch
+ cpp_call(
+ pThis, aVtableSlot,
+ ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef,
+ ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams,
+ ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams,
+ pReturn, pArgs, ppException );
+ }
+ break;
+ }
+ default:
+ {
+ ::com::sun::star::uno::RuntimeException aExc(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("illegal member type description!") ),
+ ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() );
+
+ Type const & rExcType = ::getCppuType( &aExc );
+ // binary identical null reference
+ ::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 );
+ }
+ }
+}
+
+} } }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list