1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_bridges.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <cstddef>
28*b1cdbd2cSJim Jagielski #include <dlfcn.h>
29*b1cdbd2cSJim Jagielski #include <new.h>
30*b1cdbd2cSJim Jagielski #include <typeinfo>
31*b1cdbd2cSJim Jagielski #include <list>
32*b1cdbd2cSJim Jagielski #include <map>
33*b1cdbd2cSJim Jagielski #include <rtl/alloc.h>
34*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx>
37*b1cdbd2cSJim Jagielski #include <typelib/typedescription.hxx>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include "bridges/cpp_uno/shared/arraypointer.hxx"
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include "cc50_solaris_intel.hxx"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <hash.cxx>
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski // need a += operator for OString and sal_Char
47*b1cdbd2cSJim Jagielski namespace rtl
48*b1cdbd2cSJim Jagielski {
operator +=(OString & rString,sal_Char cAdd)49*b1cdbd2cSJim Jagielski 	inline OString& operator+=( OString& rString, sal_Char cAdd )
50*b1cdbd2cSJim Jagielski 	{
51*b1cdbd2cSJim Jagielski 		sal_Char add[2];
52*b1cdbd2cSJim Jagielski 		add[0] = cAdd;
53*b1cdbd2cSJim Jagielski 		add[1] = 0;
54*b1cdbd2cSJim Jagielski 		return rString += add;
55*b1cdbd2cSJim Jagielski 	}
56*b1cdbd2cSJim Jagielski }
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski using namespace std;
59*b1cdbd2cSJim Jagielski using namespace osl;
60*b1cdbd2cSJim Jagielski using namespace rtl;
61*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski namespace CPPU_CURRENT_NAMESPACE
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski 
toUNOname(const OString & rRTTIname)66*b1cdbd2cSJim Jagielski static OString toUNOname( const OString & rRTTIname )
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski 	OString aRet;
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 	const sal_Char* pRTTI = rRTTIname.getStr();
71*b1cdbd2cSJim Jagielski 	const sal_Char* pOrg  = pRTTI;
72*b1cdbd2cSJim Jagielski 	const sal_Char* pLast = pRTTI;
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 	while( 1 )
75*b1cdbd2cSJim Jagielski 	{
76*b1cdbd2cSJim Jagielski 		if( *pRTTI == ':' || ! *pRTTI )
77*b1cdbd2cSJim Jagielski 		{
78*b1cdbd2cSJim Jagielski 			if( !aRet.isEmpty() )
79*b1cdbd2cSJim Jagielski 				aRet += ".";
80*b1cdbd2cSJim Jagielski 			aRet += rRTTIname.copy( pLast - pOrg, pRTTI - pLast );
81*b1cdbd2cSJim Jagielski 			while( *pRTTI == ':' )
82*b1cdbd2cSJim Jagielski 				pRTTI++;
83*b1cdbd2cSJim Jagielski 			pLast = pRTTI;
84*b1cdbd2cSJim Jagielski 			if( ! *pRTTI )
85*b1cdbd2cSJim Jagielski 				break;
86*b1cdbd2cSJim Jagielski 		}
87*b1cdbd2cSJim Jagielski 		else
88*b1cdbd2cSJim Jagielski 			pRTTI++;
89*b1cdbd2cSJim Jagielski 	}
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	return aRet;
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski //==================================================================================================
toRTTIname(const OString & rUNOname)94*b1cdbd2cSJim Jagielski static OString toRTTIname( const OString & rUNOname )
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski 	OStringBuffer aRet( rUNOname.getLength()*2 );
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     sal_Int32 nIndex = 0;
99*b1cdbd2cSJim Jagielski     do
100*b1cdbd2cSJim Jagielski     {
101*b1cdbd2cSJim Jagielski         if( nIndex > 0 )
102*b1cdbd2cSJim Jagielski             aRet.append( "::" );
103*b1cdbd2cSJim Jagielski         aRet.append( rUNOname.getToken( 0, '.', nIndex ) );
104*b1cdbd2cSJim Jagielski     } while( nIndex != -1 );
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	return aRet.makeStringAndClear();
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski //==================================================================================================
109*b1cdbd2cSJim Jagielski 
toRTTImangledname(const OString & rRTTIname)110*b1cdbd2cSJim Jagielski static OString toRTTImangledname( const OString & rRTTIname )
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski 	if( rRTTIname.isEmpty() )
113*b1cdbd2cSJim Jagielski 		return OString();
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 	OStringBuffer aRet( rRTTIname.getLength()*2 );
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski     aRet.append( "__1n" );
118*b1cdbd2cSJim Jagielski     sal_Int32 nIndex = 0;
119*b1cdbd2cSJim Jagielski     do
120*b1cdbd2cSJim Jagielski     {
121*b1cdbd2cSJim Jagielski         OString aToken( rRTTIname.getToken( 0, ':', nIndex ) );
122*b1cdbd2cSJim Jagielski         int nBytes = aToken.getLength();
123*b1cdbd2cSJim Jagielski         if( nBytes )
124*b1cdbd2cSJim Jagielski         {
125*b1cdbd2cSJim Jagielski             if( nBytes  > 25 )
126*b1cdbd2cSJim Jagielski             {
127*b1cdbd2cSJim Jagielski                 aRet.append( (sal_Char)( nBytes/26 + 'a' ) );
128*b1cdbd2cSJim Jagielski                 aRet.append( (sal_Char)( nBytes%26 + 'A' ) );
129*b1cdbd2cSJim Jagielski             }
130*b1cdbd2cSJim Jagielski             else
131*b1cdbd2cSJim Jagielski                 aRet.append( (sal_Char)( nBytes + 'A' ) );
132*b1cdbd2cSJim Jagielski             for (sal_Int32 i = 0; i < aToken.getLength(); ++i) {
133*b1cdbd2cSJim Jagielski                 char c = aToken[i];
134*b1cdbd2cSJim Jagielski                 if (c == 'Q') {
135*b1cdbd2cSJim Jagielski                     aRet.append("QdD");
136*b1cdbd2cSJim Jagielski                 } else {
137*b1cdbd2cSJim Jagielski                     aRet.append(c);
138*b1cdbd2cSJim Jagielski                 }
139*b1cdbd2cSJim Jagielski             }
140*b1cdbd2cSJim Jagielski         }
141*b1cdbd2cSJim Jagielski     } while( nIndex != -1 );
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	aRet.append( '_' );
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	return aRet.makeStringAndClear();
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski //##################################################################################################
149*b1cdbd2cSJim Jagielski //#### RTTI simulation #############################################################################
150*b1cdbd2cSJim Jagielski //##################################################################################################
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski class RTTIHolder
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski 	std::map< OString, void* > aAllRTTI;
155*b1cdbd2cSJim Jagielski public:
156*b1cdbd2cSJim Jagielski 	~RTTIHolder();
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 	void* getRTTI( const OString& rTypename );
getRTTI_UnoName(const OString & rUnoTypename)159*b1cdbd2cSJim Jagielski 	void* getRTTI_UnoName( const OString& rUnoTypename )
160*b1cdbd2cSJim Jagielski 		{ return getRTTI( toRTTIname( rUnoTypename ) ); }
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 	void* insertRTTI( const OString& rTypename );
insertRTTI_UnoName(const OString & rTypename)163*b1cdbd2cSJim Jagielski 	void* insertRTTI_UnoName( const OString& rTypename )
164*b1cdbd2cSJim Jagielski 		{ return insertRTTI( toRTTIname( rTypename ) ); }
165*b1cdbd2cSJim Jagielski 	void* generateRTTI( typelib_CompoundTypeDescription* pCompTypeDescr );
166*b1cdbd2cSJim Jagielski };
167*b1cdbd2cSJim Jagielski 
~RTTIHolder()168*b1cdbd2cSJim Jagielski RTTIHolder::~RTTIHolder()
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski 	for ( std::map< OString, void* >::const_iterator iPos( aAllRTTI.begin() );
171*b1cdbd2cSJim Jagielski 		  iPos != aAllRTTI.end(); ++iPos )
172*b1cdbd2cSJim Jagielski 	{
173*b1cdbd2cSJim Jagielski         delete[] static_cast< char * >(iPos->second);
174*b1cdbd2cSJim Jagielski 	}
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
178*b1cdbd2cSJim Jagielski #include <stdio.h>
179*b1cdbd2cSJim Jagielski #endif
180*b1cdbd2cSJim Jagielski 
getRTTI(const OString & rTypename)181*b1cdbd2cSJim Jagielski void* RTTIHolder::getRTTI( const OString& rTypename )
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	std::map< OString, void* >::iterator element;
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 	element = aAllRTTI.find( rTypename );
186*b1cdbd2cSJim Jagielski 	if( element != aAllRTTI.end() )
187*b1cdbd2cSJim Jagielski 		return (*element).second;
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	// create rtti structure
190*b1cdbd2cSJim Jagielski 	element = aAllRTTI.find( rTypename );
191*b1cdbd2cSJim Jagielski 	if( element != aAllRTTI.end() )
192*b1cdbd2cSJim Jagielski 		return (*element).second;
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 	return NULL;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski static long nMagicId = 1;
198*b1cdbd2cSJim Jagielski 
insertRTTI(const OString & rTypename)199*b1cdbd2cSJim Jagielski void* RTTIHolder::insertRTTI( const OString& rTypename )
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski 	OString aMangledName( toRTTImangledname( rTypename ) );
202*b1cdbd2cSJim Jagielski 	NIST_Hash aHash( aMangledName.getStr(), aMangledName.getLength() );
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	// rSuperTypename MUST exist !!!
206*b1cdbd2cSJim Jagielski     std::size_t const RTTI_SIZE = 19; // 14???
207*b1cdbd2cSJim Jagielski 	void** pRTTI = reinterpret_cast< void ** >(
208*b1cdbd2cSJim Jagielski         new char[RTTI_SIZE * sizeof (void *) + strlen(rTypename.getStr()) + 1]);
209*b1cdbd2cSJim Jagielski 	pRTTI[  0 ] = reinterpret_cast< void * >(RTTI_SIZE * sizeof (void *));
210*b1cdbd2cSJim Jagielski 	pRTTI[  1 ] = NULL;
211*b1cdbd2cSJim Jagielski 	pRTTI[  2 ] = (void*)(7*sizeof(void*));
212*b1cdbd2cSJim Jagielski 	pRTTI[  3 ] = (void*)aHash.getHash()[0];
213*b1cdbd2cSJim Jagielski 	pRTTI[  4 ] = (void*)aHash.getHash()[1];
214*b1cdbd2cSJim Jagielski 	pRTTI[  5 ] = (void*)aHash.getHash()[2];
215*b1cdbd2cSJim Jagielski 	pRTTI[  6 ] = (void*)aHash.getHash()[3];
216*b1cdbd2cSJim Jagielski 	pRTTI[  7 ] = NULL;
217*b1cdbd2cSJim Jagielski 	pRTTI[  8 ] = NULL;
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 	pRTTI[  9 ] = pRTTI[ 3 ];
220*b1cdbd2cSJim Jagielski 	pRTTI[ 10 ] = pRTTI[ 4 ];
221*b1cdbd2cSJim Jagielski 	pRTTI[ 11 ] = pRTTI[ 5 ];
222*b1cdbd2cSJim Jagielski 	pRTTI[ 12 ] = pRTTI[ 6 ];
223*b1cdbd2cSJim Jagielski 	pRTTI[ 13 ] = (void*)0x80000000;
224*b1cdbd2cSJim Jagielski     strcpy(reinterpret_cast< char * >(pRTTI + RTTI_SIZE), rTypename.getStr());
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 	aAllRTTI[ rTypename ] = (void*)pRTTI;
227*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
228*b1cdbd2cSJim Jagielski 	fprintf( stderr,
229*b1cdbd2cSJim Jagielski 			 "generating base RTTI for type %s:\n"
230*b1cdbd2cSJim Jagielski 			 "   mangled: %s\n"
231*b1cdbd2cSJim Jagielski 			 "   hash: %.8x %.8x %.8x %.8x\n",
232*b1cdbd2cSJim Jagielski 			 rTypename.getStr(),
233*b1cdbd2cSJim Jagielski 			 aMangledName.getStr(),
234*b1cdbd2cSJim Jagielski 			 pRTTI[ 3 ], pRTTI[ 4 ], pRTTI[ 5 ], pRTTI[ 6 ]
235*b1cdbd2cSJim Jagielski 			 );
236*b1cdbd2cSJim Jagielski #endif
237*b1cdbd2cSJim Jagielski 	return pRTTI;
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski 
generateRTTI(typelib_CompoundTypeDescription * pCompTypeDescr)240*b1cdbd2cSJim Jagielski void* RTTIHolder::generateRTTI( typelib_CompoundTypeDescription * pCompTypeDescr )
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski 	OString aUNOCompTypeName( OUStringToOString( pCompTypeDescr->aBase.pTypeName, RTL_TEXTENCODING_ASCII_US ) );
243*b1cdbd2cSJim Jagielski 	OString aRTTICompTypeName( toRTTIname( aUNOCompTypeName ) );
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	void* pHaveRTTI = getRTTI( aRTTICompTypeName );
246*b1cdbd2cSJim Jagielski 	if( pHaveRTTI )
247*b1cdbd2cSJim Jagielski 		return pHaveRTTI;
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	if( ! pCompTypeDescr->pBaseTypeDescription )
250*b1cdbd2cSJim Jagielski 		// this is a base type
251*b1cdbd2cSJim Jagielski 		return insertRTTI( aRTTICompTypeName );
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski 	// get base class RTTI
254*b1cdbd2cSJim Jagielski 	void* pSuperRTTI = generateRTTI( pCompTypeDescr->pBaseTypeDescription );
255*b1cdbd2cSJim Jagielski 	OSL_ENSURE( pSuperRTTI, "could not generate RTTI for supertype !" );
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	// find out the size to allocate for RTTI
258*b1cdbd2cSJim Jagielski 	void** pInherit = (void**)((sal_uInt32)pSuperRTTI + ((sal_uInt32*)pSuperRTTI)[2] + 8);
259*b1cdbd2cSJim Jagielski 	int nInherit;
260*b1cdbd2cSJim Jagielski 	for( nInherit = 1; pInherit[ nInherit*5-1 ] != (void*)0x80000000; nInherit++ )
261*b1cdbd2cSJim Jagielski 		;
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 	OString aMangledName( toRTTImangledname( aRTTICompTypeName ) );
264*b1cdbd2cSJim Jagielski 	NIST_Hash aHash( aMangledName.getStr(), aMangledName.getLength() );
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski     std::size_t const rttiSize = 14 + nInherit * 5;
267*b1cdbd2cSJim Jagielski 	void** pRTTI = reinterpret_cast< void ** >(
268*b1cdbd2cSJim Jagielski         new char[
269*b1cdbd2cSJim Jagielski             rttiSize * sizeof (void *)
270*b1cdbd2cSJim Jagielski             + strlen(aRTTICompTypeName.getStr()) + 1]);
271*b1cdbd2cSJim Jagielski 	pRTTI[  0 ] = reinterpret_cast< void * >(rttiSize * sizeof (void *));
272*b1cdbd2cSJim Jagielski 	pRTTI[  1 ] = NULL;
273*b1cdbd2cSJim Jagielski 	pRTTI[  2 ] = (void*)(7*sizeof(void*));
274*b1cdbd2cSJim Jagielski 	pRTTI[  3 ] = (void*)aHash.getHash()[0];
275*b1cdbd2cSJim Jagielski 	pRTTI[  4 ] = (void*)aHash.getHash()[1];
276*b1cdbd2cSJim Jagielski 	pRTTI[  5 ] = (void*)aHash.getHash()[2];
277*b1cdbd2cSJim Jagielski 	pRTTI[  6 ] = (void*)aHash.getHash()[3];
278*b1cdbd2cSJim Jagielski 	pRTTI[  7 ] = NULL;
279*b1cdbd2cSJim Jagielski 	pRTTI[  8 ] = NULL;
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	memcpy( pRTTI+9, pInherit, 4*nInherit*5 );
282*b1cdbd2cSJim Jagielski 	pRTTI[ 8 +nInherit*5 ] = NULL;
283*b1cdbd2cSJim Jagielski 	pRTTI[ 9 +nInherit*5 ] = pRTTI[ 3 ];
284*b1cdbd2cSJim Jagielski 	pRTTI[ 10+nInherit*5 ] = pRTTI[ 4 ];
285*b1cdbd2cSJim Jagielski 	pRTTI[ 11+nInherit*5 ] = pRTTI[ 5 ];
286*b1cdbd2cSJim Jagielski 	pRTTI[ 12+nInherit*5 ] = pRTTI[ 6 ];
287*b1cdbd2cSJim Jagielski 	pRTTI[ 13+nInherit*5 ] = (void*)0x80000000;
288*b1cdbd2cSJim Jagielski     strcpy(
289*b1cdbd2cSJim Jagielski         reinterpret_cast< char * >(pRTTI + rttiSize),
290*b1cdbd2cSJim Jagielski         aRTTICompTypeName.getStr());
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	aAllRTTI[ aRTTICompTypeName ] = (void*)pRTTI;
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
295*b1cdbd2cSJim Jagielski 	fprintf( stderr,
296*b1cdbd2cSJim Jagielski 			 "generating struct RTTI for type %s:\n"
297*b1cdbd2cSJim Jagielski 			 "   mangled: %s\n"
298*b1cdbd2cSJim Jagielski 			 "   hash: %.8x %.8x %.8X %.8x\n",
299*b1cdbd2cSJim Jagielski 			 aRTTICompTypeName.getStr(),
300*b1cdbd2cSJim Jagielski 			 aMangledName.getStr(),
301*b1cdbd2cSJim Jagielski 			 pRTTI[ 3 ], pRTTI[ 4 ], pRTTI[ 5 ], pRTTI[ 6 ]
302*b1cdbd2cSJim Jagielski 			 );
303*b1cdbd2cSJim Jagielski #endif
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 	return pRTTI;
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
309*b1cdbd2cSJim Jagielski 
deleteException(void * pExc,unsigned char * thunk,typelib_TypeDescription * pType)310*b1cdbd2cSJim Jagielski static void deleteException(
311*b1cdbd2cSJim Jagielski     void* pExc, unsigned char* thunk, typelib_TypeDescription* pType )
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski  	uno_destructData(
314*b1cdbd2cSJim Jagielski         pExc, pType, reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
315*b1cdbd2cSJim Jagielski  	typelib_typedescription_release( pType );
316*b1cdbd2cSJim Jagielski     delete[] thunk;
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski //##################################################################################################
322*b1cdbd2cSJim Jagielski //#### exported ####################################################################################
323*b1cdbd2cSJim Jagielski //##################################################################################################
324*b1cdbd2cSJim Jagielski 
cc50_solaris_intel_raiseException(uno_Any * pUnoExc,uno_Mapping * pUno2Cpp)325*b1cdbd2cSJim Jagielski void cc50_solaris_intel_raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
328*b1cdbd2cSJim Jagielski     OString cstr(
329*b1cdbd2cSJim Jagielski         OUStringToOString(
330*b1cdbd2cSJim Jagielski             *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
331*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_ASCII_US ) );
332*b1cdbd2cSJim Jagielski     fprintf( stderr, "> uno exception occured: %s\n", cstr.getStr() );
333*b1cdbd2cSJim Jagielski #endif
334*b1cdbd2cSJim Jagielski     bridges::cpp_uno::shared::ArrayPointer< unsigned char > thunkPtr(
335*b1cdbd2cSJim Jagielski         new unsigned char[24]);
336*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pTypeDescr = 0;
337*b1cdbd2cSJim Jagielski 	// will be released by deleteException
338*b1cdbd2cSJim Jagielski 	typelib_typedescriptionreference_getDescription( &pTypeDescr, pUnoExc->pType );
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	void* pRTTI;
341*b1cdbd2cSJim Jagielski 	{
342*b1cdbd2cSJim Jagielski 	static ::osl::Mutex aMutex;
343*b1cdbd2cSJim Jagielski 	::osl::Guard< ::osl::Mutex > guard( aMutex );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 	static RTTIHolder * s_pRTTI = 0;
346*b1cdbd2cSJim Jagielski 	if (! s_pRTTI)
347*b1cdbd2cSJim Jagielski 	{
348*b1cdbd2cSJim Jagielski #ifdef LEAK_STATIC_DATA
349*b1cdbd2cSJim Jagielski 		s_pRTTI = new RTTIHolder();
350*b1cdbd2cSJim Jagielski #else
351*b1cdbd2cSJim Jagielski 		static RTTIHolder s_aRTTI;
352*b1cdbd2cSJim Jagielski 		s_pRTTI = &s_aRTTI;
353*b1cdbd2cSJim Jagielski #endif
354*b1cdbd2cSJim Jagielski 	}
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	pRTTI = s_pRTTI->generateRTTI( (typelib_CompoundTypeDescription *)pTypeDescr );
357*b1cdbd2cSJim Jagielski 	}
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 	// a must be
360*b1cdbd2cSJim Jagielski 	OSL_ENSURE( sizeof(sal_Int32) == sizeof(void *), "### pointer size differs from sal_Int32!" );
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 	void * pCppExc = __Crun::ex_alloc( pTypeDescr->nSize );
363*b1cdbd2cSJim Jagielski 	uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 	// destruct uno exception
366*b1cdbd2cSJim Jagielski 	uno_any_destruct( pUnoExc, 0 );
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski     unsigned char * thunk = thunkPtr.release();
369*b1cdbd2cSJim Jagielski     // movl %esp, %ecx:
370*b1cdbd2cSJim Jagielski     thunk[0] = 0x8B;
371*b1cdbd2cSJim Jagielski     thunk[1] = 0xCC;
372*b1cdbd2cSJim Jagielski     // pushl pTypeDescr:
373*b1cdbd2cSJim Jagielski     thunk[2] = 0x68;
374*b1cdbd2cSJim Jagielski     *reinterpret_cast< void ** >(thunk + 3) = pTypeDescr;
375*b1cdbd2cSJim Jagielski     // pushl thunk:
376*b1cdbd2cSJim Jagielski     thunk[7] = 0x68;
377*b1cdbd2cSJim Jagielski     *reinterpret_cast< void ** >(thunk + 8) = thunk;
378*b1cdbd2cSJim Jagielski     // pushl 4(%ecx):
379*b1cdbd2cSJim Jagielski     thunk[12] = 0xFF;
380*b1cdbd2cSJim Jagielski     thunk[13] = 0x71;
381*b1cdbd2cSJim Jagielski     thunk[14] = 0x04;
382*b1cdbd2cSJim Jagielski     // call deleteException:
383*b1cdbd2cSJim Jagielski     thunk[15] = 0xE8;
384*b1cdbd2cSJim Jagielski #pragma disable_warn
385*b1cdbd2cSJim Jagielski     void * d = reinterpret_cast< void * >(deleteException);
386*b1cdbd2cSJim Jagielski #pragma enable_warn
387*b1cdbd2cSJim Jagielski     *reinterpret_cast< std::ptrdiff_t * >(thunk + 16) =
388*b1cdbd2cSJim Jagielski         static_cast< unsigned char * >(d) - (thunk + 20);
389*b1cdbd2cSJim Jagielski     // addl $12, %esp:
390*b1cdbd2cSJim Jagielski     thunk[20] = 0x83;
391*b1cdbd2cSJim Jagielski     thunk[21] = 0xC4;
392*b1cdbd2cSJim Jagielski     thunk[22] = 0x0C;
393*b1cdbd2cSJim Jagielski     // ret:
394*b1cdbd2cSJim Jagielski     thunk[23] = 0xC3;
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski #pragma disable_warn
397*b1cdbd2cSJim Jagielski     void (* f)(void *) = reinterpret_cast< void (*)(void *) >(thunk);
398*b1cdbd2cSJim Jagielski #pragma enable_warn
399*b1cdbd2cSJim Jagielski 	__Crun::ex_throw(pCppExc, (const __Crun::static_type_info*)pRTTI, f);
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski 
cc50_solaris_intel_fillUnoException(void * pCppExc,const char * pInfo,uno_Any * pUnoExc,uno_Mapping * pCpp2Uno)402*b1cdbd2cSJim Jagielski void cc50_solaris_intel_fillUnoException(
403*b1cdbd2cSJim Jagielski 	void* pCppExc,
404*b1cdbd2cSJim Jagielski 	const char* pInfo,
405*b1cdbd2cSJim Jagielski 	uno_Any* pUnoExc,
406*b1cdbd2cSJim Jagielski 	uno_Mapping * pCpp2Uno )
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski     OSL_ASSERT( pInfo != 0 );
409*b1cdbd2cSJim Jagielski     OString uno_name( toUNOname( pInfo ) );
410*b1cdbd2cSJim Jagielski     OUString aName( OStringToOUString(
411*b1cdbd2cSJim Jagielski                         uno_name, RTL_TEXTENCODING_ASCII_US ) );
412*b1cdbd2cSJim Jagielski     typelib_TypeDescription * pExcTypeDescr = 0;
413*b1cdbd2cSJim Jagielski     typelib_typedescription_getByName( &pExcTypeDescr, aName.pData );
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski     if (pExcTypeDescr == 0) // the thing that should not be
416*b1cdbd2cSJim Jagielski     {
417*b1cdbd2cSJim Jagielski         RuntimeException aRE(
418*b1cdbd2cSJim Jagielski             OUString( RTL_CONSTASCII_USTRINGPARAM(
419*b1cdbd2cSJim Jagielski                           "exception type not found: ") ) + aName,
420*b1cdbd2cSJim Jagielski             Reference< XInterface >() );
421*b1cdbd2cSJim Jagielski         Type const & rType = ::getCppuType( &aRE );
422*b1cdbd2cSJim Jagielski         uno_type_any_constructAndConvert(
423*b1cdbd2cSJim Jagielski             pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
424*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
425*b1cdbd2cSJim Jagielski         OString cstr( OUStringToOString(
426*b1cdbd2cSJim Jagielski                           aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
427*b1cdbd2cSJim Jagielski         OSL_ENSURE( 0, cstr.getStr() );
428*b1cdbd2cSJim Jagielski #endif
429*b1cdbd2cSJim Jagielski         return;
430*b1cdbd2cSJim Jagielski     }
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
433*b1cdbd2cSJim Jagielski     fprintf( stderr, "> c++ exception occured: %s\n",
434*b1cdbd2cSJim Jagielski              ::rtl::OUStringToOString(
435*b1cdbd2cSJim Jagielski                  pExcTypeDescr->pTypeName,
436*b1cdbd2cSJim Jagielski                  RTL_TEXTENCODING_ASCII_US ).getStr() );
437*b1cdbd2cSJim Jagielski #endif
438*b1cdbd2cSJim Jagielski     // construct uno exception any
439*b1cdbd2cSJim Jagielski     uno_any_constructAndConvert(
440*b1cdbd2cSJim Jagielski         pUnoExc, pCppExc, pExcTypeDescr, pCpp2Uno );
441*b1cdbd2cSJim Jagielski     typelib_typedescription_release( pExcTypeDescr );
442*b1cdbd2cSJim Jagielski }
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski }
445*b1cdbd2cSJim Jagielski 
446