Consolidate the code between visit and command marshalling that iterates over the members of a struct. It reduces code duplication in the generator, with no change to generated marshal code, and slightly more verbose (but no semantic change) in the generated visit code:
| visit_optional(v, &(*obj)->has_device, "device", &err); |- if (!err && (*obj)->has_device) { |- visit_type_str(v, &(*obj)->device, "device", &err); |- } | if (err) { | goto out; | } |+ if ((*obj)->has_device) { |+ visit_type_str(v, &(*obj)->device, "device", &err); |+ if (err) { |+ goto out; |+ } |+ } Signed-off-by: Eric Blake <ebl...@redhat.com> --- scripts/qapi-commands.py | 35 +---------------------------------- scripts/qapi-visit.py | 26 +------------------------- scripts/qapi.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 59 deletions(-) diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index a30f79a..3eb3704 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -23,16 +23,6 @@ def gen_command_decl(name, arg_type, box, ret_type): c_name=c_name(name), params=gen_params(arg_type, box, 'Error **errp')) -def gen_err_check(err): - if not err: - return '' - return mcgen(''' -if (%(err)s) { - goto out; -} -''', - err=err) - def gen_call(name, arg_type, box, ret_type): ret = '' @@ -145,30 +135,7 @@ visit_type_%(c_name)s(v, &arg, NULL, %(errp)s); c_name=arg_type.c_name(), errp=errparg) ret += gen_err_check(errarg) else: - for memb in arg_type.members: - if memb.optional: - ret += mcgen(''' -visit_optional(v, &has_%(c_name)s, "%(name)s", %(errp)s); -''', - c_name=c_name(memb.name), name=memb.name, - errp=errparg) - ret += gen_err_check(errarg) - ret += mcgen(''' -if (has_%(c_name)s) { -''', - c_name=c_name(memb.name)) - push_indent() - ret += mcgen(''' -visit_type_%(c_type)s(v, &%(c_name)s, "%(name)s", %(errp)s); -''', - c_name=c_name(memb.name), name=memb.name, - c_type=memb.type.c_name(), errp=errparg) - ret += gen_err_check(errarg) - if memb.optional: - pop_indent() - ret += mcgen(''' -} -''') + ret += gen_visit_fields(arg_type.members, '', errarg) if dealloc: ret += mcgen(''' diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index 1fe6c64..edf97cb 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -95,31 +95,7 @@ if (err) { ''', c_type=base.c_name()) - for memb in members: - if memb.optional: - ret += mcgen(''' -visit_optional(v, &(*obj)->has_%(c_name)s, "%(name)s", &err); -if (!err && (*obj)->has_%(c_name)s) { -''', - c_name=c_name(memb.name), name=memb.name) - push_indent() - - ret += mcgen(''' -visit_type_%(c_type)s(v, &(*obj)->%(c_name)s, "%(name)s", &err); -''', - c_type=memb.type.c_name(), c_name=c_name(memb.name), - name=memb.name) - - if memb.optional: - pop_indent() - ret += mcgen(''' -} -''') - ret += mcgen(''' -if (err) { - goto out; -} -''') + ret += gen_visit_fields(members, '(*obj)->', 'err') pop_indent() if base or members: diff --git a/scripts/qapi.py b/scripts/qapi.py index ac6d7f6..063d299 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -1456,6 +1456,51 @@ def gen_params(arg_type, box, extra): ret += sep + extra return ret +def gen_err_check(err): + if not err: + return '' + return mcgen(''' +if (%(err)s) { + goto out; +} +''', + err=err) + +def gen_visit_fields(members, prefix, errarg): + ret = '' + if errarg: + errparg = '&' + errarg + else: + errparg = 'NULL'; + for memb in members: + if memb.optional: + ret += mcgen(''' +visit_optional(v, &%(prefix)shas_%(c_name)s, "%(name)s", %(errp)s); +''', + prefix=prefix, c_name=c_name(memb.name), + name=memb.name, errp=errparg) + ret += gen_err_check(errarg) + ret += mcgen(''' +if (%(prefix)shas_%(c_name)s) { +''', + prefix=prefix, c_name=c_name(memb.name)) + push_indent() + + ret += mcgen(''' +visit_type_%(c_type)s(v, &%(prefix)s%(c_name)s, "%(name)s", %(errp)s); +''', + c_type=memb.type.c_name(), prefix=prefix, + c_name=c_name(memb.name), name=memb.name, + errp=errparg) + ret += gen_err_check(errarg) + + if memb.optional: + pop_indent() + ret += mcgen(''' +} +''') + return ret + # # Common command line parsing # -- 2.4.3