mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-07 05:51:36 +00:00
qom: Add class_base_init
The class_base_init TypeInfo callback was present in one of the early QOM versions but removed (on my request...) before committing. We will need it soon, add it. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
32efc535b8
commit
3b50e311b4
@ -291,10 +291,15 @@ struct Object
|
|||||||
* has occurred to allow a class to set its default virtual method pointers.
|
* has occurred to allow a class to set its default virtual method pointers.
|
||||||
* This is also the function to use to override virtual methods from a parent
|
* This is also the function to use to override virtual methods from a parent
|
||||||
* class.
|
* class.
|
||||||
|
* @class_base_init: This function is called for all base classes after all
|
||||||
|
* parent class initialization has occurred, but before the class itself
|
||||||
|
* is initialized. This is the function to use to undo the effects of
|
||||||
|
* memcpy from the parent class to the descendents.
|
||||||
* @class_finalize: This function is called during class destruction and is
|
* @class_finalize: This function is called during class destruction and is
|
||||||
* meant to release and dynamic parameters allocated by @class_init.
|
* meant to release and dynamic parameters allocated by @class_init.
|
||||||
* @class_data: Data to pass to the @class_init and @class_finalize functions.
|
* @class_data: Data to pass to the @class_init, @class_base_init and
|
||||||
* This can be useful when building dynamic classes.
|
* @class_finalize functions. This can be useful when building dynamic
|
||||||
|
* classes.
|
||||||
* @interfaces: The list of interfaces associated with this type. This
|
* @interfaces: The list of interfaces associated with this type. This
|
||||||
* should point to a static array that's terminated with a zero filled
|
* should point to a static array that's terminated with a zero filled
|
||||||
* element.
|
* element.
|
||||||
@ -312,6 +317,7 @@ struct TypeInfo
|
|||||||
size_t class_size;
|
size_t class_size;
|
||||||
|
|
||||||
void (*class_init)(ObjectClass *klass, void *data);
|
void (*class_init)(ObjectClass *klass, void *data);
|
||||||
|
void (*class_base_init)(ObjectClass *klass, void *data);
|
||||||
void (*class_finalize)(ObjectClass *klass, void *data);
|
void (*class_finalize)(ObjectClass *klass, void *data);
|
||||||
void *class_data;
|
void *class_data;
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ struct TypeImpl
|
|||||||
size_t instance_size;
|
size_t instance_size;
|
||||||
|
|
||||||
void (*class_init)(ObjectClass *klass, void *data);
|
void (*class_init)(ObjectClass *klass, void *data);
|
||||||
|
void (*class_base_init)(ObjectClass *klass, void *data);
|
||||||
void (*class_finalize)(ObjectClass *klass, void *data);
|
void (*class_finalize)(ObjectClass *klass, void *data);
|
||||||
|
|
||||||
void *class_data;
|
void *class_data;
|
||||||
@ -112,6 +113,7 @@ TypeImpl *type_register(const TypeInfo *info)
|
|||||||
ti->instance_size = info->instance_size;
|
ti->instance_size = info->instance_size;
|
||||||
|
|
||||||
ti->class_init = info->class_init;
|
ti->class_init = info->class_init;
|
||||||
|
ti->class_base_init = info->class_base_init;
|
||||||
ti->class_finalize = info->class_finalize;
|
ti->class_finalize = info->class_finalize;
|
||||||
ti->class_data = info->class_data;
|
ti->class_data = info->class_data;
|
||||||
|
|
||||||
@ -232,6 +234,13 @@ static void type_initialize(TypeImpl *ti)
|
|||||||
memcpy((void *)ti->class + sizeof(ObjectClass),
|
memcpy((void *)ti->class + sizeof(ObjectClass),
|
||||||
(void *)parent->class + sizeof(ObjectClass),
|
(void *)parent->class + sizeof(ObjectClass),
|
||||||
parent->class_size - sizeof(ObjectClass));
|
parent->class_size - sizeof(ObjectClass));
|
||||||
|
|
||||||
|
while (parent) {
|
||||||
|
if (parent->class_base_init) {
|
||||||
|
parent->class_base_init(ti->class, ti->class_data);
|
||||||
|
}
|
||||||
|
parent = type_get_parent(parent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memset((void *)ti->class + class_size, 0, ti->class_size - class_size);
|
memset((void *)ti->class + class_size, 0, ti->class_size - class_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user