Commit 745549c8 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Andreas Färber
Browse files

qom: Make Object a type



Right now the base Object class has a special NULL type.  Change this so
that we will be able to add class_init and class_base_init callbacks.
To do this, remove some special casing of ObjectClass that is not really
necessary.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
parent 3b50e311
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ typedef struct TypeInfo TypeInfo;
typedef struct InterfaceClass InterfaceClass;
typedef struct InterfaceInfo InterfaceInfo;

#define TYPE_OBJECT NULL
#define TYPE_OBJECT "object"

/**
 * SECTION:object.h
+30 −29
Original line number Diff line number Diff line
@@ -210,7 +210,7 @@ static void type_class_interface_init(TypeImpl *ti, InterfaceImpl *iface)

static void type_initialize(TypeImpl *ti)
{
    size_t class_size = sizeof(ObjectClass);
    TypeImpl *parent;
    int i;

    if (ti->class) {
@@ -221,19 +221,16 @@ static void type_initialize(TypeImpl *ti)
    ti->instance_size = type_object_get_size(ti);

    ti->class = g_malloc0(ti->class_size);
    ti->class->type = ti;

    if (type_has_parent(ti)) {
        TypeImpl *parent = type_get_parent(ti);

    parent = type_get_parent(ti);
    if (parent) {
        type_initialize(parent);

        class_size = parent->class_size;
        g_assert(parent->class_size <= ti->class_size);
        memcpy(ti->class, parent->class, parent->class_size);
    }

        memcpy((void *)ti->class + sizeof(ObjectClass),
               (void *)parent->class + sizeof(ObjectClass),
               parent->class_size - sizeof(ObjectClass));
    ti->class->type = ti;

    while (parent) {
        if (parent->class_base_init) {
@@ -241,9 +238,6 @@ static void type_initialize(TypeImpl *ti)
        }
        parent = type_get_parent(parent);
    }
    }

    memset((void *)ti->class + class_size, 0, ti->class_size - class_size);

    for (i = 0; i < ti->num_interfaces; i++) {
        type_class_interface_init(ti, &ti->interfaces[i]);
@@ -477,19 +471,6 @@ Object *object_dynamic_cast(Object *obj, const char *typename)
}


static void register_types(void)
{
    static TypeInfo interface_info = {
        .name = TYPE_INTERFACE,
        .instance_size = sizeof(Interface),
        .abstract = true,
    };

    type_interface = type_register_static(&interface_info);
}

type_init(register_types)

Object *object_dynamic_cast_assert(Object *obj, const char *typename)
{
    Object *inst;
@@ -1243,3 +1224,23 @@ void object_property_add_str(Object *obj, const char *name,
                        property_release_str,
                        prop, errp);
}

static void register_types(void)
{
    static TypeInfo interface_info = {
        .name = TYPE_INTERFACE,
        .instance_size = sizeof(Interface),
        .abstract = true,
    };

    static TypeInfo object_info = {
        .name = TYPE_OBJECT,
        .instance_size = sizeof(Object),
        .abstract = true,
    };

    type_interface = type_register_static(&interface_info);
    type_register_static(&object_info);
}

type_init(register_types)