Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

279 lines
5.8 KiB

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989 Microsoft Corporation
Module Name:
btgen.cxx
Abstract:
code generation method implementations for the base type class.
Notes:
History:
Sep-22-1993 VibhasC Created.
----------------------------------------------------------------------------*/
/****************************************************************************
* include files
***************************************************************************/
#include "becls.hxx"
#pragma hdrstop
/****************************************************************************
* local definitions
***************************************************************************/
/****************************************************************************
* local data
***************************************************************************/
/****************************************************************************
* externs
***************************************************************************/
/****************************************************************************/
extern CMD_ARG * pCommand;
CG_STATUS
CG_BASETYPE::GenMarshall(
CCB * pCCB )
{
expr_node * pSource = pCCB->GetSourceExpression();
expr_node * pDest = pCCB->GetDestExpression();
STM_ACTION Action;
if( GetType()->GetSize( 0 ) == 0 )
return CG_OK;
// Prepare the marshalling expression.
if( pCCB->IsRefAllocDone() )
{
pSource = MakeDereferentExpressionIfNecessary(
pCCB->GetSourceExpression() );
}
pCCB->Advance( GetWireAlignment(),
&Action,
(RPC_BUF_SIZE_PROPERTY *)0,
(RPC_BUFFER_SIZE *)0
);
Out_AlignmentOrAddAction( pCCB, pDest, Action );
Out_MarshallBaseType( pCCB,
GetType(),
pDest,
pSource
);
return CG_OK;
}
CG_STATUS
CG_BASETYPE::GenUnMarshall(
CCB * pCCB )
{
STM_ACTION Action;
ISTREAM * pStream = pCCB->GetStream();
unsigned long Size = GetType()->GetSize(0);
if( Size == 0 )
return CG_OK;
pCCB->Advance( GetWireAlignment(),
&Action,
(RPC_BUF_SIZE_PROPERTY *)0,
(RPC_BUFFER_SIZE * )0
);
Out_AlignmentOrAddAction( pCCB, pCCB->GetSourceExpression(), Action);
if( pCCB->IsRefAllocDone() )
{
expr_node * pDest = pCCB->GetDestExpression();
pDest = MakeAddressOfPointer( pDest );
Out_IfAllocCopy( pCCB,
pDest,
pCCB->GetSourceExpression(),
new expr_constant( (long) Size ) );
}
else
{
Out_UnMarshallBaseType( pCCB,
GetType(),
pCCB->GetDestExpression(),
pCCB->GetSourceExpression()
);
}
return CG_OK;
}
CG_STATUS
CG_BASETYPE::S_GenInitOutLocals(
CCB * pCCB )
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Routine Description:
Generate the init call for the locals.
Arguments:
pCCB - The ptr to code gen block.
Return Value:
Notes:
----------------------------------------------------------------------------*/
{
expr_node * pExpr;
if( !pCCB->IsRefAllocDone() )
{
pExpr = new expr_sizeof( GetType() );
Out_Alloc( pCCB, pCCB->GetSourceExpression(), 0, pExpr );
}
else
{
pExpr = MakeAddressExpressionNoMatterWhat( GetResource() );
Out_Assign( pCCB, pCCB->GetSourceExpression(), pExpr );
}
return CG_OK;
}
FORMAT_CHARACTER
CG_BASETYPE::GetFormatChar( CCB * pCCB )
{
switch ( GetType()->GetBasicType()->NodeKind() )
{
case NODE_BYTE :
return FC_BYTE;
case NODE_CHAR :
return FC_CHAR;
case NODE_SMALL :
case NODE_BOOLEAN :
return FC_SMALL;
case NODE_WCHAR_T :
return FC_WCHAR;
case NODE_SHORT :
return FC_SHORT;
case NODE_LONG :
case NODE_INT :
return FC_LONG;
case NODE_FLOAT :
return FC_FLOAT;
case NODE_HYPER :
case NODE_INT64 :
case NODE_LONGLONG :
return FC_HYPER;
case NODE_DOUBLE :
return FC_DOUBLE;
default:
assert(pCommand->IsHookOleEnabled());
return FC_BLKHOLE;
}
return FC_ZERO;
}
FORMAT_CHARACTER
CG_BASETYPE::GetSignedFormatChar()
{
BOOL IsUnsigned;
IsUnsigned = ((node_base_type *)GetType())->IsUnsigned();
switch ( GetFormatChar() )
{
case FC_BYTE :
// return FC_USMALL;
case FC_SMALL :
case FC_CHAR :
return (IsUnsigned ? FC_USMALL : FC_SMALL);
case FC_WCHAR :
// return FC_USHORT;
case FC_SHORT :
return (IsUnsigned ? FC_USHORT : FC_SHORT);
case FC_LONG :
return (IsUnsigned ? FC_ULONG : FC_LONG);
default :
assert(0);
}
return FC_ZERO;
}
char *
CG_BASETYPE::GetTypeName()
{
return GetType()->GetSymName();
}
void
CG_BASETYPE::IncrementStackOffset( long * pOffset )
{
unsigned short Env;
Env = pCommand->GetEnv();
switch ( GetFormatChar() )
{
case FC_HYPER :
case FC_DOUBLE :
if ( Env == ENV_DOS || Env == ENV_WIN16 )
*pOffset = (*pOffset + 1) & ~ 0x1;
else
*pOffset = (*pOffset + 3) & ~ 0x3;
*pOffset += 8;
break;
case FC_LONG :
case FC_FLOAT :
if ( Env == ENV_DOS || Env == ENV_WIN16 )
*pOffset = (*pOffset + 1) & ~ 0x1;
else
*pOffset = (*pOffset + 3) & ~ 0x3;
*pOffset += 4;
break;
default :
if ( Env == ENV_DOS || Env == ENV_WIN16 )
*pOffset += 2;
else
*pOffset += 4;
break;
}
}
FORMAT_CHARACTER
CG_ENUM::GetFormatChar( CCB * pCCB )
{
return ( IsEnumLong() ? FC_ENUM32 : FC_ENUM16 );
}
FORMAT_CHARACTER
CG_ENUM::GetSignedFormatChar()
{
if ( pCommand->GetEnv() == ENV_MAC ||
pCommand->GetEnv() == ENV_MPPC )
{
return ( IsEnumLong() ? FC_LONG : FC_ENUM16 );
}
else
return ( IsEnumLong() ? FC_LONG : FC_SHORT );
}
FORMAT_CHARACTER
CG_ERROR_STATUS_T::GetFormatChar( CCB * pCCB )
{
return FC_ERROR_STATUS_T;
}