Bug Summary

File:stoc/source/corereflection/crcomp.cxx
Location:line 203, column 9
Description:Access to field 'eTypeClass' results in a dereference of a null pointer (loaded from variable 'pObjTD')

Annotated Source Code

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <rtl/strbuf.hxx>
21
22#include <com/sun/star/reflection/XIdlField.hpp>
23#include <com/sun/star/reflection/XIdlField2.hpp>
24#include "com/sun/star/uno/TypeClass.hpp"
25
26#include "base.hxx"
27
28
29namespace stoc_corefl
30{
31
32//==================================================================================================
33class IdlCompFieldImpl
34 : public IdlMemberImpl
35 , public XIdlField
36 , public XIdlField2
37{
38 sal_Int32 _nOffset;
39
40public:
41 IdlCompFieldImpl( IdlReflectionServiceImpl * pReflection, const OUString & rName,
42 typelib_TypeDescription * pTypeDescr, typelib_TypeDescription * pDeclTypeDescr,
43 sal_Int32 nOffset )
44 : IdlMemberImpl( pReflection, rName, pTypeDescr, pDeclTypeDescr )
45 , _nOffset( nOffset )
46 {}
47
48 // XInterface
49 virtual Any SAL_CALL queryInterface( const Type & rType ) throw (::com::sun::star::uno::RuntimeException);
50 virtual void SAL_CALL acquire() throw ();
51 virtual void SAL_CALL release() throw ();
52
53 // XTypeProvider
54 virtual Sequence< Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException);
55 virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (::com::sun::star::uno::RuntimeException);
56
57 // XIdlMember
58 virtual Reference< XIdlClass > SAL_CALL getDeclaringClass() throw(::com::sun::star::uno::RuntimeException);
59 virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
60 // XIdlField
61 virtual Reference< XIdlClass > SAL_CALL getType() throw(::com::sun::star::uno::RuntimeException);
62 virtual FieldAccessMode SAL_CALL getAccessMode() throw(::com::sun::star::uno::RuntimeException);
63 virtual Any SAL_CALL get( const Any & rObj ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
64 virtual void SAL_CALL set( const Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
65 // XIdlField2: getType, getAccessMode and get are equal to XIdlField
66 virtual void SAL_CALL set( Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
67};
68
69// XInterface
70//__________________________________________________________________________________________________
71Any IdlCompFieldImpl::queryInterface( const Type & rType )
72 throw(::com::sun::star::uno::RuntimeException)
73{
74 Any aRet( ::cppu::queryInterface( rType,
75 static_cast< XIdlField * >( this ),
76 static_cast< XIdlField2 * >( this ) ) );
77 return (aRet.hasValue() ? aRet : IdlMemberImpl::queryInterface( rType ));
78}
79//__________________________________________________________________________________________________
80void IdlCompFieldImpl::acquire() throw()
81{
82 IdlMemberImpl::acquire();
83}
84//__________________________________________________________________________________________________
85void IdlCompFieldImpl::release() throw()
86{
87 IdlMemberImpl::release();
88}
89
90// XTypeProvider
91//__________________________________________________________________________________________________
92Sequence< Type > IdlCompFieldImpl::getTypes()
93 throw (::com::sun::star::uno::RuntimeException)
94{
95 static OTypeCollection * s_pTypes = 0;
96 if (! s_pTypes)
97 {
98 MutexGuard aGuard( getMutexAccess() );
99 if (! s_pTypes)
100 {
101 static OTypeCollection s_aTypes(
102 ::getCppuType( (const Reference< XIdlField2 > *)0 ),
103 ::getCppuType( (const Reference< XIdlField > *)0 ),
104 IdlMemberImpl::getTypes() );
105 s_pTypes = &s_aTypes;
106 }
107 }
108 return s_pTypes->getTypes();
109}
110//__________________________________________________________________________________________________
111Sequence< sal_Int8 > IdlCompFieldImpl::getImplementationId()
112 throw (::com::sun::star::uno::RuntimeException)
113{
114 static OImplementationId * s_pId = 0;
115 if (! s_pId)
116 {
117 MutexGuard aGuard( getMutexAccess() );
118 if (! s_pId)
119 {
120 static OImplementationId s_aId;
121 s_pId = &s_aId;
122 }
123 }
124 return s_pId->getImplementationId();
125}
126
127// XIdlMember
128//__________________________________________________________________________________________________
129Reference< XIdlClass > IdlCompFieldImpl::getDeclaringClass()
130 throw(::com::sun::star::uno::RuntimeException)
131{
132 if (! _xDeclClass.is())
133 {
134 MutexGuard aGuard( getMutexAccess() );
135 if (! _xDeclClass.is())
136 {
137 typelib_CompoundTypeDescription * pTD =
138 (typelib_CompoundTypeDescription *)getDeclTypeDescr();
139 while (pTD)
140 {
141 typelib_TypeDescriptionReference ** ppTypeRefs = pTD->ppTypeRefs;
142 for ( sal_Int32 nPos = pTD->nMembers; nPos--; )
143 {
144 if (td_equals( (typelib_TypeDescription *)getTypeDescr(), ppTypeRefs[nPos] ))
145 {
146 _xDeclClass = getReflection()->forType( (typelib_TypeDescription *)pTD );
147 return _xDeclClass;
148 }
149 }
150 pTD = pTD->pBaseTypeDescription;
151 }
152 }
153 }
154 return _xDeclClass;
155}
156//__________________________________________________________________________________________________
157OUString IdlCompFieldImpl::getName()
158 throw(::com::sun::star::uno::RuntimeException)
159{
160 return IdlMemberImpl::getName();
161}
162
163// XIdlField
164//__________________________________________________________________________________________________
165Reference< XIdlClass > IdlCompFieldImpl::getType()
166 throw(::com::sun::star::uno::RuntimeException)
167{
168 return getReflection()->forType( getTypeDescr() );
169}
170//__________________________________________________________________________________________________
171FieldAccessMode IdlCompFieldImpl::getAccessMode()
172 throw(::com::sun::star::uno::RuntimeException)
173{
174 return FieldAccessMode_READWRITE;
175}
176//__________________________________________________________________________________________________
177Any IdlCompFieldImpl::get( const Any & rObj )
178 throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
179{
180 if (rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_STRUCT ||
181 rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_EXCEPTION)
182 {
183 typelib_TypeDescription * pObjTD = 0;
184 TYPELIB_DANGER_GET( &pObjTD, rObj.getValueTypeRef() ){ typelib_TypeDescriptionReference * pMacroTypeRef = (rObj.getValueTypeRef
()); typelib_TypeDescription ** ppMacroTypeDescr = (&pObjTD
); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr
, pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef
->pType->pWeakRef) { typelib_typedescriptionreference_getDescription
( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release
( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef
->pType; } }
;
185
186 typelib_TypeDescription * pTD = pObjTD;
187 typelib_TypeDescription * pDeclTD = getDeclTypeDescr();
188 while (pTD && !typelib_typedescription_equals( pTD, pDeclTD ))
189 pTD = (typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pTD)->pBaseTypeDescription;
190
191 OSL_ENSURE( pTD, "### illegal object type!" )do { if (true && (!(pTD))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN
), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/crcomp.cxx"
":" "191" ": "), "%s", "### illegal object type!"); } } while
(false)
;
192 if (pTD)
1
Taking false branch
193 {
194 TYPELIB_DANGER_RELEASE( pObjTD ){ if ((((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pObjTD ); }
;
195 Any aRet;
196 uno_any_destruct(
197 &aRet, reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
198 uno_any_construct(
199 &aRet, (char *)rObj.getValue() + _nOffset, getTypeDescr(),
200 reinterpret_cast< uno_AcquireFunc >(cpp_acquire) );
201 return aRet;
202 }
203 TYPELIB_DANGER_RELEASE( pObjTD ){ if ((((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pObjTD ); }
;
2
Within the expansion of the macro 'TYPELIB_DANGER_RELEASE':
a
Access to field 'eTypeClass' results in a dereference of a null pointer (loaded from variable 'pObjTD')
204 }
205 throw IllegalArgumentException(
206 OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!")(&("illegal object given!")[0]), ((sal_Int32)((sizeof ("illegal object given!"
) / sizeof (("illegal object given!")[0]))-1)), (((rtl_TextEncoding
) 11))
),
207 (XWeak *)(OWeakObject *)this, 0 );
208}
209//__________________________________________________________________________________________________
210void IdlCompFieldImpl::set( const Any & rObj, const Any & rValue )
211 throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException)
212{
213 if (rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_STRUCT ||
214 rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_EXCEPTION)
215 {
216 typelib_TypeDescription * pObjTD = 0;
217 TYPELIB_DANGER_GET( &pObjTD, rObj.getValueTypeRef() ){ typelib_TypeDescriptionReference * pMacroTypeRef = (rObj.getValueTypeRef
()); typelib_TypeDescription ** ppMacroTypeDescr = (&pObjTD
); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr
, pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef
->pType->pWeakRef) { typelib_typedescriptionreference_getDescription
( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release
( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef
->pType; } }
;
218
219 typelib_TypeDescription * pTD = pObjTD;
220 typelib_TypeDescription * pDeclTD = getDeclTypeDescr();
221 while (pTD && !typelib_typedescription_equals( pTD, pDeclTD ))
222 pTD = (typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pTD)->pBaseTypeDescription;
223
224 OSL_ENSURE( pTD, "### illegal object type!" )do { if (true && (!(pTD))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN
), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/crcomp.cxx"
":" "224" ": "), "%s", "### illegal object type!"); } } while
(false)
;
225 if (pTD)
226 {
227 TYPELIB_DANGER_RELEASE( pObjTD ){ if ((((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pObjTD ); }
;
228 if (coerce_assign( (char *)rObj.getValue() + _nOffset, getTypeDescr(), rValue, getReflection() ))
229 {
230 return;
231 }
232 else
233 {
234 throw IllegalArgumentException(
235 OUString( RTL_CONSTASCII_USTRINGPARAM("illegal value given!")(&("illegal value given!")[0]), ((sal_Int32)((sizeof ("illegal value given!"
) / sizeof (("illegal value given!")[0]))-1)), (((rtl_TextEncoding
) 11))
),
236 (XWeak *)(OWeakObject *)this, 1 );
237 }
238 }
239 TYPELIB_DANGER_RELEASE( pObjTD ){ if ((((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pObjTD ); }
;
240 }
241 throw IllegalArgumentException(
242 OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!")(&("illegal object given!")[0]), ((sal_Int32)((sizeof ("illegal object given!"
) / sizeof (("illegal object given!")[0]))-1)), (((rtl_TextEncoding
) 11))
),
243 (XWeak *)(OWeakObject *)this, 0 );
244}
245
246//__________________________________________________________________________________________________
247void IdlCompFieldImpl::set( Any & rObj, const Any & rValue )
248 throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException)
249{
250 if (rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_STRUCT ||
251 rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_EXCEPTION)
252 {
253 typelib_TypeDescription * pObjTD = 0;
254 TYPELIB_DANGER_GET( &pObjTD, rObj.getValueTypeRef() ){ typelib_TypeDescriptionReference * pMacroTypeRef = (rObj.getValueTypeRef
()); typelib_TypeDescription ** ppMacroTypeDescr = (&pObjTD
); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr
, pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef
->pType->pWeakRef) { typelib_typedescriptionreference_getDescription
( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release
( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef
->pType; } }
;
255
256 typelib_TypeDescription * pTD = pObjTD;
257 typelib_TypeDescription * pDeclTD = getDeclTypeDescr();
258 while (pTD && !typelib_typedescription_equals( pTD, pDeclTD ))
259 pTD = (typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pTD)->pBaseTypeDescription;
260
261 OSL_ENSURE( pTD, "### illegal object type!" )do { if (true && (!(pTD))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN
), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/crcomp.cxx"
":" "261" ": "), "%s", "### illegal object type!"); } } while
(false)
;
262 if (pTD)
263 {
264 TYPELIB_DANGER_RELEASE( pObjTD ){ if ((((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pObjTD ); }
;
265 if (coerce_assign( (char *)rObj.getValue() + _nOffset, getTypeDescr(), rValue, getReflection() ))
266 {
267 return;
268 }
269 else
270 {
271 throw IllegalArgumentException(
272 OUString( RTL_CONSTASCII_USTRINGPARAM("illegal value given!")(&("illegal value given!")[0]), ((sal_Int32)((sizeof ("illegal value given!"
) / sizeof (("illegal value given!")[0]))-1)), (((rtl_TextEncoding
) 11))
),
273 (XWeak *)(OWeakObject *)this, 1 );
274 }
275 }
276 TYPELIB_DANGER_RELEASE( pObjTD ){ if ((((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pObjTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pObjTD ); }
;
277 }
278 throw IllegalArgumentException(
279 OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!")(&("illegal object given!")[0]), ((sal_Int32)((sizeof ("illegal object given!"
) / sizeof (("illegal object given!")[0]))-1)), (((rtl_TextEncoding
) 11))
),
280 (XWeak *)(OWeakObject *)this, 0 );
281}
282
283//##################################################################################################
284//##################################################################################################
285//##################################################################################################
286
287
288//__________________________________________________________________________________________________
289CompoundIdlClassImpl::~CompoundIdlClassImpl()
290{
291 delete _pFields;
292}
293
294//__________________________________________________________________________________________________
295sal_Bool CompoundIdlClassImpl::isAssignableFrom( const Reference< XIdlClass > & xType )
296 throw(::com::sun::star::uno::RuntimeException)
297{
298 if (xType.is())
299 {
300 TypeClass eTC = xType->getTypeClass();
301 if (eTC == TypeClass_STRUCT || eTC == TypeClass_EXCEPTION)
302 {
303 if (equals( xType ))
304 return sal_True((sal_Bool)1);
305 else
306 {
307 const Sequence< Reference< XIdlClass > > & rSeq = xType->getSuperclasses();
308 if (rSeq.getLength())
309 {
310 OSL_ENSURE( rSeq.getLength() == 1, "### unexpected len of super classes!" )do { if (true && (!(rSeq.getLength() == 1))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/crcomp.cxx"
":" "310" ": "), "%s", "### unexpected len of super classes!"
); } } while (false)
;
311 return isAssignableFrom( rSeq[0] );
312 }
313 }
314 }
315 }
316 return sal_False((sal_Bool)0);
317}
318//__________________________________________________________________________________________________
319Sequence< Reference< XIdlClass > > CompoundIdlClassImpl::getSuperclasses()
320 throw(::com::sun::star::uno::RuntimeException)
321{
322 if (! _xSuperClass.is())
323 {
324 MutexGuard aGuard( getMutexAccess() );
325 if (! _xSuperClass.is())
326 {
327 typelib_CompoundTypeDescription * pCompTypeDescr = getTypeDescr()->pBaseTypeDescription;
328 if (pCompTypeDescr)
329 _xSuperClass = getReflection()->forType( (typelib_TypeDescription *)pCompTypeDescr );
330 }
331 }
332 if (_xSuperClass.is())
333 return Sequence< Reference< XIdlClass > >( &_xSuperClass, 1 );
334 else
335 return Sequence< Reference< XIdlClass > >();
336}
337//__________________________________________________________________________________________________
338Reference< XIdlField > CompoundIdlClassImpl::getField( const OUString & rName )
339 throw(::com::sun::star::uno::RuntimeException)
340{
341 if (! _pFields)
342 getFields(); // init fields
343
344 const OUString2Field::const_iterator iFind( _aName2Field.find( rName ) );
345 if (iFind != _aName2Field.end())
346 return Reference< XIdlField >( (*iFind).second );
347 else
348 return Reference< XIdlField >();
349}
350//__________________________________________________________________________________________________
351Sequence< Reference< XIdlField > > CompoundIdlClassImpl::getFields()
352 throw(::com::sun::star::uno::RuntimeException)
353{
354 MutexGuard aGuard( getMutexAccess() );
355 if (! _pFields)
356 {
357 sal_Int32 nAll = 0;
358 typelib_CompoundTypeDescription * pCompTypeDescr = getTypeDescr();
359 for ( ; pCompTypeDescr; pCompTypeDescr = pCompTypeDescr->pBaseTypeDescription )
360 nAll += pCompTypeDescr->nMembers;
361
362 Sequence< Reference< XIdlField > > * pFields =
363 new Sequence< Reference< XIdlField > >( nAll );
364 Reference< XIdlField > * pSeq = pFields->getArray();
365
366 for ( pCompTypeDescr = getTypeDescr(); pCompTypeDescr;
367 pCompTypeDescr = pCompTypeDescr->pBaseTypeDescription )
368 {
369 typelib_TypeDescriptionReference ** ppTypeRefs = pCompTypeDescr->ppTypeRefs;
370 rtl_uString ** ppNames = pCompTypeDescr->ppMemberNames;
371 sal_Int32 * pMemberOffsets = pCompTypeDescr->pMemberOffsets;
372
373 for ( sal_Int32 nPos = pCompTypeDescr->nMembers; nPos--; )
374 {
375 typelib_TypeDescription * pTD = 0;
376 TYPELIB_DANGER_GET( &pTD, ppTypeRefs[nPos] ){ typelib_TypeDescriptionReference * pMacroTypeRef = (ppTypeRefs
[nPos]); typelib_TypeDescription ** ppMacroTypeDescr = (&
pTD); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr
, pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef
->pType->pWeakRef) { typelib_typedescriptionreference_getDescription
( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release
( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef
->pType; } }
;
377 OSL_ENSURE( pTD, "### cannot get field in struct!" )do { if (true && (!(pTD))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN
), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/crcomp.cxx"
":" "377" ": "), "%s", "### cannot get field in struct!"); }
} while (false)
;
378 if (pTD)
379 {
380 OUString aName( ppNames[nPos] );
381 _aName2Field[aName] = pSeq[--nAll] = new IdlCompFieldImpl(
382 getReflection(), aName, pTD, IdlClassImpl::getTypeDescr(), pMemberOffsets[nPos] );
383 TYPELIB_DANGER_RELEASE( pTD ){ if ((((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD
|| ((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE
)) typelib_typedescription_release( pTD ); }
;
384 }
385 }
386 }
387
388 _pFields = pFields;
389 }
390 return *_pFields;
391}
392
393}
394
395
396/* vim:set shiftwidth=4 softtabstop=4 expandtab: */