ooo-build r11711 - in trunk: . patches/src680



Author: rengelhard
Date: Tue Feb 26 18:35:23 2008
New Revision: 11711
URL: http://svn.gnome.org/viewvc/ooo-build?rev=11711&view=rev

Log:
2008-02-26  Rene Engelhard  <rene debian org>

        * patches/src680/cws-ia64port01.diff: update


Modified:
   trunk/ChangeLog
   trunk/patches/src680/cws-ia64port01.diff

Modified: trunk/patches/src680/cws-ia64port01.diff
==============================================================================
--- trunk/patches/src680/cws-ia64port01.diff	(original)
+++ trunk/patches/src680/cws-ia64port01.diff	Tue Feb 26 18:35:23 2008
@@ -71,8 +71,8 @@
 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 @@
++++ solenv/inc/unxlnga.mk	26 Feb 2008 16:23:14 -0000	1.1.2.2
+@@ -0,0 +1,232 @@
 +#*************************************************************************
 +#
 +#   OpenOffice.org - a multi-platform office productivity suite
@@ -238,6 +238,8 @@
 +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'\'
++LINKFLAGSRUNPATH_BRAND=-Wl,-rpath,\''$$ORIGIN:$$ORIGIN/../basis-link/program:$$ORIGIN/../basis-link/ure-link/lib'\'
++LINKFLAGSRUNPATH_OXT=
 +LINKFLAGS=-Wl,-z,combreloc $(LINKFLAGSDEFS)
 +
 +# linker flags for linking applications
@@ -318,11 +320,161 @@
 cvs diff: Diffing solenv/src
 cvs diff: Diffing solenv/unxmacxp
 cvs diff: Diffing solenv/unxmacxp/inc
