一,前言
本次主要分析object_new,也就是了解最关键的object类对象。
二,源码分析
- 看上去就是通过TypeImpl来创建Object。
Object *object_new(const char *typename)
{
TypeImpl *ti = type_get_by_name(typename);
return object_new_with_type(ti);
}
- 主要调用初始化object,把type中的class先赋值给obj,obj->class = type->class。
void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
{
Object *obj = data;
g_assert(type != NULL);
type_initialize(type);
g_assert_cmpint(type->instance_size, >=, sizeof(Object));
g_assert(type->abstract == false);
g_assert_cmpint(size, >=, type->instance_size);
memset(obj, 0, type->instance_size);
obj->class = type->class;
object_ref(obj);
obj->properties = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, object_property_free);
object_init_with_type(obj, type);
object_post_init_with_type(obj, type);
}
- 接着看object_init_with_type是一个归递,从父类开始调用instance_init函数
static void object_init_with_type(Object *obj, TypeImpl *ti)
{
if (type_has_parent(ti)) {
object_init_with_type(obj, type_get_parent(ti));
}
if (ti->instance_init) {
ti->instance_init(obj);
}
}
static void object_instance_init(Object *obj)
{
object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
}
- 主要调用属性add函数,把ObjectProperty放入obj的GSLinst中
object_property_add(obj, name, "string",
get ? property_get_str : NULL,
set ? property_set_str : NULL,
property_release_str,
prop, &local_err);
父类全部归递完成,objectNew就算创建完成了。
5. 接着调用
#define MACHINE(obj) OBJECT_CHECK(MachineState, (obj), TYPE_MACHINE)
这种我的源码宏分析(2)已经说到过了,其实就是把obj的地址赋值给MachineState的第一个元素object指针。
6.再后来就是属性添加了。
至于属性加了有什么用,好像后面处理都是靠属性中的值来判断,但是暂时不清楚。
object_property_add_child(object_get_root(), "machine",OBJECT(current_machine), &error_abort);
分了2部分。一个object_get_root(),就是创建container容器的空节点。
object_property_add_child里面主要语句就是child->parent = obj;说明把容器指向父节点container。
三,总结
本节主要关注的是Object的内容如何来的,主要通过object_new函数来创建,也就是根据TypeImpl中的class内容来创建,而TypeIpml的class源码分析(2)中第一项就有描述,class赋值是在type_initialize中处理的,而且ti->class->type = ti,等于ObjectClass中还会引用到TypeImpl中的内容。Object的所有子类和父类属性都放在properties的哈希表中。Object的父类容器名称为container。
MachineClass的第一个元素ObjectClass类的,不是指针,所以可以理解为MachineClass继承了ObjectClass。而且父类是子类的第一个元素,典型用法是MachineClass *mc = MACHINE_CLASS(oc)。MachineState的结构体设计和使用思路雷同,用了#define MACHINE(obj)宏定义。
标签:Object,obj,Apple,Qemu,object,init,源码,ti,type From: https://blog.51cto.com/u_16247275/7493755