22#define __ASM_VTABLE(name,funcs)
26#define VTABLE_ADD_FUNC(name) "\t.quad " THISCALL_NAME(name) "\n"
28#define __ASM_VTABLE(name,funcs) \
31 "\t.quad " __ASM_NAME(#name "_rtti") "\n" \
32 "\t.globl " __ASM_NAME(#name "_vtable") "\n" \
33 __ASM_NAME(#name "_vtable") ":\n" \
38#define VTABLE_ADD_FUNC(name) "\t.long " THISCALL_NAME(name) "\n"
40#define __ASM_VTABLE(name,funcs) \
43 "\t.long " __ASM_NAME(#name "_rtti") "\n" \
44 "\t.globl " __ASM_NAME(#name "_vtable") "\n" \
45 __ASM_NAME(#name "_vtable") ":\n" \
53#define DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \
54 static type_info name ## _type_info = { \
60static const rtti_base_descriptor name ## _rtti_base_descriptor = { \
67#define DEFINE_RTTI_DATA(name, off, base_classes_no, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \
68 DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \
70static const rtti_base_array name ## _rtti_base_array = { \
72 &name ## _rtti_base_descriptor, \
85static const rtti_object_hierarchy name ## _hierarchy = { \
89 &name ## _rtti_base_array \
92const rtti_object_locator name ## _rtti = { \
96 &name ## _type_info, \
102#define __DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \
103 static type_info name ## _type_info = { \
109static rtti_base_descriptor name ## _rtti_base_descriptor = { \
116#define DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \
117 __DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \
119 static void init_ ## name ## _rtti(char *base) \
121 name ## _rtti_base_descriptor.type_descriptor = (char*)&name ## _type_info - base; \
124#define DEFINE_RTTI_DATA(name, off, base_classes_no, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \
125 __DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \
127static rtti_base_array name ## _rtti_base_array = { \
142static rtti_object_hierarchy name ## _hierarchy = { \
149rtti_object_locator name ## _rtti = { \
158static void init_ ## name ## _rtti(char *base) \
160 name ## _rtti_base_descriptor.type_descriptor = (char*)&name ## _type_info - base; \
161 name ## _rtti_base_array.bases[0] = (char*)&name ## _rtti_base_descriptor - base; \
162 name ## _rtti_base_array.bases[1] = (char*)cl1 - base; \
163 name ## _rtti_base_array.bases[2] = (char*)cl2 - base; \
164 name ## _rtti_base_array.bases[3] = (char*)cl3 - base; \
165 name ## _rtti_base_array.bases[4] = (char*)cl4 - base; \
166 name ## _rtti_base_array.bases[5] = (char*)cl5 - base; \
167 name ## _rtti_base_array.bases[6] = (char*)cl6 - base; \
168 name ## _rtti_base_array.bases[7] = (char*)cl7 - base; \
169 name ## _rtti_base_array.bases[8] = (char*)cl8 - base; \
170 name ## _rtti_base_array.bases[9] = (char*)cl9 - base; \
171 name ## _hierarchy.base_classes = (char*)&name ## _rtti_base_array - base; \
172 name ## _rtti.type_descriptor = (char*)&name ## _type_info - base; \
173 name ## _rtti.type_hierarchy = (char*)&name ## _hierarchy - base; \
174 name ## _rtti.object_locator = (char*)&name ## _rtti - base; \
179#define DEFINE_RTTI_DATA0(name, off, mangled_name) \
180 DEFINE_RTTI_DATA(name, off, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
181#define DEFINE_RTTI_DATA1(name, off, cl1, mangled_name) \
182 DEFINE_RTTI_DATA(name, off, 1, cl1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
183#define DEFINE_RTTI_DATA2(name, off, cl1, cl2, mangled_name) \
184 DEFINE_RTTI_DATA(name, off, 2, cl1, cl2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
185#define DEFINE_RTTI_DATA3(name, off, cl1, cl2, cl3, mangled_name) \
186 DEFINE_RTTI_DATA(name, off, 3, cl1, cl2, cl3, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
187#define DEFINE_RTTI_DATA4(name, off, cl1, cl2, cl3, cl4, mangled_name) \
188 DEFINE_RTTI_DATA(name, off, 4, cl1, cl2, cl3, cl4, NULL, NULL, NULL, NULL, NULL, mangled_name)
189#define DEFINE_RTTI_DATA8(name, off, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, mangled_name) \
190 DEFINE_RTTI_DATA(name, off, 8, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, NULL, mangled_name)
191#define DEFINE_RTTI_DATA9(name, off, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \
192 DEFINE_RTTI_DATA(name, off, 9, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name)
230 unsigned int type_descriptor;
231 int num_base_classes;
233 unsigned int attributes;
238 unsigned int bases[10];
244 unsigned int attributes;
246 unsigned int base_classes;
252 int base_class_offset;
254 unsigned int type_descriptor;
255 unsigned int type_hierarchy;
256 unsigned int object_locator;
261#ifdef __ASM_USE_THISCALL_WRAPPER
263#define CALL_VTBL_FUNC(this, off, ret, type, args) ((ret (WINAPI*)type)&vtbl_wrapper_##off)args
265extern void *vtbl_wrapper_0;
266extern void *vtbl_wrapper_4;
267extern void *vtbl_wrapper_8;
268extern void *vtbl_wrapper_12;
269extern void *vtbl_wrapper_16;
270extern void *vtbl_wrapper_20;
271extern void *vtbl_wrapper_24;
272extern void *vtbl_wrapper_28;
273extern void *vtbl_wrapper_32;
274extern void *vtbl_wrapper_36;
275extern void *vtbl_wrapper_40;
276extern void *vtbl_wrapper_44;
277extern void *vtbl_wrapper_48;
281#define CALL_VTBL_FUNC(this, off, ret, type, args) ((ret (__thiscall***)type)this)[0][off/4]args
293#define CREATE_TYPE_INFO_VTABLE \
294DEFINE_THISCALL_WRAPPER(type_info_vector_dtor,8) \
295void * __thiscall type_info_vector_dtor(type_info * _this, unsigned int flags) \
300 INT_PTR i, *ptr = (INT_PTR *)_this - 1; \
302 for (i = *ptr - 1; i >= 0; i--) free(_this[i].name); \
308 if (flags & 1) free(_this); \
313DEFINE_RTTI_DATA0( type_info, 0, ".?AVtype_info@@" ) \
315__ASM_BLOCK_BEGIN(type_info_vtables) \
316 __ASM_VTABLE(type_info, \
317 VTABLE_ADD_FUNC(type_info_vector_dtor)); \
struct _rtti_base_array rtti_base_array
const vtable_ptr type_info_vtable
exception *__thiscall exception_ctor(exception *, const char **)
struct _rtti_object_locator rtti_object_locator
struct _rtti_object_hierarchy rtti_object_hierarchy
struct _rtti_base_descriptor rtti_base_descriptor
static const FxOffsetAndName offsets[]
const rtti_base_descriptor * bases[10]
const type_info * type_descriptor
const rtti_base_array * base_classes
const type_info * type_descriptor
const rtti_object_hierarchy * type_hierarchy
void *__thiscall type_info_vector_dtor(type_info *_this, unsigned int flags)