qdev_try_create->object_class_by_name->type_initialize的调用流程,如果父 ObjectClass没初始化,会初始化父ObjectClass,此时调用到父ObjectClass对应name的TypeImpl的 class_init函数,例如\的class_init回调pit_common_class_init,此回调会设置 ISADeviceClass的init回调为pit_init_common。 Object类型转换
再解释下Object里常用的一个宏:OBJECT_CHECK,以ISA_DEVICE这段代码为例:
static const TypeInfo mc146818rtc_info = { .name = \sizeof(RTCState), .class_init = rtc_class_initfn, }; ISADevice *isa_create(ISABus *bus, const char *name) { DeviceState *dev; if (!bus) { hw_error(\bus present.\return ISA_DEVICE(dev);//毫无疑问,\肯定可以转换为\,why?见mc146818rtc_info定义 } ISADevice *dev = isa_create(bus, \
1 staticconstTypeInfomc146818rtc_info={
2 .name =\3 .parent =\4 .instance_size=sizeof(RTCState),
5 .class_init =rtc_class_initfn, 6 };
7 ISADevice*isa_create(ISABus*bus,constchar*name) 8 {
9 DeviceState*dev;
10 if(!bus){ 11 hw_error(\12 bus present.\13 } 14 dev=qdev_create(&bus->qbus,name); 15 returnISA_DEVICE(dev);//毫无疑问,\肯定可以转换16 为\,why?见mc146818rtc_info定义 }
ISADevice*dev=isa_create(bus,\
这里的ISA_DEVICE体现了OBJECT的类型转换功能,宏定义为: #define OBJECT(obj) \\ ((Object *)(obj)) #define OBJECT_CHECK(type, obj, name) \\ ((type
*)object_dynamic_cast_assert(OBJECT(obj), (name))) #define ISA_DEVICE(obj) \\ OBJECT_CHECK(ISADevice, (obj), TYPE_ISA_DEVICE)
1 #define OBJECT(obj) \\ 2 ((Object*)(obj)) 3 #define OBJECT_CHECK(type, obj, name) \\ 4 ((type*)object_dynamic_cast_assert(OBJECT(obj),(name))) 5 #define ISA_DEVICE(obj) \\ 6 OBJECT_CHECK(ISADevice,(obj),TYPE_ISA_DEVICE)
展开后为:
#define ISA_DEVICE(dev)
(ISADevice*)object_class_dynamic_cast(((Object *)dev)->class, \
#define ISA_DEVICE(dev) 1 (ISADevice*)object_class_dynamic_cast(((Object *)dev)->class, \
object.c里面定义了object_class_dynamic_cast函数,其实此函数功能比较简单,就是通过遍历parent看当前class是否有一个祖先是typename,其定义如下:
ObjectClass *object_class_dynamic_cast(ObjectClass *class, const char *typename) { TypeImpl *target_type =
type_get_by_name(typename); //找到\对应的TypeImpl* TypeImpl *type = class->type; //本ObjectClass真实的TypeImpl*,其实这里是\*target_type $31 = {name = 0x5555566d0b20 \class_size = 128, instance_size = 160, class_init = 0x55555568ddd0 , class_base_init = 0, class_finalize = 0, class_data = 0x0, instance_init = 0, instance_finalize = 0, abstract = true, parent = 0x5555566d0a40 \= 0x5555566da730, class = 0x555556a14750, num_interfaces = 0, interfaces = {{typename = 0x0} }} (gdb) p *type_interface $33 = {name = 0x5555566e40b0 \instance_size = 0, class_init = 0, class_base_init = 0, class_finalize = 0, class_data = 0x0, instance_init = 0, instance_finalize = 0, abstract = true, parent = 0x0, parent_type = 0x0, class = 0x0, num_interfaces = 0, interfaces = {{ typename = 0x0} }} type_is_ancestor用于判断,\是否是\的祖先(判断方法是递归遍历\的parent,
比较是否有\),如果是,那么要考虑interface的情况,这里不是,且 type->num_interfaces为0 */ if
(type->num_interfaces && type_is_ancestor(target_type, type_interface)) { int found = 0; GSList *i; for (i =
class->interfaces; i; i = i->next) { ObjectClass *target_class = i->data; if (type_is_ancestor(target_class->type,
target_type)) { ret = target_class; found++; } } /* The match was ambiguous, don't allow a cast */ if (found > 1) { ret = NULL; } } else if (type_is_ancestor(type, target_type)) { /* 判断type=\的祖先是否是target_type=\, 如果是,这里表示子类class=\能成功转换为父类
typename=\所指的ObjectClass */ ret = class; } return ret; }
1 ObjectClass*object_class_dynamic_cast(ObjectClass*class,
2 3 constchar*typename) 4 {
5 TypeImpl*target_type=type_get_by_name(typename);//找到6 \对应的TypeImpl*
7 TypeImpl*type=class->type;//本ObjectClass真实的TypeImpl*,8 其实这里是\
9 ObjectClass*ret=NULL; 1 /*
0 (gdb) p *target_type
1$31 = {name = 0x5555566d0b20 \
1 instance_size = 160, class_init = 0x55555568ddd0 , class_base_init = 10,
2 class_finalize = 0, class_data = 0x0, instance_init = 0, 1instance_finalize = 0, abstract = true, parent = 0x5555566d0a40 3 \1 class = 0x555556a14750, num_interfaces = 0, interfaces = {{typename
4 = 0x0} }}
1 (gdb) p *type_interface 5 $33 = {name = 0x5555566e40b0 \class_size = 32, instance_size 1= 0, class_init = 0, class_base_init = 0, class_finalize = 0, class_data 6 = 0x0,
1 instance_init = 0, instance_finalize = 0, abstract = true, parent 7 = 0x0, parent_type = 0x0, class = 0x0, num_interfaces = 0, interfaces 1= {{
8 typename = 0x0} }} 1 type_is_ancestor 用于判断,\是否是\的祖9 先(判断方法是递归遍历\的parent,比较是否 有\),2如果是,那么要考虑interface的情况,这里不是,且type->num_interfaces0 为0
2 */
1 if(type->num_interfaces&&type_is_ancestor(target_type,type_2interface)){
2 intfound=0; 2 GSList*i;
3 for(i=class->interfaces;i;i=i->next){
2 ObjectClass*target_class=i->data;
4 if(type_is_ancestor(target_class->type,targ2et_type)){
5 ret=target_class; 2 found++; 6 } 2 }
7 /* The match was ambiguous, don't allow a cast */ 2 if(found>1){
8 ret=NULL; 2 }
9 }elseif(type_is_ancestor(type,target_type)){ 3 /*
0 判断type=\的祖先是否是3target_type=\,
1 如果是,这里表示子类class=\能成功转换为3父类typename=\所指的ObjectClass 2 */
3 ret=class; 3 }
3 returnret; 4 } 35 3