qobject: Ensure base is at offset 0
All QObject types have the base QObject as their first field. This allows the simplification of qobject_to(). Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20180419150145.24795-2-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Commit message paragraph on type casts dropped, to avoid giving the impression type casting would be okay] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
46cfbf13b0
commit
7ee9edfdb1
@ -61,9 +61,8 @@ struct QObject {
|
||||
QEMU_BUILD_BUG_MSG(QTYPE__MAX != 7,
|
||||
"The QTYPE_CAST_TO_* list needs to be extended");
|
||||
|
||||
#define qobject_to(type, obj) ({ \
|
||||
QObject *_tmp = qobject_check_type(obj, glue(QTYPE_CAST_TO_, type)); \
|
||||
_tmp ? container_of(_tmp, type, base) : (type *)NULL; })
|
||||
#define qobject_to(type, obj) \
|
||||
((type *)qobject_check_type(obj, glue(QTYPE_CAST_TO_, type)))
|
||||
|
||||
/* Initialize an object to default values */
|
||||
static inline void qobject_init(QObject *obj, QType type)
|
||||
|
@ -16,6 +16,15 @@
|
||||
#include "qapi/qmp/qlist.h"
|
||||
#include "qapi/qmp/qstring.h"
|
||||
|
||||
QEMU_BUILD_BUG_MSG(
|
||||
offsetof(QNull, base) != 0 ||
|
||||
offsetof(QNum, base) != 0 ||
|
||||
offsetof(QString, base) != 0 ||
|
||||
offsetof(QDict, base) != 0 ||
|
||||
offsetof(QList, base) != 0 ||
|
||||
offsetof(QBool, base) != 0,
|
||||
"base qobject must be at offset 0");
|
||||
|
||||
static void (*qdestroy[QTYPE__MAX])(QObject *) = {
|
||||
[QTYPE_NONE] = NULL, /* No such object exists */
|
||||
[QTYPE_QNULL] = NULL, /* qnull_ is indestructible */
|
||||
|
Loading…
Reference in New Issue
Block a user