151 lines
4.6 KiB
C
151 lines
4.6 KiB
C
//
|
|
// _RTTIBaseClassDescriptor
|
|
//
|
|
// TypeDescriptor is declared in ehdata.h
|
|
//
|
|
#if defined(_M_IA64) || defined(VERSP_P7) /*IFSTRIP=IGN*/
|
|
#pragma pack(push, rttidata, 4)
|
|
#endif
|
|
|
|
#ifndef WANT_NO_TYPES
|
|
typedef const struct _s_RTTIBaseClassDescriptor {
|
|
#if defined(_M_IA64) && !defined(VERSP_P7)
|
|
__int32 pTypeDescriptor; // Image relative offset of TypeDescriptor
|
|
#else
|
|
TypeDescriptor *pTypeDescriptor;
|
|
#endif
|
|
DWORD numContainedBases;
|
|
PMD where;
|
|
DWORD attributes;
|
|
} _RTTIBaseClassDescriptor;
|
|
#endif // WANT_NO_TYPES
|
|
|
|
#define BCD_NOTVISIBLE 0x00000001
|
|
#define BCD_AMBIGUOUS 0x00000002
|
|
#define BCD_PRIVORPROTINCOMPOBJ 0x00000004
|
|
#define BCD_PRIVORPROTBASE 0x00000008
|
|
#define BCD_VBOFCONTOBJ 0x00000010
|
|
#define BCD_NONPOLYMORPHIC 0x00000020
|
|
|
|
#define BCD_PTD(bcd) ((bcd).pTypeDescriptor)
|
|
#define BCD_NUMCONTBASES(bcd) ((bcd).numContainedBases)
|
|
#define BCD_WHERE(bcd) ((bcd).where)
|
|
#define BCD_ATTRIBUTES(bcd) ((bcd).attributes)
|
|
#if defined(_M_IA64)
|
|
#define BCD_PTD_IB(bcd,ib) ((TypeDescriptor*)((ib) + (bcd).pTypeDescriptor))
|
|
#endif
|
|
|
|
|
|
//
|
|
// _RTTIBaseClassArray
|
|
//
|
|
#pragma warning(disable:4200) // get rid of obnoxious nonstandard extension warning
|
|
#ifndef WANT_NO_TYPES
|
|
typedef const struct _s_RTTIBaseClassArray {
|
|
#if defined(_M_IA64) && !defined(VERSP_P7)
|
|
__int32 arrayOfBaseClassDescriptors[]; // Image relative offset of _RTTIBaseClassDescriptor
|
|
#else
|
|
_RTTIBaseClassDescriptor *arrayOfBaseClassDescriptors[];
|
|
#endif
|
|
} _RTTIBaseClassArray;
|
|
#endif // WANT_NO_TYPES
|
|
#pragma warning(default:4200)
|
|
|
|
//
|
|
// _RTTIClassHierarchyDescriptor
|
|
//
|
|
#ifndef WANT_NO_TYPES
|
|
typedef const struct _s_RTTIClassHierarchyDescriptor {
|
|
DWORD signature;
|
|
DWORD attributes;
|
|
DWORD numBaseClasses;
|
|
#if defined(_M_IA64) && !defined(VERSP_P7)
|
|
__int32 pBaseClassArray; // Image relative offset of _RTTIBaseClassArray
|
|
#else
|
|
_RTTIBaseClassArray *pBaseClassArray;
|
|
#endif
|
|
} _RTTIClassHierarchyDescriptor;
|
|
#endif // WANT_NO_TYPES
|
|
|
|
#define CHD_MULTINH 0x00000001
|
|
#define CHD_VIRTINH 0x00000002
|
|
#define CHD_AMBIGUOUS 0x00000004
|
|
|
|
#define CHD_SIGNATURE(chd) ((chd).signature)
|
|
#define CHD_ATTRIBUTES(chd) ((chd).attributes)
|
|
#define CHD_NUMBASES(chd) ((chd).numBaseClasses)
|
|
#define CHD_PBCA(chd) ((chd).pBaseClassArray)
|
|
#define CHD_PBCD(bcd) (bcd)
|
|
#if defined(_M_IA64)
|
|
#define CHD_PBCA_IB(chd,ib) ((_RTTIBaseClassArray*)((ib) + (chd).pBaseClassArray))
|
|
#define CHD_PBCD_IB(bcd,ib) ((_RTTIBaseClassDescriptor*)((ib) + bcd))
|
|
#endif
|
|
|
|
//
|
|
// _RTTICompleteObjectLocator
|
|
//
|
|
#ifndef WANT_NO_TYPES
|
|
typedef const struct _s_RTTICompleteObjectLocator {
|
|
DWORD signature;
|
|
DWORD offset;
|
|
DWORD cdOffset;
|
|
#if defined(_M_IA64) && !defined(VERSP_P7)
|
|
__int32 pTypeDescriptor; // Image relative offset of TypeDescriptor
|
|
__int32 pClassDescriptor; // Image relative offset of _RTTIClassHierarchyDescriptor
|
|
#else
|
|
TypeDescriptor *pTypeDescriptor;
|
|
_RTTIClassHierarchyDescriptor *pClassDescriptor;
|
|
#endif
|
|
} _RTTICompleteObjectLocator;
|
|
#endif // WANT_NO_TYPES
|
|
|
|
#define COL_SIGNATURE(col) ((col).signature)
|
|
#define COL_OFFSET(col) ((col).offset)
|
|
#define COL_CDOFFSET(col) ((col).cdOffset)
|
|
#define COL_PTD(col) ((col).pTypeDescriptor)
|
|
#define COL_PCHD(col) ((col).pClassDescriptor)
|
|
#if defined(_M_IA64)
|
|
#define COL_PTD_IB(col,ib) ((TypeDescriptor*)((ib) + (col).pTypeDescriptor))
|
|
#define COL_PCHD_IB(col,ib) ((_RTTIClassHierarchyDescriptor*)((ib) + (col).pClassDescriptor))
|
|
#endif
|
|
|
|
#ifdef BUILDING_TYPESRC_C
|
|
//
|
|
// Type of the result of __RTtypeid and internal applications of typeid().
|
|
// This also introduces the tag "type_info" as an incomplete type.
|
|
//
|
|
|
|
typedef const class type_info &__RTtypeidReturnType;
|
|
|
|
//
|
|
// Declaration of CRT entrypoints, as seen by the compiler. Types are
|
|
// simplified so as to avoid type matching hassles.
|
|
//
|
|
|
|
#ifndef THROWSPEC
|
|
#if _MSC_VER >= 1300
|
|
#define THROWSPEC(_ex) throw _ex
|
|
#else
|
|
#define THROWSPEC(_ex)
|
|
#endif
|
|
#endif
|
|
|
|
// Perform a dynamic_cast on obj. of polymorphic type
|
|
extern "C" PVOID __cdecl __RTDynamicCast (
|
|
PVOID, // ptr to vfptr
|
|
LONG, // offset of vftable
|
|
PVOID, // src type
|
|
PVOID, // target type
|
|
BOOL) THROWSPEC((...)); // isReference
|
|
|
|
// Perform 'typeid' on obj. of polymorphic type
|
|
extern "C" PVOID __cdecl __RTtypeid (PVOID) THROWSPEC((...)); // ptr to vfptr
|
|
|
|
// Perform a dynamic_cast from obj. of polymorphic type to void*
|
|
extern "C" PVOID __cdecl __RTCastToVoid (PVOID) THROWSPEC((...)); // ptr to vfptr
|
|
#endif
|
|
|
|
#if defined(_M_IA64) || defined(VERSP_P7) /*IFSTRIP=IGN*/
|
|
#pragma pack(pop, rttidata)
|
|
#endif
|