[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
- [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 2/9] Simplify code using *MACHINE_GET_CLASS, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 1/9] configure: test if _Generic works as expected, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 3/9] qom: QUALIFIED_CAST helper macro, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 4/9] qom: Make object_class_get_parent() const-aware, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 5/9] Make class parameter const at some functions, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 6/9] Explicitly cast the *_GET_CLASS() value when we break the rules, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aware,
Eduardo Habkost <=
- [Qemu-devel] [RFC v2 9/9] qom: Make object_get_class() return const pointer, Eduardo Habkost, 2017/03/29
- Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers, Laszlo Ersek, 2017/03/29
- Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers, Eduardo Habkost, 2017/03/29
- [Qemu-devel] [RFC v2 7/9] Use const variables for *_GET_CLASS values, Eduardo Habkost, 2017/03/29
- Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers, Paolo Bonzini, 2017/03/30