Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name: uniongen.cxx
Abstract:
union base in-line stuff.
Notes:
History:
Jan-06-1994 VibhasC Created ----------------------------------------------------------------------------*/
/****************************************************************************
* include files ***************************************************************************/
#include "becls.hxx"
#pragma hdrstop
/****************************************************************************
* local definitions ***************************************************************************/ /****************************************************************************
* local data ***************************************************************************/
/****************************************************************************
* externs ***************************************************************************/ /****************************************************************************/
CG_STATUS CG_UNION::S_GenInitOutLocals( CCB * pCCB ) { char Buffer[ 256 ]; RESOURCE * pResource; PNAME p; CG_NDR * pLPC = pCCB->GetLastPlaceholderClass();
sprintf( Buffer, "%s", pLPC->GetType()->GetSymName() );
p = pCCB->GenTRNameOffLastParam( Buffer );
pResource = pCCB->GetLocalResource( p );
// There is a pointer for the top level structure.
Out_Assign( pCCB, pCCB->GetSourceExpression(), MakeAddressExpressionNoMatterWhat( pResource ) );
if( HasPointer() ) { expr_node * pSrc = pCCB->GetSourceExpression();
// BUGBUG: Embedded structure are not inited yet!!
// It is enough to emit code to set just the first pointer field to
// 0. Guess why ?. Base type fields need not be set to 0.
expr_proc_call * pProc = new expr_proc_call( MIDL_MEMSET_RTN_NAME ); pProc->SetParam( new expr_param( pSrc ) ); pProc->SetParam( new expr_param( new expr_constant( 0L ) ) ); pProc->SetParam( new expr_param( new expr_sizeof( GetType()))); pCCB->GetStream()->NewLine(); pProc->PrintCall( pCCB->GetStream(), 0, 0 ); }
return CG_OK; }
short CG_UNION::GetPointerMembers( ITERATOR& I ) { CG_ITERATOR M; CG_CASE * pCase; short Count = 0;
if( HasPointer() ) { GetMembers( M );
while( ITERATOR_GETNEXT( M, pCase ) ) { CG_FIELD * pField = (CG_FIELD *)pCase->GetChild();
if((pCase->FLastCase()||(pCase->GetCGID() == ID_CG_DEFAULT_CASE))&& pField && (pField->GetChild()) && pField->GetChild()->IsPointer() ) { ITERATOR_INSERT( I, pField ); Count++; } } } return Count; }
|