[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 03/27] qom: clean up/optimize object_dynamic_cast
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v2 03/27] qom: clean up/optimize object_dynamic_cast |
Date: |
Sat, 4 Feb 2012 09:02:33 +0100 |
The interface loop can be performed only on the parent object. It
does not need to be done on each interface. Similarly, we can
simplify the code by switching early from the implementation
object to the parent object.
Signed-off-by: Paolo Bonzini <address@hidden>
---
qom/object.c | 38 ++++++++++++++++++--------------------
1 files changed, 18 insertions(+), 20 deletions(-)
diff --git a/qom/object.c b/qom/object.c
index 4261944..4d21f0a 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -372,7 +372,6 @@ static bool object_is_type(Object *obj, const char
*typename)
{
TypeImpl *target_type = type_get_by_name(typename);
TypeImpl *type = obj->class->type;
- GSList *i;
/* Check if typename is a direct ancestor of type */
while (type) {
@@ -383,15 +382,6 @@ static bool object_is_type(Object *obj, const char
*typename)
type = type_get_parent(type);
}
- /* Check if obj has an interface of typename */
- for (i = obj->interfaces; i; i = i->next) {
- Interface *iface = i->data;
-
- if (object_is_type(OBJECT(iface), typename)) {
- return true;
- }
- }
-
return false;
}
@@ -404,6 +394,24 @@ Object *object_dynamic_cast(Object *obj, const char
*typename)
return obj;
}
+ /* Check if obj is an interface and its containing object is a direct
+ * ancestor of typename. In principle we could do this test at the very
+ * beginning of object_dynamic_cast, avoiding a second call to
+ * object_is_type. However, casting between interfaces is relatively
+ * rare, and object_is_type(obj, TYPE_INTERFACE) would fail almost always.
+ *
+ * Perhaps we could add a magic value to the object header for increased
+ * (run-time) type safety and to speed up tests like this one. If we ever
+ * do that we can revisit the order here.
+ */
+ if (object_is_type(obj, TYPE_INTERFACE)) {
+ assert(!obj->interfaces);
+ obj = INTERFACE(obj)->obj;
+ if (object_is_type(obj, typename)) {
+ return obj;
+ }
+ }
+
/* Check if obj has an interface of typename */
for (i = obj->interfaces; i; i = i->next) {
Interface *iface = i->data;
@@ -413,16 +421,6 @@ Object *object_dynamic_cast(Object *obj, const char
*typename)
}
}
- /* Check if obj is an interface and its containing object is a direct
- * ancestor of typename */
- if (object_is_type(obj, TYPE_INTERFACE)) {
- Interface *iface = INTERFACE(obj);
-
- if (object_is_type(iface->obj, typename)) {
- return iface->obj;
- }
- }
-
return NULL;
}
--
1.7.7.6
- [Qemu-devel] [PATCH v2 00/27] next steps for qdev & QOM, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 01/27] qom: clean up cast macros, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 02/27] qom: more documentation on subclassing, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 05/27] qom: do not include qdev header file, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 03/27] qom: clean up/optimize object_dynamic_cast,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 04/27] qom: avoid useless conversions from string to type, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 08/27] qom: fix off-by-one, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 18/27] qdev: make the non-legacy pci address property accept an integer, Paolo Bonzini, 2012/02/04
- [Qemu-devel] [PATCH v2 12/27] qom: add property get/set wrappers for links, Paolo Bonzini, 2012/02/04