cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qobject.c (2043B)


      1/*
      2 * QObject
      3 *
      4 * Copyright (C) 2015 Red Hat, Inc.
      5 *
      6 * This work is licensed under the terms of the GNU LGPL, version 2.1
      7 * or later.  See the COPYING.LIB file in the top-level directory.
      8 */
      9
     10#include "qemu/osdep.h"
     11#include "qapi/qmp/qbool.h"
     12#include "qapi/qmp/qnull.h"
     13#include "qapi/qmp/qnum.h"
     14#include "qapi/qmp/qdict.h"
     15#include "qapi/qmp/qlist.h"
     16#include "qapi/qmp/qstring.h"
     17#include "qobject-internal.h"
     18
     19QEMU_BUILD_BUG_MSG(
     20    offsetof(QNull, base) != 0 ||
     21    offsetof(QNum, base) != 0 ||
     22    offsetof(QString, base) != 0 ||
     23    offsetof(QDict, base) != 0 ||
     24    offsetof(QList, base) != 0 ||
     25    offsetof(QBool, base) != 0,
     26    "base qobject must be at offset 0");
     27
     28static void (*qdestroy[QTYPE__MAX])(QObject *) = {
     29    [QTYPE_NONE] = NULL,               /* No such object exists */
     30    [QTYPE_QNULL] = NULL,              /* qnull_ is indestructible */
     31    [QTYPE_QNUM] = qnum_destroy_obj,
     32    [QTYPE_QSTRING] = qstring_destroy_obj,
     33    [QTYPE_QDICT] = qdict_destroy_obj,
     34    [QTYPE_QLIST] = qlist_destroy_obj,
     35    [QTYPE_QBOOL] = qbool_destroy_obj,
     36};
     37
     38void qobject_destroy(QObject *obj)
     39{
     40    assert(!obj->base.refcnt);
     41    assert(QTYPE_QNULL < obj->base.type && obj->base.type < QTYPE__MAX);
     42    qdestroy[obj->base.type](obj);
     43}
     44
     45
     46static bool (*qis_equal[QTYPE__MAX])(const QObject *, const QObject *) = {
     47    [QTYPE_NONE] = NULL,               /* No such object exists */
     48    [QTYPE_QNULL] = qnull_is_equal,
     49    [QTYPE_QNUM] = qnum_is_equal,
     50    [QTYPE_QSTRING] = qstring_is_equal,
     51    [QTYPE_QDICT] = qdict_is_equal,
     52    [QTYPE_QLIST] = qlist_is_equal,
     53    [QTYPE_QBOOL] = qbool_is_equal,
     54};
     55
     56bool qobject_is_equal(const QObject *x, const QObject *y)
     57{
     58    /* We cannot test x == y because an object does not need to be
     59     * equal to itself (e.g. NaN floats are not). */
     60
     61    if (!x && !y) {
     62        return true;
     63    }
     64
     65    if (!x || !y || x->base.type != y->base.type) {
     66        return false;
     67    }
     68
     69    assert(QTYPE_NONE < x->base.type && x->base.type < QTYPE__MAX);
     70
     71    return qis_equal[x->base.type](x, y);
     72}