http://www.openoffice.org/issues/show_bug.cgi?id=40178 catch up recent version of bridges/source/cpp_uno/gcc3_linux_intel/cpp2uno.cxx Only difference is: - rtti = (type_info *)dlsym( m_hApp, symName.getStr() ); + rtti = (type_info *)dlsym( RTLD_DEFAULT, symName.getStr() ); #iZ 22253 for reason why we changed m_hApp to RTLD_DEFAULT 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.3 diff -u -r1.3 cpp2uno.cxx --- bridges/source/cpp_uno/gcc3_freebsd_intel/cpp2uno.cxx 28 Apr 2003 16:28:20 -0000 1.3 +++ bridges/source/cpp_uno/gcc3_freebsd_intel/cpp2uno.cxx 27 Dec 2004 06:05:52 -0000 @@ -2,9 +2,9 @@ * * $RCSfile: cpp2uno.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.6 $ * - * last change: $Author: hr $ $Date: 2003/04/28 16:28:20 $ + * last change: $Author: obo $ $Date: 2004/06/04 02:59:45 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,34 +59,26 @@ * ************************************************************************/ -#include - -#include -#include -#include - +#include +#include "com/sun/star/uno/RuntimeException.hpp" #include #include -#include -#include +#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" - -using namespace ::osl; -using namespace ::rtl; using namespace ::com::sun::star::uno; -namespace CPPU_CURRENT_NAMESPACE +namespace { //================================================================================================== -rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT; - -//================================================================================================== static typelib_TypeClass cpp2uno_call( - cppu_cppInterfaceProxy * pThis, + bridges::cpp_uno::shared::CppInterfaceProxy * pThis, const typelib_TypeDescription * pMemberTypeDescr, typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return sal_Int32 nParams, typelib_MethodParameter * pParams, @@ -106,7 +98,7 @@ if (pReturnTypeDescr) { - if (cppu_isSimpleType( pReturnTypeDescr )) + if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) { pUnoReturn = pRegisterReturn; // direct way for simple types } @@ -115,7 +107,8 @@ pCppReturn = *(void **)pCppStack; pCppStack += sizeof(void *); - pUnoReturn = (cppu_relatesToInterface( pReturnTypeDescr ) + pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( + pReturnTypeDescr ) ? alloca( pReturnTypeDescr->nSize ) : pCppReturn); // direct way } @@ -141,7 +134,9 @@ typelib_TypeDescription * pParamTypeDescr = 0; TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); - if (!rParam.bOut && cppu_isSimpleType( pParamTypeDescr )) // value + if (!rParam.bOut + && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) + // value { pCppArgs[nPos] = pCppStack; pUnoArgs[nPos] = pCppStack; @@ -168,11 +163,12 @@ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; } // is in/inout - else if (cppu_relatesToInterface( pParamTypeDescr )) + else if (bridges::cpp_uno::shared::relatesToInterfaceType( + pParamTypeDescr )) { uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ), *(void **)pCppStack, pParamTypeDescr, - &pThis->pBridge->aCpp2Uno ); + pThis->getBridge()->getCpp2Uno() ); pTempIndizes[nTempIndizes] = nPos; // has to be reconverted // will be released at reconversion ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; @@ -192,7 +188,8 @@ uno_Any * pUnoExc = &aUnoExc; // invoke uno dispatch call - (*pThis->pUnoI->pDispatcher)( pThis->pUnoI, pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc ); + (*pThis->getUnoI()->pDispatcher)( + pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc ); // in case an exception occured... if (pUnoExc) @@ -209,7 +206,9 @@ if (pReturnTypeDescr) TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); - raiseException( &aUnoExc, &pThis->pBridge->aUno2Cpp ); // has to destruct the any + CPPU_CURRENT_NAMESPACE::raiseException( + &aUnoExc, pThis->getBridge()->getUno2Cpp() ); + // has to destruct the any // is here for dummy return typelib_TypeClass_VOID; } @@ -226,7 +225,7 @@ // convert and assign uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release ); uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr, - &pThis->pBridge->aUno2Cpp ); + pThis->getBridge()->getUno2Cpp() ); } // destroy temp uno param uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); @@ -239,7 +238,7 @@ if (pUnoReturn != pCppReturn) // needs reconversion { uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr, - &pThis->pBridge->aUno2Cpp ); + pThis->getBridge()->getUno2Cpp() ); // destroy temp uno return uno_destructData( pUnoReturn, pReturnTypeDescr, 0 ); } @@ -260,38 +259,41 @@ //================================================================================================== static typelib_TypeClass cpp_mediate( - sal_Int32 nVtableCall, + sal_Int32 nFunctionIndex, + sal_Int32 nVtableOffset, void ** pCallStack, sal_Int64 * pRegisterReturn /* space for register return */ ) { OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" ); // pCallStack: ret adr, [ret *], this, params - // _this_ ptr is patched cppu_XInterfaceProxy object - cppu_cppInterfaceProxy * pCppI = NULL; - if( nVtableCall & 0x80000000 ) + void * pThis; + if( nFunctionIndex & 0x80000000 ) { - nVtableCall &= 0x7fffffff; - pCppI = (cppu_cppInterfaceProxy *)(XInterface *)*(pCallStack +2); + nFunctionIndex &= 0x7fffffff; + pThis = pCallStack[2]; } else { - pCppI = (cppu_cppInterfaceProxy *)(XInterface *)*(pCallStack +1); + pThis = pCallStack[1]; } + pThis = static_cast< char * >(pThis) - nVtableOffset; + bridges::cpp_uno::shared::CppInterfaceProxy * pCppI + = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy( + pThis); - typelib_InterfaceTypeDescription * pTypeDescr = pCppI->pTypeDescr; + typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr(); - OSL_ENSURE( nVtableCall < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); - if (nVtableCall >= pTypeDescr->nMapFunctionIndexToMemberIndex) + OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); + if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex) { throw RuntimeException( - OUString::createFromAscii("illegal vtable index!"), - (XInterface *)pCppI ); + rtl::OUString::createFromAscii("illegal vtable index!"), + (XInterface *)pThis ); } // determine called method - OSL_ENSURE( nVtableCall < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); - sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nVtableCall]; + sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex]; OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" ); TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] ); @@ -301,7 +303,7 @@ { case typelib_TypeClass_INTERFACE_ATTRIBUTE: { - if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nVtableCall) + if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex) { // is GET method eRet = cpp2uno_call( @@ -330,7 +332,7 @@ case typelib_TypeClass_INTERFACE_METHOD: { // is METHOD - switch (nVtableCall) + switch (nFunctionIndex) { case 1: // acquire() pCppI->acquireProxy(); // non virtual call! @@ -347,9 +349,10 @@ if (pTD) { XInterface * pInterface = 0; - (*pCppI->pBridge->pCppEnv->getRegisteredInterface)( - pCppI->pBridge->pCppEnv, - (void **)&pInterface, pCppI->oid.pData, (typelib_InterfaceTypeDescription *)pTD ); + (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)( + pCppI->getBridge()->getCppEnv(), + (void **)&pInterface, pCppI->getOid().pData, + (typelib_InterfaceTypeDescription *)pTD ); if (pInterface) { @@ -378,8 +381,8 @@ default: { throw RuntimeException( - OUString::createFromAscii("no member description found!"), - (XInterface *)pCppI ); + rtl::OUString::createFromAscii("no member description found!"), + (XInterface *)pThis ); // is here for dummy eRet = typelib_TypeClass_VOID; } @@ -393,12 +396,15 @@ * is called on incoming vtable calls * (called by asm snippets) */ -static void cpp_vtable_call( int nTableEntry, void** pCallStack ) __attribute__((regparm(2))); +static void cpp_vtable_call( + int nFunctionIndex, int nVtableOffset, void** pCallStack ) + __attribute__((regparm(3))); -void cpp_vtable_call( int nTableEntry, void** pCallStack ) +void cpp_vtable_call( int nFunctionIndex, int nVtableOffset, void** pCallStack ) { volatile long nRegReturn[2]; - typelib_TypeClass aType = cpp_mediate( nTableEntry, pCallStack, (sal_Int64*)nRegReturn ); + typelib_TypeClass aType = cpp_mediate( + nFunctionIndex, nVtableOffset, pCallStack, (sal_Int64*)nRegReturn ); switch( aType ) { @@ -434,161 +440,103 @@ //================================================================================================== -class MediateClassData -{ - typedef ::std::hash_map< OUString, void *, OUStringHash > t_classdata_map; - t_classdata_map m_map; - Mutex m_mutex; - -public: - void const * get_vtable( typelib_InterfaceTypeDescription * pTD ) SAL_THROW( () ); - - inline MediateClassData() SAL_THROW( () ) - {} - ~MediateClassData() SAL_THROW( () ); -}; -//__________________________________________________________________________________________________ -MediateClassData::~MediateClassData() SAL_THROW( () ) +int const codeSnippetSize = 20; + +unsigned char * codeSnippet( + unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset, + bool simpleRetType) { - OSL_TRACE( "> calling ~MediateClassData(): freeing mediate vtables." ); - - for ( t_classdata_map::const_iterator iPos( m_map.begin() ); iPos != m_map.end(); ++iPos ) - { - ::rtl_freeMemory( iPos->second ); - } + if (!simpleRetType) { + functionIndex |= 0x80000000; + } + unsigned char * p = code; + OSL_ASSERT(sizeof (sal_Int32) == 4); + // mov function_index, %eax: + *p++ = 0xB8; + *reinterpret_cast< sal_Int32 * >(p) = functionIndex; + p += sizeof (sal_Int32); + // mov vtable_offset, %edx: + *p++ = 0xBA; + *reinterpret_cast< sal_Int32 * >(p) = vtableOffset; + p += sizeof (sal_Int32); + // mov %esp, %ecx: + *p++ = 0x89; + *p++ = 0xE1; + // jmp cpp_vtable_call: + *p++ = 0xE9; + *reinterpret_cast< sal_Int32 * >(p) + = ((unsigned char *) cpp_vtable_call) - p - sizeof (sal_Int32); + p += sizeof (sal_Int32); + OSL_ASSERT(p - code <= codeSnippetSize); + return code + codeSnippetSize; } -//-------------------------------------------------------------------------------------------------- -static inline void codeSnippet( char * code, sal_uInt32 vtable_pos, bool simple_ret_type ) SAL_THROW( () ) -{ - if (! simple_ret_type) - vtable_pos |= 0x80000000; - OSL_ASSERT( sizeof (long) == 4 ); - // mov $nPos, %eax - *code++ = 0xb8; - *(long *)code = vtable_pos; - code += sizeof (long); - // mov %esp, %edx - *code++ = 0x89; - *code++ = 0xe2; - // jmp cpp_vtable_call - *code++ = 0xe9; - *(long *)code = ((char *)cpp_vtable_call) - code - sizeof (long); + } -//__________________________________________________________________________________________________ -void const * MediateClassData::get_vtable( typelib_InterfaceTypeDescription * pTD ) SAL_THROW( () ) -{ - void * buffer; - - // avoiding locked counts - OUString const & unoName = *(OUString const *)&((typelib_TypeDescription *)pTD)->pTypeName; - { - MutexGuard aGuard( m_mutex ); - t_classdata_map::const_iterator iFind( m_map.find( unoName ) ); - if (iFind == m_map.end()) - { - // create new vtable - sal_Int32 nSlots = pTD->nMapFunctionIndexToMemberIndex; - buffer = ::rtl_allocateMemory( ((2+ nSlots) * sizeof (void *)) + (nSlots *20) ); - - ::std::pair< t_classdata_map::iterator, bool > insertion( - m_map.insert( t_classdata_map::value_type( unoName, buffer ) ) ); - OSL_ENSURE( insertion.second, "### inserting new vtable buffer failed?!" ); - - void ** slots = (void **)buffer; - *slots++ = 0; - *slots++ = 0; // rtti - char * code = (char *)(slots + nSlots); - - sal_uInt32 vtable_pos = 0; - sal_Int32 nAllMembers = pTD->nAllMembers; - typelib_TypeDescriptionReference ** ppAllMembers = pTD->ppAllMembers; - for ( sal_Int32 nPos = 0; nPos < nAllMembers; ++nPos ) - { - typelib_TypeDescription * pTD = 0; - TYPELIB_DANGER_GET( &pTD, ppAllMembers[ nPos ] ); - OSL_ASSERT( pTD ); - if (typelib_TypeClass_INTERFACE_ATTRIBUTE == pTD->eTypeClass) - { - bool simple_ret = cppu_isSimpleType( - ((typelib_InterfaceAttributeTypeDescription *)pTD)->pAttributeTypeRef->eTypeClass ); - // get method - *slots++ = code; - codeSnippet( code, vtable_pos++, simple_ret ); - code += 20; - if (! ((typelib_InterfaceAttributeTypeDescription *)pTD)->bReadOnly) - { - // set method - *slots++ = code; - codeSnippet( code, vtable_pos++, true ); - code += 20; - } - } - else + +void ** bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(char * block) +{ + return reinterpret_cast< void ** >(block) + 2; +} + +char * bridges::cpp_uno::shared::VtableFactory::createBlock( + sal_Int32 slotCount, void *** slots) +{ + char * block = new char[ + (slotCount + 2) * sizeof (void *) + slotCount * codeSnippetSize]; + *slots = mapBlockToVtable(block); + (*slots)[-2] = 0; + (*slots)[-1] = 0; + return block; +} + +unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( + void ** slots, unsigned char * code, + typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset, + sal_Int32 functionCount, sal_Int32 vtableOffset) +{ + 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++ = code; + code = codeSnippet( + code, functionOffset++, vtableOffset, + bridges::cpp_uno::shared::isSimpleType( + reinterpret_cast< + typelib_InterfaceAttributeTypeDescription * >( + member)->pAttributeTypeRef)); + // Setter: + if (!reinterpret_cast< + typelib_InterfaceAttributeTypeDescription * >( + member)->bReadOnly) { - bool simple_ret = cppu_isSimpleType( - ((typelib_InterfaceMethodTypeDescription *)pTD)->pReturnTypeRef->eTypeClass ); *slots++ = code; - codeSnippet( code, vtable_pos++, simple_ret ); - code += 20; + code = codeSnippet(code, functionOffset++, vtableOffset, true); } - TYPELIB_DANGER_RELEASE( pTD ); + break; + + case typelib_TypeClass_INTERFACE_METHOD: + *slots++ = code; + code = codeSnippet( + code, functionOffset++, vtableOffset, + bridges::cpp_uno::shared::isSimpleType( + reinterpret_cast< + typelib_InterfaceMethodTypeDescription * >( + member)->pReturnTypeRef)); + break; + + default: + OSL_ASSERT(false); + break; } - OSL_ASSERT( vtable_pos == nSlots ); - } - else - { - buffer = iFind->second; - } + TYPELIB_DANGER_RELEASE(member); } - - return ((void **)buffer +2); -} - -//================================================================================================== -void SAL_CALL cppu_cppInterfaceProxy_patchVtable( - XInterface * pCppI, typelib_InterfaceTypeDescription * pTypeDescr ) throw () -{ - static MediateClassData * s_pMediateClassData = 0; - if (! s_pMediateClassData) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! s_pMediateClassData) - { -#ifdef LEAK_STATIC_DATA - s_pMediateClassData = new MediateClassData(); -#else - static MediateClassData s_aMediateClassData; - s_pMediateClassData = &s_aMediateClassData; -#endif - } - } - *(void const **)pCppI = s_pMediateClassData->get_vtable( pTypeDescr ); -} - + return code; } -extern "C" -{ -//################################################################################################## -sal_Bool SAL_CALL component_canUnload( TimeValue * pTime ) - SAL_THROW_EXTERN_C() -{ - return CPPU_CURRENT_NAMESPACE::g_moduleCount.canUnload( - &CPPU_CURRENT_NAMESPACE::g_moduleCount, pTime ); -} -//################################################################################################## -void SAL_CALL uno_initEnvironment( uno_Environment * pCppEnv ) - SAL_THROW_EXTERN_C() -{ - CPPU_CURRENT_NAMESPACE::cppu_cppenv_initEnvironment( - pCppEnv ); -} -//################################################################################################## -void SAL_CALL uno_ext_getMapping( - uno_Mapping ** ppMapping, uno_Environment * pFrom, uno_Environment * pTo ) - SAL_THROW_EXTERN_C() -{ - CPPU_CURRENT_NAMESPACE::cppu_ext_getMapping( - ppMapping, pFrom, pTo ); -} -} +void bridges::cpp_uno::shared::VtableFactory::flushCode( + unsigned char const *, unsigned char const *) +{} Index: bridges/source/cpp_uno/gcc3_freebsd_intel/except.cxx =================================================================== RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_freebsd_intel/except.cxx,v retrieving revision 1.4 diff -u -r1.4 except.cxx --- bridges/source/cpp_uno/gcc3_freebsd_intel/except.cxx 28 Apr 2003 16:41:25 -0000 1.4 +++ bridges/source/cpp_uno/gcc3_freebsd_intel/except.cxx 27 Dec 2004 06:05:52 -0000 @@ -2,9 +2,9 @@ * * $RCSfile: except.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.10 $ * - * last change: $Author: hr $ $Date: 2003/04/28 16:41:25 $ + * last change: $Author: obo $ $Date: 2004/06/04 02:59:59 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -69,7 +69,8 @@ #include #include -#include +#include +#include "com/sun/star/uno/RuntimeException.hpp" #include #include @@ -147,7 +148,7 @@ }; //__________________________________________________________________________________________________ RTTI::RTTI() SAL_THROW( () ) - : m_hApp( dlopen( 0, RTLD_LAZY ) ) + : m_hApp( dlopen( 0, RTLD_NOW | RTLD_GLOBAL ) ) { } //__________________________________________________________________________________________________ @@ -182,7 +183,8 @@ buf.append( 'E' ); OString symName( buf.makeStringAndClear() ); - rtti = (type_info *)dlsym( m_hApp, symName.getStr() ); +//#iZ 22253 + rtti = (type_info *)dlsym( RTLD_DEFAULT, symName.getStr() ); if (rtti) { @@ -253,7 +255,7 @@ //================================================================================================== void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) { -#if defined DEBUG +#if OSL_DEBUG_LEVEL > 1 OString cstr( OUStringToOString( *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ), @@ -275,7 +277,7 @@ *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ), Reference< XInterface >() ); } - + pCppExc = __cxa_allocate_exception( pTypeDescr->nSize ); ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp ); @@ -321,16 +323,16 @@ Reference< XInterface >() ); Type const & rType = ::getCppuType( &aRE ); uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); -#if defined _DEBUG +#if OSL_DEBUG_LEVEL > 0 OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) ); OSL_ENSURE( 0, cstr.getStr() ); #endif return; } - + typelib_TypeDescription * pExcTypeDescr = 0; OUString unoName( toUNOname( header->exceptionType->name() ) ); -#if defined DEBUG +#if OSL_DEBUG_LEVEL > 1 OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) ); fprintf( stderr, "> c++ exception occured: %s\n", cstr_unoName.getStr() ); #endif @@ -342,7 +344,7 @@ Reference< XInterface >() ); Type const & rType = ::getCppuType( &aRE ); uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); -#if defined _DEBUG +#if OSL_DEBUG_LEVEL > 0 OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) ); OSL_ENSURE( 0, cstr.getStr() ); #endif Index: bridges/source/cpp_uno/gcc3_freebsd_intel/makefile.mk =================================================================== RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_freebsd_intel/makefile.mk,v retrieving revision 1.2 diff -u -r1.2 makefile.mk --- bridges/source/cpp_uno/gcc3_freebsd_intel/makefile.mk 18 Mar 2003 19:06:52 -0000 1.2 +++ bridges/source/cpp_uno/gcc3_freebsd_intel/makefile.mk 27 Dec 2004 06:05:52 -0000 @@ -2,9 +2,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.2 $ +# $Revision: 1.3 $ # -# last change: $Author: hr $ $Date: 2003/03/18 19:06:52 $ +# last change: $Author: hr $ $Date: 2004/02/03 12:37:41 $ # # The Contents of this file are made available subject to the terms of # either of the following licenses @@ -95,10 +95,8 @@ SHL1IMPLIB=i$(TARGET) SHL1VERSIONMAP=..$/..$/bridge_exports.map -SHL1OBJS= \ - $(SLO)$/except.obj \ - $(SLO)$/cpp2uno.obj \ - $(SLO)$/uno2cpp.obj +SHL1OBJS = $(SLOFILES) +SHL1LIBS = $(SLB)$/cpp_uno_shared.lib SHL1STDLIBS= \ $(CPPULIB) \ Index: bridges/source/cpp_uno/gcc3_freebsd_intel/share.hxx =================================================================== RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_freebsd_intel/share.hxx,v retrieving revision 1.2 diff -u -r1.2 share.hxx --- bridges/source/cpp_uno/gcc3_freebsd_intel/share.hxx 18 Mar 2003 19:06:53 -0000 1.2 +++ bridges/source/cpp_uno/gcc3_freebsd_intel/share.hxx 27 Dec 2004 06:05:52 -0000 @@ -4,7 +4,7 @@ * * $Revision: 1.2 $ * - * last change: $Author: hr $ $Date: 2003/03/18 19:06:53 $ + * last change: $Author: hr $ $Date: 2004/02/03 12:38:19 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,6 +59,8 @@ * ************************************************************************/ +#include "uno/mapping.h" + #include #include #include @@ -66,6 +68,8 @@ 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 Index: bridges/source/cpp_uno/gcc3_freebsd_intel/uno2cpp.cxx =================================================================== RCS file: /cvs/udk/bridges/source/cpp_uno/gcc3_freebsd_intel/uno2cpp.cxx,v retrieving revision 1.5 diff -u -r1.5 uno2cpp.cxx --- bridges/source/cpp_uno/gcc3_freebsd_intel/uno2cpp.cxx 3 Nov 2004 09:03:15 -0000 1.5 +++ bridges/source/cpp_uno/gcc3_freebsd_intel/uno2cpp.cxx 27 Dec 2004 06:05:52 -0000 @@ -2,9 +2,9 @@ * * $RCSfile: uno2cpp.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.7 $ * - * last change: $Author: pjunck $ $Date: 2004/11/03 09:03:15 $ + * last change: $Author: sb $ $Date: 2004/09/27 09:08:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,24 +59,25 @@ * ************************************************************************/ -#include -#include +#include +#include +#include "com/sun/star/uno/RuntimeException.hpp" #include -#include -#include -#include "share.hxx" +#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" using namespace ::rtl; using namespace ::com::sun::star::uno; -namespace CPPU_CURRENT_NAMESPACE +namespace { -void dummy_can_throw_anything( char const * ); - //================================================================================================== // The call instruction within the asm section of callVirtualMethod may throw // exceptions. So that the compiler handles this correctly, it is important @@ -85,7 +86,7 @@ // callVirtualMethod is not inlined at its call site (so that any exceptions are // caught which are thrown from the instruction calling callVirtualMethod): void callVirtualMethod( - void * pThis, + void * pAdjustedThisPtr, sal_Int32 nVtableIndex, void * pRegisterReturn, typelib_TypeClass eReturnType, @@ -93,7 +94,7 @@ sal_Int32 nStackLongs ) __attribute__((noinline)); void callVirtualMethod( - void * pThis, + void * pAdjustedThisPtr, sal_Int32 nVtableIndex, void * pRegisterReturn, typelib_TypeClass eReturnType, @@ -103,13 +104,13 @@ // parameter list is mixed list of * and values // reference parameters are pointers - OSL_ENSURE( pStackLongs && pThis, "### null ptr!" ); + OSL_ENSURE( pStackLongs && pAdjustedThisPtr, "### null ptr!" ); OSL_ENSURE( (sizeof(void *) == 4) && (sizeof(sal_Int32) == 4), "### unexpected size of int!" ); OSL_ENSURE( nStackLongs && pStackLongs, "### no stack in callVirtualMethod !" ); // never called - if (! pThis) dummy_can_throw_anything("xxx"); // address something - + if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something + volatile long edx = 0, eax = 0; // for register returns void * stackptr; asm volatile ( @@ -139,8 +140,8 @@ // cleanup stack "mov %6, %%esp\n\t" : - : "m"(nStackLongs), "m"(pStackLongs), "m"(pThis), "m"(nVtableIndex), - "m"(eax), "m"(edx), "m"(stackptr) + : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), + "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr) : "eax", "edx" ); switch( eReturnType ) { @@ -172,8 +173,8 @@ //================================================================================================== static void cpp_call( - cppu_unoInterfaceProxy * pThis, - sal_Int32 nVtableCall, + 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 ) @@ -192,21 +193,25 @@ if (pReturnTypeDescr) { - if (cppu_isSimpleType( pReturnTypeDescr )) + if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) { pCppReturn = pUnoReturn; // direct way for simple types } else { // complex return via ptr - pCppReturn = *(void **)pCppStack = (cppu_relatesToInterface( pReturnTypeDescr ) - ? alloca( pReturnTypeDescr->nSize ) - : pUnoReturn); // direct way + pCppReturn = *(void **)pCppStack + = (bridges::cpp_uno::shared::relatesToInterfaceType( + pReturnTypeDescr ) + ? alloca( pReturnTypeDescr->nSize ) + : pUnoReturn); // direct way pCppStack += sizeof(void *); } } // push this - *(void**)pCppStack = pThis->pCppI; + void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + + aVtableSlot.offset; + *(void**)pCppStack = pAdjustedThisPtr; pCppStack += sizeof( void* ); // stack space @@ -226,10 +231,11 @@ typelib_TypeDescription * pParamTypeDescr = 0; TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); - if (!rParam.bOut && cppu_isSimpleType( pParamTypeDescr )) + if (!rParam.bOut + && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) { uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr, - &pThis->pBridge->aUno2Cpp ); + pThis->getBridge()->getUno2Cpp() ); switch (pParamTypeDescr->eTypeClass) { @@ -254,11 +260,13 @@ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; } // is in/inout - else if (cppu_relatesToInterface( pParamTypeDescr )) + else if (bridges::cpp_uno::shared::relatesToInterfaceType( + pParamTypeDescr )) { uno_copyAndConvertData( *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ), - pUnoArgs[nPos], pParamTypeDescr, &pThis->pBridge->aUno2Cpp ); + pUnoArgs[nPos], pParamTypeDescr, + pThis->getBridge()->getUno2Cpp() ); pTempIndizes[nTempIndizes] = nPos; // has to be reconverted // will be released at reconversion @@ -278,7 +286,7 @@ { OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 3), "UNALIGNED STACK !!! (Please DO panic)" ); callVirtualMethod( - pThis->pCppI, nVtableCall, + pAdjustedThisPtr, aVtableSlot.index, pCppReturn, pReturnTypeDescr->eTypeClass, (sal_Int32 *)pCppStackStart, (pCppStack - pCppStackStart) / sizeof(sal_Int32) ); // NO exception occured... @@ -296,13 +304,13 @@ { uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr, - &pThis->pBridge->aCpp2Uno ); + pThis->getBridge()->getCpp2Uno() ); } } else // pure out { uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr, - &pThis->pBridge->aCpp2Uno ); + pThis->getBridge()->getCpp2Uno() ); } // destroy temp cpp param => cpp: every param was constructed uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release ); @@ -313,14 +321,14 @@ if (pCppReturn && pUnoReturn != pCppReturn) { uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr, - &pThis->pBridge->aCpp2Uno ); + pThis->getBridge()->getCpp2Uno() ); uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release ); } } catch (...) { // fill uno exception - fillUnoException( __cxa_get_globals()->caughtExceptions, *ppUnoExc, &pThis->pBridge->aCpp2Uno ); + fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() ); // temporary params for ( ; nTempIndizes--; ) @@ -336,32 +344,32 @@ } } +} //================================================================================================== -void SAL_CALL cppu_unoInterfaceProxy_dispatch( +void bridges::cpp_uno::shared::UnoInterfaceProxy::dispatch( uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr, - void * pReturn, void * pArgs[], uno_Any ** ppException ) throw () + void * pReturn, void * pArgs[], uno_Any ** ppException ) SAL_THROW(()) { // is my surrogate - cppu_unoInterfaceProxy * pThis = (cppu_unoInterfaceProxy *)pUnoI; + bridges::cpp_uno::shared::UnoInterfaceProxy * pThis + = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * >(pUnoI); typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr; switch (pMemberDescr->eTypeClass) { case typelib_TypeClass_INTERFACE_ATTRIBUTE: { - // determine vtable call index - sal_Int32 nMemberPos = ((typelib_InterfaceMemberTypeDescription *)pMemberDescr)->nPosition; - OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### member pos out of range!" ); - - sal_Int32 nVtableCall = pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos]; - OSL_ENSURE( nVtableCall < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); - + VtableSlot aVtableSlot( + getVtableSlot( + reinterpret_cast< + typelib_InterfaceAttributeTypeDescription const * >( + pMemberDescr))); if (pReturn) { // dependent dispatch cpp_call( - pThis, nVtableCall, + pThis, aVtableSlot, ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef, 0, 0, // no params pReturn, pArgs, ppException ); @@ -381,8 +389,9 @@ &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData ); // dependent dispatch + aVtableSlot.index += 1; // get, then set method cpp_call( - pThis, nVtableCall +1, // get, then set method + pThis, aVtableSlot, pReturnTypeRef, 1, &aParam, pReturn, pArgs, ppException ); @@ -394,14 +403,12 @@ } case typelib_TypeClass_INTERFACE_METHOD: { - // determine vtable call index - sal_Int32 nMemberPos = ((typelib_InterfaceMemberTypeDescription *)pMemberDescr)->nPosition; - OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### member pos out of range!" ); - - sal_Int32 nVtableCall = pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos]; - OSL_ENSURE( nVtableCall < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); - - switch (nVtableCall) + VtableSlot aVtableSlot( + getVtableSlot( + reinterpret_cast< + typelib_InterfaceMethodTypeDescription const * >( + pMemberDescr))); + switch (aVtableSlot.index) { // standard calls case 1: // acquire uno interface @@ -419,8 +426,8 @@ if (pTD) { uno_Interface * pInterface = 0; - (*pThis->pBridge->pUnoEnv->getRegisteredInterface)( - pThis->pBridge->pUnoEnv, + (*pThis->pBridge->getUnoEnv()->getRegisteredInterface)( + pThis->pBridge->getUnoEnv(), (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD ); if (pInterface) @@ -439,7 +446,7 @@ default: // dependent dispatch cpp_call( - pThis, nVtableCall, + pThis, aVtableSlot, ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef, ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams, ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams, @@ -459,6 +466,3 @@ } } } - -} -