[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v12 14/18] qapi-commands: Wrap argument visit in vis
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v12 14/18] qapi-commands: Wrap argument visit in visit_start_struct |
Date: |
Mon, 29 Feb 2016 22:14:28 -0700 |
The qmp-input visitor was playing rather fast and loose: when
visiting a QDict, you could grab members of the root dictionary
without first pushing into the dict. But we are about to tighten
the input visitor, at which point the generated marshal code
MUST follow the same paradigms as everyone else, of pushing into
the struct before grabbing its keys, because the value of 'name'
should be ignored on the top-level visit.
It will also make things easier to follow when we introduce boxed
command parameters, where we call visit_type_FOO() instead of
individual members of FOO, since visit_type_FOO() also uses a
level of visit_start_struct() for handling the same QDict input.
Generated code grows as follows:
|@@ -63,18 +63,28 @@ void qmp_marshal_add_fd(QDict *args, QOb
| char *opaque = NULL;
|
| v = qmp_input_get_visitor(qiv);
|+ visit_start_struct(v, NULL, NULL, 0, &err);
|+ if (err) {
|+ goto out;
|+ }
| if (visit_optional(v, "fdset-id", &has_fdset_id)) {
| visit_type_int(v, "fdset-id", &fdset_id, &err);
| if (err) {
|- goto out;
|+ goto out_obj;
| }
| }
| if (visit_optional(v, "opaque", &has_opaque)) {
| visit_type_str(v, "opaque", &opaque, &err);
| if (err) {
|- goto out;
|+ goto out_obj;
| }
| }
|+ visit_check_struct(v, &err);
|+out_obj:
|+ visit_end_struct(v);
|+ if (err) {
|+ goto out;
|+ }
|
| retval = qmp_add_fd(has_fdset_id, fdset_id, has_opaque, opaque, &err);
Note that this change could also make it possible for the
marshalling code to automatically detect excess input at the top
level, and not just in nested dictionaries. However, that checking
is not currently useful (and we rely on the manual checking in
monitor.c:qmp_check_client_args() instead) as long as qmp-commands.hx
uses .args_type, and as long as we have 'name:O' as an arg-type that
explicitly allows unknown top-level keys because we haven't yet
converted 'device_add' and 'netdev_add' to introspectible use of
'any'.
Signed-off-by: Eric Blake <address@hidden>
---
v12: new patch
---
scripts/qapi-commands.py | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 7c9cfbf..a586676 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -109,14 +109,28 @@ def gen_marshal_input_visit(arg_type, dealloc=False):
else:
ret += mcgen('''
v = qmp_input_get_visitor(qiv);
+ visit_start_struct(v, NULL, NULL, 0, &err);
+ if (err) {
+ goto out;
+ }
''')
- ret += gen_visit_members(arg_type.members, skiperr=dealloc)
+ ret += gen_visit_members(arg_type.members, skiperr=dealloc,
+ label='out_obj')
if dealloc:
ret += mcgen('''
qapi_dealloc_visitor_cleanup(qdv);
''')
+ else:
+ ret += mcgen('''
+ visit_check_struct(v, &err);
+out_obj:
+ visit_end_struct(v);
+ if (err) {
+ goto out;
+ }
+''')
return ret
--
2.5.0
- [Qemu-devel] [PATCH v12 00/18] qapi visitor cleanups (post-introspection cleanups subset E), Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 03/18] qmp: Drop dead command->type, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 01/18] qapi-visit: Add visitor.type classification, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 10/18] qmp: Support explicit null during visits, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 05/18] qmp-input: Don't consume input when checking has_member, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 07/18] qapi: Document visitor interfaces, add assertions, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 02/18] qapi: Guarantee NULL obj on input visitor callback error, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 12/18] qmp: Tighten output visitor rules, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 14/18] qapi-commands: Wrap argument visit in visit_start_struct,
Eric Blake <=
- [Qemu-devel] [PATCH v12 15/18] qom: Wrap prop visit in visit_start_struct, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 16/18] qmp-input: Require struct push to visit members of top dict, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 04/18] qmp-input: Clean up stack handling, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 08/18] tests: Add check-qnull, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 11/18] spapr_drc: Expose 'null' in qom-get when there is no fdt, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 13/18] qapi: Split visit_end_struct() into pieces, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 18/18] qapi: Change visit_type_FOO() to no longer return partial objects, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 09/18] qapi: Add visit_type_null() visitor, Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 17/18] qapi: Simplify semantics of visit_next_list(), Eric Blake, 2016/03/01
- [Qemu-devel] [PATCH v12 06/18] qmp-input: Refactor when list is advanced, Eric Blake, 2016/03/01