qapi-commands: Inline single-use helpers of gen_marshal()
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 <eblake@redhat.com>
Message-Id: <1458254921-17042-10-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
386230a249
commit
c1ff0e6c85
@ -55,68 +55,6 @@ def gen_call(name, arg_type, ret_type):
|
|||||||
return ret
|
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):
|
def gen_marshal_output(ret_type):
|
||||||
return mcgen('''
|
return mcgen('''
|
||||||
|
|
||||||
@ -165,15 +103,40 @@ def gen_marshal(name, arg_type, ret_type):
|
|||||||
|
|
||||||
%(proto)s
|
%(proto)s
|
||||||
{
|
{
|
||||||
|
Error *err = NULL;
|
||||||
''',
|
''',
|
||||||
proto=gen_marshal_proto(name))
|
proto=gen_marshal_proto(name))
|
||||||
|
|
||||||
ret += gen_marshal_vars(arg_type, ret_type)
|
if ret_type:
|
||||||
ret += gen_marshal_input_visit(arg_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)
|
ret += gen_call(name, arg_type, ret_type)
|
||||||
|
|
||||||
# 'goto out' produced by gen_marshal_input_visit->gen_visit_members()
|
# 'goto out' produced above for arg_type, and by gen_call() for ret_type
|
||||||
# for each arg_type member, and by gen_call() for ret_type
|
|
||||||
if (arg_type and arg_type.members) or ret_type:
|
if (arg_type and arg_type.members) or ret_type:
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
|
|
||||||
@ -182,7 +145,16 @@ out:
|
|||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
error_propagate(errp, err);
|
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('''
|
ret += mcgen('''
|
||||||
}
|
}
|
||||||
''')
|
''')
|
||||||
|
Loading…
Reference in New Issue
Block a user