qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aw


From: Eduardo Habkost
Subject: [Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aware
Date: Wed, 29 Mar 2017 16:41:47 -0300

Use the QUALIFIED_CAST macro to make OBJECT_CLASS,
OBJECT_CLASS_CHECK, object_class_dynamic_cast(), and
object_class_dynamic_cast_assert() return a const pointer if the
class argument is already a const pointer.

Signed-off-by: Eduardo Habkost <address@hidden>
---
 include/qom/object.h | 31 +++++++++++++++++++++----------
 qom/object.c         | 15 ++++++++-------
 2 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 4af3c8e232..2b1513d2f2 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -527,7 +527,7 @@ struct TypeInfo
  * this function will always succeed.
  */
 #define OBJECT_CLASS(class) \
-    ((ObjectClass *)(class))
+    (QUALIFIED_CAST(typeof(class), ObjectClass *)(class))
 
 /**
  * OBJECT_CHECK:
@@ -556,9 +556,10 @@ struct TypeInfo
  * typically wrapped by each type to perform type safe casts of a class to a
  * specific class type.
  */
-#define OBJECT_CLASS_CHECK(class_type, class, name) \
-    ((class_type *)object_class_dynamic_cast_assert(OBJECT_CLASS(class), 
(name), \
-                                               __FILE__, __LINE__, __func__))
+#define OBJECT_CLASS_CHECK(class_type, class, name)                \
+    (QUALIFIED_CAST(typeof(class), class_type *)                   \
+     object_class_dynamic_cast_assert(OBJECT_CLASS(class), (name), \
+                                      __FILE__, __LINE__, __func__))
 
 /**
  * OBJECT_GET_CLASS:
@@ -845,10 +846,16 @@ Type type_register(const TypeInfo *info);
  * enabled.  This function is not meant to be called directly, but only through
  * the wrapper macros OBJECT_CLASS_CHECK and INTERFACE_CHECK.
  */
-ObjectClass *object_class_dynamic_cast_assert(ObjectClass *klass,
-                                              const char *typename,
-                                              const char *file, int line,
-                                              const char *func);
+#define object_class_dynamic_cast_assert(klass, typename, file, line, func) \
+    (QUALIFIED_CAST(typeof(klass), ObjectClass *)                           \
+     object_class_dynamic_cast_assert_const((ObjectClass *)klass, typename, \
+                                            file, line, func))
+
+const ObjectClass *object_class_dynamic_cast_assert_const(ObjectClass *klass,
+                                                          const char *typename,
+                                                          const char *file,
+                                                          int line,
+                                                          const char *func);
 
 /**
  * object_class_dynamic_cast:
@@ -864,8 +871,12 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass 
*klass,
  * classes or interfaces on the hierarchy leading to @klass implement
  * it.  (FIXME: perhaps this can be detected at type definition time?)
  */
-ObjectClass *object_class_dynamic_cast(ObjectClass *klass,
-                                       const char *typename);
+#define object_class_dynamic_cast(klass, typename) \
+    (QUALIFIED_CAST(typeof(klass), ObjectClass *)  \
+     object_class_dynamic_cast_const(klass, typename))
+
+const ObjectClass *object_class_dynamic_cast_const(const ObjectClass *klass,
+                                                   const char *typename);
 
 /**
  * object_class_get_parent:
diff --git a/qom/object.c b/qom/object.c
index 41dae18420..9b6c990ac5 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -648,10 +648,10 @@ out:
     return obj;
 }
 
-ObjectClass *object_class_dynamic_cast(ObjectClass *class,
-                                       const char *typename)
+const ObjectClass *object_class_dynamic_cast_const(const ObjectClass *class,
+                                                   const char *typename)
 {
-    ObjectClass *ret = NULL;
+    const ObjectClass *ret = NULL;
     TypeImpl *target_type;
     TypeImpl *type;
 
@@ -696,10 +696,11 @@ ObjectClass *object_class_dynamic_cast(ObjectClass *class,
     return ret;
 }
 
-ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class,
-                                              const char *typename,
-                                              const char *file, int line,
-                                              const char *func)
+const ObjectClass *object_class_dynamic_cast_assert_const(ObjectClass *class,
+                                                          const char *typename,
+                                                          const char *file,
+                                                          int line,
+                                                          const char *func)
 {
     ObjectClass *ret;
 
-- 
2.11.0.259.g40922b1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]