xref: /AOO41X/main/bridges/source/cpp_uno/s5abi_macosx_x86-64/except.cxx (revision 67a794bc92a1e8ffd80bf2fdc9bf74ed09144659)
16d1ed1ddSHerbert Dürr /**************************************************************
26d1ed1ddSHerbert Dürr  *
36d1ed1ddSHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
46d1ed1ddSHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
56d1ed1ddSHerbert Dürr  * distributed with this work for additional information
66d1ed1ddSHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
76d1ed1ddSHerbert Dürr  * to you under the Apache License, Version 2.0 (the
86d1ed1ddSHerbert Dürr  * "License"); you may not use this file except in compliance
96d1ed1ddSHerbert Dürr  * with the License.  You may obtain a copy of the License at
106d1ed1ddSHerbert Dürr  *
116d1ed1ddSHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
126d1ed1ddSHerbert Dürr  *
136d1ed1ddSHerbert Dürr  * Unless required by applicable law or agreed to in writing,
146d1ed1ddSHerbert Dürr  * software distributed under the License is distributed on an
156d1ed1ddSHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d1ed1ddSHerbert Dürr  * KIND, either express or implied.  See the License for the
176d1ed1ddSHerbert Dürr  * specific language governing permissions and limitations
186d1ed1ddSHerbert Dürr  * under the License.
196d1ed1ddSHerbert Dürr  *
206d1ed1ddSHerbert Dürr  *************************************************************/
216d1ed1ddSHerbert Dürr 
226d1ed1ddSHerbert Dürr 
236d1ed1ddSHerbert Dürr 
246d1ed1ddSHerbert Dürr // MARKER(update_precomp.py): autogen include statement, do not remove
256d1ed1ddSHerbert Dürr #include "precompiled_bridges.hxx"
266d1ed1ddSHerbert Dürr 
276d1ed1ddSHerbert Dürr #if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6))
286d1ed1ddSHerbert Dürr #include <exception>
296d1ed1ddSHerbert Dürr #endif
306d1ed1ddSHerbert Dürr 
316d1ed1ddSHerbert Dürr #include <stdio.h>
326d1ed1ddSHerbert Dürr #include <string.h>
336d1ed1ddSHerbert Dürr #include <dlfcn.h>
346d1ed1ddSHerbert Dürr #include <cxxabi.h>
356d1ed1ddSHerbert Dürr #include <hash_map>
366d1ed1ddSHerbert Dürr #include <sys/param.h>
376d1ed1ddSHerbert Dürr 
386d1ed1ddSHerbert Dürr #include <rtl/strbuf.hxx>
396d1ed1ddSHerbert Dürr #include <rtl/ustrbuf.hxx>
406d1ed1ddSHerbert Dürr #include <osl/diagnose.h>
416d1ed1ddSHerbert Dürr #include <osl/mutex.hxx>
426d1ed1ddSHerbert Dürr 
436d1ed1ddSHerbert Dürr #include <com/sun/star/uno/genfunc.hxx>
446d1ed1ddSHerbert Dürr #include "com/sun/star/uno/RuntimeException.hpp"
456d1ed1ddSHerbert Dürr #include <typelib/typedescription.hxx>
466d1ed1ddSHerbert Dürr #include <uno/any2.h>
476d1ed1ddSHerbert Dürr 
486d1ed1ddSHerbert Dürr #include "share.hxx"
496d1ed1ddSHerbert Dürr 
506d1ed1ddSHerbert Dürr 
516d1ed1ddSHerbert Dürr using namespace ::std;
526d1ed1ddSHerbert Dürr using namespace ::osl;
536d1ed1ddSHerbert Dürr using namespace ::rtl;
546d1ed1ddSHerbert Dürr using namespace ::com::sun::star::uno;
556d1ed1ddSHerbert Dürr using namespace ::__cxxabiv1;
566d1ed1ddSHerbert Dürr 
576d1ed1ddSHerbert Dürr 
586d1ed1ddSHerbert Dürr namespace CPPU_CURRENT_NAMESPACE
596d1ed1ddSHerbert Dürr {
606d1ed1ddSHerbert Dürr 
dummy_can_throw_anything(char const *)616d1ed1ddSHerbert Dürr void dummy_can_throw_anything( char const * )
626d1ed1ddSHerbert Dürr {
636d1ed1ddSHerbert Dürr }
646d1ed1ddSHerbert Dürr 
656d1ed1ddSHerbert Dürr //==================================================================================================
toUNOname(char const * p)666d1ed1ddSHerbert Dürr static OUString toUNOname( char const * p ) SAL_THROW( () )
676d1ed1ddSHerbert Dürr {
686d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
696d1ed1ddSHerbert Dürr     char const * start = p;
706d1ed1ddSHerbert Dürr #endif
716d1ed1ddSHerbert Dürr 
726d1ed1ddSHerbert Dürr     // example: N3com3sun4star4lang24IllegalArgumentExceptionE
736d1ed1ddSHerbert Dürr 
746d1ed1ddSHerbert Dürr 	OUStringBuffer buf( 64 );
756d1ed1ddSHerbert Dürr     OSL_ASSERT( 'N' == *p );
766d1ed1ddSHerbert Dürr     ++p; // skip N
776d1ed1ddSHerbert Dürr 
786d1ed1ddSHerbert Dürr     while ('E' != *p)
796d1ed1ddSHerbert Dürr     {
806d1ed1ddSHerbert Dürr         // read chars count
816d1ed1ddSHerbert Dürr         long n = (*p++ - '0');
826d1ed1ddSHerbert Dürr         while ('0' <= *p && '9' >= *p)
836d1ed1ddSHerbert Dürr         {
846d1ed1ddSHerbert Dürr             n *= 10;
856d1ed1ddSHerbert Dürr             n += (*p++ - '0');
866d1ed1ddSHerbert Dürr         }
876d1ed1ddSHerbert Dürr         buf.appendAscii( p, n );
886d1ed1ddSHerbert Dürr         p += n;
896d1ed1ddSHerbert Dürr         if ('E' != *p)
906d1ed1ddSHerbert Dürr             buf.append( (sal_Unicode)'.' );
916d1ed1ddSHerbert Dürr     }
926d1ed1ddSHerbert Dürr 
936d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
946d1ed1ddSHerbert Dürr     OUString ret( buf.makeStringAndClear() );
956d1ed1ddSHerbert Dürr     OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
966d1ed1ddSHerbert Dürr     fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
976d1ed1ddSHerbert Dürr     return ret;
986d1ed1ddSHerbert Dürr #else
996d1ed1ddSHerbert Dürr     return buf.makeStringAndClear();
1006d1ed1ddSHerbert Dürr #endif
1016d1ed1ddSHerbert Dürr }
1026d1ed1ddSHerbert Dürr 
1036d1ed1ddSHerbert Dürr //==================================================================================================
1046d1ed1ddSHerbert Dürr class RTTI
1056d1ed1ddSHerbert Dürr {
1066d1ed1ddSHerbert Dürr     typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map;
1076d1ed1ddSHerbert Dürr 
1086d1ed1ddSHerbert Dürr     Mutex m_mutex;
1096d1ed1ddSHerbert Dürr 	t_rtti_map m_rttis;
1106d1ed1ddSHerbert Dürr     t_rtti_map m_generatedRttis;
1116d1ed1ddSHerbert Dürr 
1126d1ed1ddSHerbert Dürr     void * m_hApp;
1136d1ed1ddSHerbert Dürr 
1146d1ed1ddSHerbert Dürr public:
1156d1ed1ddSHerbert Dürr     RTTI() SAL_THROW( () );
1166d1ed1ddSHerbert Dürr     ~RTTI() SAL_THROW( () );
1176d1ed1ddSHerbert Dürr 
1186d1ed1ddSHerbert Dürr     type_info * getRTTI( typelib_CompoundTypeDescription * ) SAL_THROW( () );
1196d1ed1ddSHerbert Dürr };
1206d1ed1ddSHerbert Dürr 
1216d1ed1ddSHerbert Dürr //__________________________________________________________________________________________________
RTTI()1226d1ed1ddSHerbert Dürr RTTI::RTTI() SAL_THROW( () )
1236d1ed1ddSHerbert Dürr     : m_hApp( dlopen( 0, RTLD_LAZY ) )
1246d1ed1ddSHerbert Dürr {
1256d1ed1ddSHerbert Dürr }
1266d1ed1ddSHerbert Dürr 
1276d1ed1ddSHerbert Dürr //__________________________________________________________________________________________________
~RTTI()1286d1ed1ddSHerbert Dürr RTTI::~RTTI() SAL_THROW( () )
1296d1ed1ddSHerbert Dürr {
1306d1ed1ddSHerbert Dürr     dlclose( m_hApp );
1316d1ed1ddSHerbert Dürr }
1326d1ed1ddSHerbert Dürr 
1336d1ed1ddSHerbert Dürr //__________________________________________________________________________________________________
getRTTI(typelib_CompoundTypeDescription * pTypeDescr)1346d1ed1ddSHerbert Dürr type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () )
1356d1ed1ddSHerbert Dürr {
1366d1ed1ddSHerbert Dürr     type_info * rtti;
1376d1ed1ddSHerbert Dürr 
1386d1ed1ddSHerbert Dürr     OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName;
1396d1ed1ddSHerbert Dürr 
1406d1ed1ddSHerbert Dürr     MutexGuard guard( m_mutex );
1416d1ed1ddSHerbert Dürr     t_rtti_map::const_iterator iFind( m_rttis.find( unoName ) );
1426d1ed1ddSHerbert Dürr     if (iFind == m_rttis.end())
1436d1ed1ddSHerbert Dürr     {
144*67a794bcSJim Jagielski         // RTTI symbol
1456d1ed1ddSHerbert Dürr         OStringBuffer buf( 64 );
1466d1ed1ddSHerbert Dürr         buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") );
1476d1ed1ddSHerbert Dürr         sal_Int32 index = 0;
1486d1ed1ddSHerbert Dürr         do
1496d1ed1ddSHerbert Dürr         {
1506d1ed1ddSHerbert Dürr             OUString token( unoName.getToken( 0, '.', index ) );
1516d1ed1ddSHerbert Dürr             buf.append( token.getLength() );
1526d1ed1ddSHerbert Dürr             OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) );
1536d1ed1ddSHerbert Dürr             buf.append( c_token );
1546d1ed1ddSHerbert Dürr         }
1556d1ed1ddSHerbert Dürr         while (index >= 0);
1566d1ed1ddSHerbert Dürr         buf.append( 'E' );
1576d1ed1ddSHerbert Dürr 
1586d1ed1ddSHerbert Dürr         OString symName( buf.makeStringAndClear() );
159*67a794bcSJim Jagielski         rtti = static_cast<std::type_info *>(dlsym( m_hApp, symName.getStr() ));
1606d1ed1ddSHerbert Dürr 
1616d1ed1ddSHerbert Dürr         if (rtti)
1626d1ed1ddSHerbert Dürr         {
1636d1ed1ddSHerbert Dürr             pair< t_rtti_map::iterator, bool > insertion(
1646d1ed1ddSHerbert Dürr                 m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
1656d1ed1ddSHerbert Dürr             OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" );
1666d1ed1ddSHerbert Dürr         }
1676d1ed1ddSHerbert Dürr         else
1686d1ed1ddSHerbert Dürr         {
1696d1ed1ddSHerbert Dürr             // try to lookup the symbol in the generated rtti map
1706d1ed1ddSHerbert Dürr             t_rtti_map::const_iterator iFind2( m_generatedRttis.find( unoName ) );
1716d1ed1ddSHerbert Dürr             if (iFind2 == m_generatedRttis.end())
1726d1ed1ddSHerbert Dürr             {
1736d1ed1ddSHerbert Dürr                 // we must generate it !
1746d1ed1ddSHerbert Dürr                 // symbol and rtti-name is nearly identical,
1756d1ed1ddSHerbert Dürr                 // the symbol is prefixed with _ZTI
1766d1ed1ddSHerbert Dürr                 char const * rttiName = symName.getStr() +4;
177*67a794bcSJim Jagielski #if OSL_DEBUG_LEVEL > 1
1786d1ed1ddSHerbert Dürr                 fprintf( stderr,"generated rtti for %s\n", rttiName );
179fd233926SHerbert Dürr                 const OString aCUnoName = OUStringToOString( unoName, RTL_TEXTENCODING_UTF8);
180eafa8e05SHerbert Dürr                 OSL_TRACE( "TypeInfo for \"%s\" not found and cannot be generated.\n", aCUnoName.getStr());
1816d1ed1ddSHerbert Dürr #endif
182*67a794bcSJim Jagielski #if 0
1836d1ed1ddSHerbert Dürr                 if (pTypeDescr->pBaseTypeDescription)
1846d1ed1ddSHerbert Dürr                 {
1856d1ed1ddSHerbert Dürr                     // ensure availability of base
1866d1ed1ddSHerbert Dürr                     type_info * base_rtti = getRTTI(
1876d1ed1ddSHerbert Dürr                         (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription );
1886d1ed1ddSHerbert Dürr                     rtti = new __si_class_type_info(
1896d1ed1ddSHerbert Dürr                         strdup( rttiName ), (__class_type_info *)base_rtti );
1906d1ed1ddSHerbert Dürr                 }
1916d1ed1ddSHerbert Dürr                 else
1926d1ed1ddSHerbert Dürr                 {
1936d1ed1ddSHerbert Dürr                     // this class has no base class
1946d1ed1ddSHerbert Dürr                     rtti = new __class_type_info( strdup( rttiName ) );
1956d1ed1ddSHerbert Dürr                 }
196fd233926SHerbert Dürr #else
197fd233926SHerbert Dürr 				rtti = NULL;
198fd233926SHerbert Dürr #endif
199fd233926SHerbert Dürr                 bool bOK = m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti )).second;
200fd233926SHerbert Dürr                 OSL_ENSURE( bOK, "### inserting new generated rtti failed?!" );
2016d1ed1ddSHerbert Dürr             }
2026d1ed1ddSHerbert Dürr             else // taking already generated rtti
2036d1ed1ddSHerbert Dürr             {
2046d1ed1ddSHerbert Dürr                 rtti = iFind2->second;
2056d1ed1ddSHerbert Dürr             }
2066d1ed1ddSHerbert Dürr         }
2076d1ed1ddSHerbert Dürr     }
2086d1ed1ddSHerbert Dürr     else
2096d1ed1ddSHerbert Dürr     {
2106d1ed1ddSHerbert Dürr         rtti = iFind->second;
2116d1ed1ddSHerbert Dürr     }
2126d1ed1ddSHerbert Dürr 
2136d1ed1ddSHerbert Dürr     return rtti;
2146d1ed1ddSHerbert Dürr }
2156d1ed1ddSHerbert Dürr 
2166d1ed1ddSHerbert Dürr //--------------------------------------------------------------------------------------------------
deleteException(void * pExc)2176d1ed1ddSHerbert Dürr static void deleteException( void * pExc )
2186d1ed1ddSHerbert Dürr {
219*67a794bcSJim Jagielski     __cxa_exception const * header = static_cast<__cxa_exception const *>(pExc) - 1;
220fd233926SHerbert Dürr     if( !header->exceptionType) // TODO: remove this when getRTTI() always returns non-NULL
221fd233926SHerbert Dürr         return; // NOTE: leak for now
2226d1ed1ddSHerbert Dürr     typelib_TypeDescription * pTD = 0;
2236d1ed1ddSHerbert Dürr     OUString unoName( toUNOname( header->exceptionType->name() ) );
2246d1ed1ddSHerbert Dürr     ::typelib_typedescription_getByName( &pTD, unoName.pData );
2256d1ed1ddSHerbert Dürr     OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" );
2266d1ed1ddSHerbert Dürr     if (pTD)
2276d1ed1ddSHerbert Dürr     {
2286d1ed1ddSHerbert Dürr 		::uno_destructData( pExc, pTD, cpp_release );
2296d1ed1ddSHerbert Dürr 		::typelib_typedescription_release( pTD );
2306d1ed1ddSHerbert Dürr 	}
2316d1ed1ddSHerbert Dürr }
2326d1ed1ddSHerbert Dürr 
2336d1ed1ddSHerbert Dürr //==================================================================================================
raiseException(uno_Any * pUnoExc,uno_Mapping * pUno2Cpp)2346d1ed1ddSHerbert Dürr void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
2356d1ed1ddSHerbert Dürr {
2366d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
2376d1ed1ddSHerbert Dürr     OString cstr(
2386d1ed1ddSHerbert Dürr         OUStringToOString(
2396d1ed1ddSHerbert Dürr             *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
2406d1ed1ddSHerbert Dürr             RTL_TEXTENCODING_ASCII_US ) );
241*67a794bcSJim Jagielski     fprintf( stderr, "> uno exception occurred: %s\n", cstr.getStr() );
2426d1ed1ddSHerbert Dürr #endif
2436d1ed1ddSHerbert Dürr     void * pCppExc;
2446d1ed1ddSHerbert Dürr     type_info * rtti;
2456d1ed1ddSHerbert Dürr 
2466d1ed1ddSHerbert Dürr     {
2476d1ed1ddSHerbert Dürr     // construct cpp exception object
2486d1ed1ddSHerbert Dürr 	typelib_TypeDescription * pTypeDescr = 0;
2496d1ed1ddSHerbert Dürr 	TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
2506d1ed1ddSHerbert Dürr     OSL_ASSERT( pTypeDescr );
2516d1ed1ddSHerbert Dürr     if (! pTypeDescr)
2526d1ed1ddSHerbert Dürr     {
2536d1ed1ddSHerbert Dürr         throw RuntimeException(
2546d1ed1ddSHerbert Dürr             OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get typedescription for type ") ) +
2556d1ed1ddSHerbert Dürr             *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
2566d1ed1ddSHerbert Dürr             Reference< XInterface >() );
2576d1ed1ddSHerbert Dürr     }
2586d1ed1ddSHerbert Dürr 
2596d1ed1ddSHerbert Dürr 	pCppExc = __cxa_allocate_exception( pTypeDescr->nSize );
2606d1ed1ddSHerbert Dürr 	::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
2616d1ed1ddSHerbert Dürr 
2626d1ed1ddSHerbert Dürr 	// destruct uno exception
2636d1ed1ddSHerbert Dürr 	::uno_any_destruct( pUnoExc, 0 );
2646d1ed1ddSHerbert Dürr     // avoiding locked counts
2656d1ed1ddSHerbert Dürr     static RTTI * s_rtti = 0;
2666d1ed1ddSHerbert Dürr     if (! s_rtti)
2676d1ed1ddSHerbert Dürr     {
2686d1ed1ddSHerbert Dürr         MutexGuard guard( Mutex::getGlobalMutex() );
2696d1ed1ddSHerbert Dürr         if (! s_rtti)
2706d1ed1ddSHerbert Dürr         {
2716d1ed1ddSHerbert Dürr #ifdef LEAK_STATIC_DATA
2726d1ed1ddSHerbert Dürr             s_rtti = new RTTI();
2736d1ed1ddSHerbert Dürr #else
2746d1ed1ddSHerbert Dürr             static RTTI rtti_data;
2756d1ed1ddSHerbert Dürr             s_rtti = &rtti_data;
2766d1ed1ddSHerbert Dürr #endif
2776d1ed1ddSHerbert Dürr         }
2786d1ed1ddSHerbert Dürr     }
2796d1ed1ddSHerbert Dürr 	rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr );
2806d1ed1ddSHerbert Dürr     TYPELIB_DANGER_RELEASE( pTypeDescr );
2816d1ed1ddSHerbert Dürr     OSL_ENSURE( rtti, "### no rtti for throwing exception!" );
2826d1ed1ddSHerbert Dürr     if (! rtti)
2836d1ed1ddSHerbert Dürr     {
2846d1ed1ddSHerbert Dürr         throw RuntimeException(
2856d1ed1ddSHerbert Dürr             OUString( RTL_CONSTASCII_USTRINGPARAM("no rtti for type ") ) +
2866d1ed1ddSHerbert Dürr             *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
2876d1ed1ddSHerbert Dürr             Reference< XInterface >() );
2886d1ed1ddSHerbert Dürr     }
2896d1ed1ddSHerbert Dürr     }
2906d1ed1ddSHerbert Dürr 
2916d1ed1ddSHerbert Dürr 	__cxa_throw( pCppExc, rtti, deleteException );
2926d1ed1ddSHerbert Dürr }
2936d1ed1ddSHerbert Dürr 
2946d1ed1ddSHerbert Dürr //==================================================================================================
fillUnoException(__cxa_exception * header,uno_Any * pUnoExc,uno_Mapping * pCpp2Uno)2956d1ed1ddSHerbert Dürr void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
2966d1ed1ddSHerbert Dürr {
2976d1ed1ddSHerbert Dürr     if (! header)
2986d1ed1ddSHerbert Dürr     {
2996d1ed1ddSHerbert Dürr         RuntimeException aRE(
3006d1ed1ddSHerbert Dürr             OUString( RTL_CONSTASCII_USTRINGPARAM("no exception header!") ),
3016d1ed1ddSHerbert Dürr             Reference< XInterface >() );
3026d1ed1ddSHerbert Dürr         Type const & rType = ::getCppuType( &aRE );
3036d1ed1ddSHerbert Dürr         uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
3046d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 0
3056d1ed1ddSHerbert Dürr         OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
3066d1ed1ddSHerbert Dürr         OSL_ENSURE( 0, cstr.getStr() );
3076d1ed1ddSHerbert Dürr #endif
3086d1ed1ddSHerbert Dürr         return;
3096d1ed1ddSHerbert Dürr     }
3106d1ed1ddSHerbert Dürr 
311*67a794bcSJim Jagielski     /*
312*67a794bcSJim Jagielski      * Handle the case where we are built on llvm 10 (or later) but are running
313*67a794bcSJim Jagielski      * on an earlier version (eg, community builds). In this situation the
314*67a794bcSJim Jagielski      * reserved ptr doesn't exist in the struct returned and so the offsets
315*67a794bcSJim Jagielski      * that header uses are wrong. This assumes that reserved isn't used
316*67a794bcSJim Jagielski      * and that referenceCount is always >0 in the cases we handle
317*67a794bcSJim Jagielski      */
318*67a794bcSJim Jagielski     {
319*67a794bcSJim Jagielski         // Does this look like the newer struct __cxa_exception?
320*67a794bcSJim Jagielski         // That is, is the 1st element NULL (*reserved)?
321*67a794bcSJim Jagielski         if (*reinterpret_cast<void **>(header) == NULL) {
322*67a794bcSJim Jagielski             // Yes. So we move up a slot to offset
323*67a794bcSJim Jagielski             header = reinterpret_cast<__cxa_exception *>(reinterpret_cast<void **>(header) + 1);
324*67a794bcSJim Jagielski         }
325*67a794bcSJim Jagielski     }
326*67a794bcSJim Jagielski 
3276d1ed1ddSHerbert Dürr 	typelib_TypeDescription * pExcTypeDescr = 0;
3286d1ed1ddSHerbert Dürr     OUString unoName( toUNOname( header->exceptionType->name() ) );
3296d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
3306d1ed1ddSHerbert Dürr     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
331*67a794bcSJim Jagielski     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
3326d1ed1ddSHerbert Dürr #endif
3336d1ed1ddSHerbert Dürr 	typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
3346d1ed1ddSHerbert Dürr     if (0 == pExcTypeDescr)
3356d1ed1ddSHerbert Dürr     {
3366d1ed1ddSHerbert Dürr         RuntimeException aRE(
3376d1ed1ddSHerbert Dürr             OUString( RTL_CONSTASCII_USTRINGPARAM("exception type not found: ") ) + unoName,
3386d1ed1ddSHerbert Dürr             Reference< XInterface >() );
3396d1ed1ddSHerbert Dürr         Type const & rType = ::getCppuType( &aRE );
3406d1ed1ddSHerbert Dürr         uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
3416d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 0
3426d1ed1ddSHerbert Dürr         OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
3436d1ed1ddSHerbert Dürr         OSL_ENSURE( 0, cstr.getStr() );
3446d1ed1ddSHerbert Dürr #endif
3456d1ed1ddSHerbert Dürr     }
3466d1ed1ddSHerbert Dürr     else
3476d1ed1ddSHerbert Dürr     {
3486d1ed1ddSHerbert Dürr         // construct uno exception any
3496d1ed1ddSHerbert Dürr         uno_any_constructAndConvert( pUnoExc, header->adjustedPtr, pExcTypeDescr, pCpp2Uno );
3506d1ed1ddSHerbert Dürr         typelib_typedescription_release( pExcTypeDescr );
3516d1ed1ddSHerbert Dürr     }
3526d1ed1ddSHerbert Dürr }
3536d1ed1ddSHerbert Dürr 
3546d1ed1ddSHerbert Dürr }
3556d1ed1ddSHerbert Dürr 
356