xref: /aoo4110/main/cppu/source/uno/data.cxx (revision b1cdbd2c)
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_cppu.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <cstddef>
28*b1cdbd2cSJim Jagielski #include <stdio.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "cppu/macros.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "osl/mutex.hxx"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include "constr.hxx"
35*b1cdbd2cSJim Jagielski #include "destr.hxx"
36*b1cdbd2cSJim Jagielski #include "copy.hxx"
37*b1cdbd2cSJim Jagielski #include "assign.hxx"
38*b1cdbd2cSJim Jagielski #include "eq.hxx"
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include "boost/static_assert.hpp"
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski using namespace ::cppu;
44*b1cdbd2cSJim Jagielski using namespace ::rtl;
45*b1cdbd2cSJim Jagielski using namespace ::osl;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski namespace cppu
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski // Sequence<>() (default ctor) relies on this being static:
52*b1cdbd2cSJim Jagielski uno_Sequence g_emptySeq = { 1, 0, { 0 } };
53*b1cdbd2cSJim Jagielski typelib_TypeDescriptionReference * g_pVoidType = 0;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
binuno_queryInterface(void * pUnoI,typelib_TypeDescriptionReference * pDestType)56*b1cdbd2cSJim Jagielski void * binuno_queryInterface( void * pUnoI, typelib_TypeDescriptionReference * pDestType )
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski     // init queryInterface() td
59*b1cdbd2cSJim Jagielski     static typelib_TypeDescription * g_pQITD = 0;
60*b1cdbd2cSJim Jagielski 	if (0 == g_pQITD)
61*b1cdbd2cSJim Jagielski 	{
62*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( Mutex::getGlobalMutex() );
63*b1cdbd2cSJim Jagielski 		if (0 == g_pQITD)
64*b1cdbd2cSJim Jagielski 		{
65*b1cdbd2cSJim Jagielski             typelib_TypeDescriptionReference * type_XInterface =
66*b1cdbd2cSJim Jagielski                 * typelib_static_type_getByTypeClass( typelib_TypeClass_INTERFACE );
67*b1cdbd2cSJim Jagielski 			typelib_InterfaceTypeDescription * pTXInterfaceDescr = 0;
68*b1cdbd2cSJim Jagielski 			TYPELIB_DANGER_GET( (typelib_TypeDescription **) &pTXInterfaceDescr, type_XInterface );
69*b1cdbd2cSJim Jagielski 			OSL_ASSERT( pTXInterfaceDescr->ppAllMembers );
70*b1cdbd2cSJim Jagielski 			typelib_typedescriptionreference_getDescription(
71*b1cdbd2cSJim Jagielski 				&g_pQITD, pTXInterfaceDescr->ppAllMembers[ 0 ] );
72*b1cdbd2cSJim Jagielski 			TYPELIB_DANGER_RELEASE( (typelib_TypeDescription *) pTXInterfaceDescr );
73*b1cdbd2cSJim Jagielski 		}
74*b1cdbd2cSJim Jagielski 	}
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     uno_Any aRet, aExc;
77*b1cdbd2cSJim Jagielski     uno_Any * pExc = &aExc;
78*b1cdbd2cSJim Jagielski     void * aArgs[ 1 ];
79*b1cdbd2cSJim Jagielski     aArgs[ 0 ] = &pDestType;
80*b1cdbd2cSJim Jagielski     (*((uno_Interface *) pUnoI)->pDispatcher)(
81*b1cdbd2cSJim Jagielski         (uno_Interface *) pUnoI, g_pQITD, &aRet, aArgs, &pExc );
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     uno_Interface * ret = 0;
84*b1cdbd2cSJim Jagielski     if (0 == pExc)
85*b1cdbd2cSJim Jagielski     {
86*b1cdbd2cSJim Jagielski         typelib_TypeDescriptionReference * ret_type = aRet.pType;
87*b1cdbd2cSJim Jagielski         switch (ret_type->eTypeClass)
88*b1cdbd2cSJim Jagielski         {
89*b1cdbd2cSJim Jagielski         case typelib_TypeClass_VOID: // common case
90*b1cdbd2cSJim Jagielski             typelib_typedescriptionreference_release( ret_type );
91*b1cdbd2cSJim Jagielski             break;
92*b1cdbd2cSJim Jagielski         case typelib_TypeClass_INTERFACE:
93*b1cdbd2cSJim Jagielski             // tweaky... avoiding acquire/ release pair
94*b1cdbd2cSJim Jagielski             typelib_typedescriptionreference_release( ret_type );
95*b1cdbd2cSJim Jagielski             ret = (uno_Interface *) aRet.pReserved; // serving acquired interface
96*b1cdbd2cSJim Jagielski             break;
97*b1cdbd2cSJim Jagielski         default:
98*b1cdbd2cSJim Jagielski             _destructAny( &aRet, 0 );
99*b1cdbd2cSJim Jagielski             break;
100*b1cdbd2cSJim Jagielski         }
101*b1cdbd2cSJim Jagielski     }
102*b1cdbd2cSJim Jagielski     else
103*b1cdbd2cSJim Jagielski     {
104*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
105*b1cdbd2cSJim Jagielski         OUStringBuffer buf( 128 );
106*b1cdbd2cSJim Jagielski         buf.appendAscii(
107*b1cdbd2cSJim Jagielski             RTL_CONSTASCII_STRINGPARAM("### exception occured querying for interface ") );
108*b1cdbd2cSJim Jagielski         buf.append( * reinterpret_cast< OUString const * >( &pDestType->pTypeName ) );
109*b1cdbd2cSJim Jagielski         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(": [") );
110*b1cdbd2cSJim Jagielski         buf.append( * reinterpret_cast< OUString const * >( &pExc->pType->pTypeName ) );
111*b1cdbd2cSJim Jagielski         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] ") );
112*b1cdbd2cSJim Jagielski         // Message is very first member
113*b1cdbd2cSJim Jagielski         buf.append( * reinterpret_cast< OUString const * >( pExc->pData ) );
114*b1cdbd2cSJim Jagielski         OString cstr(
115*b1cdbd2cSJim Jagielski             OUStringToOString( buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US ) );
116*b1cdbd2cSJim Jagielski         OSL_ENSURE( 0, cstr.getStr() );
117*b1cdbd2cSJim Jagielski #endif
118*b1cdbd2cSJim Jagielski         uno_any_destruct( pExc, 0 );
119*b1cdbd2cSJim Jagielski     }
120*b1cdbd2cSJim Jagielski     return ret;
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski //==================================================================================================
defaultConstructStruct(void * pMem,typelib_CompoundTypeDescription * pCompType)124*b1cdbd2cSJim Jagielski void defaultConstructStruct(
125*b1cdbd2cSJim Jagielski 	void * pMem,
126*b1cdbd2cSJim Jagielski 	typelib_CompoundTypeDescription * pCompType )
127*b1cdbd2cSJim Jagielski 	SAL_THROW( () )
128*b1cdbd2cSJim Jagielski {
129*b1cdbd2cSJim Jagielski 	_defaultConstructStruct( pMem, pCompType );
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski //==================================================================================================
copyConstructStruct(void * pDest,void * pSource,typelib_CompoundTypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)132*b1cdbd2cSJim Jagielski void copyConstructStruct(
133*b1cdbd2cSJim Jagielski 	void * pDest, void * pSource,
134*b1cdbd2cSJim Jagielski 	typelib_CompoundTypeDescription * pTypeDescr,
135*b1cdbd2cSJim Jagielski 	uno_AcquireFunc acquire, uno_Mapping * mapping )
136*b1cdbd2cSJim Jagielski 	SAL_THROW( () )
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski 	_copyConstructStruct( pDest, pSource, pTypeDescr, acquire, mapping );
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski //==================================================================================================
destructStruct(void * pValue,typelib_CompoundTypeDescription * pTypeDescr,uno_ReleaseFunc release)141*b1cdbd2cSJim Jagielski void destructStruct(
142*b1cdbd2cSJim Jagielski 	void * pValue,
143*b1cdbd2cSJim Jagielski 	typelib_CompoundTypeDescription * pTypeDescr,
144*b1cdbd2cSJim Jagielski 	uno_ReleaseFunc release )
145*b1cdbd2cSJim Jagielski 	SAL_THROW( () )
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski 	_destructStruct( pValue, pTypeDescr, release );
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski //==================================================================================================
equalStruct(void * pDest,void * pSource,typelib_CompoundTypeDescription * pTypeDescr,uno_QueryInterfaceFunc queryInterface,uno_ReleaseFunc release)150*b1cdbd2cSJim Jagielski sal_Bool equalStruct(
151*b1cdbd2cSJim Jagielski 	void * pDest, void *pSource,
152*b1cdbd2cSJim Jagielski 	typelib_CompoundTypeDescription * pTypeDescr,
153*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
154*b1cdbd2cSJim Jagielski 	SAL_THROW( () )
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski 	return _equalStruct( pDest, pSource, pTypeDescr, queryInterface, release );
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski //==================================================================================================
assignStruct(void * pDest,void * pSource,typelib_CompoundTypeDescription * pTypeDescr,uno_QueryInterfaceFunc queryInterface,uno_AcquireFunc acquire,uno_ReleaseFunc release)159*b1cdbd2cSJim Jagielski sal_Bool assignStruct(
160*b1cdbd2cSJim Jagielski 	void * pDest, void * pSource,
161*b1cdbd2cSJim Jagielski 	typelib_CompoundTypeDescription * pTypeDescr,
162*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
163*b1cdbd2cSJim Jagielski 	SAL_THROW( () )
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	return _assignStruct( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski //==============================================================================
copyConstructSequence(uno_Sequence * pSource,typelib_TypeDescriptionReference * pElementType,uno_AcquireFunc acquire,uno_Mapping * mapping)169*b1cdbd2cSJim Jagielski uno_Sequence * copyConstructSequence(
170*b1cdbd2cSJim Jagielski 	uno_Sequence * pSource,
171*b1cdbd2cSJim Jagielski 	typelib_TypeDescriptionReference * pElementType,
172*b1cdbd2cSJim Jagielski 	uno_AcquireFunc acquire, uno_Mapping * mapping )
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski 	return icopyConstructSequence( pSource, pElementType, acquire, mapping );
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski //==============================================================================
destructSequence(uno_Sequence * pSequence,typelib_TypeDescriptionReference * pType,typelib_TypeDescription * pTypeDescr,uno_ReleaseFunc release)178*b1cdbd2cSJim Jagielski void destructSequence(
179*b1cdbd2cSJim Jagielski 	uno_Sequence * pSequence,
180*b1cdbd2cSJim Jagielski 	typelib_TypeDescriptionReference * pType,
181*b1cdbd2cSJim Jagielski     typelib_TypeDescription * pTypeDescr,
182*b1cdbd2cSJim Jagielski 	uno_ReleaseFunc release )
183*b1cdbd2cSJim Jagielski {
184*b1cdbd2cSJim Jagielski     idestructSequence( pSequence, pType, pTypeDescr, release );
185*b1cdbd2cSJim Jagielski }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski //==================================================================================================
equalSequence(uno_Sequence * pDest,uno_Sequence * pSource,typelib_TypeDescriptionReference * pElementType,uno_QueryInterfaceFunc queryInterface,uno_ReleaseFunc release)188*b1cdbd2cSJim Jagielski sal_Bool equalSequence(
189*b1cdbd2cSJim Jagielski 	uno_Sequence * pDest, uno_Sequence * pSource,
190*b1cdbd2cSJim Jagielski 	typelib_TypeDescriptionReference * pElementType,
191*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
192*b1cdbd2cSJim Jagielski 	SAL_THROW( () )
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski 	return _equalSequence( pDest, pSource, pElementType, queryInterface, release );
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski extern "C"
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_constructData(void * pMem,typelib_TypeDescriptionReference * pType)200*b1cdbd2cSJim Jagielski void SAL_CALL uno_type_constructData(
201*b1cdbd2cSJim Jagielski 	void * pMem, typelib_TypeDescriptionReference * pType )
202*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski 	_defaultConstructData( pMem, pType, 0 );
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski //##################################################################################################
uno_constructData(void * pMem,typelib_TypeDescription * pTypeDescr)207*b1cdbd2cSJim Jagielski void SAL_CALL uno_constructData(
208*b1cdbd2cSJim Jagielski 	void * pMem, typelib_TypeDescription * pTypeDescr )
209*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski 	_defaultConstructData( pMem, pTypeDescr->pWeakRef, pTypeDescr );
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_destructData(void * pValue,typelib_TypeDescriptionReference * pType,uno_ReleaseFunc release)214*b1cdbd2cSJim Jagielski void SAL_CALL uno_type_destructData(
215*b1cdbd2cSJim Jagielski 	void * pValue, typelib_TypeDescriptionReference * pType,
216*b1cdbd2cSJim Jagielski 	uno_ReleaseFunc release )
217*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
218*b1cdbd2cSJim Jagielski {
219*b1cdbd2cSJim Jagielski 	_destructData( pValue, pType, 0, release );
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski //##################################################################################################
uno_destructData(void * pValue,typelib_TypeDescription * pTypeDescr,uno_ReleaseFunc release)222*b1cdbd2cSJim Jagielski void SAL_CALL uno_destructData(
223*b1cdbd2cSJim Jagielski 	void * pValue,
224*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pTypeDescr,
225*b1cdbd2cSJim Jagielski 	uno_ReleaseFunc release )
226*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski 	_destructData( pValue, pTypeDescr->pWeakRef, pTypeDescr, release );
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_copyData(void * pDest,void * pSource,typelib_TypeDescriptionReference * pType,uno_AcquireFunc acquire)231*b1cdbd2cSJim Jagielski void SAL_CALL uno_type_copyData(
232*b1cdbd2cSJim Jagielski 	void * pDest, void * pSource,
233*b1cdbd2cSJim Jagielski 	typelib_TypeDescriptionReference * pType,
234*b1cdbd2cSJim Jagielski 	uno_AcquireFunc acquire )
235*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski 	_copyConstructData( pDest, pSource, pType, 0, acquire, 0 );
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski //##################################################################################################
uno_copyData(void * pDest,void * pSource,typelib_TypeDescription * pTypeDescr,uno_AcquireFunc acquire)240*b1cdbd2cSJim Jagielski void SAL_CALL uno_copyData(
241*b1cdbd2cSJim Jagielski 	void * pDest, void * pSource,
242*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pTypeDescr,
243*b1cdbd2cSJim Jagielski 	uno_AcquireFunc acquire )
244*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski 	_copyConstructData( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, acquire, 0 );
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_copyAndConvertData(void * pDest,void * pSource,typelib_TypeDescriptionReference * pType,uno_Mapping * mapping)249*b1cdbd2cSJim Jagielski void SAL_CALL uno_type_copyAndConvertData(
250*b1cdbd2cSJim Jagielski 	void * pDest, void * pSource,
251*b1cdbd2cSJim Jagielski 	typelib_TypeDescriptionReference * pType,
252*b1cdbd2cSJim Jagielski 	uno_Mapping * mapping )
253*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski 	_copyConstructData( pDest, pSource, pType, 0, 0, mapping );
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski //##################################################################################################
uno_copyAndConvertData(void * pDest,void * pSource,typelib_TypeDescription * pTypeDescr,uno_Mapping * mapping)258*b1cdbd2cSJim Jagielski void SAL_CALL uno_copyAndConvertData(
259*b1cdbd2cSJim Jagielski 	void * pDest, void * pSource,
260*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pTypeDescr,
261*b1cdbd2cSJim Jagielski 	uno_Mapping * mapping )
262*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski 	_copyConstructData( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, 0, mapping );
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_equalData(void * pVal1,typelib_TypeDescriptionReference * pVal1Type,void * pVal2,typelib_TypeDescriptionReference * pVal2Type,uno_QueryInterfaceFunc queryInterface,uno_ReleaseFunc release)267*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL uno_type_equalData(
268*b1cdbd2cSJim Jagielski 	void * pVal1, typelib_TypeDescriptionReference * pVal1Type,
269*b1cdbd2cSJim Jagielski 	void * pVal2, typelib_TypeDescriptionReference * pVal2Type,
270*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
271*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski 	return _equalData(
274*b1cdbd2cSJim Jagielski         pVal1, pVal1Type, 0,
275*b1cdbd2cSJim Jagielski         pVal2, pVal2Type, 0,
276*b1cdbd2cSJim Jagielski         queryInterface, release );
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski //##################################################################################################
uno_equalData(void * pVal1,typelib_TypeDescription * pVal1TD,void * pVal2,typelib_TypeDescription * pVal2TD,uno_QueryInterfaceFunc queryInterface,uno_ReleaseFunc release)279*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL uno_equalData(
280*b1cdbd2cSJim Jagielski 	void * pVal1, typelib_TypeDescription * pVal1TD,
281*b1cdbd2cSJim Jagielski 	void * pVal2, typelib_TypeDescription * pVal2TD,
282*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
283*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
284*b1cdbd2cSJim Jagielski {
285*b1cdbd2cSJim Jagielski 	return _equalData(
286*b1cdbd2cSJim Jagielski         pVal1, pVal1TD->pWeakRef, pVal1TD,
287*b1cdbd2cSJim Jagielski         pVal2, pVal2TD->pWeakRef, pVal2TD,
288*b1cdbd2cSJim Jagielski         queryInterface, release );
289*b1cdbd2cSJim Jagielski }
290*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_assignData(void * pDest,typelib_TypeDescriptionReference * pDestType,void * pSource,typelib_TypeDescriptionReference * pSourceType,uno_QueryInterfaceFunc queryInterface,uno_AcquireFunc acquire,uno_ReleaseFunc release)291*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL uno_type_assignData(
292*b1cdbd2cSJim Jagielski 	void * pDest, typelib_TypeDescriptionReference * pDestType,
293*b1cdbd2cSJim Jagielski 	void * pSource, typelib_TypeDescriptionReference * pSourceType,
294*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
295*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski 	return _assignData(
298*b1cdbd2cSJim Jagielski         pDest, pDestType, 0,
299*b1cdbd2cSJim Jagielski         pSource, pSourceType, 0,
300*b1cdbd2cSJim Jagielski         queryInterface, acquire, release );
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski //##################################################################################################
uno_assignData(void * pDest,typelib_TypeDescription * pDestTD,void * pSource,typelib_TypeDescription * pSourceTD,uno_QueryInterfaceFunc queryInterface,uno_AcquireFunc acquire,uno_ReleaseFunc release)303*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL uno_assignData(
304*b1cdbd2cSJim Jagielski 	void * pDest, typelib_TypeDescription * pDestTD,
305*b1cdbd2cSJim Jagielski 	void * pSource, typelib_TypeDescription * pSourceTD,
306*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
307*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski 	return _assignData(
310*b1cdbd2cSJim Jagielski         pDest, pDestTD->pWeakRef, pDestTD,
311*b1cdbd2cSJim Jagielski         pSource, pSourceTD->pWeakRef, pSourceTD,
312*b1cdbd2cSJim Jagielski         queryInterface, acquire, release );
313*b1cdbd2cSJim Jagielski }
314*b1cdbd2cSJim Jagielski //##################################################################################################
uno_type_isAssignableFromData(typelib_TypeDescriptionReference * pAssignable,void * pFrom,typelib_TypeDescriptionReference * pFromType,uno_QueryInterfaceFunc queryInterface,uno_ReleaseFunc release)315*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL uno_type_isAssignableFromData(
316*b1cdbd2cSJim Jagielski     typelib_TypeDescriptionReference * pAssignable,
317*b1cdbd2cSJim Jagielski 	void * pFrom, typelib_TypeDescriptionReference * pFromType,
318*b1cdbd2cSJim Jagielski 	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
319*b1cdbd2cSJim Jagielski 	SAL_THROW_EXTERN_C()
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski     if (::typelib_typedescriptionreference_isAssignableFrom( pAssignable, pFromType ))
322*b1cdbd2cSJim Jagielski         return sal_True;
323*b1cdbd2cSJim Jagielski     if (typelib_TypeClass_INTERFACE != pFromType->eTypeClass ||
324*b1cdbd2cSJim Jagielski         typelib_TypeClass_INTERFACE != pAssignable->eTypeClass)
325*b1cdbd2cSJim Jagielski     {
326*b1cdbd2cSJim Jagielski         return sal_False;
327*b1cdbd2cSJim Jagielski     }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     // query
330*b1cdbd2cSJim Jagielski     if (0 == pFrom)
331*b1cdbd2cSJim Jagielski         return sal_False;
332*b1cdbd2cSJim Jagielski     void * pInterface = *(void **)pFrom;
333*b1cdbd2cSJim Jagielski     if (0 == pInterface)
334*b1cdbd2cSJim Jagielski         return sal_False;
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     if (0 == queryInterface)
337*b1cdbd2cSJim Jagielski         queryInterface = binuno_queryInterface;
338*b1cdbd2cSJim Jagielski     void * p = (*queryInterface)( pInterface, pAssignable );
339*b1cdbd2cSJim Jagielski     _release( p, release );
340*b1cdbd2cSJim Jagielski     return (0 != p);
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski }
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski //##################################################################################################
346*b1cdbd2cSJim Jagielski //##################################################################################################
347*b1cdbd2cSJim Jagielski //##################################################################################################
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski #if defined( SAL_W32)
353*b1cdbd2cSJim Jagielski #pragma pack(push, 8)
354*b1cdbd2cSJim Jagielski #elif defined(SAL_OS2)
355*b1cdbd2cSJim Jagielski #pragma pack(push, 4)
356*b1cdbd2cSJim Jagielski #endif
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski #if defined(INTEL) \
359*b1cdbd2cSJim Jagielski     && (defined(__GNUC__) && (defined(LINUX) || defined(FREEBSD) || defined(OS2)) || defined(MACOSX) \
360*b1cdbd2cSJim Jagielski         || defined(__SUNPRO_CC) && defined(SOLARIS))
361*b1cdbd2cSJim Jagielski #define MAX_ALIGNMENT_4
362*b1cdbd2cSJim Jagielski #endif
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski #define OFFSET_OF( s, m ) reinterpret_cast< std::size_t >((char *)&((s *)16)->m -16)
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski #define BINTEST_VERIFY( c ) \
367*b1cdbd2cSJim Jagielski     if (! (c)) { fprintf( stderr, "### binary compatibility test failed: %s [line %d]!!!\n", #c, __LINE__ ); abort(); }
368*b1cdbd2cSJim Jagielski #define BINTEST_VERIFYOFFSET( s, m, n ) \
369*b1cdbd2cSJim Jagielski     if (OFFSET_OF(s, m) != n) { fprintf( stderr, "### OFFSET_OF(" #s ", "  #m ") = %" SAL_PRI_SIZET "u instead of expected %d!!!\n", OFFSET_OF(s, m), static_cast<int>(n) ); abort(); }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski #define BINTEST_VERIFYSIZE( s, n ) \
372*b1cdbd2cSJim Jagielski     if (sizeof(s) != n) { fprintf( stderr, "### sizeof(" #s ") = %d instead of expected %d!!!\n", (int)sizeof(s), n ); abort(); }
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski struct C1
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski     sal_Int16 n1;
377*b1cdbd2cSJim Jagielski };
378*b1cdbd2cSJim Jagielski struct C2 : public C1
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski     sal_Int32 n2 CPPU_GCC3_ALIGN( C1 );
381*b1cdbd2cSJim Jagielski };
382*b1cdbd2cSJim Jagielski struct C3 : public C2
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski     double d3;
385*b1cdbd2cSJim Jagielski     sal_Int32 n3;
386*b1cdbd2cSJim Jagielski };
387*b1cdbd2cSJim Jagielski struct C4 : public C3
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski     sal_Int32 n4 CPPU_GCC3_ALIGN( C3 );
390*b1cdbd2cSJim Jagielski     double d4;
391*b1cdbd2cSJim Jagielski };
392*b1cdbd2cSJim Jagielski struct C5 : public C4
393*b1cdbd2cSJim Jagielski {
394*b1cdbd2cSJim Jagielski     sal_Int64 n5;
395*b1cdbd2cSJim Jagielski     sal_Bool b5;
396*b1cdbd2cSJim Jagielski };
397*b1cdbd2cSJim Jagielski struct C6 : public C1
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski     C5 c6 CPPU_GCC3_ALIGN( C1 );
400*b1cdbd2cSJim Jagielski     sal_Bool b6;
401*b1cdbd2cSJim Jagielski };
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski struct D
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski     sal_Int16 d;
406*b1cdbd2cSJim Jagielski     sal_Int32 e;
407*b1cdbd2cSJim Jagielski };
408*b1cdbd2cSJim Jagielski struct E
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski     sal_Bool a;
411*b1cdbd2cSJim Jagielski     sal_Bool b;
412*b1cdbd2cSJim Jagielski     sal_Bool c;
413*b1cdbd2cSJim Jagielski     sal_Int16 d;
414*b1cdbd2cSJim Jagielski     sal_Int32 e;
415*b1cdbd2cSJim Jagielski };
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski struct M
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski 	sal_Int32	n;
420*b1cdbd2cSJim Jagielski 	sal_Int16	o;
421*b1cdbd2cSJim Jagielski };
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski struct N : public M
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski 	sal_Int16	p CPPU_GCC3_ALIGN( M );
426*b1cdbd2cSJim Jagielski };
427*b1cdbd2cSJim Jagielski struct N2
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski     M m;
430*b1cdbd2cSJim Jagielski 	sal_Int16	p;
431*b1cdbd2cSJim Jagielski };
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski struct O : public M
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski 	double	p;
436*b1cdbd2cSJim Jagielski     sal_Int16 q;
437*b1cdbd2cSJim Jagielski };
438*b1cdbd2cSJim Jagielski struct O2 : public O
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski 	sal_Int16 p2 CPPU_GCC3_ALIGN( O );
441*b1cdbd2cSJim Jagielski };
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski struct P : public N
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski 	double	p2;
446*b1cdbd2cSJim Jagielski };
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski struct empty
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski };
451*b1cdbd2cSJim Jagielski struct second : public empty
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski 	int a;
454*b1cdbd2cSJim Jagielski };
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski struct AlignSize_Impl
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	sal_Int16	nInt16;
459*b1cdbd2cSJim Jagielski 	double		dDouble;
460*b1cdbd2cSJim Jagielski };
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski struct Char1
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski     char c1;
465*b1cdbd2cSJim Jagielski };
466*b1cdbd2cSJim Jagielski struct Char2 : public Char1
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski     char c2 CPPU_GCC3_ALIGN( Char1 );
469*b1cdbd2cSJim Jagielski };
470*b1cdbd2cSJim Jagielski struct Char3 : public Char2
471*b1cdbd2cSJim Jagielski {
472*b1cdbd2cSJim Jagielski     char c3 CPPU_GCC3_ALIGN( Char2 );
473*b1cdbd2cSJim Jagielski };
474*b1cdbd2cSJim Jagielski struct Char4
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski     Char3 chars;
477*b1cdbd2cSJim Jagielski     char c;
478*b1cdbd2cSJim Jagielski };
479*b1cdbd2cSJim Jagielski class Ref
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski     void * p;
482*b1cdbd2cSJim Jagielski };
483*b1cdbd2cSJim Jagielski enum Enum
484*b1cdbd2cSJim Jagielski {
485*b1cdbd2cSJim Jagielski     v = SAL_MAX_ENUM
486*b1cdbd2cSJim Jagielski };
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski class BinaryCompatible_Impl
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski public:
492*b1cdbd2cSJim Jagielski 	BinaryCompatible_Impl();
493*b1cdbd2cSJim Jagielski };
BinaryCompatible_Impl()494*b1cdbd2cSJim Jagielski BinaryCompatible_Impl::BinaryCompatible_Impl()
495*b1cdbd2cSJim Jagielski {
496*b1cdbd2cSJim Jagielski     BOOST_STATIC_ASSERT( ((sal_Bool) true) == sal_True &&
497*b1cdbd2cSJim Jagielski                          (1 != 0) == sal_True );
498*b1cdbd2cSJim Jagielski     BOOST_STATIC_ASSERT( ((sal_Bool) false) == sal_False &&
499*b1cdbd2cSJim Jagielski                          (1 == 0) == sal_False );
500*b1cdbd2cSJim Jagielski #ifdef MAX_ALIGNMENT_4
501*b1cdbd2cSJim Jagielski     // max alignment is 4
502*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( AlignSize_Impl, dDouble, 4 );
503*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( AlignSize_Impl, 12 );
504*b1cdbd2cSJim Jagielski #else
505*b1cdbd2cSJim Jagielski     // max alignment is 8
506*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( AlignSize_Impl, dDouble, 8 );
507*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( AlignSize_Impl, 16 );
508*b1cdbd2cSJim Jagielski #endif
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski     // sequence
511*b1cdbd2cSJim Jagielski     BINTEST_VERIFY( (SAL_SEQUENCE_HEADER_SIZE % 8) == 0 );
512*b1cdbd2cSJim Jagielski     // enum
513*b1cdbd2cSJim Jagielski     BINTEST_VERIFY( sizeof( Enum ) == sizeof( sal_Int32 ) );
514*b1cdbd2cSJim Jagielski     // any
515*b1cdbd2cSJim Jagielski     BINTEST_VERIFY( sizeof(void *) >= sizeof(sal_Int32) );
516*b1cdbd2cSJim Jagielski     BINTEST_VERIFY( sizeof( uno_Any ) == sizeof( void * ) * 3 );
517*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( uno_Any, pType, 0 );
518*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( uno_Any, pData, 1 * sizeof (void *) );
519*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( uno_Any, pReserved, 2 * sizeof (void *) );
520*b1cdbd2cSJim Jagielski     // interface
521*b1cdbd2cSJim Jagielski     BINTEST_VERIFY( sizeof( Ref ) == sizeof( void * ) );
522*b1cdbd2cSJim Jagielski     // string
523*b1cdbd2cSJim Jagielski     BINTEST_VERIFY( sizeof( OUString ) == sizeof( rtl_uString * ) );
524*b1cdbd2cSJim Jagielski     // struct
525*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( M, 8 );
526*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( M, o, 4 );
527*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( N, 12 );
528*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( N, p, 8 );
529*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( N2, 12 );
530*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( N2, p, 8 );
531*b1cdbd2cSJim Jagielski #ifdef MAX_ALIGNMENT_4
532*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( O, 20 );
533*b1cdbd2cSJim Jagielski #else
534*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( O, 24 );
535*b1cdbd2cSJim Jagielski #endif
536*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( D, 8 );
537*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( D, e, 4 );
538*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( E, d, 4 );
539*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( E, e, 8 );
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C1, 2 );
542*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C2, 8 );
543*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C2, n2, 4 );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski #ifdef MAX_ALIGNMENT_4
546*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C3, 20 );
547*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C3, d3, 8 );
548*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C3, n3, 16 );
549*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C4, 32 );
550*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C4, n4, 20 );
551*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C4, d4, 24 );
552*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C5, 44 );
553*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C5, n5, 32 );
554*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C5, b5, 40 );
555*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C6, 52 );
556*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C6, c6, 4 );
557*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C6, b6, 48 );
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( O2, 24 );
560*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( O2, p2, 20 );
561*b1cdbd2cSJim Jagielski #else
562*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C3, 24 );
563*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C3, d3, 8 );
564*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C3, n3, 16 );
565*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C4, 40 );
566*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C4, n4, 24 );
567*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C4, d4, 32 );
568*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C5, 56 );
569*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C5, n5, 40 );
570*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C5, b5, 48 );
571*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( C6, 72 );
572*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C6, c6, 8 );
573*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( C6, b6, 64 );
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( O2, 32 );
576*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( O2, p2, 24 );
577*b1cdbd2cSJim Jagielski #endif
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( Char3, 3 );
580*b1cdbd2cSJim Jagielski     BINTEST_VERIFYOFFSET( Char4, c, 3 );
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski #ifdef MAX_ALIGNMENT_4
583*b1cdbd2cSJim Jagielski     // max alignment is 4
584*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( P, 20 );
585*b1cdbd2cSJim Jagielski #else
586*b1cdbd2cSJim Jagielski     // alignment of P is 8, because of P[] ...
587*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( P, 24 );
588*b1cdbd2cSJim Jagielski     BINTEST_VERIFYSIZE( second, sizeof( int ) );
589*b1cdbd2cSJim Jagielski #endif
590*b1cdbd2cSJim Jagielski }
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski #ifdef SAL_W32
593*b1cdbd2cSJim Jagielski #	pragma pack(pop)
594*b1cdbd2cSJim Jagielski #elif defined(SAL_OS2)
595*b1cdbd2cSJim Jagielski #	pragma pack()
596*b1cdbd2cSJim Jagielski #endif
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski static BinaryCompatible_Impl aTest;
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski #endif
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski }
603