[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 09/16] qapi-commands: Inline single-use helpers o
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v6 09/16] qapi-commands: Inline single-use helpers of gen_marshal() |
Date: |
Thu, 17 Mar 2016 16:48:34 -0600 |
Originally, gen_marshal_input_visit() (or gen_visitor_input_block()
before commit f1538019) was factored out to make it easy to do two
passes of a visit to each member of a (possibly-implicit) object,
without duplicating lots of code. But after recent changes, those
visits now occupy a single line of emitted code, and the helper
method has become a series of conditionals both before and after
the one important line, making it rather awkward to see at a glance
what gets emitted on the first (parsing) or second (deallocation)
pass. It's a lot easier to read the generator code if we just
inline both uses directly into gen_marshal(), without all the
conditionals.
Once we've done that, it's easy to notice that gen_marshal_vars()
is used only once, and inlining it too lets us consolidate some
mcgen() calls that used to be split across helpers.
gen_call() remains a single-use helper function, but it has
enough indentation and complexity that inlining it would hamper
legibility.
No change to generated output. The fact that the diffstat shows
a net reduction in lines is an argument in favor of this cleanup.
Signed-off-by: Eric Blake <address@hidden>
---
v6: rebase to earlier changes
v5: no change
v4: new patch
---
scripts/qapi-commands.py | 106 +++++++++++++++++------------------------------
1 file changed, 39 insertions(+), 67 deletions(-)
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 28b9cbe..b570069 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -55,68 +55,6 @@ def gen_call(name, arg_type, ret_type):
return ret
-def gen_marshal_vars(arg_type, ret_type):
- ret = mcgen('''
- Error *err = NULL;
-''')
-
- if ret_type:
- ret += mcgen('''
- %(c_type)s retval;
-''',
- c_type=ret_type.c_type())
-
- if arg_type and arg_type.members:
- ret += mcgen('''
- QmpInputVisitor *qiv = qmp_input_visitor_new_strict(QOBJECT(args));
- QapiDeallocVisitor *qdv;
- Visitor *v;
- %(c_name)s arg = {0};
-
-''',
- c_name=arg_type.c_name())
- else:
- ret += mcgen('''
-
- (void)args;
-''')
-
- return ret
-
-
-def gen_marshal_input_visit(arg_type, dealloc=False):
- ret = ''
-
- if not arg_type or not arg_type.members:
- return ret
-
- if dealloc:
- ret += mcgen('''
- qmp_input_visitor_cleanup(qiv);
- qdv = qapi_dealloc_visitor_new();
- v = qapi_dealloc_get_visitor(qdv);
-''')
- errp = 'NULL'
- else:
- ret += mcgen('''
- v = qmp_input_get_visitor(qiv);
-''')
- errp = '&err'
-
- ret += mcgen('''
- visit_type_%(c_name)s_members(v, &arg, %(errp)s);
-''',
- c_name=arg_type.c_name(), errp=errp)
-
- if dealloc:
- ret += mcgen('''
- qapi_dealloc_visitor_cleanup(qdv);
-''')
- else:
- ret += gen_err_check()
- return ret
-
-
def gen_marshal_output(ret_type):
return mcgen('''
@@ -165,15 +103,40 @@ def gen_marshal(name, arg_type, ret_type):
%(proto)s
{
+ Error *err = NULL;
''',
proto=gen_marshal_proto(name))
- ret += gen_marshal_vars(arg_type, ret_type)
- ret += gen_marshal_input_visit(arg_type)
+ if ret_type:
+ ret += mcgen('''
+ %(c_type)s retval;
+''',
+ c_type=ret_type.c_type())
+
+ if arg_type and arg_type.members:
+ ret += mcgen('''
+ QmpInputVisitor *qiv = qmp_input_visitor_new_strict(QOBJECT(args));
+ QapiDeallocVisitor *qdv;
+ Visitor *v;
+ %(c_name)s arg = {0};
+
+ v = qmp_input_get_visitor(qiv);
+ visit_type_%(c_name)s_members(v, &arg, &err);
+ if (err) {
+ goto out;
+ }
+''',
+ c_name=arg_type.c_name())
+
+ else:
+ ret += mcgen('''
+
+ (void)args;
+''')
+
ret += gen_call(name, arg_type, ret_type)
- # 'goto out' produced by gen_marshal_input_visit->gen_visit_members()
- # for each arg_type member, and by gen_call() for ret_type
+ # 'goto out' produced above for arg_type, and by gen_call() for ret_type
if (arg_type and arg_type.members) or ret_type:
ret += mcgen('''
@@ -182,7 +145,16 @@ out:
ret += mcgen('''
error_propagate(errp, err);
''')
- ret += gen_marshal_input_visit(arg_type, dealloc=True)
+ if arg_type and arg_type.members:
+ ret += mcgen('''
+ qmp_input_visitor_cleanup(qiv);
+ qdv = qapi_dealloc_visitor_new();
+ v = qapi_dealloc_get_visitor(qdv);
+ visit_type_%(c_name)s_members(v, &arg, NULL);
+ qapi_dealloc_visitor_cleanup(qdv);
+''',
+ c_name=arg_type.c_name())
+
ret += mcgen('''
}
''')
--
2.5.0
- [Qemu-devel] [PATCH v6 00/16] easier unboxed visits/qapi implicit types, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 01/16] qapi: Assert in places where variants are not handled, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 06/16] qapi-event: Drop qmp_output_get_qobject() null check, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 02/16] qapi: Fix command with named empty argument type, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 07/16] qapi-event: Utilize implicit struct visits, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 09/16] qapi-commands: Inline single-use helpers of gen_marshal(),
Eric Blake <=
- [Qemu-devel] [PATCH v6 13/16] qapi: Make BlockdevOptions doc example closer to reality, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 16/16] qapi: Consolidate object visitors, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 11/16] qapi: Drop unused c_null(), Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 04/16] qapi: Adjust names of implicit types, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 03/16] qapi: Make c_type() more OO-like, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 10/16] qapi: Inline gen_visit_members() into lone caller, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 05/16] qapi: Emit implicit structs in generated C, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 08/16] qapi-commands: Utilize implicit struct visits, Eric Blake, 2016/03/17
- [Qemu-devel] [PATCH v6 14/16] qapi: Allow anonymous base for flat union, Eric Blake, 2016/03/17