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().

Backports commit 7ee9edfdb117da47c86c9764d90f0be11a648666 from qemu
This commit is contained in:
Marc-André Lureau 2018-05-04 09:54:24 -04:00 committed by Lioncash
parent ec12091943
commit 2ca916e106
No known key found for this signature in database
GPG Key ID: 4E3C3CC1031BA9C7
2 changed files with 11 additions and 3 deletions

View File

@ -65,9 +65,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)

View File

@ -15,6 +15,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 *) = {
NULL, /* No such object exists */
NULL, /* qnull_ is indestructible */