mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-25 01:48:16 +00:00
qom: add helper macro DEFINE_TYPES()
DEFINE_TYPES() will help to simplify following routine patterns: static void foo_register_types(void) { type_register_static(&foo1_type_info); type_register_static(&foo2_type_info); ... } type_init(foo_register_types) or static void foo_register_types(void) { int i; for (i = 0; i < ARRAY_SIZE(type_infos); i++) { type_register_static(&type_infos[i]); } } type_init(foo_register_types) with a single line DEFINE_TYPES(type_infos) where types have static definition which could be consolidated in a single array of TypeInfo structures. It saves us ~6-10LOC per use case and would help to replace imperative foo_register_types() there with declarative style of type registration. Backports commit 38b5d79b2e8cf6085324066d84e8bb3b3bbe8548 from qemu
This commit is contained in:
parent
c97583fc42
commit
6f265062ef
1 changed files with 36 additions and 0 deletions
|
@ -85,6 +85,28 @@ struct uc_struct;
|
|||
* #TypeInfo describes information about the type including what it inherits
|
||||
* from, the instance and class size, and constructor/destructor hooks.
|
||||
*
|
||||
* Alternatively several static types could be registered using helper macro
|
||||
* DEFINE_TYPES()
|
||||
*
|
||||
* <example>
|
||||
* <programlisting>
|
||||
* static const TypeInfo device_types_info[] = {
|
||||
* {
|
||||
* .name = TYPE_MY_DEVICE_A,
|
||||
* .parent = TYPE_DEVICE,
|
||||
* .instance_size = sizeof(MyDeviceA),
|
||||
* },
|
||||
* {
|
||||
* .name = TYPE_MY_DEVICE_B,
|
||||
* .parent = TYPE_DEVICE,
|
||||
* .instance_size = sizeof(MyDeviceB),
|
||||
* },
|
||||
* };
|
||||
*
|
||||
* DEFINE_TYPES(device_types_info)
|
||||
* </programlisting>
|
||||
* </example>
|
||||
*
|
||||
* Every type has an #ObjectClass associated with it. #ObjectClass derivatives
|
||||
* are instantiated dynamically but there is only ever one instance for any
|
||||
* given type. The #ObjectClass typically holds a table of function pointers
|
||||
|
@ -685,6 +707,20 @@ Type type_register(struct uc_struct *uc, const TypeInfo *info);
|
|||
*/
|
||||
void type_register_static_array(struct uc_struct *uc, const TypeInfo *infos, int nr_infos);
|
||||
|
||||
/**
|
||||
* DEFINE_TYPES:
|
||||
* @type_array: The array containing #TypeInfo structures to register
|
||||
*
|
||||
* @type_array should be static constant that exists for the life time
|
||||
* that the type is registered.
|
||||
*/
|
||||
#define DEFINE_TYPES(type_array) \
|
||||
static void do_qemu_init_ ## type_array(struct uc_struct *uc) \
|
||||
{ \
|
||||
type_register_static_array(uc, type_array, ARRAY_SIZE(type_array)); \
|
||||
} \
|
||||
type_init(do_qemu_init_ ## type_array)
|
||||
|
||||
/**
|
||||
* object_class_dynamic_cast_assert:
|
||||
* @klass: The #ObjectClass to attempt to cast.
|
||||
|
|
Loading…
Reference in a new issue