diff options
Diffstat (limited to 'bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx')
-rw-r--r-- | bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx | 451 |
1 files changed, 0 insertions, 451 deletions
diff --git a/bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx b/bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx deleted file mode 100644 index e8a177243..000000000 --- a/bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx +++ /dev/null @@ -1,451 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_bridges.hxx" - -#include <cstddef> -#include <dlfcn.h> -#include <new.h> -#include <typeinfo> -#include <list> -#include <map> -#include <rtl/alloc.h> -#include <osl/diagnose.h> -#include <typelib/typedescription.hxx> -#include <com/sun/star/uno/Any.hxx> -#include "com/sun/star/uno/RuntimeException.hpp" - -#include "cc50_solaris_sparc.hxx" -#include "flushcode.hxx" -#include <rtl/strbuf.hxx> - -#include "bridges/cpp_uno/shared/arraypointer.hxx" - -#include <hash.cxx> - -// need a += operator for OString and sal_Char -using ::rtl::OUString; -using ::rtl::OString; -using ::rtl::OStringBuffer; -using ::rtl::OUStringToOString; -using ::rtl::OStringToOUString; - -{ - inline OString& operator+=( OString& rString, sal_Char cAdd ) - { - sal_Char add[2]; - add[0] = cAdd; - add[1] = 0; - return rString += add; - } -} - -using namespace std; -using namespace osl; -using namespace com::sun::star::uno; - -namespace CPPU_CURRENT_NAMESPACE -{ - -//================================================================================================== -static OString toUNOname( const OString & rRTTIname ) -{ - OString aRet; - - const sal_Char* pRTTI = rRTTIname.getStr(); - const sal_Char* pOrg = pRTTI; - const sal_Char* pLast = pRTTI; - - while( 1 ) - { - if( *pRTTI == ':' || ! *pRTTI ) - { - if( aRet.getLength() ) - aRet += "."; - aRet += rRTTIname.copy( pLast - pOrg, pRTTI - pLast ); - while( *pRTTI == ':' ) - pRTTI++; - pLast = pRTTI; - if( ! *pRTTI ) - break; - } - else - pRTTI++; - } - - return aRet; -} -//================================================================================================== -static OString toRTTIname( const OString & rUNOname ) -{ - OStringBuffer aRet( rUNOname.getLength()*2 ); - - sal_Int32 nIndex = 0; - do - { - if( nIndex > 0 ) - aRet.append( "::" ); - aRet.append( rUNOname.getToken( 0, '.', nIndex ) ); - } while( nIndex != -1 ); - - return aRet.makeStringAndClear(); -} -//================================================================================================== - -static OString toRTTImangledname( const OString & rRTTIname ) -{ - if( ! rRTTIname.getLength() ) - return OString(); - - OStringBuffer aRet( rRTTIname.getLength()*2 ); - - aRet.append( "__1n" ); - sal_Int32 nIndex = 0; - do - { - OString aToken( rRTTIname.getToken( 0, ':', nIndex ) ); - int nBytes = aToken.getLength(); - if( nBytes ) - { - if( nBytes > 25 ) - { - aRet.append( (sal_Char)( nBytes/26 + 'a' ) ); - aRet.append( (sal_Char)( nBytes%26 + 'A' ) ); - } - else - aRet.append( (sal_Char)( nBytes + 'A' ) ); - for (sal_Int32 i = 0; i < aToken.getLength(); ++i) { - char c = aToken[i]; - if (c == 'Q') { - aRet.append("QdD"); - } else { - aRet.append(c); - } - } - } - } while( nIndex != -1 ); - - aRet.append( '_' ); - - return aRet.makeStringAndClear(); -} - - -//################################################################################################## -//#### RTTI simulation ############################################################################# -//################################################################################################## - -class RTTIHolder -{ - std::map< OString, void* > aAllRTTI; -public: - ~RTTIHolder(); - - void* getRTTI( const OString& rTypename ); - void* getRTTI_UnoName( const OString& rUnoTypename ) - { return getRTTI( toRTTIname( rUnoTypename ) ); } - - void* insertRTTI( const OString& rTypename ); - void* insertRTTI_UnoName( const OString& rTypename ) - { return insertRTTI( toRTTIname( rTypename ) ); } - void* generateRTTI( typelib_CompoundTypeDescription* pCompTypeDescr ); -}; - -RTTIHolder::~RTTIHolder() -{ - for ( std::map< OString, void* >::const_iterator iPos( aAllRTTI.begin() ); - iPos != aAllRTTI.end(); ++iPos ) - { - delete[] static_cast< char * >(iPos->second); - } -} - -#if OSL_DEBUG_LEVEL > 1 -#include <stdio.h> -#endif - -void* RTTIHolder::getRTTI( const OString& rTypename ) -{ - std::map< OString, void* >::iterator element; - - element = aAllRTTI.find( rTypename ); - if( element != aAllRTTI.end() ) - return (*element).second; - - // create rtti structure - element = aAllRTTI.find( rTypename ); - if( element != aAllRTTI.end() ) - return (*element).second; - - return NULL; -} - -void* RTTIHolder::insertRTTI( const OString& rTypename ) -{ - OString aMangledName( toRTTImangledname( rTypename ) ); - NIST_Hash aHash( aMangledName.getStr(), aMangledName.getLength() ); - - std::size_t const RTTI_SIZE = 19; // 14??? - void** pRTTI = reinterpret_cast< void ** >( - new char[RTTI_SIZE * sizeof (void *) + strlen(rTypename.getStr()) + 1]); - pRTTI[ 0 ] = reinterpret_cast< void * >(RTTI_SIZE * sizeof (void *)); - pRTTI[ 1 ] = NULL; - pRTTI[ 2 ] = (void*)(7*sizeof(void*)); - pRTTI[ 3 ] = (void*)aHash.getHash()[0]; - pRTTI[ 4 ] = (void*)aHash.getHash()[1]; - pRTTI[ 5 ] = (void*)aHash.getHash()[2]; - pRTTI[ 6 ] = (void*)aHash.getHash()[3]; - pRTTI[ 7 ] = NULL; - pRTTI[ 8 ] = NULL; - - pRTTI[ 9 ] = pRTTI[ 3 ]; - pRTTI[ 10 ] = pRTTI[ 4 ]; - pRTTI[ 11 ] = pRTTI[ 5 ]; - pRTTI[ 12 ] = pRTTI[ 6 ]; - pRTTI[ 13 ] = (void*)0x80000000; - strcpy(reinterpret_cast< char * >(pRTTI + RTTI_SIZE), rTypename.getStr()); - - aAllRTTI[ rTypename ] = (void*)pRTTI; -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, - "generating base RTTI for type %s:\n" - " mangled: %s\n" - " hash: %.8x %.8x %.8x %.8x\n", - rTypename.getStr(), - aMangledName.getStr(), - pRTTI[ 3 ], pRTTI[ 4 ], pRTTI[ 5 ], pRTTI[ 6 ] - ); -#endif - return pRTTI; -} - -//-------------------------------------------------------------------------------------------------- - -void* RTTIHolder::generateRTTI( typelib_CompoundTypeDescription * pCompTypeDescr ) -{ - OString aUNOCompTypeName( OUStringToOString( pCompTypeDescr->aBase.pTypeName, RTL_TEXTENCODING_ASCII_US ) ); - OString aRTTICompTypeName( toRTTIname( aUNOCompTypeName ) ); - - void* pHaveRTTI = getRTTI( aRTTICompTypeName ); - if( pHaveRTTI ) - return pHaveRTTI; - - if( ! pCompTypeDescr->pBaseTypeDescription ) - // this is a base type - return insertRTTI( aRTTICompTypeName ); - - // get base class RTTI - void* pSuperRTTI = generateRTTI( pCompTypeDescr->pBaseTypeDescription ); - OSL_ENSURE( pSuperRTTI, "could not generate RTTI for supertype !" ); - - // find out the size to allocate for RTTI - void** pInherit = (void**)((sal_uInt32)pSuperRTTI + ((sal_uInt32*)pSuperRTTI)[2] + 8); - int nInherit; - for( nInherit = 1; pInherit[ nInherit*5-1 ] != (void*)0x80000000; nInherit++ ) - ; - - OString aMangledName( toRTTImangledname( aRTTICompTypeName ) ); - NIST_Hash aHash( aMangledName.getStr(), aMangledName.getLength() ); - - std::size_t const rttiSize = 14 + nInherit * 5; - void** pRTTI = reinterpret_cast< void ** >( - new char[ - rttiSize * sizeof (void *) - + strlen(aRTTICompTypeName.getStr()) + 1]); - pRTTI[ 0 ] = reinterpret_cast< void * >(rttiSize * sizeof (void *)); - pRTTI[ 1 ] = NULL; - pRTTI[ 2 ] = (void*)(7*sizeof(void*)); - pRTTI[ 3 ] = (void*)aHash.getHash()[0]; - pRTTI[ 4 ] = (void*)aHash.getHash()[1]; - pRTTI[ 5 ] = (void*)aHash.getHash()[2]; - pRTTI[ 6 ] = (void*)aHash.getHash()[3]; - pRTTI[ 7 ] = NULL; - pRTTI[ 8 ] = NULL; - - memcpy( pRTTI+9, pInherit, 4*nInherit*5 ); - pRTTI[ 8 +nInherit*5 ] = NULL; - pRTTI[ 9 +nInherit*5 ] = pRTTI[ 3 ]; - pRTTI[ 10+nInherit*5 ] = pRTTI[ 4 ]; - pRTTI[ 11+nInherit*5 ] = pRTTI[ 5 ]; - pRTTI[ 12+nInherit*5 ] = pRTTI[ 6 ]; - pRTTI[ 13+nInherit*5 ] = (void*)0x80000000; - strcpy( - reinterpret_cast< char * >(pRTTI + rttiSize), - aRTTICompTypeName.getStr()); - - aAllRTTI[ aRTTICompTypeName ] = (void*)pRTTI; - -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, - "generating struct RTTI for type %s:\n" - " mangled: %s\n" - " hash: %.8x %.8x %.8X %.8x\n", - aRTTICompTypeName.getStr(), - aMangledName.getStr(), - pRTTI[ 3 ], pRTTI[ 4 ], pRTTI[ 5 ], pRTTI[ 6 ] - ); -#endif - - return pRTTI; -} - -//-------------------------------------------------------------------------------------------------- - -static void deleteException( - void* pExc, unsigned int* thunk, typelib_TypeDescription* pType ) -{ - uno_destructData( - pExc, pType, reinterpret_cast< uno_ReleaseFunc >(cpp_release) ); - typelib_typedescription_release( pType ); - delete[] thunk; -} - -//__________________________________________________________________________________________________ - -//################################################################################################## -//#### exported #################################################################################### -//################################################################################################## - -void cc50_solaris_sparc_raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) -{ -#if OSL_DEBUG_LEVEL > 1 - OString cstr( - OUStringToOString( - *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ), - RTL_TEXTENCODING_ASCII_US ) ); - fprintf( stderr, "> uno exception occurred: %s\n", cstr.getStr() ); -#endif - bridges::cpp_uno::shared::ArrayPointer< unsigned int > thunkPtr( - new unsigned int[6]); - - typelib_TypeDescription * pTypeDescr = 0; - // will be released by deleteException - typelib_typedescriptionreference_getDescription( &pTypeDescr, pUnoExc->pType ); - - void* pRTTI; - { - static ::osl::Mutex aMutex; - ::osl::Guard< ::osl::Mutex > guard( aMutex ); - - static RTTIHolder * s_pRTTI = 0; - if (! s_pRTTI) - { -#ifdef LEAK_STATIC_DATA - s_pRTTI = new RTTIHolder(); -#else - static RTTIHolder s_aRTTI; - s_pRTTI = &s_aRTTI; -#endif - } - - pRTTI = s_pRTTI->generateRTTI( (typelib_CompoundTypeDescription *)pTypeDescr ); - } - - // a must be - OSL_ENSURE( sizeof(sal_Int32) == sizeof(void *), "### pointer size differs from sal_Int32!" ); - - void * pCppExc = __Crun::ex_alloc( pTypeDescr->nSize ); - uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp ); - - // destruct uno exception - uno_any_destruct( pUnoExc, 0 ); - - unsigned int * thunk = thunkPtr.release(); - // sethi %hi(thunk), %o1: - thunk[0] = 0x13000000 | (reinterpret_cast< unsigned int >(thunk) >> 10); - // or %o1, %lo(thunk), %o1: - thunk[1] = 0x92126000 | (reinterpret_cast< unsigned int >(thunk) & 0x3FF); - // sethi %hi(pTypeDescr), %o2: - thunk[2] = 0x15000000 - | (reinterpret_cast< unsigned int >(pTypeDescr) >> 10); - // sethi %hi(deleteException), %o3 - thunk[3] = 0x17000000 - | (reinterpret_cast< unsigned int >(deleteException) >> 10); - // jmpl %o3, %lo(deleteException), %g0 - thunk[4] = 0x81C2E000 - | (reinterpret_cast< unsigned int >(deleteException) & 0x3FF); - // or %o2, %lo(pTypeDescr), %o2: - thunk[5] = 0x9412A000 - | (reinterpret_cast< unsigned int >(pTypeDescr) & 0x3FF); - bridges::cpp_uno::cc50_solaris_sparc::flushCode(thunk, thunk + 6); - -#pragma disable_warn - void (* f)(void *) = reinterpret_cast< void (*)(void *) >(thunk); -#pragma enable_warn - __Crun::ex_throw(pCppExc, (const __Crun::static_type_info*)pRTTI, f); -} - -void cc50_solaris_sparc_fillUnoException( - void* pCppExc, - const char* pInfo, - uno_Any* pUnoExc, - uno_Mapping * pCpp2Uno ) -{ - OSL_ASSERT( pInfo != 0 ); - OString uno_name( toUNOname( pInfo ) ); - OUString aName( OStringToOUString( - uno_name, RTL_TEXTENCODING_ASCII_US ) ); - typelib_TypeDescription * pExcTypeDescr = 0; - typelib_typedescription_getByName( &pExcTypeDescr, aName.pData ); - - if (pExcTypeDescr == 0) // the thing that should not be - { - RuntimeException aRE( - OUString( RTL_CONSTASCII_USTRINGPARAM( - "exception type not found: ") ) + aName, - Reference< XInterface >() ); - Type const & rType = ::getCppuType( &aRE ); - uno_type_any_constructAndConvert( - pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); -#if OSL_DEBUG_LEVEL > 0 - OString cstr( OUStringToOString( - aRE.Message, RTL_TEXTENCODING_ASCII_US ) ); - OSL_FAIL( cstr.getStr() ); -#endif - return; - } - -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "> c++ exception occurred: %s\n", - ::rtl::OUStringToOString( - pExcTypeDescr->pTypeName, - RTL_TEXTENCODING_ASCII_US ).getStr() ); -#endif - // construct uno exception any - uno_any_constructAndConvert( - pUnoExc, pCppExc, pExcTypeDescr, pCpp2Uno ); - typelib_typedescription_release( pExcTypeDescr ); -} - -} - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |