Skip to content

Commit

Permalink
qapi: rename QmpOutputVisitor to QObjectOutputVisitor
Browse files Browse the repository at this point in the history
The QmpOutputVisitor has no direct dependency on QMP. It is
valid to use it anywhere that one wants a QObject. Rename it
to better reflect its functionality as a generic QAPI
to QObject converter.

The commit before previous renamed the files, this one renames C
identifiers.

Reviewed-by: Kevin Wolf <[email protected]>
Reviewed-by: Eric Blake <[email protected]>
Signed-off-by: Daniel P. Berrange <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Markus Armbruster <[email protected]>
[Split into file rename and identifier rename]
Signed-off-by: Markus Armbruster <[email protected]>
  • Loading branch information
berrange authored and Markus Armbruster committed Oct 25, 2016
1 parent 09e6836 commit 7d5e199
Show file tree
Hide file tree
Showing 12 changed files with 94 additions and 96 deletions.
2 changes: 1 addition & 1 deletion block/qapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ void bdrv_image_info_specific_dump(fprintf_function func_fprintf, void *f,
ImageInfoSpecific *info_spec)
{
QObject *obj, *data;
Visitor *v = qmp_output_visitor_new(&obj);
Visitor *v = qobject_output_visitor_new(&obj);

visit_type_ImageInfoSpecific(v, NULL, &info_spec, &error_abort);
visit_complete(v, &obj);
Expand Down
2 changes: 1 addition & 1 deletion blockdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3776,7 +3776,7 @@ void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
{
BlockDriverState *bs;
QObject *obj;
Visitor *v = qmp_output_visitor_new(&obj);
Visitor *v = qobject_output_visitor_new(&obj);
QDict *qdict;
Error *local_err = NULL;

Expand Down
2 changes: 1 addition & 1 deletion docs/qapi-code-gen.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1005,7 +1005,7 @@ Example:
Error *err = NULL;
Visitor *v;

v = qmp_output_visitor_new(ret_out);
v = qobject_output_visitor_new(ret_out);
visit_type_UserDefOne(v, "unused", &ret_in, &err);
if (!err) {
visit_complete(v, ret_out);
Expand Down
4 changes: 2 additions & 2 deletions include/qapi/qobject-output-visitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
#include "qapi/visitor.h"
#include "qapi/qmp/qobject.h"

typedef struct QmpOutputVisitor QmpOutputVisitor;
typedef struct QObjectOutputVisitor QObjectOutputVisitor;

/*
* Create a new QObject output visitor.
*
* If everything else succeeds, pass @result to visit_complete() to
* collect the result of the visit.
*/
Visitor *qmp_output_visitor_new(QObject **result);
Visitor *qobject_output_visitor_new(QObject **result);

#endif
162 changes: 80 additions & 82 deletions qapi/qobject-output-visitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,34 +19,32 @@
#include "qemu-common.h"
#include "qapi/qmp/types.h"

typedef struct QStackEntry
{
typedef struct QStackEntry {
QObject *value;
void *qapi; /* sanity check that caller uses same pointer */
QSLIST_ENTRY(QStackEntry) node;
} QStackEntry;

struct QmpOutputVisitor
{
struct QObjectOutputVisitor {
Visitor visitor;
QSLIST_HEAD(, QStackEntry) stack; /* Stack of unfinished containers */
QObject *root; /* Root of the output visit */
QObject **result; /* User's storage location for result */
};

#define qmp_output_add(qov, name, value) \
qmp_output_add_obj(qov, name, QOBJECT(value))
#define qmp_output_push(qov, value, qapi) \
qmp_output_push_obj(qov, QOBJECT(value), qapi)
#define qobject_output_add(qov, name, value) \
qobject_output_add_obj(qov, name, QOBJECT(value))
#define qobject_output_push(qov, value, qapi) \
qobject_output_push_obj(qov, QOBJECT(value), qapi)

static QmpOutputVisitor *to_qov(Visitor *v)
static QObjectOutputVisitor *to_qov(Visitor *v)
{
return container_of(v, QmpOutputVisitor, visitor);
return container_of(v, QObjectOutputVisitor, visitor);
}

/* Push @value onto the stack of current QObjects being built */
static void qmp_output_push_obj(QmpOutputVisitor *qov, QObject *value,
void *qapi)
static void qobject_output_push_obj(QObjectOutputVisitor *qov, QObject *value,
void *qapi)
{
QStackEntry *e = g_malloc0(sizeof(*e));

Expand All @@ -58,7 +56,7 @@ static void qmp_output_push_obj(QmpOutputVisitor *qov, QObject *value,
}

/* Pop a value off the stack of QObjects being built, and return it. */
static QObject *qmp_output_pop(QmpOutputVisitor *qov, void *qapi)
static QObject *qobject_output_pop(QObjectOutputVisitor *qov, void *qapi)
{
QStackEntry *e = QSLIST_FIRST(&qov->stack);
QObject *value;
Expand All @@ -75,8 +73,8 @@ static QObject *qmp_output_pop(QmpOutputVisitor *qov, void *qapi)
/* Add @value to the current QObject being built.
* If the stack is visiting a dictionary or list, @value is now owned
* by that container. Otherwise, @value is now the root. */
static void qmp_output_add_obj(QmpOutputVisitor *qov, const char *name,
QObject *value)
static void qobject_output_add_obj(QObjectOutputVisitor *qov, const char *name,
QObject *value)
{
QStackEntry *e = QSLIST_FIRST(&qov->stack);
QObject *cur = e ? e->value : NULL;
Expand All @@ -101,107 +99,107 @@ static void qmp_output_add_obj(QmpOutputVisitor *qov, const char *name,
}
}

static void qmp_output_start_struct(Visitor *v, const char *name, void **obj,
size_t unused, Error **errp)
static void qobject_output_start_struct(Visitor *v, const char *name,
void **obj, size_t unused, Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
QObjectOutputVisitor *qov = to_qov(v);
QDict *dict = qdict_new();

qmp_output_add(qov, name, dict);
qmp_output_push(qov, dict, obj);
qobject_output_add(qov, name, dict);
qobject_output_push(qov, dict, obj);
}

static void qmp_output_end_struct(Visitor *v, void **obj)
static void qobject_output_end_struct(Visitor *v, void **obj)
{
QmpOutputVisitor *qov = to_qov(v);
QObject *value = qmp_output_pop(qov, obj);
QObjectOutputVisitor *qov = to_qov(v);
QObject *value = qobject_output_pop(qov, obj);
assert(qobject_type(value) == QTYPE_QDICT);
}

static void qmp_output_start_list(Visitor *v, const char *name,
GenericList **listp, size_t size,
Error **errp)
static void qobject_output_start_list(Visitor *v, const char *name,
GenericList **listp, size_t size,
Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
QObjectOutputVisitor *qov = to_qov(v);
QList *list = qlist_new();

qmp_output_add(qov, name, list);
qmp_output_push(qov, list, listp);
qobject_output_add(qov, name, list);
qobject_output_push(qov, list, listp);
}

static GenericList *qmp_output_next_list(Visitor *v, GenericList *tail,
size_t size)
static GenericList *qobject_output_next_list(Visitor *v, GenericList *tail,
size_t size)
{
return tail->next;
}

static void qmp_output_end_list(Visitor *v, void **obj)
static void qobject_output_end_list(Visitor *v, void **obj)
{
QmpOutputVisitor *qov = to_qov(v);
QObject *value = qmp_output_pop(qov, obj);
QObjectOutputVisitor *qov = to_qov(v);
QObject *value = qobject_output_pop(qov, obj);
assert(qobject_type(value) == QTYPE_QLIST);
}

static void qmp_output_type_int64(Visitor *v, const char *name, int64_t *obj,
Error **errp)
static void qobject_output_type_int64(Visitor *v, const char *name,
int64_t *obj, Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
qmp_output_add(qov, name, qint_from_int(*obj));
QObjectOutputVisitor *qov = to_qov(v);
qobject_output_add(qov, name, qint_from_int(*obj));
}

static void qmp_output_type_uint64(Visitor *v, const char *name, uint64_t *obj,
Error **errp)
static void qobject_output_type_uint64(Visitor *v, const char *name,
uint64_t *obj, Error **errp)
{
/* FIXME values larger than INT64_MAX become negative */
QmpOutputVisitor *qov = to_qov(v);
qmp_output_add(qov, name, qint_from_int(*obj));
QObjectOutputVisitor *qov = to_qov(v);
qobject_output_add(qov, name, qint_from_int(*obj));
}

static void qmp_output_type_bool(Visitor *v, const char *name, bool *obj,
Error **errp)
static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
qmp_output_add(qov, name, qbool_from_bool(*obj));
QObjectOutputVisitor *qov = to_qov(v);
qobject_output_add(qov, name, qbool_from_bool(*obj));
}

static void qmp_output_type_str(Visitor *v, const char *name, char **obj,
Error **errp)
static void qobject_output_type_str(Visitor *v, const char *name, char **obj,
Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
QObjectOutputVisitor *qov = to_qov(v);
if (*obj) {
qmp_output_add(qov, name, qstring_from_str(*obj));
qobject_output_add(qov, name, qstring_from_str(*obj));
} else {
qmp_output_add(qov, name, qstring_from_str(""));
qobject_output_add(qov, name, qstring_from_str(""));
}
}

static void qmp_output_type_number(Visitor *v, const char *name, double *obj,
Error **errp)
static void qobject_output_type_number(Visitor *v, const char *name,
double *obj, Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
qmp_output_add(qov, name, qfloat_from_double(*obj));
QObjectOutputVisitor *qov = to_qov(v);
qobject_output_add(qov, name, qfloat_from_double(*obj));
}

static void qmp_output_type_any(Visitor *v, const char *name, QObject **obj,
Error **errp)
static void qobject_output_type_any(Visitor *v, const char *name,
QObject **obj, Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
QObjectOutputVisitor *qov = to_qov(v);
qobject_incref(*obj);
qmp_output_add_obj(qov, name, *obj);
qobject_output_add_obj(qov, name, *obj);
}

static void qmp_output_type_null(Visitor *v, const char *name, Error **errp)
static void qobject_output_type_null(Visitor *v, const char *name, Error **errp)
{
QmpOutputVisitor *qov = to_qov(v);
qmp_output_add_obj(qov, name, qnull());
QObjectOutputVisitor *qov = to_qov(v);
qobject_output_add_obj(qov, name, qnull());
}

/* Finish building, and return the root object.
* The root object is never null. The caller becomes the object's
* owner, and should use qobject_decref() when done with it. */
static void qmp_output_complete(Visitor *v, void *opaque)
static void qobject_output_complete(Visitor *v, void *opaque)
{
QmpOutputVisitor *qov = to_qov(v);
QObjectOutputVisitor *qov = to_qov(v);

/* A visit must have occurred, with each start paired with end. */
assert(qov->root && QSLIST_EMPTY(&qov->stack));
Expand All @@ -212,9 +210,9 @@ static void qmp_output_complete(Visitor *v, void *opaque)
qov->result = NULL;
}

static void qmp_output_free(Visitor *v)
static void qobject_output_free(Visitor *v)
{
QmpOutputVisitor *qov = to_qov(v);
QObjectOutputVisitor *qov = to_qov(v);
QStackEntry *e;

while (!QSLIST_EMPTY(&qov->stack)) {
Expand All @@ -227,27 +225,27 @@ static void qmp_output_free(Visitor *v)
g_free(qov);
}

Visitor *qmp_output_visitor_new(QObject **result)
Visitor *qobject_output_visitor_new(QObject **result)
{
QmpOutputVisitor *v;
QObjectOutputVisitor *v;

v = g_malloc0(sizeof(*v));

v->visitor.type = VISITOR_OUTPUT;
v->visitor.start_struct = qmp_output_start_struct;
v->visitor.end_struct = qmp_output_end_struct;
v->visitor.start_list = qmp_output_start_list;
v->visitor.next_list = qmp_output_next_list;
v->visitor.end_list = qmp_output_end_list;
v->visitor.type_int64 = qmp_output_type_int64;
v->visitor.type_uint64 = qmp_output_type_uint64;
v->visitor.type_bool = qmp_output_type_bool;
v->visitor.type_str = qmp_output_type_str;
v->visitor.type_number = qmp_output_type_number;
v->visitor.type_any = qmp_output_type_any;
v->visitor.type_null = qmp_output_type_null;
v->visitor.complete = qmp_output_complete;
v->visitor.free = qmp_output_free;
v->visitor.start_struct = qobject_output_start_struct;
v->visitor.end_struct = qobject_output_end_struct;
v->visitor.start_list = qobject_output_start_list;
v->visitor.next_list = qobject_output_next_list;
v->visitor.end_list = qobject_output_end_list;
v->visitor.type_int64 = qobject_output_type_int64;
v->visitor.type_uint64 = qobject_output_type_uint64;
v->visitor.type_bool = qobject_output_type_bool;
v->visitor.type_str = qobject_output_type_str;
v->visitor.type_number = qobject_output_type_number;
v->visitor.type_any = qobject_output_type_any;
v->visitor.type_null = qobject_output_type_null;
v->visitor.complete = qobject_output_complete;
v->visitor.free = qobject_output_free;

*result = NULL;
v->result = result;
Expand Down
6 changes: 3 additions & 3 deletions qemu-img.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ static void dump_json_image_check(ImageCheck *check, bool quiet)
{
QString *str;
QObject *obj;
Visitor *v = qmp_output_visitor_new(&obj);
Visitor *v = qobject_output_visitor_new(&obj);

visit_type_ImageCheck(v, NULL, &check, &error_abort);
visit_complete(v, &obj);
Expand Down Expand Up @@ -2193,7 +2193,7 @@ static void dump_json_image_info_list(ImageInfoList *list)
{
QString *str;
QObject *obj;
Visitor *v = qmp_output_visitor_new(&obj);
Visitor *v = qobject_output_visitor_new(&obj);

visit_type_ImageInfoList(v, NULL, &list, &error_abort);
visit_complete(v, &obj);
Expand All @@ -2209,7 +2209,7 @@ static void dump_json_image_info(ImageInfo *info)
{
QString *str;
QObject *obj;
Visitor *v = qmp_output_visitor_new(&obj);
Visitor *v = qobject_output_visitor_new(&obj);

visit_type_ImageInfo(v, NULL, &info, &error_abort);
visit_complete(v, &obj);
Expand Down
2 changes: 1 addition & 1 deletion qom/qom-qobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ QObject *object_property_get_qobject(Object *obj, const char *name,
Error *local_err = NULL;
Visitor *v;

v = qmp_output_visitor_new(&ret);
v = qobject_output_visitor_new(&ret);
object_property_get(obj, v, name, &local_err);
if (!local_err) {
visit_complete(v, &ret);
Expand Down
2 changes: 1 addition & 1 deletion scripts/qapi-commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def gen_marshal_output(ret_type):
Error *err = NULL;
Visitor *v;
v = qmp_output_visitor_new(ret_out);
v = qobject_output_visitor_new(ret_out);
visit_type_%(c_name)s(v, "unused", &ret_in, &err);
if (!err) {
visit_complete(v, ret_out);
Expand Down
2 changes: 1 addition & 1 deletion scripts/qapi-event.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def gen_event_send(name, arg_type, boxed):

if arg_type and not arg_type.is_empty():
ret += mcgen('''
v = qmp_output_visitor_new(&obj);
v = qobject_output_visitor_new(&obj);
''')
if not arg_type.is_implicit():
ret += mcgen('''
Expand Down
2 changes: 1 addition & 1 deletion tests/check-qnull.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static void qnull_visit_test(void)
visit_type_null(v, NULL, &error_abort);
visit_free(v);

v = qmp_output_visitor_new(&obj);
v = qobject_output_visitor_new(&obj);
visit_type_null(v, NULL, &error_abort);
visit_complete(v, &obj);
g_assert(obj == &qnull_);
Expand Down
2 changes: 1 addition & 1 deletion tests/test-qobject-output-visitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ typedef struct TestOutputVisitorData {
static void visitor_output_setup(TestOutputVisitorData *data,
const void *unused)
{
data->ov = qmp_output_visitor_new(&data->obj);
data->ov = qobject_output_visitor_new(&data->obj);
g_assert(data->ov);
}

Expand Down
Loading

0 comments on commit 7d5e199

Please sign in to comment.