windows-nt/Source/XPSP1/NT/com/rpc/midl/codegen/uniongen.cxx
2020-09-26 16:20:57 +08:00

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;
}