+cvs diff: Diffing tools
+cvs diff: Diffing tools/bootstrp
+cvs diff: Diffing tools/bootstrp/addexes
+cvs diff: Diffing tools/bootstrp/addexes2
+cvs diff: Diffing tools/inc
+cvs diff: Diffing tools/inc/bootstrp
+cvs diff: Diffing tools/inc/pch
+cvs diff: Diffing tools/inc/tools
+Index: tools/inc/tools/solar.h
+===================================================================
+RCS file: /cvs/util/tools/inc/tools/solar.h,v
+retrieving revision 1.5
+retrieving revision 1.5.44.2
+diff -u -u -p -b -w -B -r1.5 -r1.5.44.2
+--- tools/inc/tools/solar.h	2 Nov 2007 13:00:07 -0000	1.5
++++ tools/inc/tools/solar.h	21 Feb 2008 13:32:27 -0000	1.5.44.2
+@@ -388,6 +388,12 @@ template<typename T> inline T Abs(T a) {
+   #define __DLLEXTENSION "ls.so"
+ #elif defined LINUX && defined __x86_64__
+   #define __DLLEXTENSION "lx.so"
++#elif defined LINUX && defined MIPS
++  #define __DLLEXTENSION "lm.so"
++#elif defined LINUX && defined IA64
++  #define __DLLEXTENSION "la.so"
++#elif defined LINUX
++  #error unknown plattform
+ #elif defined FREEBSD && defined X86
+   #define __DLLEXTENSION "fi.so"
+ #elif defined FREEBSD && defined X86_64
+cvs diff: Diffing tools/prj
+cvs diff: Diffing tools/source
+cvs diff: Diffing tools/source/communi
+cvs diff: Diffing tools/source/datetime
+cvs diff: Diffing tools/source/debug
+cvs diff: Diffing tools/source/fsys
+cvs diff: Diffing tools/source/generic
+cvs diff: Diffing tools/source/inet
+cvs diff: Diffing tools/source/memtools
+cvs diff: Diffing tools/source/misc
+cvs diff: Diffing tools/source/rc
+cvs diff: Diffing tools/source/ref
+cvs diff: Diffing tools/source/solar
+cvs diff: Diffing tools/source/stream
+cvs diff: Diffing tools/source/string
+cvs diff: Diffing tools/source/testtoolloader
+cvs diff: Diffing tools/source/zcodec
+cvs diff: Diffing tools/test
+cvs diff: Diffing tools/unx
+cvs diff: Diffing tools/unx/source
+cvs diff: Diffing tools/unx/source/dll
+cvs diff: Diffing tools/util
+cvs diff: Diffing tools/util/defs
+cvs diff: Diffing tools/win
+cvs diff: Diffing tools/win/inc
+cvs diff: Diffing tools/win/source
+cvs diff: Diffing tools/win/source/dll
+cvs diff: Diffing tools/win/source/fastfsys
+cvs diff: Diffing tools/workben
 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
+Index: bridges/inc/bridges/cpp_uno/shared/cppinterfaceproxy.hxx
+===================================================================
+RCS file: /cvs/udk/bridges/inc/bridges/cpp_uno/shared/cppinterfaceproxy.hxx,v
+retrieving revision 1.4
+retrieving revision 1.4.104.1
+diff -u -u -p -b -w -B -r1.4 -r1.4.104.1
+--- bridges/inc/bridges/cpp_uno/shared/cppinterfaceproxy.hxx	19 Jun 2006 23:38:14 -0000	1.4
++++ bridges/inc/bridges/cpp_uno/shared/cppinterfaceproxy.hxx	18 Feb 2008 10:40:36 -0000	1.4.104.1
+@@ -42,6 +42,7 @@
+ #include "typelib/typedescription.h"
+ #include "uno/dispatcher.h"
+ #include "uno/environment.h"
++#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+ 
+ namespace com { namespace sun { namespace star { namespace uno {
+     class XInterface;
+@@ -102,7 +103,7 @@ private:
+     typelib_InterfaceTypeDescription * pTypeDescr;
+     rtl::OUString oid;
+ 
+-    void ** vtables[1];
++    VtableFactory::Slot * vtables[1];
+ 
+     friend void SAL_CALL freeCppInterfaceProxy(
+         uno_ExtEnvironment * pEnv, void * pInterface);
+Index: bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx
+===================================================================
+RCS file: /cvs/udk/bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx,v
+retrieving revision 1.5
+retrieving revision 1.5.116.1
+diff -u -u -p -b -w -B -r1.5 -r1.5.116.1
+--- bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx	2 May 2006 11:59:11 -0000	1.5
++++ bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx	18 Feb 2008 10:40:36 -0000	1.5.116.1
+@@ -50,6 +50,12 @@ namespace bridges { namespace cpp_uno { 
+  */
+ class VtableFactory {
+ public:
++    // This structure is not defined in the generic part, but instead has to be
++    // defined individually for each CPP--UNO bridge:
++    /** A vtable slot.
++     */
++    struct Slot;
++
+     /** A raw vtable block.
+      */
+     struct Block {
+@@ -99,7 +105,7 @@ public:
+     // defined individually for each CPP--UNO bridge:
+     /** Given a pointer to a block, turn it into a vtable pointer.
+      */
+-    static void ** mapBlockToVtable(void * block);
++    static Slot * mapBlockToVtable(void * block);
+ 
+ private:
+     class GuardedBlocks;
+@@ -133,11 +139,10 @@ private:
+     /** Initialize a raw vtable block.
+ 
+         @param block  the start address of the raw vtable block
+-        @return  a pointer to the first virtual function slot (minus any
+-        platform-specific ones, like a pointer to a destructor) within the given
+-        block
++        @param slotCount  the number of slots
++        @return  a pointer past the last vtable slot
+      */
+-    static void ** initializeBlock(void * block);
++    static Slot * initializeBlock(void * block, sal_Int32 slotCount);
+ 
+     // This function is not defined in the generic part, but instead has to be
+     // defined individually for each CPP--UNO bridge:
+@@ -145,8 +150,10 @@ private:
+         functions of a given interface type (and generate any necessary code
+         snippets for them).
+ 
+-        @param slots  points to the first vtable slot to be filled with the
+-        first virtual function local to the given type
++        @param slots  on input, points past the vtable slot to be filled with
++        the last virtual function local to the given type; on output, points to
++        the vtable slot filled with the first virtual function local to the
++        given type
+         @param code  points to the start of the area where code snippets can be
+         generated
+         @param type  the interface type description for which to generate vtable
+@@ -162,7 +169,7 @@ private:
+         @return  a pointer to the remaining code snippet area
+      */
+     static unsigned char * addLocalFunctions(
+-        void ** slots, unsigned char * code,
++        Slot ** slots, unsigned char * code,
+         typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+         sal_Int32 functionCount, sal_Int32 vtableOffset);
+ 
 cvs diff: Diffing bridges/inc/bridges/remote
 cvs diff: Diffing bridges/inc/pch
 cvs diff: Diffing bridges/prj
@@ -345,10 +497,429 @@
 cvs diff: Diffing bridges/source
 cvs diff: Diffing bridges/source/cpp_uno
 cvs diff: Diffing bridges/source/cpp_uno/cc50_solaris_intel
+Index: bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx,v
+retrieving revision 1.15
+retrieving revision 1.15.82.1
+diff -u -u -p -b -w -B -r1.15 -r1.15.82.1
+--- bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx	16 Sep 2006 15:43:28 -0000	1.15
++++ bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx	18 Feb 2008 11:14:12 -0000	1.15.82.1
+@@ -460,30 +460,37 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+-{
+-    return static_cast< void ** >(block) + 1;
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block) {
++    return static_cast< Slot * >(block) + 1;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 3) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 3) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block) + 2;
+-    slots[-3] = 0; // RTTI
+-    slots[-2] = 0; // null
+-    slots[-1] = 0; // destructor
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block) + 2;
++    slots[-3].fn = 0; // RTTI
++    slots[-2].fn = 0; // null
++    slots[-1].fn = 0; // destructor
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -491,7 +498,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceAttributeTypeDescription * >(
+@@ -501,13 +508,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, 0);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
 cvs diff: Diffing bridges/source/cpp_uno/cc50_solaris_sparc
+Index: bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx,v
+retrieving revision 1.23
+retrieving revision 1.23.42.1
+diff -u -u -p -b -w -B -r1.23 -r1.23.42.1
+--- bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx	14 Mar 2007 08:25:27 -0000	1.23
++++ bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx	18 Feb 2008 11:14:13 -0000	1.23.42.1
+@@ -456,30 +456,38 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 1;
++    return static_cast< Slot * >(block) + 1;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 3) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 3) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block) + 2;
+-    slots[-3] = 0; // RTTI
+-    slots[-2] = 0; // null
+-    slots[-1] = 0; // destructor
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block) + 2;
++    slots[-3].fn = 0; // RTTI
++    slots[-2].fn = 0; // null
++    slots[-1].fn = 0; // destructor
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -487,7 +495,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -499,13 +507,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_freebsd_intel
+Index: bridges/source/cpp_uno/gcc3_freebsd_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_freebsd_intel/cpp2uno.cxx,v
+retrieving revision 1.10
+retrieving revision 1.10.32.1
+diff -u -u -p -b -w -B -r1.10 -r1.10.32.1
+--- bridges/source/cpp_uno/gcc3_freebsd_intel/cpp2uno.cxx	5 Jul 2007 08:59:35 -0000	1.10
++++ bridges/source/cpp_uno/gcc3_freebsd_intel/cpp2uno.cxx	18 Feb 2008 10:47:02 -0000	1.10.32.1
+@@ -421,29 +421,37 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -451,7 +459,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceAttributeTypeDescription * >(
+@@ -461,7 +469,7 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(
+                     code, functionOffset++, vtableOffset,
+                     typelib_TypeClass_VOID);
+@@ -469,7 +477,7 @@ unsigned char * bridges::cpp_uno::shared
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_freebsd_x86-64
+Index: bridges/source/cpp_uno/gcc3_freebsd_x86-64/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_freebsd_x86-64/cpp2uno.cxx,v
+retrieving revision 1.3
+retrieving revision 1.3.82.1
+diff -u -u -p -b -w -B -r1.3 -r1.3.82.1
+--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/cpp2uno.cxx	16 Sep 2006 15:46:37 -0000	1.3
++++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/cpp2uno.cxx	18 Feb 2008 10:47:02 -0000	1.3.82.1
+@@ -465,35 +465,42 @@ unsigned char * codeSnippet( unsigned ch
+ }
+ 
+ //==================================================================================================
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable( void * block )
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-	return static_cast<void **>( block ) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ //==================================================================================================
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return ( slotCount + 2 ) * sizeof( void * ) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+ //==================================================================================================
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock( void * block )
+-{
+-	void ** slots = mapBlockToVtable( block );
+-	slots[-2] = 0;
+-	slots[-1] = 0;
+-
+-	return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ //==================================================================================================
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-	void ** slots, unsigned char * code,
++	Slot ** slots, unsigned char * code,
+ 	typelib_InterfaceTypeDescription const * type, sal_Int32 nFunctionOffset,
+ 	sal_Int32 functionCount, sal_Int32 nVtableOffset )
+ {
++	(*slots) -= functionCount;
++	Slot * s = *slots;
++
+ 	for ( sal_Int32 nPos = 0; nPos < type->nMembers; ++nPos )
+ 	{
+ 		typelib_TypeDescription * pTD = 0;
+@@ -507,14 +514,14 @@ unsigned char * bridges::cpp_uno::shared
+ 				reinterpret_cast<typelib_InterfaceAttributeTypeDescription *>( pTD );
+ 
+ 			// get method
+-			*slots++ = code;
++			(s++)->fn = code;
+ 			code = codeSnippet( code, nFunctionOffset++, nVtableOffset,
+ 								x86_64::return_in_hidden_param( pAttrTD->pAttributeTypeRef ) );
+ 
+ 			if ( ! pAttrTD->bReadOnly )
+ 			{
+ 				// set method
+-				*slots++ = code;
++				(s++)->fn = code;
+ 				code = codeSnippet( code, nFunctionOffset++, nVtableOffset, false );
+ 			}
+ 		}
+@@ -523,7 +530,7 @@ unsigned char * bridges::cpp_uno::shared
+ 			typelib_InterfaceMethodTypeDescription *pMethodTD =
+ 				reinterpret_cast<typelib_InterfaceMethodTypeDescription *>( pTD );
+ 			
+-			*slots++ = code;
++			(s++)->fn = code;
+ 			code = codeSnippet( code, nFunctionOffset++, nVtableOffset,
+ 								x86_64::return_in_hidden_param( pMethodTD->pReturnTypeRef ) );
+ 		}
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_arm
+Index: bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx,v
+retrieving revision 1.3
+retrieving revision 1.3.6.1
+diff -u -u -p -b -w -B -r1.3 -r1.3.6.1
+--- bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx	12 Dec 2007 15:34:25 -0000	1.3
++++ bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx	18 Feb 2008 10:40:36 -0000	1.3.6.1
+@@ -447,29 +447,37 @@ namespace
+     }
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i)
+     {
+         typelib_TypeDescription * member = 0;
+@@ -479,7 +487,7 @@ unsigned char * bridges::cpp_uno::shared
+         {
+             case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+                 // Getter:
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(
+                     code, functionOffset++, vtableOffset,
+                     bridges::cpp_uno::shared::isSimpleType(
+@@ -491,14 +499,14 @@ unsigned char * bridges::cpp_uno::shared
+                     typelib_InterfaceAttributeTypeDescription * >(
+                         member)->bReadOnly)
+                 {
+-                    *slots++ = code;
++                    (s++)->fn = code;
+                     code = codeSnippet(
+                         code, functionOffset++, vtableOffset, true);
+                 }
+                 break;
+             case typelib_TypeClass_INTERFACE_METHOD:
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+ 
+                 typelib_InterfaceMethodTypeDescription *pMethodTD = 
+                     reinterpret_cast<
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_ia64
 Index: bridges/source/cpp_uno/gcc3_linux_ia64/call.s
 ===================================================================
@@ -382,8 +953,8 @@
 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 @@
++++ bridges/source/cpp_uno/gcc3_linux_ia64/cpp2uno.cxx	18 Feb 2008 10:40:37 -0000	1.1.2.3
+@@ -0,0 +1,692 @@
 +/*************************************************************************
 + *
 + *  OpenOffice.org - a multi-platform office productivity suite
@@ -966,7 +1537,7 @@
 +{
 +const int codeSnippetSize = 40;
 +
-+ia64::function_desc codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, 
++bridges::cpp_uno::shared::VtableFactory::Slot codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, 
 +                              bool bHasHiddenParam )
 +{
 +#ifdef CMC_DEBUG
@@ -982,14 +1553,14 @@
 +
 +    long *raw = (long *)code;
 +
-+    ia64::function_desc* destination = (ia64::function_desc*)cpp_vtable_call;
++    bridges::cpp_uno::shared::VtableFactory::Slot* destination = (bridges::cpp_uno::shared::VtableFactory::Slot*)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);
++    return *(bridges::cpp_uno::shared::VtableFactory::Slot*)(code);
 +}
 +}
 +
@@ -997,33 +1568,34 @@
 +{
 +}
 +
-+void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++bridges::cpp_uno::shared::VtableFactory::Slot * bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
 +{
-+    ia64::function_desc *pRet = static_cast< ia64::function_desc* >(block) + 2;
-+    return reinterpret_cast< void** >(pRet);
++    return static_cast< Slot * >(block) + 2;
 +}
 +
++
 +sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
 +    sal_Int32 slotCount)
 +{
-+    return (slotCount + 2) * sizeof (ia64::function_desc) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
 +}
 +
-+void** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block)
++bridges::cpp_uno::shared::VtableFactory::Slot* bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block, sal_Int32 slotCount)
 +{
-+    ia64::function_desc * slots = reinterpret_cast< ia64::function_desc* >(mapBlockToVtable(block));
-+    ia64::function_desc foo = {0,0};
++    Slot * slots = mapBlockToVtable(block);
++    Slot foo = {0,0};
 +    slots[-2] = foo;
 +    slots[-1] = foo;
-+    return reinterpret_cast< void** >(slots);
++    return slots + slotCount;
 +}
 +
 +unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
-+    void ** in_slots, unsigned char * code,
++    Slot ** in_slots, unsigned char * code,
 +    typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
-+    sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
 +{
-+    ia64::function_desc *slots = reinterpret_cast< ia64::function_desc* >(in_slots);
++    (*in_slots) -= functionCount;
++    Slot * slots = *in_slots;
 +#ifdef CMC_DEBUG
 +    fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
 +    fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
@@ -1479,8 +2051,8 @@
 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 @@
++++ bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx	18 Feb 2008 10:40:37 -0000	1.1.2.3
+@@ -0,0 +1,138 @@
 +/*************************************************************************
 + *
 + *  OpenOffice.org - a multi-platform office productivity suite
@@ -1521,6 +2093,7 @@
 +#include <typeinfo>
 +#include <exception>
 +#include <cstddef>
++#include "bridges/cpp_uno/shared/vtablefactory.hxx"
 +
 +namespace CPPU_CURRENT_NAMESPACE
 +{
@@ -1585,18 +2158,6 @@
 +{
 +    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 );
 +
@@ -1609,6 +2170,26 @@
 +    };
 +}
 +
++namespace bridges
++{
++    namespace cpp_uno
++    {
++        namespace shared
++        {
++            /*
++                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 VtableFactory::Slot
++            {
++                sal_uInt64 code_address;
++                sal_uInt64 gp_value;
++            };
++        }
++    }
++}
 +/* vi:set tabstop=4 shiftwidth=4 expandtab: */
 Index: bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
 ===================================================================
@@ -2291,17 +2872,270 @@
 +} } }
 +/* vi:set tabstop=4 shiftwidth=4 expandtab: */
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_intel
+Index: bridges/source/cpp_uno/gcc3_linux_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_intel/cpp2uno.cxx,v
+retrieving revision 1.12
+retrieving revision 1.12.82.1
+diff -u -u -p -b -w -B -r1.12 -r1.12.82.1
+--- bridges/source/cpp_uno/gcc3_linux_intel/cpp2uno.cxx	16 Sep 2006 15:47:26 -0000	1.12
++++ bridges/source/cpp_uno/gcc3_linux_intel/cpp2uno.cxx	18 Feb 2008 10:40:37 -0000	1.12.82.1
+@@ -421,29 +421,36 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+-{
+-    return static_cast< void ** >(block) + 2;
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block) {
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -451,7 +458,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceAttributeTypeDescription * >(
+@@ -461,7 +468,7 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(
+                     code, functionOffset++, vtableOffset,
+                     typelib_TypeClass_VOID);
+@@ -469,7 +476,7 @@ unsigned char * bridges::cpp_uno::shared
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_mips
+Index: bridges/source/cpp_uno/gcc3_linux_mips/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_mips/cpp2uno.cxx,v
+retrieving revision 1.3
+retrieving revision 1.3.8.1
+diff -u -u -p -b -w -B -r1.3 -r1.3.8.1
+--- bridges/source/cpp_uno/gcc3_linux_mips/cpp2uno.cxx	22 Nov 2007 16:47:04 -0000	1.3
++++ bridges/source/cpp_uno/gcc3_linux_mips/cpp2uno.cxx	18 Feb 2008 10:40:37 -0000	1.3.8.1
+@@ -726,37 +726,38 @@ void bridges::cpp_uno::shared::VtableFac
+   sysmips(FLUSH_CACHE,0,0,0);
+ }
+ 
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+ 
+-
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-  return reinterpret_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-     slots[-2] = 0; //null
+-     slots[-1] = 0; //destructor
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0; //null
++    slots[-1].fn = 0; //destructor
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-	void ** slots, unsigned char * code,
++	Slot ** slots, unsigned char * code,
+ 	typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-	sal_Int32
+-#ifdef BRDEBUG
+-       functionCount
+-#endif
+-    , sal_Int32 vtableOffset)
++	sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
+-
++   (*slots) -= functionCount;
++    Slot * s = *slots;
+ #ifdef BRDEBUG
+    fprintf(stderr, "in addLocalFunctions functionOffset is %d\n",functionOffset);
+    fprintf(stderr, "in addLocalFunctions vtableOffset is %d\n",vtableOffset);
+@@ -771,7 +772,7 @@ unsigned char * bridges::cpp_uno::shared
+ 	switch (member->eTypeClass) {
+ 	  case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+ 		// Getter:
+-		*slots++ = code;
++		(s++)->fn = code;
+ 		code = codeSnippet(
+ 			code, functionOffset++, vtableOffset,
+ 			bridges::cpp_uno::shared::isSimpleType(
+@@ -784,13 +785,13 @@ unsigned char * bridges::cpp_uno::shared
+ 			typelib_InterfaceAttributeTypeDescription * >(
+ 			  member)->bReadOnly)
+ 		{
+-		  *slots++ = code;
++		  (s++)->fn = code;
+ 		  code = codeSnippet(code, functionOffset++, vtableOffset, true);
+ 		}
+ 		break;
+ 
+ 	  case typelib_TypeClass_INTERFACE_METHOD:
+-		*slots++ = code;
++		(s++)->fn = code;
+ 		code = codeSnippet(
+ 			code, functionOffset++, vtableOffset,
+ 			bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_powerpc
+Index: bridges/source/cpp_uno/gcc3_linux_powerpc/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_powerpc/cpp2uno.cxx,v
+retrieving revision 1.10
+retrieving revision 1.10.4.1
+diff -u -u -p -b -w -B -r1.10 -r1.10.4.1
+--- bridges/source/cpp_uno/gcc3_linux_powerpc/cpp2uno.cxx	4 Feb 2008 13:43:38 -0000	1.10
++++ bridges/source/cpp_uno/gcc3_linux_powerpc/cpp2uno.cxx	18 Feb 2008 10:40:37 -0000	1.10.4.1
+@@ -660,32 +660,37 @@ void bridges::cpp_uno::shared::VtableFac
+   __asm__ volatile ( "sync;" "isync;" : : : "memory");
+ }
+ 
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+ 
+-
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+     sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
+-
++     (*slots) -= functionCount;
++     Slot * s = *slots;
+   // fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
+   // fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
+   // fflush(stderr);
+@@ -697,7 +702,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -710,13 +715,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 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
+retrieving revision 1.2.32.2
+diff -u -u -p -b -w -B -r1.2 -r1.2.32.2
 --- 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
++++ bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx	18 Feb 2008 10:40:37 -0000	1.2.32.2
 @@ -135,7 +135,7 @@ static typelib_TypeClass cpp2uno_call(
  			{
  				case typelib_TypeClass_FLOAT:
@@ -2367,6 +3201,79 @@
  
      __asm__ __volatile__ (
          "std 3,   0(%0)\t\n"
+@@ -645,31 +645,37 @@ void bridges::cpp_uno::shared::VtableFac
+   __asm__ volatile ( "sync;" "isync;" : : : "memory");
+ }
+ 
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+ 
+-
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code, 
++    Slot ** slots, unsigned char * code, 
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+     sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++     (*slots) -= functionCount;
++     Slot * s = *slots;
+ #ifdef CMC_DEBUG
+     fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
+     fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
+@@ -682,7 +688,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -695,13 +701,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 Index: bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx
 ===================================================================
 RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx,v
@@ -2434,66 +3341,770 @@
      switch (eTypeClass)
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_s390
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_sparc
+Index: bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx,v
+retrieving revision 1.12
+retrieving revision 1.12.66.1
+diff -u -u -p -b -w -B -r1.12 -r1.12.66.1
+--- bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx	22 Nov 2006 11:07:20 -0000	1.12
++++ bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx	18 Feb 2008 10:40:38 -0000	1.12.66.1
+@@ -493,29 +493,37 @@ unsigned char * codeSnippet(
+ 
+ } //end of namespace
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-     slots[-2] = 0; //null
+-     slots[-1] = 0; //destructor
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0; //null
++    slots[-1].fn = 0; //destructor
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /* functionCount */, sal_Int32 vTableOffset)
++    sal_Int32 functionCount, sal_Int32 vTableOffset)
+ {
++	(*slots) -= functionCount;
++	Slot * s = *slots;
+ 	for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -523,7 +531,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vTableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -535,13 +543,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vTableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vTableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_linux_x86-64
+Index: bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx,v
+retrieving revision 1.7
+retrieving revision 1.7.8.1
+diff -u -u -p -b -w -B -r1.7 -r1.7.8.1
+--- bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx	13 Nov 2007 14:18:07 -0000	1.7
++++ bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx	18 Feb 2008 10:40:38 -0000	1.7.8.1
+@@ -465,35 +465,41 @@ unsigned char * codeSnippet( unsigned ch
+ }
+ 
+ //==================================================================================================
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable( void * block )
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-	return static_cast<void **>( block ) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ //==================================================================================================
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return ( slotCount + 2 ) * sizeof( void * ) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+ //==================================================================================================
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock( void * block )
+-{
+-	void ** slots = mapBlockToVtable( block );
+-	slots[-2] = 0;
+-	slots[-1] = 0;
+-
+-	return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ //==================================================================================================
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-	void ** slots, unsigned char * code,
++	Slot ** slots, unsigned char * code,
+ 	typelib_InterfaceTypeDescription const * type, sal_Int32 nFunctionOffset,
+-	sal_Int32 /* functionCount */, sal_Int32 nVtableOffset )
++	sal_Int32 functionCount, sal_Int32 nVtableOffset )
+ {
++	(*slots) -= functionCount;
++	Slot * s = *slots;
+ 	for ( sal_Int32 nPos = 0; nPos < type->nMembers; ++nPos )
+ 	{
+ 		typelib_TypeDescription * pTD = 0;
+@@ -507,14 +513,14 @@ unsigned char * bridges::cpp_uno::shared
+ 				reinterpret_cast<typelib_InterfaceAttributeTypeDescription *>( pTD );
+ 
+ 			// get method
+-			*slots++ = code;
++			(s++)->fn = code;
+ 			code = codeSnippet( code, nFunctionOffset++, nVtableOffset,
+ 								x86_64::return_in_hidden_param( pAttrTD->pAttributeTypeRef ) );
+ 
+ 			if ( ! pAttrTD->bReadOnly )
+ 			{
+ 				// set method
+-				*slots++ = code;
++				(s++)->fn = code;
+ 				code = codeSnippet( code, nFunctionOffset++, nVtableOffset, false );
+ 			}
+ 		}
+@@ -523,7 +529,7 @@ unsigned char * bridges::cpp_uno::shared
+ 			typelib_InterfaceMethodTypeDescription *pMethodTD =
+ 				reinterpret_cast<typelib_InterfaceMethodTypeDescription *>( pTD );
+ 			
+-			*slots++ = code;
++			(s++)->fn = code;
+ 			code = codeSnippet( code, nFunctionOffset++, nVtableOffset,
+ 								x86_64::return_in_hidden_param( pMethodTD->pReturnTypeRef ) );
+ 		}
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_macosx_intel
+Index: bridges/source/cpp_uno/gcc3_macosx_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_macosx_intel/cpp2uno.cxx,v
+retrieving revision 1.5
+retrieving revision 1.5.82.1
+diff -u -u -p -b -w -B -r1.5 -r1.5.82.1
+--- bridges/source/cpp_uno/gcc3_macosx_intel/cpp2uno.cxx	16 Sep 2006 15:51:08 -0000	1.5
++++ bridges/source/cpp_uno/gcc3_macosx_intel/cpp2uno.cxx	18 Feb 2008 11:01:40 -0000	1.5.82.1
+@@ -450,29 +450,37 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -480,7 +488,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceAttributeTypeDescription * >(
+@@ -490,7 +498,7 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(
+                     code, functionOffset++, vtableOffset,
+                     0 /* indicates VOID */);
+@@ -498,7 +506,7 @@ unsigned char * bridges::cpp_uno::shared
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_macosx_powerpc
+Index: bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx,v
+retrieving revision 1.9
+retrieving revision 1.9.54.1
+diff -u -u -p -b -w -B -r1.9 -r1.9.54.1
+--- bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx	18 Jan 2007 14:15:28 -0000	1.9
++++ bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx	18 Feb 2008 11:01:40 -0000	1.9.54.1
+@@ -655,30 +655,37 @@ void bridges::cpp_uno::shared::VtableFac
+   __asm__ volatile ( "sync;" "isync;" : : : "memory");
+ }
+ 
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /* functionCount */, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+ 
+   // fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
+   // fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
+@@ -691,7 +698,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -704,13 +711,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_netbsd_intel
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_os2_intel
+Index: bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx,v
+retrieving revision 1.3
+retrieving revision 1.3.20.1
+diff -u -u -p -b -w -B -r1.3 -r1.3.20.1
+--- bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx	25 Sep 2007 09:33:55 -0000	1.3
++++ bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx	18 Feb 2008 11:07:00 -0000	1.3.20.1
+@@ -453,29 +453,37 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+     sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -483,7 +491,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -495,13 +503,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_os2_intel/defs
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_solaris_intel
+Index: bridges/source/cpp_uno/gcc3_solaris_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_solaris_intel/cpp2uno.cxx,v
+retrieving revision 1.6
+retrieving revision 1.6.82.1
+diff -u -u -p -b -w -B -r1.6 -r1.6.82.1
+--- bridges/source/cpp_uno/gcc3_solaris_intel/cpp2uno.cxx	16 Sep 2006 15:53:13 -0000	1.6
++++ bridges/source/cpp_uno/gcc3_solaris_intel/cpp2uno.cxx	18 Feb 2008 11:05:04 -0000	1.6.82.1
+@@ -452,29 +452,37 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+     sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -482,7 +490,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -494,13 +502,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vtableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/gcc3_solaris_sparc
+Index: bridges/source/cpp_uno/gcc3_solaris_sparc/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_solaris_sparc/cpp2uno.cxx,v
+retrieving revision 1.6
+retrieving revision 1.6.82.1
+diff -u -u -p -b -w -B -r1.6 -r1.6.82.1
+--- bridges/source/cpp_uno/gcc3_solaris_sparc/cpp2uno.cxx	16 Sep 2006 15:53:57 -0000	1.6
++++ bridges/source/cpp_uno/gcc3_solaris_sparc/cpp2uno.cxx	18 Feb 2008 11:05:04 -0000	1.6.82.1
+@@ -491,29 +491,37 @@ unsigned char * codeSnippet(
+ 
+ } //end of namespace
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0; //null
+-    slots[-1] = 0; //destructor
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0; //null
++    slots[-1].fn = 0; //destructor
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+     sal_Int32 functionCount, sal_Int32 vTableOffset)
+ {
++	(*slots) -= functionCount;
++	Slot * s = *slots;
+ 	for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -521,7 +529,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vTableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
+@@ -533,13 +541,13 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(code, functionOffset++, vTableOffset, true);
+             }
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vTableOffset,
+                 bridges::cpp_uno::shared::isSimpleType(
 cvs diff: Diffing bridges/source/cpp_uno/mingw_intel
+Index: bridges/source/cpp_uno/mingw_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/mingw_intel/cpp2uno.cxx,v
+retrieving revision 1.3
+retrieving revision 1.3.34.1
+diff -u -u -p -b -w -B -r1.3 -r1.3.34.1
+--- bridges/source/cpp_uno/mingw_intel/cpp2uno.cxx	25 May 2007 10:53:46 -0000	1.3
++++ bridges/source/cpp_uno/mingw_intel/cpp2uno.cxx	18 Feb 2008 11:16:17 -0000	1.3.34.1
+@@ -422,29 +422,37 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 2;
++    return static_cast< Slot * >(block) + 2;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-2] = 0;
+-    slots[-1] = 0;
+-    return slots;
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
++{
++    Slot * slots = mapBlockToVtable(block);
++    slots[-2].fn = 0;
++    slots[-1].fn = 0;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+-    sal_Int32 /*functionCount*/, sal_Int32 vtableOffset)
++    sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+         typelib_TypeDescription * member = 0;
+         TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+@@ -452,7 +460,7 @@ unsigned char * bridges::cpp_uno::shared
+         switch (member->eTypeClass) {
+         case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+             // Getter:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceAttributeTypeDescription * >(
+@@ -462,7 +470,7 @@ unsigned char * bridges::cpp_uno::shared
+                 typelib_InterfaceAttributeTypeDescription * >(
+                     member)->bReadOnly)
+             {
+-                *slots++ = code;
++                (s++)->fn = code;
+                 code = codeSnippet(
+                     code, functionOffset++, vtableOffset,
+                     typelib_TypeClass_VOID);
+@@ -470,7 +478,7 @@ unsigned char * bridges::cpp_uno::shared
+             break;
+ 
+         case typelib_TypeClass_INTERFACE_METHOD:
+-            *slots++ = code;
++            (s++)->fn = code;
+             code = codeSnippet(
+                 code, functionOffset++, vtableOffset,
+                 reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
 cvs diff: Diffing bridges/source/cpp_uno/msvc_win32_intel
+Index: bridges/source/cpp_uno/msvc_win32_intel/cpp2uno.cxx
+===================================================================
+RCS file: /cvs/udk/bridges/source/cpp_uno/msvc_win32_intel/cpp2uno.cxx,v
+retrieving revision 1.17
+retrieving revision 1.17.82.1
+diff -u -u -p -b -w -B -r1.17 -r1.17.82.1
+--- bridges/source/cpp_uno/msvc_win32_intel/cpp2uno.cxx	16 Sep 2006 15:54:51 -0000	1.17
++++ bridges/source/cpp_uno/msvc_win32_intel/cpp2uno.cxx	18 Feb 2008 11:20:25 -0000	1.17.82.1
+@@ -442,18 +442,23 @@ unsigned char * codeSnippet(
+ 
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
++
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+ {
+-    return static_cast< void ** >(block) + 1;
++    return static_cast< Slot * >(block) + 1;
+ }
+ 
+ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+     sal_Int32 slotCount)
+ {
+-    return (slotCount + 1) * sizeof (void *) + slotCount * codeSnippetSize;
++    return (slotCount + 1) * sizeof (Slot) + slotCount * codeSnippetSize;
+ }
+ 
+-void ** bridges::cpp_uno::shared::VtableFactory::initializeBlock(void * block) {
++bridges::cpp_uno::shared::VtableFactory::Slot *
++bridges::cpp_uno::shared::VtableFactory::initializeBlock(
++    void * block, sal_Int32 slotCount)
+ 	struct Rtti {
+ 		sal_Int32 n0, n1, n2;
+ 		type_info * rtti;
+@@ -466,18 +471,20 @@ void ** bridges::cpp_uno::shared::Vtable
+     };
+     static Rtti rtti;
+ 
+-    void ** slots = mapBlockToVtable(block);
+-    slots[-1] = &rtti;
+-    return slots;
++    Slot * slots = mapBlockToVtable(block);
++    slots[-1].fn = &rtti;
++    return slots + slotCount;
+ }
+ 
+ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+-    void ** slots, unsigned char * code,
++    Slot ** slots, unsigned char * code,
+     typelib_InterfaceTypeDescription const *, sal_Int32 functionOffset,
+     sal_Int32 functionCount, sal_Int32 vtableOffset)
+ {
++    (*slots) -= functionCount;
++    Slot * s = *slots;
+     for (sal_Int32 i = 0; i < functionCount; ++i) {
+-        *slots++ = code;
++        (s++)->fn = code;
+         code = codeSnippet(code, functionOffset++, vtableOffset);
+     }
+     return code;
 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
+retrieving revision 1.9.22.2
+diff -u -u -p -b -w -B -r1.9 -r1.9.22.2
 --- 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(
++++ bridges/source/cpp_uno/shared/vtablefactory.cxx	18 Feb 2008 10:40:38 -0000	1.9.22.2
+@@ -266,21 +266,19 @@ void VtableFactory::createVtables(
              throw std::bad_alloc();
          }
          try {
 -            void ** slots = initializeBlock(block.start) + slotCount;
-+            function_desc *slots = (function_desc*)initializeBlock(block.start);
-+            slots+=slotCount;
++            Slot * slots = initializeBlock(block.start, 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*);
++            sal_Int32 vtableOffset = blocks.size() * sizeof (Slot *);
              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;
+-                sal_Int32 functionCount
+-                    = bridges::cpp_uno::shared::getLocalFunctions(type2);
+-                slots -= functionCount;
                  code = addLocalFunctions(
 -                    slots, code, type2,
-+                    (void**)slots, code, type2,
++                    &slots, code, type2,
                      baseOffset.getFunctionOffset(type2->aBase.pTypeName),
-                     functionCount, vtableOffset);
+-                    functionCount, vtableOffset);
++                    bridges::cpp_uno::shared::getLocalFunctions(type2),
++                    vtableOffset);
              }
+             flushCode(codeBegin, code);
+             blocks.push_back(block);
 cvs diff: Diffing bridges/source/jni_uno
 cvs diff: Diffing bridges/source/jni_uno/java
 cvs diff: Diffing bridges/source/jni_uno/java/com



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]