ooo-build r11600 - in trunk: . patches/src680
- From: rengelhard svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r11600 - in trunk: . patches/src680
- Date: Sat, 16 Feb 2008 21:04:55 +0000 (GMT)
Author: rengelhard
Date: Sat Feb 16 21:04:54 2008
New Revision: 11600
URL: http://svn.gnome.org/viewvc/ooo-build?rev=11600&view=rev
Log:
2008-02-16 Rene Engelhard <rene debian org>
* patches/src680/apply,
patches/src680/cws-ia64port01.diff: cws-extract
Added:
trunk/patches/src680/cws-ia64port01.diff
Modified:
trunk/ChangeLog
trunk/patches/src680/apply
Modified: trunk/patches/src680/apply
==============================================================================
--- trunk/patches/src680/apply (original)
+++ trunk/patches/src680/apply Sat Feb 16 21:04:54 2008
@@ -311,6 +311,9 @@
cws-thiscomponent-basctl.diff
cws-thiscomponent-sfx2.diff
+[ CWSBackports ]
+cws-ia64port01.diff, i#84999
+
[ WPG ]
# libwpg-based import filter for WordPerfect Graphics
libwpg.diff
@@ -945,7 +948,7 @@
[ BuildBits >= ooh680-m4 ]
# allow to define java target, so the build is usable with the JVM 1.4
# even when it is built with JDK 1.5
-build-java-target.diff, pmladek
+#build-java-target.diff, pmladek
[ BuildBits < ooh680-m5 ]
# don't include asm/sigcontext.h, see Debian Bug #442418
Added: trunk/patches/src680/cws-ia64port01.diff
==============================================================================
--- (empty file)
+++ trunk/patches/src680/cws-ia64port01.diff Sat Feb 16 21:04:54 2008
@@ -0,0 +1,2917 @@
+cvs diff: Diffing automation
+cvs diff: Diffing automation/inc
+cvs diff: Diffing automation/inc/automation
+cvs diff: Diffing automation/inc/pch
+cvs diff: Diffing automation/packimages
+cvs diff: Diffing automation/prj
+cvs diff: Diffing automation/source
+cvs diff: Diffing automation/source/app
+cvs diff: Diffing automation/source/communi
+cvs diff: Diffing automation/source/inc
+cvs diff: Diffing automation/source/miniapp
+cvs diff: Diffing automation/source/mozillaserver
+cvs diff: Diffing automation/source/server
+cvs diff: Diffing automation/source/simplecm
+cvs diff: Diffing automation/source/testtool
+Index: automation/source/testtool/objtest.cxx
+===================================================================
+RCS file: /cvs/util/automation/source/testtool/objtest.cxx,v
+retrieving revision 1.36
+retrieving revision 1.36.6.1
+diff -u -u -p -b -w -B -r1.36 -r1.36.6.1
+--- automation/source/testtool/objtest.cxx 26 Nov 2007 17:59:36 -0000 1.36
++++ automation/source/testtool/objtest.cxx 8 Jan 2008 08:25:51 -0000 1.36.6.1
+@@ -542,6 +542,8 @@ void TestToolObj::LoadIniFile() // La
+ abGP.Append( "18" ); // Linux MIPS
+ #elif defined LINUX && defined ARM
+ abGP.Append( "19" ); // Linux ARM
++#elif defined LINUX && defined IA64
++ abGP.Append( "20" ); // Linux ia64
+ #else
+ #error ("unknown platform. please request an ID for your platform on qa/dev")
+ #endif
+cvs diff: Diffing automation/util
+cvs diff: Diffing automation/util/defs
+cvs diff: Diffing solenv
+cvs diff: Diffing solenv/bin
+cvs diff: Diffing solenv/bin/modules
+cvs diff: Diffing solenv/bin/modules/PCVSLib
+cvs diff: Diffing solenv/bin/modules/PCVSLib/lib
+cvs diff: Diffing solenv/bin/modules/PCVSLib/lib/PCVSLib
+cvs diff: Diffing solenv/bin/modules/PCVSLib/samples
+cvs diff: Diffing solenv/bin/modules/PCVSLib/t
+cvs diff: Diffing solenv/bin/modules/installer
+cvs diff: Diffing solenv/bin/modules/installer/windows
+cvs diff: Diffing solenv/bin/modules/packager
+cvs diff: Diffing solenv/bin/modules/par2script
+cvs diff: Diffing solenv/bin/modules/pre2par
+cvs diff: Diffing solenv/config
+cvs diff: Diffing solenv/inc
+Index: solenv/inc/unx.mk
+===================================================================
+RCS file: /cvs/tools/solenv/inc/unx.mk,v
+retrieving revision 1.35
+retrieving revision 1.35.92.1
+diff -u -u -p -b -w -B -r1.35 -r1.35.92.1
+--- solenv/inc/unx.mk 2 Nov 2007 15:20:22 -0000 1.35
++++ solenv/inc/unx.mk 4 Jan 2008 18:52:35 -0000 1.35.92.1
+@@ -131,6 +131,10 @@
+ .INCLUDE : unxlngr.mk
+ .ENDIF
+
++.IF "$(COM)$(OS)$(CPU)$(GLIBC)" == "GCCLINUXA2REDHAT60"
++.INCLUDE : unxlnga.mk
++.ENDIF
++
+ .IF "$(COM)$(OS)$(CPU)" == "ACCHPUXR"
+ .INCLUDE : unxhpxr.mk
+ .ENDIF
+Index: solenv/inc/unxlnga.mk
+===================================================================
+RCS file: solenv/inc/unxlnga.mk
+diff -N solenv/inc/unxlnga.mk
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ solenv/inc/unxlnga.mk 4 Jan 2008 18:52:35 -0000 1.1.2.1
+@@ -0,0 +1,230 @@
++#*************************************************************************
++#
++# OpenOffice.org - a multi-platform office productivity suite
++#
++# $RCSfile$
++#
++# $Revision$
++#
++# last change: $Author$ $Date$
++#
++# The Contents of this file are made available subject to
++# the terms of GNU Lesser General Public License Version 2.1.
++#
++#
++# GNU Lesser General Public License Version 2.1
++# =============================================
++# Copyright 2005 by Sun Microsystems, Inc.
++# 901 San Antonio Road, Palo Alto, CA 94303, USA
++#
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Lesser General Public
++# License version 2.1, as published by the Free Software Foundation.
++#
++# This library 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 for more details.
++#
++# You should have received a copy of the GNU Lesser General Public
++# License along with this library; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++# MA 02111-1307 USA
++#
++#*************************************************************************
++
++# mk file for unxlnga
++ASM=
++AFLAGS=
++
++SOLAR_JAVA*=
++JAVAFLAGSDEBUG=-g
++
++# filter for supressing verbose messages from linker
++#not needed at the moment
++#LINKOUTPUT_FILTER=" |& $(SOLARENV)$/bin$/msg_filter"
++
++# _PTHREADS is needed for the stl
++CDEFS+=$(PTHREAD_CFLAGS) -DGLIBC=2 -DIA64 -D_PTHREADS -D_REENTRANT -DNEW_SOLAR -D_USE_NAMESPACE=1 -DSTLPORT_VERSION=400
++
++# enable visibility define in "sal/types.h"
++.IF "$(HAVE_GCC_VISIBILITY_FEATURE)" == "TRUE"
++CDEFS += -DHAVE_GCC_VISIBILITY_FEATURE
++.ENDIF # "$(HAVE_GCC_VISIBILITY_FEATURE)" == "TRUE"
++
++# this is a platform with JAVA support
++.IF "$(SOLAR_JAVA)"!=""
++JAVADEF=-DSOLAR_JAVA
++.IF "$(debug)"==""
++JAVA_RUNTIME=-ljava
++.ELSE
++JAVA_RUNTIME=-ljava_g
++.ENDIF
++.ENDIF
++
++# architecture dependent flags for the C and C++ compiler that can be changed by
++# exporting the variable ARCH_FLAGS="..." in the shell, which is used to start build
++ARCH_FLAGS*=
++
++# name of C++ Compiler
++CXX*=g++
++# name of C Compiler
++CC*=gcc
++.IF "$(SYSBASE)"!=""
++CFLAGS_SYSBASE:=-isystem $(SYSBASE)$/usr$/include
++CXX+:=$(CFLAGS_SYSBASE)
++CC+:=$(CFLAGS_SYSBASE)
++.ENDIF # "$(SYSBASE)"!=""
++CFLAGS+=-Wreturn-type -fmessage-length=0 -c
++# flags to enable build with symbols; required for crashdump feature
++.IF "$(ENABLE_SYMBOLS)"=="SMALL"
++CFLAGSENABLESYMBOLS=-g1
++.ELSE
++CFLAGSENABLESYMBOLS=-g # was temporarily commented out, reenabled before Beta
++
++.ENDIF
++.IF "$(HAVE_LD_HASH_STYLE)" == "TRUE"
++LINKFLAGS += -Wl,--hash-style=both
++.ELSE
++LINKFLAGS += -Wl,-zdynsort
++.ENDIF
++
++# flags for the C++ Compiler
++CFLAGSCC= -pipe $(ARCH_FLAGS)
++# Flags for enabling exception handling
++CFLAGSEXCEPTIONS=-fexceptions -fno-enforce-eh-specs
++# Flags for disabling exception handling
++CFLAGS_NO_EXCEPTIONS=-fno-exceptions
++
++# -fpermissive should be removed as soon as possible
++CFLAGSCXX= -pipe $(ARCH_FLAGS)
++CFLAGSCXX+= -Wno-ctor-dtor-privacy
++CFLAGSCXX+= -fno-use-cxa-atexit
++PICSWITCH:=-fpic
++.IF "$(HAVE_GCC_VISIBILITY_FEATURE)" == "TRUE"
++CFLAGSCXX += -fvisibility-inlines-hidden
++.ENDIF # "$(HAVE_GCC_VISIBILITY_FEATURE)" == "TRUE"
++
++# Compiler flags for compiling static object in multi threaded environment with graphical user interface
++CFLAGSOBJGUIMT=
++# Compiler flags for compiling static object in multi threaded environment with character user interface
++CFLAGSOBJCUIMT=
++# Compiler flags for compiling shared object in multi threaded environment with graphical user interface
++CFLAGSSLOGUIMT=$(PICSWITCH)
++# Compiler flags for compiling shared object in multi threaded environment with character user interface
++CFLAGSSLOCUIMT=$(PICSWITCH)
++# Compiler flags for profiling
++CFLAGSPROF=
++# Compiler flags for debugging
++CFLAGSDEBUG=-g
++CFLAGSDBGUTIL=
++# Compiler flags for enabling optimizations
++.IF "$(PRODUCT)"!=""
++CFLAGSOPT=-O2 -fno-strict-aliasing # optimizing for products
++CFLAGSOPT+=-Wuninitialized # not supported without optimization
++.ELSE # "$(PRODUCT)"!=""
++CFLAGSOPT= # no optimizing for non products
++.ENDIF # "$(PRODUCT)"!=""
++# Compiler flags for disabling optimizations
++CFLAGSNOOPT=-O0
++# Compiler flags for describing the output path
++CFLAGSOUTOBJ=-o
++
++# -Wshadow does not work for C with nested uses of pthread_cleanup_push:
++CFLAGSWARNCC=-Wall -Wextra -Wendif-labels
++CFLAGSWARNCXX=$(CFLAGSWARNCC) -Wshadow -Wno-ctor-dtor-privacy \
++ -Wno-non-virtual-dtor
++CFLAGSWALLCC=$(CFLAGSWARNCC)
++CFLAGSWALLCXX=$(CFLAGSWARNCXX)
++CFLAGSWERRCC=-Werror
++
++# Once all modules on this platform compile without warnings, set
++# COMPILER_WARN_ERRORS=TRUE here instead of setting MODULES_WITH_WARNINGS (see
++# settings.mk):
++
++MODULES_WITH_WARNINGS := \
++ extensions \
++ soldep \
++ slideshow \
++ svtools \
++ svx
++
++# switches for dynamic and static linking
++STATIC = -Wl,-Bstatic
++DYNAMIC = -Wl,-Bdynamic
++
++# name of linker
++LINK*=$(CXX)
++LINKC*=$(CC)
++
++# default linker flags
++LINKFLAGSDEFS*=-Wl,-z,defs
++LINKFLAGSRUNPATH_URELIB=-Wl,-rpath,\''$$ORIGIN'\'
++LINKFLAGSRUNPATH_UREBIN=-Wl,-rpath,\''$$ORIGIN/../lib:$$ORIGIN'\'
++ #TODO: drop $ORIGIN once no URE executable is also shipped in OOo
++LINKFLAGSRUNPATH_OOO=-Wl,-rpath,\''$$ORIGIN:$$ORIGIN/../ure-link/lib'\'
++LINKFLAGS=-Wl,-z,combreloc $(LINKFLAGSDEFS)
++
++# linker flags for linking applications
++LINKFLAGSAPPGUI= -Wl,-export-dynamic -Wl,--noinhibit-exec
++LINKFLAGSAPPCUI= -Wl,-export-dynamic -Wl,--noinhibit-exec
++
++# linker flags for linking shared libraries
++LINKFLAGSSHLGUI= -shared
++LINKFLAGSSHLCUI= -shared
++
++LINKFLAGSTACK=
++LINKFLAGSPROF=
++LINKFLAGSDEBUG=-g
++LINKFLAGSOPT=
++
++# linker flags for optimization (symbol hashtable)
++# for now, applied to symbol scoped libraries, only
++LINKFLAGSOPTIMIZE*=-Wl,-O1
++LINKVERSIONMAPFLAG=$(LINKFLAGSOPTIMIZE) -Wl,--version-script
++
++SONAME_SWITCH=-Wl,-h
++
++# Sequence of libs does matter !
++
++STDLIBCPP=-lstdc++
++
++# default objectfilenames to link
++STDOBJVCL=$(L)$/salmain.o
++STDOBJGUI=
++STDSLOGUI=
++STDOBJCUI=
++STDSLOCUI=
++
++# libraries for linking applications
++STDLIBGUIMT+=-lX11 -ldl -lpthread -lm
++STDLIBCUIMT+=-ldl -lpthread -lm
++# libraries for linking shared libraries
++STDSHLGUIMT+=-lX11 -lXext -ldl -lpthread -lm
++STDSHLCUIMT+=-ldl -lpthread -lm
++
++LIBSALCPPRT*=-Wl,--whole-archive -lsalcpprt -Wl,--no-whole-archive
++
++# name of library manager
++LIBMGR=ar
++LIBFLAGS=-r
++
++# tool for generating import libraries
++IMPLIB=
++IMPLIBFLAGS=
++
++MAPSYM=
++MAPSYMFLAGS=
++
++RC=irc
++RCFLAGS=-fo$@ $(RCFILES)
++RCLINK=
++RCLINKFLAGS=
++RCSETVERSION=
++
++# platform specific identifier for shared libs
++DLLPOSTFIX=la
++DLLPRE=lib
++DLLPOST=.so
++PCHPOST=.gch
++
+cvs diff: Diffing solenv/inc/startup
+cvs diff: Diffing solenv/inc/startup/AIX
+cvs diff: Diffing solenv/inc/startup/FREEBSD
+cvs diff: Diffing solenv/inc/startup/HPUX
+cvs diff: Diffing solenv/inc/startup/IRIX
+cvs diff: Diffing solenv/inc/startup/LINUX
+cvs diff: Diffing solenv/inc/startup/MACOSX
+cvs diff: Diffing solenv/inc/startup/NETBSD
+cvs diff: Diffing solenv/inc/startup/SOLARIS
+cvs diff: Diffing solenv/inc/startup/UNIX
+cvs diff: Diffing solenv/inc/startup/wnt
+cvs diff: Diffing solenv/prj
+cvs diff: Diffing solenv/src
+cvs diff: Diffing solenv/unxmacxp
+cvs diff: Diffing solenv/unxmacxp/inc
+cvs diff: Diffing bridges
+cvs diff: Diffing bridges/inc
+cvs diff: Diffing bridges/inc/bridges
+cvs diff: Diffing bridges/inc/bridges/cpp_uno
+cvs diff: Diffing bridges/inc/bridges/cpp_uno/shared
+cvs diff: Diffing bridges/inc/bridges/remote
+cvs diff: Diffing bridges/inc/pch
+cvs diff: Diffing bridges/prj
+Index: bridges/prj/build.lst
+===================================================================
+RCS file: /cvs/udk/bridges/prj/build.lst,v
+retrieving revision 1.44
+retrieving revision 1.44.8.1
+diff -u -u -p -b -w -B -r1.44 -r1.44.8.1
+--- bridges/prj/build.lst 26 Nov 2007 18:01:08 -0000 1.44
++++ bridges/prj/build.lst 4 Jan 2008 19:09:57 -0000 1.44.8.1
+@@ -18,6 +18,7 @@ br bridges\source\cpp_uno\gcc3_linux_mip
+ br bridges\source\cpp_uno\gcc3_linux_s390 nmake - u br_gccl33 br_unotypes br_inc NULL
+ br bridges\source\cpp_uno\gcc3_linux_sparc nmake - u br_gccl3s br_unotypes br_cppuno_shared br_inc NULL
+ br bridges\source\cpp_uno\gcc3_linux_arm nmake - u br_gccl3r br_unotypes NULL
++br bridges\source\cpp_uno\gcc3_linux_ia64 nmake - u br_gccl3a br_unotypes NULL
+ br bridges\source\cpp_uno\gcc3_macosx_intel nmake - u br_gcc3macoxi br_cppuno_shared br_unotypes br_inc NULL
+ br bridges\source\cpp_uno\gcc3_macosx_powerpc nmake - u br_gcc3macoxp br_cppuno_shared br_unotypes br_inc NULL
+ br bridges\source\cpp_uno\cc50_solaris_sparc nmake - u br_cc50sols br_unotypes br_cppuno_shared br_inc NULL
+cvs diff: Diffing bridges/source
+cvs diff: Diffing bridges/source/cpp_uno
+cvs diff: Diffing bridges/source/cpp_uno/cc50_solaris_intel
+cvs diff: Diffing bridges/source/cpp_uno/cc50_solaris_sparc
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_freebsd_intel
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_freebsd_x86-64
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_arm
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_ia64
+Index: bridges/source/cpp_uno/gcc3_linux_ia64/call.s
+===================================================================
+RCS file: bridges/source/cpp_uno/gcc3_linux_ia64/call.s
+diff -N bridges/source/cpp_uno/gcc3_linux_ia64/call.s
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ bridges/source/cpp_uno/gcc3_linux_ia64/call.s 15 Feb 2008 17:36:55 -0000 1.1.2.2
+@@ -0,0 +1,20 @@
++/* ia64 support code for OpenOffice C++/UNO bridging
++ *
++ * Caolan McNamara <caolanm redhat com>
++ */
++ .text
++ .align 16
++ .global privateSnippetExecutor#
++ .proc privateSnippetExecutor#
++privateSnippetExecutor:
++ adds r15 = 8, gp /* r15 now points to real gp value*/
++ ;;
++ ld8 r14 = [gp] /* load nOffsetAndIndex into a handy register */
++ ld8 gp = [r15] /* load real gp value into gp */
++ ;;
++ /* store the address where large structs are "returned" into a handy register */
++ mov r15 = r8
++ ;;
++ br cpp_vtable_call# /* call cpp_vtable_call which'll suck out r14 */
++ ;;
++ .endp privateSnippetExecutor#
+Index: bridges/source/cpp_uno/gcc3_linux_ia64/cpp2uno.cxx
+===================================================================
+RCS file: bridges/source/cpp_uno/gcc3_linux_ia64/cpp2uno.cxx
+diff -N bridges/source/cpp_uno/gcc3_linux_ia64/cpp2uno.cxx
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ bridges/source/cpp_uno/gcc3_linux_ia64/cpp2uno.cxx 15 Feb 2008 17:36:55 -0000 1.1.2.2
+@@ -0,0 +1,691 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 by Sun Microsystems, Inc.
++ * 901 San Antonio Road, Palo Alto, CA 94303, USA
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License version 2.1, as published by the Free Software Foundation.
++ *
++ * This library 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 for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ ************************************************************************/
++
++// 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 <stdio.h>
++
++extern "C" { extern void (*privateSnippetExecutor)(); }
++
++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, long r8,
++ void ** gpreg, void ** fpreg, void ** ovrflw,
++ sal_Int64 * pRegisterReturn /* space for register return */ )
++{
++#ifdef CMC_DEBUG
++ fprintf(stderr, "as far as cpp2uno_call\n");
++#endif
++
++ int ng = 0; //number of gpr registers used
++ int nf = 0; //number of fpr regsiters used
++
++ // gpreg: [ret *], this, [gpr params]
++ // fpreg: [fpr params]
++ // ovrflw: [gpr or fpr params (properly aligned)]
++
++ // 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
++
++ if (pReturnTypeDescr)
++ {
++ if ( ia64::return_in_hidden_param( pReturnTypeRef ) ) // complex return via ptr passed as hidden parameter reg (pCppReturn)
++ {
++ pCppReturn = *(void **)gpreg;
++ gpreg++;
++ ng++;
++
++ pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
++ ? alloca( pReturnTypeDescr->nSize )
++ : pCppReturn); // direct way
++ }
++ else if ( ia64::return_via_r8_buffer( pReturnTypeRef ) ) // complex return via ptr passed in r8
++ {
++ pCppReturn = (void *)r8;
++
++ pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
++ ? alloca( pReturnTypeDescr->nSize )
++ : pCppReturn); // direct way
++ }
++
++ else
++ pUnoReturn = pRegisterReturn; // direct way for simple types
++ }
++ // pop this
++ gpreg++;
++ ng++;
++
++ // stack space
++ OSL_ENSURE( sizeof(void *) == sizeof(sal_Int64), "### unexpected size!" );
++ // parameters
++ void ** pUnoArgs = (void **)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;
++ bool bOverFlowUsed = false;
++ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
++ {
++ const typelib_MethodParameter & rParam = pParams[nPos];
++ typelib_TypeDescription * pParamTypeDescr = 0;
++ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "arg %d of %d\n", nPos, nParams);
++#endif
++
++ //I think it is impossible to get UNO to pass structs as parameters by copy
++ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "simple\n");
++#endif
++
++ switch (pParamTypeDescr->eTypeClass)
++ {
++ case typelib_TypeClass_FLOAT:
++ if (nf < ia64::MAX_SSE_REGS && ng < ia64::MAX_GPR_REGS)
++ {
++ float tmp = (float) (*((double *)fpreg));
++ (*((float *) fpreg)) = tmp;
++ pCppArgs[nPos] = pUnoArgs[nPos] = fpreg++;
++ nf++;
++ gpreg++;
++ ng++;
++ }
++ else
++ {
++ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
++ bOverFlowUsed = true;
++ }
++ if (bOverFlowUsed) ovrflw++;
++ break;
++ case typelib_TypeClass_DOUBLE:
++ if (nf < ia64::MAX_SSE_REGS && ng < ia64::MAX_GPR_REGS)
++ {
++ pCppArgs[nPos] = pUnoArgs[nPos] = fpreg++;
++ nf++;
++ gpreg++;
++ ng++;
++ }
++ else
++ {
++ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
++ bOverFlowUsed = true;
++ }
++ if (bOverFlowUsed) ovrflw++;
++ break;
++ case typelib_TypeClass_BYTE:
++ case typelib_TypeClass_BOOLEAN:
++ case typelib_TypeClass_CHAR:
++ case typelib_TypeClass_SHORT:
++ case typelib_TypeClass_UNSIGNED_SHORT:
++ case typelib_TypeClass_ENUM:
++ case typelib_TypeClass_LONG:
++ case typelib_TypeClass_UNSIGNED_LONG:
++ default:
++ if (ng < ia64::MAX_GPR_REGS)
++ {
++ pCppArgs[nPos] = pUnoArgs[nPos] = gpreg++;
++ ng++;
++ }
++ else
++ {
++ pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
++ bOverFlowUsed = true;
++ }
++ if (bOverFlowUsed) ovrflw++;
++ break;
++ }
++
++ // no longer needed
++ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
++ }
++ else // ptr to complex value | ref
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "complex, ng is %d\n", ng);
++#endif
++ void *pCppStack; //temporary stack pointer
++
++ if (ng < ia64::MAX_GPR_REGS)
++ {
++ pCppArgs[nPos] = pCppStack = *gpreg++;
++ ng++;
++ }
++ else
++ {
++ pCppArgs[nPos] = pCppStack = *ovrflw;
++ bOverFlowUsed = true;
++ }
++ if (bOverFlowUsed) ovrflw++;
++
++ if (! rParam.bIn) // is pure out
++ {
++ // uno out is unconstructed mem!
++ pUnoArgs[nPos] = 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] = 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 );
++ }
++ }
++ }
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "end of params\n");
++#endif
++
++ // 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 = ia64::return_via_r8_buffer(pReturnTypeRef) ? typelib_TypeClass_VOID : (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
++ TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
++ return eRet;
++ }
++ else
++ return typelib_TypeClass_VOID;
++ }
++}
++
++
++//==================================================================================================
++static typelib_TypeClass cpp_mediate(
++ sal_uInt64 nOffsetAndIndex,
++ void ** gpreg, void ** fpreg, long sp, long r8,
++ sal_Int64 * pRegisterReturn /* space for register return */ )
++{
++ OSL_ENSURE( sizeof(sal_Int64)==sizeof(void *), "### unexpected!" );
++
++ sal_Int32 nVtableOffset = (nOffsetAndIndex >> 32);
++ sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFFFFFF);
++
++ void ** ovrflw = (void**)(sp);
++
++ // gpreg: [ret *], this, [other gpr params]
++ // fpreg: [fpr params]
++ // ovrflw: [gpr or fpr params (properly aligned)]
++
++ void * pThis;
++ if (nFunctionIndex & 0x80000000 )
++ {
++ nFunctionIndex &= 0x7fffffff;
++ pThis = gpreg[1];
++#ifdef CMC_DEBUG
++ fprintf(stderr, "pThis is gpreg[1]\n");
++#endif
++ }
++ else
++ {
++ pThis = gpreg[0];
++#ifdef CMC_DEBUG
++ fprintf(stderr, "pThis is gpreg[0]\n");
++#endif
++ }
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "pThis is %p\n", pThis);
++#endif
++
++ pThis = static_cast< char * >(pThis) - nVtableOffset;
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "pThis is now %p\n", pThis);
++#endif
++
++ bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
++ = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(
++ pThis);
++
++ typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "indexes are %d %d\n", nFunctionIndex, pTypeDescr->nMapFunctionIndexToMemberIndex);
++#endif
++
++ 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!" );
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "members are %d %d\n", nMemberPos, pTypeDescr->nAllMembers);
++#endif
++
++ 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
++ r8, 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,
++ r8, 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,
++ r8, gpreg, fpreg, ovrflw, pRegisterReturn );
++ }
++ break;
++ }
++ default:
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "screwed\n");
++#endif
++
++ throw RuntimeException(
++ rtl::OUString::createFromAscii("no member description found!"),
++ (XInterface *)pThis );
++ // is here for dummy
++ eRet = typelib_TypeClass_VOID;
++ }
++ }
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "end of cpp_mediate\n");
++#endif
++ return eRet;
++}
++}
++
++extern "C" ia64::RegReturn cpp_vtable_call(
++ long in0, long in1, long in2, long in3, long in4, long in5, long in6, long in7,
++ long firstonstack
++ )
++{
++ register long r15 asm("r15");
++ long r8 = r15;
++
++ register long r14 asm("r14");
++ long nOffsetAndIndex = r14;
++
++ long sp = (long)&firstonstack;
++
++ sal_uInt64 gpreg[ia64::MAX_GPR_REGS];
++ gpreg[0] = in0;
++ gpreg[1] = in1;
++ gpreg[2] = in2;
++ gpreg[3] = in3;
++ gpreg[4] = in4;
++ gpreg[5] = in5;
++ gpreg[6] = in6;
++ gpreg[7] = in7;
++
++ double fpreg[ia64::MAX_SSE_REGS];
++ register double f8 asm("f8"); fpreg[0] = f8;
++ register double f9 asm("f9"); fpreg[1] = f9;
++ register double f10 asm("f10"); fpreg[2] = f10;
++ register double f11 asm("f11"); fpreg[3] = f11;
++ register double f12 asm("f12"); fpreg[4] = f12;
++ register double f13 asm("f13"); fpreg[5] = f13;
++ register double f14 asm("f14"); fpreg[6] = f14;
++ register double f15 asm("f15"); fpreg[7] = f15;
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "cpp_vtable_call called with %lx\n", nOffsetAndIndex);
++ fprintf(stderr, "adump is %lx %lx %lx %lx %lx %lx %lx %lx\n", in0, in1, in2, in3, in4, in5, in6, in7);
++ fprintf(stderr, "bdump is %f %f %f %f %f %f %f %f\n", f8, f9, f10, f11, f12, f13, f14, f15);
++#endif
++
++ volatile long nRegReturn[4] = { 0 };
++
++ typelib_TypeClass aType =
++ cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, r8, (sal_Int64*)&nRegReturn[0]);
++
++ ia64::RegReturn ret;
++ switch( aType )
++ {
++ case typelib_TypeClass_VOID:
++ break;
++ case typelib_TypeClass_BOOLEAN:
++ case typelib_TypeClass_BYTE:
++ case typelib_TypeClass_CHAR:
++ case typelib_TypeClass_UNSIGNED_SHORT:
++ case typelib_TypeClass_SHORT:
++ case typelib_TypeClass_ENUM:
++ case typelib_TypeClass_UNSIGNED_LONG:
++ case typelib_TypeClass_LONG:
++ case typelib_TypeClass_UNSIGNED_HYPER:
++ case typelib_TypeClass_HYPER:
++ ret.r8 = nRegReturn[0];
++ break;
++ case typelib_TypeClass_FLOAT:
++ asm volatile("ldfs f8=%0" : : "m"((*((float*)&nRegReturn))) : "f8");
++ break;
++ case typelib_TypeClass_DOUBLE:
++ asm volatile("ldfd f8=%0" : : "m"((*((double*)&nRegReturn))) : "f8");
++ break;
++ case typelib_TypeClass_STRUCT:
++ case typelib_TypeClass_EXCEPTION:
++ {
++ ret.r8 = nRegReturn[0];
++ ret.r9 = nRegReturn[1];
++ ret.r10 = nRegReturn[2];
++ ret.r11 = nRegReturn[3];
++ break;
++ }
++ default:
++ break;
++ }
++ return ret;
++}
++
++namespace
++{
++const int codeSnippetSize = 40;
++
++ia64::function_desc codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset,
++ bool bHasHiddenParam )
++{
++#ifdef CMC_DEBUG
++ fprintf(stderr, "size is %d\n", codeSnippetSize);
++ fprintf(stderr,"in codeSnippet functionIndex is %x\n", nFunctionIndex);
++ fprintf(stderr,"in codeSnippet vtableOffset is %x\n", nVtableOffset);
++#endif
++
++ sal_uInt64 nOffsetAndIndex = ( ( (sal_uInt64) nVtableOffset ) << 32 ) | ( (sal_uInt64) nFunctionIndex );
++
++ if ( bHasHiddenParam )
++ nOffsetAndIndex |= 0x80000000;
++
++ long *raw = (long *)code;
++
++ ia64::function_desc* destination = (ia64::function_desc*)cpp_vtable_call;
++
++ raw[0] = (long)&privateSnippetExecutor;
++ raw[1] = (long)&raw[2];
++ raw[2] = nOffsetAndIndex;
++ raw[3] = destination->gp_value;
++
++ return *(ia64::function_desc*)(code);
++}
++}
++
++void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const *, unsigned char const *)
++{
++}
++
++void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++{
++ ia64::function_desc *pRet = static_cast< ia64::function_desc* >(block) + 2;
++ return reinterpret_cast< void** >(pRet);
++}
++
++sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
++ sal_Int32 slotCount)
++{
++ return (slotCount + 2) * sizeof (ia64::function_desc) + slotCount * codeSnippetSize;
++}
++
++void** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block)
++{
++ ia64::function_desc * slots = reinterpret_cast< ia64::function_desc* >(mapBlockToVtable(block));
++ ia64::function_desc foo = {0,0};
++ slots[-2] = foo;
++ slots[-1] = foo;
++ return reinterpret_cast< void** >(slots);
++}
++
++unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
++ void ** in_slots, unsigned char * code,
++ typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
++ sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++{
++ ia64::function_desc *slots = reinterpret_cast< ia64::function_desc* >(in_slots);
++#ifdef CMC_DEBUG
++ fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
++ fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
++#endif
++
++ 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:
++ *slots++ = codeSnippet(
++ code, functionOffset++, vtableOffset,
++ ia64::return_in_hidden_param(
++ reinterpret_cast<
++ typelib_InterfaceAttributeTypeDescription * >(
++ member)->pAttributeTypeRef));
++ code += codeSnippetSize;
++
++
++ // Setter:
++ if (!reinterpret_cast<
++ typelib_InterfaceAttributeTypeDescription * >(
++ member)->bReadOnly)
++ {
++ *slots++ = codeSnippet(code, functionOffset++, vtableOffset, false);
++ code += codeSnippetSize;
++ }
++ break;
++
++ case typelib_TypeClass_INTERFACE_METHOD:
++ *slots++ = codeSnippet(
++ code, functionOffset++, vtableOffset,
++ ia64::return_in_hidden_param(
++ reinterpret_cast<
++ typelib_InterfaceMethodTypeDescription * >(
++ member)->pReturnTypeRef));
++ code += codeSnippetSize;
++ break;
++
++ default:
++ OSL_ASSERT(false);
++ break;
++ }
++ TYPELIB_DANGER_RELEASE(member);
++ }
++ return code;
++}
++
++/* vi:set tabstop=4 shiftwidth=4 expandtab: */
+Index: bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
+===================================================================
+RCS file: bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
+diff -N bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx 15 Feb 2008 17:36:56 -0000 1.1.2.2
+@@ -0,0 +1,294 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 by Sun Microsystems, Inc.
++ * 901 San Antonio Road, Palo Alto, CA 94303, USA
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License version 2.1, as published by the Free Software Foundation.
++ *
++ * This library 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 for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ ************************************************************************/
++
++// 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"
++
++
++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( () )
++{
++#if OSL_DEBUG_LEVEL > 1
++ 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)'.' );
++ }
++
++#if OSL_DEBUG_LEVEL > 1
++ 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 iRttiFind( m_rttis.find( unoName ) );
++ if (iRttiFind == 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 iFind( m_generatedRttis.find( unoName ) );
++ if (iFind == 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;
++#if OSL_DEBUG_LEVEL > 1
++ 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 = iFind->second;
++ }
++ }
++ }
++ else
++ {
++ rtti = iRttiFind->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 );
++}
++
++}
++/* vi:set tabstop=4 shiftwidth=4 expandtab: */
+Index: bridges/source/cpp_uno/gcc3_linux_ia64/makefile.mk
+===================================================================
+RCS file: bridges/source/cpp_uno/gcc3_linux_ia64/makefile.mk
+diff -N bridges/source/cpp_uno/gcc3_linux_ia64/makefile.mk
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ bridges/source/cpp_uno/gcc3_linux_ia64/makefile.mk 4 Jan 2008 19:09:57 -0000 1.1.2.1
+@@ -0,0 +1,91 @@
++#*************************************************************************
++#
++# OpenOffice.org - a multi-platform office productivity suite
++#
++# $RCSfile$
++#
++# $Revision$
++#
++# last change: $Author$ $Date$
++#
++# The Contents of this file are made available subject to
++# the terms of GNU Lesser General Public License Version 2.1.
++#
++#
++# GNU Lesser General Public License Version 2.1
++# =============================================
++# Copyright 2005 by Sun Microsystems, Inc.
++# 901 San Antonio Road, Palo Alto, CA 94303, USA
++#
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Lesser General Public
++# License version 2.1, as published by the Free Software Foundation.
++#
++# This library 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 for more details.
++#
++# You should have received a copy of the GNU Lesser General Public
++# License along with this library; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++# MA 02111-1307 USA
++#
++#*************************************************************************
++
++PRJ=..$/..$/..
++
++PRJNAME=bridges
++TARGET=gcc3_uno
++LIBTARGET=no
++ENABLE_EXCEPTIONS=TRUE
++
++# --- Settings -----------------------------------------------------
++
++.INCLUDE : settings.mk
++
++# --- Files --------------------------------------------------------
++
++.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCLINUXAgcc3"
++
++.IF "$(cppu_no_leak)" == ""
++CFLAGS += -DLEAK_STATIC_DATA
++.ENDIF
++
++# In case someone enabled the non-standard -fomit-frame-pointer which does not
++# work with the .cxx sources in this directory:
++CFLAGSCXX += -fno-omit-frame-pointer
++
++NOOPTFILES= \
++ $(SLO)$/uno2cpp.obj \
++ $(SLO)$/cpp2uno.obj
++
++CFLAGSNOOPT=-O0
++
++SLOFILES= \
++ $(SLO)$/except.obj \
++ $(SLO)$/cpp2uno.obj \
++ $(SLO)$/uno2cpp.obj \
++ $(SLO)$/call.obj
++
++SHL1TARGET= $(TARGET)
++
++SHL1DEF=$(MISC)$/$(SHL1TARGET).def
++SHL1IMPLIB=i$(TARGET)
++SHL1VERSIONMAP=..$/..$/bridge_exports.map
++
++SHL1OBJS= $(SLOFILES)
++SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
++
++SHL1STDLIBS= \
++ $(CPPULIB) \
++ $(SALLIB)
++
++.ENDIF
++
++# --- Targets ------------------------------------------------------
++
++.INCLUDE : target.mk
++
++$(SLO)$/%.obj: %.s
++ $(CC) -c -o $(SLO)$/$(@:b).o $< -fpic ; touch $@
+Index: bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
+===================================================================
+RCS file: bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
+diff -N bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx 15 Feb 2008 17:36:56 -0000 1.1.2.2
+@@ -0,0 +1,129 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 by Sun Microsystems, Inc.
++ * 901 San Antonio Road, Palo Alto, CA 94303, USA
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License version 2.1, as published by the Free Software Foundation.
++ *
++ * This library 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 for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ ************************************************************************/
++
++#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 ia64
++{
++ enum ia64limits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 8, MAX_REG_SLOTS = 8 };
++
++ /*
++ http://www.swag.uwaterloo.ca/asx/ABI.html
++ On Itanium, function pointers are pairs: the function address followed
++ by the global pointer value that should be used when calling the
++ function (code address, gp value)
++ */
++ struct function_desc
++ {
++ sal_uInt64 code_address;
++ sal_uInt64 gp_value;
++ };
++
++ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
++ bool return_via_r8_buffer( typelib_TypeDescriptionReference *pTypeRef );
++
++ struct RegReturn
++ {
++ long r8;
++ long r9;
++ long r10;
++ long r11;
++ };
++}
++
++/* vi:set tabstop=4 shiftwidth=4 expandtab: */
+Index: bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
+===================================================================
+RCS file: bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
+diff -N bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
+--- /dev/null 1 Jan 1970 00:00:00 -0000
++++ bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx 15 Feb 2008 19:22:43 -0000 1.1.2.3
+@@ -0,0 +1,673 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 by Sun Microsystems, Inc.
++ * 901 San Antonio Road, Palo Alto, CA 94303, USA
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License version 2.1, as published by the Free Software Foundation.
++ *
++ * This library 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 for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_bridges.hxx"
++
++#include <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;
++
++void MapReturn(const ia64::RegReturn &rRet, double dret, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn, sal_uInt64 *pRegisterReturn)
++{
++ switch (pReturnTypeDescr->eTypeClass)
++ {
++ case typelib_TypeClass_HYPER:
++ case typelib_TypeClass_UNSIGNED_HYPER:
++ case typelib_TypeClass_LONG:
++ case typelib_TypeClass_UNSIGNED_LONG:
++ case typelib_TypeClass_ENUM:
++ *pRegisterReturn = rRet.r8;
++ break;
++ case typelib_TypeClass_CHAR:
++ case typelib_TypeClass_SHORT:
++ case typelib_TypeClass_UNSIGNED_SHORT:
++ *pRegisterReturn = (unsigned short)rRet.r8;
++ break;
++ case typelib_TypeClass_BOOLEAN:
++ case typelib_TypeClass_BYTE:
++ *pRegisterReturn = (unsigned char)rRet.r8;
++ break;
++ case typelib_TypeClass_FLOAT:
++ *reinterpret_cast<float *>( pRegisterReturn ) = dret;
++ break;
++ case typelib_TypeClass_DOUBLE:
++ *reinterpret_cast<double *>( pRegisterReturn ) = dret;
++ break;
++ case typelib_TypeClass_STRUCT:
++ case typelib_TypeClass_EXCEPTION:
++ {
++ sal_uInt32 nRetSize = pReturnTypeDescr->nSize;
++ if (bSimpleReturn && nRetSize <= 32 && nRetSize > 0)
++ memcpy(pRegisterReturn, (void*)&rRet, nRetSize);
++ break;
++ }
++ default:
++ break;
++ }
++}
++
++namespace ia64
++{
++ bool is_complex_struct( typelib_TypeDescriptionReference *pTypeRef )
++ {
++ if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
++ {
++ typelib_TypeDescription * pTypeDescr = 0;
++ TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
++
++ bool bRet = bridges::cpp_uno::shared::relatesToInterfaceType( pTypeDescr );
++ TYPELIB_DANGER_RELEASE( pTypeDescr );
++
++ return bRet;
++ }
++ return false;
++ }
++
++ bool return_via_r8_buffer( typelib_TypeDescriptionReference *pTypeRef )
++ {
++ if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
++ {
++ if (is_complex_struct( pTypeRef )) return false;
++
++ typelib_TypeDescription * pTypeDescr = 0;
++ TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
++
++ /* If the struct is larger than 32 bytes, then there is a buffer at r8 to stick the return value into */
++ bool bRet = pTypeDescr->nSize > 32;
++ TYPELIB_DANGER_RELEASE( pTypeDescr );
++ return bRet;
++ }
++ return false;
++ }
++
++ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef )
++ {
++ if (bridges::cpp_uno::shared::isSimpleType(pTypeRef))
++ return false;
++ else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
++ return is_complex_struct( pTypeRef );
++ return true;
++ }
++
++
++}
++
++namespace
++{
++//==================================================================================================
++static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
++ void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
++ sal_uInt64 *pStack, sal_uInt32 nStack,
++ sal_uInt64 *pGPR, sal_uInt32 nGPR,
++ double *pFPR, sal_uInt32 nFPR)
++{
++ // Stack, if used, must be 16-bytes aligned
++ if ( nStack )
++ nStack = ( nStack + 1 ) & ~1;
++
++ // Should not happen, but...
++ if ( nFPR > ia64::MAX_SSE_REGS )
++ nFPR = ia64::MAX_SSE_REGS;
++ if ( nGPR > ia64::MAX_GPR_REGS )
++ nGPR = ia64::MAX_GPR_REGS;
++
++#ifdef CMC_DEBUG
++ // Let's figure out what is really going on here
++ {
++ fprintf( stderr, "= callVirtualMethod() =\nGPR's (%d): ", nGPR );
++ for ( unsigned int i = 0; i < nGPR; ++i )
++ fprintf( stderr, "0x%lx, ", pGPR[i] );
++ fprintf( stderr, "\nFPR's (%d): ", nFPR );
++ for ( unsigned int i = 0; i < nFPR; ++i )
++ fprintf( stderr, "0x%lx (%f), ", pFPR[i], pFPR[i] );
++ fprintf( stderr, "\nStack (%d): ", nStack );
++ for ( unsigned int i = 0; i < nStack; ++i )
++ fprintf( stderr, "0x%lx, ", pStack[i] );
++ fprintf( stderr, "\n" );
++ fprintf( stderr, "pRegisterReturn is %p\n", pRegisterReturn);
++ }
++#endif
++
++ // Load parameters to stack, if necessary
++ sal_uInt64 *stack = (sal_uInt64 *) __builtin_alloca( nStack * 8 );
++ memcpy( stack, pStack, nStack * 8 );
++
++ // To get pointer to method
++ // a) get the address of the vtable
++ sal_uInt64 pMethod = *((sal_uInt64 *)pThis);
++ // b) get the address from the vtable entry at offset, each entry is 16bytes,
++ // 8 for function pointer, and 8 for global pointer
++ pMethod += 16 * nVtableIndex;
++
++ typedef void (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 );
++ FunctionCall pFunc = (FunctionCall)pMethod;
++
++ switch (nFPR) //deliberate fall through
++ {
++ case 8:
++ asm volatile("ldfd f15=%0" : : "m"(pFPR[7]) : "f15");
++ case 7:
++ asm volatile("ldfd f14=%0" : : "m"(pFPR[6]) : "f14");
++ case 6:
++ asm volatile("ldfd f13=%0" : : "m"(pFPR[5]) : "f13");
++ case 5:
++ asm volatile("ldfd f12=%0" : : "m"(pFPR[4]) : "f12");
++ case 4:
++ asm volatile("ldfd f11=%0" : : "m"(pFPR[3]) : "f11");
++ case 3:
++ asm volatile("ldfd f10=%0" : : "m"(pFPR[2]) : "f10");
++ case 2:
++ asm volatile("ldfd f9=%0" : : "m"(pFPR[1]) : "f9");
++ case 1:
++ asm volatile("ldfd f8=%0" : : "m"(pFPR[0]) : "f8");
++ default:
++ break;
++ }
++
++ //stick the return area into r8 for big struct returning
++ asm volatile("ld8 r8=%0" : : "m"(pRegisterReturn) : "r8");
++
++ (*pFunc)(pGPR[0], pGPR[1], pGPR[2], pGPR[3], pGPR[4], pGPR[5], pGPR[6], pGPR[7]);
++
++ register double f8 asm("f8");
++ ia64::RegReturn ret;
++ {
++ register long r8 asm("r8"); ret.r8 = r8;
++ register long r9 asm("r9"); ret.r9 = r9;
++ register long r10 asm("r10"); ret.r10 = r10;
++ register long r11 asm("r11"); ret.r11 = r11;
++ }
++
++ MapReturn(ret, f8, pReturnTypeDescr, bSimpleReturn, (sal_uInt64*)pRegisterReturn);
++}
++
++// Macros for easier insertion of values to registers or stack
++// pSV - pointer to the source
++// nr - order of the value [will be increased if stored to register]
++// pFPR, pGPR - pointer to the registers
++// pDS - pointer to the stack [will be increased if stored here]
++
++// The value in %xmm register is already prepared to be retrieved as a float,
++// thus we treat float and double the same
++#define INSERT_FLOAT( pSV, nfr, pFPR, ngr, pGPR, pDS, bOverflow ) \
++ if ( nfr < ia64::MAX_SSE_REGS && ngr < ia64::MAX_GPR_REGS ) \
++ pFPR[nfr++] = *reinterpret_cast<float *>( pSV ); \
++ if ( ngr < ia64::MAX_GPR_REGS ) \
++ pGPR[ngr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
++ else \
++ bOverFlow = true; \
++ if (bOverFlow) \
++ *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
++
++#define INSERT_DOUBLE( pSV, nfr, pFPR, ngr, pGPR, pDS, bOverflow ) \
++ if ( nfr < ia64::MAX_SSE_REGS && ngr < ia64::MAX_GPR_REGS ) \
++ pFPR[nfr++] = *reinterpret_cast<double *>( pSV ); \
++ if ( ngr < ia64::MAX_GPR_REGS ) \
++ pGPR[ngr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
++ else \
++ bOverFlow = true; \
++ if (bOverFlow) \
++ *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
++
++#define INSERT_INT64( pSV, nr, pGPR, pDS, bOverflow ) \
++ if ( nr < ia64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
++ else \
++ bOverFlow = true; \
++ if (bOverFlow) \
++ *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV );
++
++#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow ) \
++ if ( nr < ia64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
++ else \
++ bOverFlow = true; \
++ if (bOverFlow) \
++ *pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
++
++#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverflow ) \
++ if ( nr < ia64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
++ else \
++ bOverFlow = true; \
++ if (bOverFlow) \
++ *pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
++
++#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverflow ) \
++ if ( nr < ia64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
++ else \
++ bOverFlow = true; \
++ if (bOverFlow) \
++ *pDS++ = *reinterpret_cast<sal_uInt8 *>( pSV );
++
++//==================================================================================================
++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_uInt64 * pStack = (sal_uInt64 *)alloca( (nParams+3) * sizeof(sal_Int64) );
++ sal_uInt64 * pStackStart = pStack;
++
++ sal_uInt64 pGPR[ia64::MAX_GPR_REGS];
++ sal_uInt32 nGPR = 0;
++
++ double pFPR[ia64::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
++
++ bool bOverFlow = false;
++
++ bool bSimpleReturn = true;
++ if (pReturnTypeDescr)
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "return type is %d\n", pReturnTypeDescr->eTypeClass);
++#endif
++ if ( ia64::return_in_hidden_param(pReturnTypeRef) || ia64::return_via_r8_buffer(pReturnTypeRef) )
++ bSimpleReturn = false;
++
++ if ( bSimpleReturn )
++ {
++ pCppReturn = pUnoReturn; // direct way for simple types
++#ifdef CMC_DEBUG
++ fprintf(stderr, "simple return\n");
++#endif
++ }
++ else
++ {
++ // complex return via ptr
++ pCppReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
++ ? alloca( pReturnTypeDescr->nSize ) : pUnoReturn);
++#ifdef CMC_DEBUG
++ fprintf(stderr, "pCppReturn/pUnoReturn is %lx/%lx", pCppReturn, pUnoReturn);
++#endif
++ if (!ia64::return_via_r8_buffer(pReturnTypeRef))
++ INSERT_INT64( &pCppReturn, nGPR, pGPR, pStack, bOverFlow );
++ }
++ }
++ // push "this" pointer
++ void * pAdjustedThisPtr = reinterpret_cast< void ** >( pThis->getCppI() ) + aVtableSlot.offset;
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "this pointer is %p\n", pAdjustedThisPtr);
++#endif
++ INSERT_INT64( &pAdjustedThisPtr, nGPR, pGPR, pStack, bOverFlow );
++
++ // Args
++ void ** pCppArgs = (void **)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;
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "n params is %d\n", nParams);
++#endif
++
++ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
++ {
++ const typelib_MethodParameter & rParam = pParams[nPos];
++ typelib_TypeDescription * pParamTypeDescr = 0;
++ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
++
++#ifdef CMC_DEBUG
++ fprintf(stderr, "param %d is %d %d %d\n", nPos, rParam.bOut, bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ),
++ pParamTypeDescr->eTypeClass);
++#endif
++
++ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
++ {
++// uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), pUnoArgs[nPos], pParamTypeDescr,
++ uno_copyAndConvertData( pCppArgs[nPos] = pStack, pUnoArgs[nPos], pParamTypeDescr,
++ pThis->getBridge()->getUno2Cpp() );
++ switch (pParamTypeDescr->eTypeClass)
++ {
++ case typelib_TypeClass_HYPER:
++ case typelib_TypeClass_UNSIGNED_HYPER:
++#ifdef CMC_DEBUG
++ fprintf(stderr, "hyper is %lx\n", *(unsigned long*)(pCppArgs[nPos]));
++#endif
++ INSERT_INT64( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
++ break;
++ case typelib_TypeClass_LONG:
++ case typelib_TypeClass_UNSIGNED_LONG:
++ case typelib_TypeClass_ENUM:
++#ifdef CMC_DEBUG
++ fprintf(stderr, "long is %lx\n", *(unsigned int*)(pCppArgs[nPos]));
++#endif
++ INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
++ break;
++ case typelib_TypeClass_SHORT:
++ case typelib_TypeClass_CHAR:
++ case typelib_TypeClass_UNSIGNED_SHORT:
++#ifdef CMC_DEBUG
++ fprintf(stderr, "short is %x\n", *(unsigned short*)(pCppArgs[nPos]));
++#endif
++ INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
++ break;
++ case typelib_TypeClass_BOOLEAN:
++ case typelib_TypeClass_BYTE:
++#ifdef CMC_DEBUG
++ fprintf(stderr, "byte is %x\n", *(unsigned char*)(pCppArgs[nPos]));
++#endif
++ INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
++ break;
++ case typelib_TypeClass_FLOAT:
++#ifdef CMC_DEBUG
++ fprintf(stderr, "a float is %f\n", *(float*)(pCppArgs[nPos]));
++ fprintf(stderr, "b float is %f\n", *(double*)(pCppArgs[nPos]));
++#endif
++ INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, nGPR, pGPR, pStack, bOverFlow );
++ break;
++ case typelib_TypeClass_DOUBLE:
++#ifdef CMC_DEBUG
++ fprintf(stderr, "double is %f\n", *(double*)(pCppArgs[nPos]));
++#endif
++ INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, nGPR, pGPR, pStack, bOverFlow );
++ break;
++ default:
++ break;
++ }
++
++ // no longer needed
++ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
++
++ }
++ else // ptr to complex value | ref
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "complex type again %d\n", rParam.bIn);
++#endif
++ if (! rParam.bIn) // is pure out
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "complex size is %d\n", pParamTypeDescr->nSize );
++#endif
++ // cpp out is constructed mem, uno out is not!
++ uno_constructData(
++ pCppArgs[nPos] = 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 ))
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "this one\n");
++#endif
++ uno_copyAndConvertData(
++ pCppArgs[nPos] = 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
++ {
++#ifdef CMC_DEBUG
++ fprintf(stderr, "that one, passing %lx through\n", pUnoArgs[nPos]);
++#endif
++ pCppArgs[nPos] = pUnoArgs[nPos];
++ // no longer needed
++ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
++ }
++ INSERT_INT64( &(pCppArgs[nPos]), nGPR, pGPR, pStack, bOverFlow );
++ }
++ }
++
++ try
++ {
++ callVirtualMethod(
++ pAdjustedThisPtr, aVtableSlot.index,
++ pCppReturn, pReturnTypeDescr, bSimpleReturn,
++ pStackStart, ( pStack - pStackStart ),
++ pGPR, nGPR,
++ 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);
++
++ 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 );
++ }
++ }
++}
++
++} } }
++/* vi:set tabstop=4 shiftwidth=4 expandtab: */
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_intel
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_mips
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_powerpc
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_powerpc64
+Index: bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx,v
+retrieving revision 1.2
+retrieving revision 1.2.32.1
+diff -u -u -p -b -w -B -r1.2 -r1.2.32.1
+--- bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx 18 Jun 2007 16:34:57 -0000 1.2
++++ bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx 4 Jan 2008 19:09:57 -0000 1.2.32.1
+@@ -135,7 +135,7 @@ static typelib_TypeClass cpp2uno_call(
+ {
+ case typelib_TypeClass_FLOAT:
+ case typelib_TypeClass_DOUBLE:
+- if (nf < 13)
++ if (nf < ppc64::MAX_SSE_REGS)
+ {
+ if (pParamTypeDescr->eTypeClass == typelib_TypeClass_FLOAT)
+ {
+@@ -154,7 +154,7 @@ static typelib_TypeClass cpp2uno_call(
+ break;
+ case typelib_TypeClass_BYTE:
+ case typelib_TypeClass_BOOLEAN:
+- if (ng < 8)
++ if (ng < ppc64::MAX_GPR_REGS)
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-1));
+ ng++;
+@@ -170,7 +170,7 @@ static typelib_TypeClass cpp2uno_call(
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+- if (ng < 8)
++ if (ng < ppc64::MAX_GPR_REGS)
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-2));
+ ng++;
+@@ -186,7 +186,7 @@ static typelib_TypeClass cpp2uno_call(
+ case typelib_TypeClass_ENUM:
+ case typelib_TypeClass_LONG:
+ case typelib_TypeClass_UNSIGNED_LONG:
+- if (ng < 8)
++ if (ng < ppc64::MAX_GPR_REGS)
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-4));
+ ng++;
+@@ -200,7 +200,7 @@ static typelib_TypeClass cpp2uno_call(
+ if (bOverFlowUsed) ovrflw++;
+ break;
+ default:
+- if (ng < 8)
++ if (ng < ppc64::MAX_GPR_REGS)
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = gpreg++;
+ ng++;
+@@ -224,7 +224,7 @@ static typelib_TypeClass cpp2uno_call(
+ #endif
+ void *pCppStack; //temporary stack pointer
+
+- if (ng < 8)
++ if (ng < ppc64::MAX_GPR_REGS)
+ {
+ pCppArgs[nPos] = pCppStack = *gpreg++;
+ ng++;
+@@ -521,8 +521,8 @@ extern "C" void privateSnippetExecutor(
+ "mr %0, 11\n\t"
+ : "=r" (nOffsetAndIndex) : );
+
+- sal_uInt64 gpreg[8];
+- double fpreg[13];
++ sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
++ double fpreg[ppc64::MAX_SSE_REGS];
+
+ __asm__ __volatile__ (
+ "std 3, 0(%0)\t\n"
+Index: bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx,v
+retrieving revision 1.2
+retrieving revision 1.2.32.1
+diff -u -u -p -b -w -B -r1.2 -r1.2.32.1
+--- bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx 18 Jun 2007 16:35:07 -0000 1.2
++++ bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx 4 Jan 2008 19:09:58 -0000 1.2.32.1
+@@ -141,8 +141,8 @@ type_info * RTTI::getRTTI( typelib_Compo
+ 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())
++ t_rtti_map::const_iterator iRttiFind( m_rttis.find( unoName ) );
++ if (iRttiFind == m_rttis.end())
+ {
+ // RTTI symbol
+ OStringBuffer buf( 64 );
+@@ -206,7 +206,7 @@ type_info * RTTI::getRTTI( typelib_Compo
+ }
+ else
+ {
+- rtti = iFind->second;
++ rtti = iRttiFind->second;
+ }
+
+ return rtti;
+Index: bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx,v
+retrieving revision 1.2
+retrieving revision 1.2.32.1
+diff -u -u -p -b -w -B -r1.2 -r1.2.32.1
+--- bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx 18 Jun 2007 16:35:29 -0000 1.2
++++ bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx 4 Jan 2008 19:09:58 -0000 1.2.32.1
+@@ -97,3 +97,8 @@ void raiseException(
+ void fillUnoException(
+ __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+ }
++
++namespace ppc64
++{
++ enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
++}
+Index: bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx,v
+retrieving revision 1.2
+retrieving revision 1.2.32.1
+diff -u -u -p -b -w -B -r1.2 -r1.2.32.1
+--- bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx 18 Jun 2007 16:35:40 -0000 1.2
++++ bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx 4 Jan 2008 19:09:58 -0000 1.2.32.1
+@@ -55,11 +55,6 @@
+ using namespace ::rtl;
+ using namespace ::com::sun::star::uno;
+
+-namespace ppc64
+-{
+- enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+-}
+-
+ void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+ {
+ switch (eTypeClass)
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_s390
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_sparc
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_x86-64
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_macosx_intel
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_macosx_powerpc
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_netbsd_intel
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_os2_intel
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_os2_intel/defs
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_solaris_intel
+cvs diff: Diffing bridges/source/cpp_uno/gcc3_solaris_sparc
+cvs diff: Diffing bridges/source/cpp_uno/mingw_intel
+cvs diff: Diffing bridges/source/cpp_uno/msvc_win32_intel
+cvs diff: Diffing bridges/source/cpp_uno/shared
+Index: bridges/source/cpp_uno/shared/vtablefactory.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/shared/vtablefactory.cxx,v
+retrieving revision 1.9
+retrieving revision 1.9.22.1
+diff -u -u -p -b -w -B -r1.9 -r1.9.22.1
+--- bridges/source/cpp_uno/shared/vtablefactory.cxx 20 Sep 2007 15:30:12 -0000 1.9
++++ bridges/source/cpp_uno/shared/vtablefactory.cxx 4 Jan 2008 19:09:58 -0000 1.9.22.1
+@@ -252,6 +252,16 @@ void VtableFactory::freeBlock(Block cons
+ rtl_arena_free(m_arena, block.start, block.size);
+ }
+
++#ifndef IA64
++ typedef void* function_desc;
++#else
++ struct function_desc
++ {
++ sal_uInt64 code_address;
++ sal_uInt64 gp_value;
++ };
++#endif
++
+ void VtableFactory::createVtables(
+ GuardedBlocks & blocks, BaseOffset const & baseOffset,
+ typelib_InterfaceTypeDescription * type, bool includePrimary) const
+@@ -266,11 +276,12 @@ void VtableFactory::createVtables(
+ throw std::bad_alloc();
+ }
+ try {
+- void ** slots = initializeBlock(block.start) + slotCount;
++ function_desc *slots = (function_desc*)initializeBlock(block.start);
++ slots+=slotCount;
+ unsigned char * codeBegin =
+ reinterpret_cast< unsigned char * >(slots);
+ unsigned char * code = codeBegin;
+- sal_Int32 vtableOffset = blocks.size() * sizeof (void **);
++ sal_Int32 vtableOffset = blocks.size() * sizeof (function_desc*);
+ for (typelib_InterfaceTypeDescription const * type2 = type;
+ type2 != 0; type2 = type2->pBaseTypeDescription)
+ {
+@@ -278,7 +289,7 @@ void VtableFactory::createVtables(
+ = bridges::cpp_uno::shared::getLocalFunctions(type2);
+ slots -= functionCount;
+ code = addLocalFunctions(
+- slots, code, type2,
++ (void**)slots, code, type2,
+ baseOffset.getFunctionOffset(type2->aBase.pTypeName),
+ functionCount, vtableOffset);
+ }
+cvs diff: Diffing bridges/source/jni_uno
+cvs diff: Diffing bridges/source/jni_uno/java
+cvs diff: Diffing bridges/source/jni_uno/java/com
+cvs diff: Diffing bridges/source/jni_uno/java/com/sun
+cvs diff: Diffing bridges/source/jni_uno/java/com/sun/star
+cvs diff: Diffing bridges/source/jni_uno/java/com/sun/star/bridges
+cvs diff: Diffing bridges/source/jni_uno/java/com/sun/star/bridges/jni_uno
+cvs diff: Diffing bridges/source/remote
+cvs diff: Diffing bridges/source/remote/context
+cvs diff: Diffing bridges/source/remote/idl
+cvs diff: Diffing bridges/source/remote/static
+cvs diff: Diffing bridges/source/remote/urp
+cvs diff: Diffing bridges/test
+cvs diff: Diffing bridges/test/com
+cvs diff: Diffing bridges/test/com/sun
+cvs diff: Diffing bridges/test/com/sun/star
+cvs diff: Diffing bridges/test/com/sun/star/lib
+cvs diff: Diffing bridges/test/com/sun/star/lib/uno
+cvs diff: Diffing bridges/test/com/sun/star/lib/uno/bridges
+cvs diff: Diffing bridges/test/com/sun/star/lib/uno/bridges/java_remote
+cvs diff: Diffing bridges/test/inter_libs_exc
+cvs diff: Diffing bridges/test/java_uno
+cvs diff: Diffing bridges/test/java_uno/acquire
+cvs diff: Diffing bridges/test/java_uno/any
+cvs diff: Diffing bridges/test/java_uno/equals
+cvs diff: Diffing bridges/test/java_uno/nativethreadpool
+cvs diff: Diffing bridges/test/performance
+cvs diff: Diffing bridges/unotypes
+cvs diff: Diffing config_office
+Index: config_office/set_soenv.in
+===================================================================
+RCS file: /cvs/tools/config_office/set_soenv.in,v
+retrieving revision 1.172
+retrieving revision 1.168.8.2
+diff -u -u -p -b -w -B -r1.172 -r1.168.8.2
+--- config_office/set_soenv.in 4 Feb 2008 12:56:11 -0000 1.172
++++ config_office/set_soenv.in 14 Feb 2008 09:47:05 -0000 1.168.8.2
+@@ -436,6 +436,18 @@ elsif ( $platform =~ m/linux-gnu/ )
+ $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."amd64".$ds."native_threads";
+ $JREEXTRALIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."amd64".$ds."xawt";
+ }
++ elsif ($platform =~ m/^ia64/)
++ { print "Setting Linux ia64 specific values... ";
++ $outfile = "LinuxIA64Env.Set";
++ $CPU = "A";
++ $CPUNAME = "IA64";
++ $CVER = "C341";
++ $OUTPATH = "unxlnga";
++ $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ia64";
++ $JREEXTRALIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ia64".$ds."xawt";
++ $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ia64".$ds."server";
++ $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ia64".$ds."native_threads";
++ }
+ elsif ($platform =~ m/^sparc/)
+
+ { print "Setting Linux Sparc specific values... ";
+cvs diff: Diffing config_office/guw
+cvs diff: Diffing jvmfwk
+cvs diff: Diffing jvmfwk/distributions
+cvs diff: Diffing jvmfwk/distributions/OpenOfficeorg
+cvs diff: Diffing jvmfwk/distributions/StarOffice
+cvs diff: Diffing jvmfwk/inc
+cvs diff: Diffing jvmfwk/inc/jvmfwk
+cvs diff: Diffing jvmfwk/inc/pch
+cvs diff: Diffing jvmfwk/plugins
+cvs diff: Diffing jvmfwk/plugins/sunmajor
+cvs diff: Diffing jvmfwk/plugins/sunmajor/javaenvsetup
+cvs diff: Diffing jvmfwk/plugins/sunmajor/pluginlib
+Index: jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx
+===================================================================
+RCS file: /cvs/udk/jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx,v
+retrieving revision 1.9
+retrieving revision 1.9.4.1
+diff -u -u -p -b -w -B -r1.9 -r1.9.4.1
+--- jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx 26 Nov 2007 18:04:40 -0000 1.9
++++ jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx 4 Jan 2008 19:05:43 -0000 1.9.4.1
+@@ -67,6 +67,8 @@ namespace jfw_plugin
+ #define JFW_PLUGIN_ARCH "amd64"
+ #elif defined ARM
+ #define JFW_PLUGIN_ARCH "arm"
++#elif defined IA64
++#define JFW_PLUGIN_ARCH "ia64"
+ #else // SPARC, INTEL, POWERPC, MIPS, ARM
+ #error unknown plattform
+ #endif // SPARC, INTEL, POWERPC, MIPS, ARM
+cvs diff: Diffing jvmfwk/prj
+cvs diff: Diffing jvmfwk/source
+cvs diff: Diffing sal
+cvs diff: Diffing sal/cpprt
+cvs diff: Diffing sal/inc
+cvs diff: Diffing sal/inc/internal
+cvs diff: Diffing sal/inc/osl
+cvs diff: Diffing sal/inc/pch
+cvs diff: Diffing sal/inc/rtl
+cvs diff: Diffing sal/inc/sal
+cvs diff: Diffing sal/inc/systools
+cvs diff: Diffing sal/inc/systools/win32
+cvs diff: Diffing sal/osl
+cvs diff: Diffing sal/osl/all
+cvs diff: Diffing sal/osl/os2
+cvs diff: Diffing sal/osl/os2/helpers
+cvs diff: Diffing sal/osl/unx
+cvs diff: Diffing sal/osl/unx/asm
+cvs diff: Diffing sal/osl/w32
+cvs diff: Diffing sal/prj
+cvs diff: Diffing sal/qa
+cvs diff: Diffing sal/qa/ByteSequence
+cvs diff: Diffing sal/qa/OStringBuffer
+cvs diff: Diffing sal/qa/helper
+cvs diff: Diffing sal/qa/helper/gcov
+cvs diff: Diffing sal/qa/inc
+cvs diff: Diffing sal/qa/osl
+cvs diff: Diffing sal/qa/osl/condition
+cvs diff: Diffing sal/qa/osl/file
+cvs diff: Diffing sal/qa/osl/module
+cvs diff: Diffing sal/qa/osl/mutex
+cvs diff: Diffing sal/qa/osl/pipe
+cvs diff: Diffing sal/qa/osl/process
+cvs diff: Diffing sal/qa/osl/profile
+cvs diff: Diffing sal/qa/osl/security
+cvs diff: Diffing sal/qa/osl/semaphore
+cvs diff: Diffing sal/qa/osl/socket
+cvs diff: Diffing sal/qa/osl/thread
+cvs diff: Diffing sal/qa/rtl
+cvs diff: Diffing sal/qa/rtl/alloc
+cvs diff: Diffing sal/qa/rtl/bootstrap
+cvs diff: Diffing sal/qa/rtl/cipher
+cvs diff: Diffing sal/qa/rtl/crc32
+cvs diff: Diffing sal/qa/rtl/digest
+cvs diff: Diffing sal/qa/rtl/doublelock
+cvs diff: Diffing sal/qa/rtl/locale
+cvs diff: Diffing sal/qa/rtl/logfile
+cvs diff: Diffing sal/qa/rtl/math
+cvs diff: Diffing sal/qa/rtl/ostring
+cvs diff: Diffing sal/qa/rtl/oustring
+cvs diff: Diffing sal/qa/rtl/oustringbuffer
+cvs diff: Diffing sal/qa/rtl/process
+cvs diff: Diffing sal/qa/rtl/random
+cvs diff: Diffing sal/qa/rtl/strings
+cvs diff: Diffing sal/qa/rtl/textenc
+cvs diff: Diffing sal/qa/rtl/uri
+cvs diff: Diffing sal/qa/rtl/uuid
+cvs diff: Diffing sal/qa/rtl_strings
+cvs diff: Diffing sal/qa/sal
+cvs diff: Diffing sal/qa/systools
+cvs diff: Diffing sal/qa/testHelperFunctions
+cvs diff: Diffing sal/rtl
+cvs diff: Diffing sal/rtl/source
+Index: sal/rtl/source/macro.hxx
+===================================================================
+RCS file: /cvs/porting/sal/rtl/source/macro.hxx,v
+retrieving revision 1.8
+retrieving revision 1.8.20.1
+diff -u -u -p -b -w -B -r1.8 -r1.8.20.1
+--- sal/rtl/source/macro.hxx 26 Nov 2007 18:05:15 -0000 1.8
++++ sal/rtl/source/macro.hxx 4 Jan 2008 19:04:40 -0000 1.8.20.1
+@@ -78,6 +78,8 @@ this is inserted for the case that the p
+ #define THIS_ARCH "MIPS"
+ #elif defined ARM
+ #define THIS_ARCH "ARM"
++#elif defined IA64
++#define THIS_ARCH "IA64"
+ #endif
+
+ #if ! defined THIS_ARCH
+cvs diff: Diffing sal/systools
+cvs diff: Diffing sal/systools/win32
+cvs diff: Diffing sal/systools/win32/delayload
+cvs diff: Diffing sal/systools/win32/guistdio
+cvs diff: Diffing sal/systools/win32/kill
+cvs diff: Diffing sal/systools/win32/onlineupdate
+cvs diff: Diffing sal/systools/win32/uwinapi
+cvs diff: Diffing sal/test
+cvs diff: Diffing sal/test/unloading
+cvs diff: Diffing sal/textenc
+cvs diff: Diffing sal/textenc/generate
+cvs diff: Diffing sal/typesconfig
+Index: sal/typesconfig/typesconfig.c
+===================================================================
+RCS file: /cvs/porting/sal/typesconfig/typesconfig.c,v
+retrieving revision 1.4
+retrieving revision 1.4.182.1
+diff -u -u -p -b -w -B -r1.4 -r1.4.182.1
+--- sal/typesconfig/typesconfig.c 24 Oct 2006 13:28:51 -0000 1.4
++++ sal/typesconfig/typesconfig.c 14 Feb 2008 09:28:39 -0000 1.4.182.1
+@@ -214,6 +214,16 @@ int check( TestFunc func, Type eT, void*
+ *************************************************************************/
+ int GetAtAddress( Type eT, void* p )
+ {
++#if defined(IA64) || defined(ARM32)
++ switch ( eT )
++ {
++ case t_char: return *((char*)p);
++ case t_short: if ((long)p % sizeof(short)) abort(); else return *((short*)p);
++ case t_int: if ((long)p % sizeof(int)) abort(); else return *((int*)p);
++ case t_long: if ((long)p % sizeof(long)) abort(); else return *((long*)p);
++ case t_double: if ((long)p % sizeof(double)) abort(); else return *((double*)p);
++ }
++#else
+ switch ( eT )
+ {
+ case t_char: return *((char*)p);
+@@ -222,6 +232,7 @@ int GetAtAddress( Type eT, void* p )
+ case t_long: return *((long*)p);
+ case t_double: return *((double*)p);
+ }
++#endif
+ abort();
+ }
+
+cvs diff: Diffing sal/util
+cvs diff: Diffing sal/workben
+cvs diff: Diffing sal/workben/clipboardwben
+cvs diff: Diffing sal/workben/clipboardwben/testcopy
+cvs diff: Diffing sal/workben/clipboardwben/testpaste
+cvs diff: Diffing sal/workben/clipboardwben/testviewer
+cvs diff: Diffing cppu
+cvs diff: Diffing cppu/inc
+cvs diff: Diffing cppu/inc/com
+cvs diff: Diffing cppu/inc/com/sun
+cvs diff: Diffing cppu/inc/com/sun/star
+cvs diff: Diffing cppu/inc/com/sun/star/uno
+cvs diff: Diffing cppu/inc/cppu
+cvs diff: Diffing cppu/inc/cppu/helper
+cvs diff: Diffing cppu/inc/cppu/helper/purpenv
+cvs diff: Diffing cppu/inc/pch
+cvs diff: Diffing cppu/inc/typelib
+cvs diff: Diffing cppu/inc/uno
+cvs diff: Diffing cppu/prj
+cvs diff: Diffing cppu/qa
+cvs diff: Diffing cppu/source
+cvs diff: Diffing cppu/source/AffineBridge
+cvs diff: Diffing cppu/source/UnsafeBridge
+cvs diff: Diffing cppu/source/cppu
+cvs diff: Diffing cppu/source/helper
+cvs diff: Diffing cppu/source/helper/purpenv
+cvs diff: Diffing cppu/source/threadpool
+cvs diff: Diffing cppu/source/typelib
+cvs diff: Diffing cppu/source/uno
+cvs diff: Diffing cppu/test
+Index: cppu/test/language_binding.idl
+===================================================================
+RCS file: /cvs/udk/cppu/test/language_binding.idl,v
+retrieving revision 1.3
+retrieving revision 1.3.130.1
+diff -u -u -p -b -w -B -r1.3 -r1.3.130.1
+--- cppu/test/language_binding.idl 8 Sep 2005 08:55:54 -0000 1.3
++++ cppu/test/language_binding.idl 16 Feb 2008 15:27:58 -0000 1.3.130.1
+@@ -71,6 +71,49 @@ struct TestSimple
+ test::TestEnum Enum;
+ };
+ /**
++ * equal to max size returned in registers on x86_64
++ */
++struct SmallStruct
++{
++ hyper a;
++ hyper b;
++};
++/**
++ * equal to max size returned in registers on ia64
++ */
++struct MediumStruct
++{
++ hyper a;
++ hyper b;
++ hyper c;
++ hyper d;
++};
++/**
++ * bigger than max size returned in registers on ia64
++ */
++struct BigStruct
++{
++ hyper a;
++ hyper b;
++ hyper c;
++ hyper d;
++ hyper e;
++ hyper f;
++ hyper g;
++ hyper h;
++};
++/**
++ * all floats, ia64 claims to handle them specially
++ */
++struct AllFloats
++{
++ float a;
++ float b;
++ float c;
++ float d;
++};
++
++/**
+ * complex c++ types
+ */
+ struct TestElement : test::TestSimple
+@@ -131,6 +174,26 @@ interface XLBTestBase : com::sun::star::
+ [out] sequence<test::TestElement > aSequence,
+ [out] test::TestData aStruct );
+
++ /**
++ * register return test 1
++ */
++ test::SmallStruct echoSmallStruct( [in] test::SmallStruct aStruct );
++
++ /**
++ * register return test 2
++ */
++ test::MediumStruct echoMediumStruct( [in] test::MediumStruct aStruct );
++
++ /**
++ * register return test 3
++ */
++ test::BigStruct echoBigStruct( [in] test::BigStruct aStruct );
++
++ /**
++ * register return test 4
++ */
++ test::AllFloats echoAllFloats( [in] test::AllFloats aStruct );
++
+ [attribute] boolean Bool;
+ [attribute] byte Byte;
+ [attribute] char Char;
+Index: cppu/test/test_di.cxx
+===================================================================
+RCS file: /cvs/udk/cppu/test/test_di.cxx,v
+retrieving revision 1.19
+retrieving revision 1.19.64.1
+diff -u -u -p -b -w -B -r1.19 -r1.19.64.1
+--- cppu/test/test_di.cxx 27 Oct 2006 12:16:06 -0000 1.19
++++ cppu/test/test_di.cxx 16 Feb 2008 15:27:58 -0000 1.19.64.1
+@@ -42,6 +42,7 @@
+ #include "precompiled_cppu.hxx"
+
+ #include <stdio.h>
++#include <string.h>
+ #include <rtl/ustring.hxx>
+ #include <osl/diagnose.h>
+ #include <osl/time.h>
+@@ -237,6 +238,15 @@ public:
+ test::TestData& rStruct )
+ throw(com::sun::star::uno::RuntimeException);
+
++ virtual test::SmallStruct echoSmallStruct(const test::SmallStruct& rStruct) throw(com::sun::star::uno::RuntimeException)
++ { return rStruct; }
++ virtual test::MediumStruct echoMediumStruct(const test::MediumStruct& rStruct) throw(com::sun::star::uno::RuntimeException)
++ { return rStruct; }
++ virtual test::BigStruct echoBigStruct(const test::BigStruct& rStruct) throw(com::sun::star::uno::RuntimeException)
++ { return rStruct; }
++ virtual test::AllFloats echoAllFloats(const test::AllFloats& rStruct) throw(com::sun::star::uno::RuntimeException)
++ { return rStruct; }
++
+ virtual sal_Bool SAL_CALL getBool() throw(com::sun::star::uno::RuntimeException)
+ { return _aData.Bool; }
+ virtual sal_Int8 SAL_CALL getByte() throw(com::sun::star::uno::RuntimeException)
+@@ -493,7 +503,27 @@ static sal_Bool performTest(
+ aRet.Sequence = xLBT->getSequence();
+ aRet2 = xLBT->getStruct();
+
+- return (equals( aData, aRet ) && equals( aData, aRet2 ));
++ OSL_ASSERT( equals( aData, aRet ) && equals( aData, aRet2 ) );
++ }
++ {
++ test::SmallStruct aIn(1, 2);
++ test::SmallStruct aOut = xLBT->echoSmallStruct(aIn);
++ OSL_ASSERT( memcmp(&aIn, &aOut, sizeof(test::SmallStruct)) == 0 );
++ }
++ {
++ test::MediumStruct aIn(1, 2, 3, 4);
++ test::MediumStruct aOut = xLBT->echoMediumStruct(aIn);
++ OSL_ASSERT( memcmp(&aIn, &aOut, sizeof(test::MediumStruct)) == 0 );
++ }
++ {
++ test::BigStruct aIn(1, 2, 3, 4, 5, 6, 7, 8);
++ test::BigStruct aOut = xLBT->echoBigStruct(aIn);
++ OSL_ASSERT( memcmp(&aIn, &aOut, sizeof(test::BigStruct)) == 0 );
++ }
++ {
++ test::AllFloats aIn(1.1, 2.2, 3.3, 4.4);
++ test::AllFloats aOut = xLBT->echoAllFloats(aIn);
++ return( memcmp(&aIn, &aOut, sizeof(test::AllFloats)) == 0 );
+ }
+ }
+ return sal_False;
+Index: cppu/test/testcppu.cxx
+===================================================================
+RCS file: /cvs/udk/cppu/test/testcppu.cxx,v
+retrieving revision 1.34
+retrieving revision 1.34.56.1
+diff -u -u -p -b -w -B -r1.34 -r1.34.56.1
+--- cppu/test/testcppu.cxx 1 Dec 2006 17:27:07 -0000 1.34
++++ cppu/test/testcppu.cxx 16 Feb 2008 15:27:58 -0000 1.34.56.1
+@@ -80,6 +80,7 @@
+ #include <com/sun/star/beans/PropertyValue.hpp>
+ #include <test/XSimpleInterface.hpp>
+ #include <test/XLanguageBindingTest.hpp>
++#include <com/sun/star/registry/XSimpleRegistry.hpp>
+
+ using namespace test;
+ using namespace rtl;
+cvs diff: Diffing cppu/test/AffineBridge
+cvs diff: Diffing cppu/test/AntiEnvGuard
+cvs diff: Diffing cppu/test/EnvDcp
+cvs diff: Diffing cppu/test/EnvGuard
+cvs diff: Diffing cppu/test/EnvStack
+cvs diff: Diffing cppu/test/EnvStack_tester
+cvs diff: Diffing cppu/test/FreeReference
+cvs diff: Diffing cppu/test/Map
+cvs diff: Diffing cppu/test/ObjectFactory
+cvs diff: Diffing cppu/test/Shield
+cvs diff: Diffing cppu/test/UnsafeBridge
+cvs diff: Diffing cppu/test/alignment
+cvs diff: Diffing cppu/test/cascade_mapping
+cvs diff: Diffing cppu/test/env_substs
+cvs diff: Diffing cppu/test/env_tester
+cvs diff: Diffing cppu/test/mapping_tester
+cvs diff: Diffing cppu/test/purpenvhelper
+cvs diff: Diffing cppu/test/purpose_envs
+cvs diff: Diffing cppu/util
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]