|
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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__
|