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

523 lines
14 KiB
C++

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name:
btcls.hxx
Abstract:
Contains definitions for base type related code generation class
definitions.
Notes:
History:
VibhasC Jul-29-1993 Created.
----------------------------------------------------------------------------*/
#ifndef __BTCLS_HXX__
#define __BTCLS_HXX__
#include "nulldefs.h"
extern "C"
{
#include <stdio.h>
}
#include "ndrcls.hxx"
#include "ndr64tkn.h"
class RESOURCE;
void
GenRangeFormatString(
FORMAT_STRING* pFormatString,
node_range_attr* pRangeAttr,
unsigned char uFlags,
FORMAT_CHARACTER format
);
/////////////////////////////////////////////////////////////////////////////
// the base type code generation class.
/////////////////////////////////////////////////////////////////////////////
//
// This class corresponds to a base type. All base types are clubbed together
// into this class, since they share a whole lot of properties.
//
class CG_BASETYPE : public CG_NDR
{
private:
public:
//
// The constructor.
//
CG_BASETYPE(
node_skl * pBT,
XLAT_SIZE_INFO & Info) // packing and size info
: CG_NDR( pBT, Info )
{
SetSStubAllocLocation(
S_STUB_ALLOC_LOCATION_UNKNOWN );
SetSStubAllocType( S_STUB_ALLOC_TYPE_NONE );
SetSStubInitNeed( S_STUB_INIT_NOT_NEEDED );
}
virtual
void Visit( CG_VISITOR *pVisitor )
{
pVisitor->Visit( this );
}
//
// VARDESC generation routine
//
virtual
CG_STATUS GetTypeDesc(TYPEDESC * &ptd, CCB * pCCB);
//
// Get and set methods.
//
virtual
ID_CG GetCGID()
{
return ID_CG_BT;
}
//
// Marshall a base type.
//
virtual
CG_STATUS GenMarshall( CCB * pCCB );
virtual
CG_STATUS GenUnMarshall( CCB * pCCB );
//
// Format string routines for base types.
//
virtual
void GenNdrFormat( CCB * pCCB );
//
// This method is called to generate offline portions of a types
// format string.
//
virtual
void GenNdrParamOffline( CCB* pCCB )
{
if ( GetRangeAttribute() )
{
GenNdrFormat( pCCB );
}
}
virtual
void GenNdrParamDescription( CCB * pCCB );
virtual
void GetNdrParamAttributes(
CCB * pCCB,
PARAM_ATTRIBUTES *attributes );
virtual
void GenNdrParamDescriptionOld( CCB * pCCB )
{
pCCB->GetProcFormatString()->
PushFormatChar( GetFormatChar() );
}
//
// CG_ENUM redefines the GetFormatChar* methods.
//
virtual
FORMAT_CHARACTER GetFormatChar( CCB * pCCB = 0 );
virtual
FORMAT_CHARACTER GetSignedFormatChar();
virtual
NDR64_FORMAT_CHARACTER GetNDR64FormatChar( CCB * pCCB = 0 );
virtual
NDR64_FORMAT_CHARACTER GetNDR64SignedFormatChar();
char * GetTypeName();
long FixedBufferSize( CCB * pCCB );
BOOL InterpreterMustFree( CCB * )
{
return GetFormatChar() != FC_ENUM16;
}
//
// This routine adjusts the stack size for the basetype, based upon the
// current machine and environment. Needed for computing the stack
// offsets in the NDR format string conformance descripions for top level
// attributed arrays/pointers.
//
void IncrementStackOffset( long * pOffset );
// end format string routines
virtual
BOOL IsSimpleType()
{
return TRUE;
}
BOOL HasAFixedBufferSize()
{
return TRUE;
}
virtual
bool IsHomogeneous(FORMAT_CHARACTER format)
{
return GetFormatChar() == format;
}
virtual
CG_STATUS S_GenInitOutLocals( CCB * pCCB );
/////////////////////////////////////////////////////////////////////
virtual
CG_STATUS MarshallAnalysis( ANALYSIS_INFO * pAna );
virtual
CG_STATUS UnMarshallAnalysis( ANALYSIS_INFO * pAna );
virtual
CG_STATUS S_OutLocalAnalysis( ANALYSIS_INFO * pAna );
virtual
CG_STATUS FollowerMarshallAnalysis( ANALYSIS_INFO * )
{
return CG_OK;
}
virtual
CG_STATUS FollowerUnMarshallAnalysis( ANALYSIS_INFO * )
{
return CG_OK;
}
};
/////////////////////////////////////////////////////////////////////////////
// the int3264 code generation class.
/////////////////////////////////////////////////////////////////////////////
//
// This class corresponds to an __int3264. This inherits from the basetypes,
// Note that we use this node only when __int3264 generated for a 64b platform,
// otherwise ilcore will manufacture a basetype node.
// Once we have a CG_INT3264, it behaves like an enum - due to difference in
// memory and wire sizes it makes things complex etc.
//
class CG_INT3264 : public CG_BASETYPE
{
private:
void * _pCTI;
public:
//
// The constructor.
//
CG_INT3264 (
node_skl * pBT,
XLAT_SIZE_INFO & Info
) :
CG_BASETYPE( pBT, Info ), _pCTI( 0 )
{}
//
// Get and set methods.
//
virtual
ID_CG GetCGID()
{
return ID_CG_INT3264;
}
virtual
void Visit( CG_VISITOR *pVisitor )
{
pVisitor->Visit( this );
}
};
/////////////////////////////////////////////////////////////////////////////
// the enum code generation class.
/////////////////////////////////////////////////////////////////////////////
//
// This class corresponds to an enum. This inherits from the basetypes,
// since they share a whole lot of properties.
//
class CG_ENUM : public CG_BASETYPE
{
private:
void * _pCTI;
public:
//
// The constructor.
//
CG_ENUM (
node_skl * pBT,
XLAT_SIZE_INFO & Info
) :
CG_BASETYPE( pBT, Info ), _pCTI( 0 )
{
}
//
// Get and set methods.
//
BOOL IsEnumLong()
{
return GetWireSize() != 2;
}
virtual
ID_CG GetCGID()
{
return ID_CG_ENUM;
}
virtual
void Visit( CG_VISITOR *pVisitor )
{
pVisitor->Visit( this );
}
//
// Generate typeinfo
//
virtual
CG_STATUS GenTypeInfo( CCB * pCCB);
virtual
CG_STATUS GetTypeDesc(TYPEDESC * &ptd, CCB * pCCB)
{
return CG_NDR::GetTypeDesc(ptd, pCCB);
};
virtual
FORMAT_CHARACTER GetFormatChar( CCB* pCCB = 0 );
virtual
FORMAT_CHARACTER GetSignedFormatChar();
virtual
NDR64_FORMAT_CHARACTER GetNDR64FormatChar( CCB* pCCB = 0 );
virtual
NDR64_FORMAT_CHARACTER GetNDR64SignedFormatChar();
};
/////////////////////////////////////////////////////////////////////////////
// the error_status_t code generation class.
/////////////////////////////////////////////////////////////////////////////
//
// This class corresponds to an error_status_t. This inherits from the basetypes,
// since they share a whole lot of properties.
//
class CG_ERROR_STATUS_T : public CG_BASETYPE
{
private:
public:
//
// The constructor.
//
CG_ERROR_STATUS_T(
node_skl * pBT,
XLAT_SIZE_INFO & Info )
: CG_BASETYPE( pBT, Info )
{
}
//
// Get and set methods.
//
virtual
ID_CG GetCGID()
{
return ID_CG_ERROR_STATUS_T;
}
virtual
void Visit( CG_VISITOR *pVisitor )
{
pVisitor->Visit( this );
}
virtual
FORMAT_CHARACTER GetFormatChar( CCB * pCCB = 0 );
virtual
FORMAT_CHARACTER GetSignedFormatChar()
{
MIDL_ASSERT(0);
return FC_ZERO;
}
virtual
NDR64_FORMAT_CHARACTER GetNDR64FormatChar( CCB * pCCB = 0 );
virtual
NDR64_FORMAT_CHARACTER GetNDR64SignedFormatChar()
{
MIDL_ASSERT(0);
return FC64_ZERO;
}
};
/////////////////////////////////////////////////////////////////////////////
// the error_status_t code generation class.
/////////////////////////////////////////////////////////////////////////////
//
// This class corresponds to an error_status_t. This inherits from the basetypes,
// since they share a whole lot of properties.
//
class CG_HRESULT : public CG_BASETYPE
{
private:
public:
//
// The constructor.
//
CG_HRESULT(
node_skl * pBT,
XLAT_SIZE_INFO & Info )
: CG_BASETYPE( pBT, Info )
{
}
//
// Get and set methods.
//
virtual
ID_CG GetCGID()
{
return ID_CG_HRESULT;
}
virtual
void Visit( CG_VISITOR *pVisitor )
{
pVisitor->Visit( this );
}
virtual
FORMAT_CHARACTER GetFormatChar( CCB * )
{
return FC_LONG;
}
virtual
FORMAT_CHARACTER GetSignedFormatChar()
{
MIDL_ASSERT(0);
return FC_ZERO;
}
virtual
NDR64_FORMAT_CHARACTER GetNDR64FormatChar( CCB * )
{
return FC64_INT32;
}
virtual
NDR64_FORMAT_CHARACTER GetNDR64SignedFormatChar()
{
MIDL_ASSERT(0);
return FC64_ZERO;
}
};
/////////////////////////////////////////////////////////////////////////////
// the cs_tag parameter code generation class.
/////////////////////////////////////////////////////////////////////////////
class CG_CS_TAG : public CG_NDR
{
private:
NDR_CS_TAG_FLAGS Flags;
public:
CG_CS_TAG(
node_skl * pBT,
XLAT_SIZE_INFO & Info,
BOOL fIsSTag,
BOOL fIsDRTag,
BOOL fIsRTag )
: CG_NDR( pBT, Info )
{
Flags.STag = (unsigned char) ( fIsSTag ? 1 : 0 );
Flags.DRTag = (unsigned char) ( fIsDRTag ? 1 : 0 );
Flags.RTag = (unsigned char) ( fIsRTag ? 1 : 0 );
}
virtual
ID_CG GetCGID()
{
return ID_CG_CS_TAG;
}
virtual
void Visit( CG_VISITOR *pVisitor )
{
pVisitor->Visit( this );
}
virtual
void GenNdrFormat( CCB * pCCB );
};
#endif // __BTCLS_HXX__