108 lines
2.6 KiB
C++
108 lines
2.6 KiB
C++
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
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;
|
|
}
|