diff options
author | Markus Armbruster <armbru@redhat.com> | 2018-02-26 13:50:08 -0600 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2018-03-02 13:14:10 -0600 |
commit | 71b3f0459c460c9e16a47372ccddbfa6e2c7aadf (patch) | |
tree | cd09eb26b84f76dbe839460bdb55a45e3f269dbc /scripts/qapi/commands.py | |
parent | 834a3f349806e543db5c347feef5ef8de0a78559 (diff) |
qapi: Make code-generating visitors use QAPIGen more
The use of QAPIGen is rather shallow so far: most of the output
accumulation is not converted. Take the next step: convert output
accumulation in the code-generating visitor classes. Helper functions
outside these classes are not converted.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20180211093607.27351-20-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
[eblake: rebase to earlier guardstart cleanup]
Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'scripts/qapi/commands.py')
-rw-r--r-- | scripts/qapi/commands.py | 71 |
1 files changed, 28 insertions, 43 deletions
diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py index 05fe33a03b..46757db771 100644 --- a/scripts/qapi/commands.py +++ b/scripts/qapi/commands.py @@ -223,44 +223,15 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds) return ret -class QAPISchemaGenCommandVisitor(QAPISchemaVisitor): +class QAPISchemaGenCommandVisitor(QAPISchemaMonolithicCVisitor): + def __init__(self, prefix): - self._prefix = prefix - self.decl = None - self.defn = None - self._regy = None - self._visited_ret_types = None - - def visit_begin(self, schema): - self.decl = '' - self.defn = '' + QAPISchemaMonolithicCVisitor.__init__( + self, prefix, 'qmp-commands', + ' * Schema-defined QAPI/QMP commands', __doc__) self._regy = '' self._visited_ret_types = set() - - def visit_end(self): - self.defn += gen_registry(self._regy, self._prefix) - self._regy = None - self._visited_ret_types = None - - def visit_command(self, name, info, arg_type, ret_type, - gen, success_response, boxed): - if not gen: - return - self.decl += gen_command_decl(name, arg_type, boxed, ret_type) - if ret_type and ret_type not in self._visited_ret_types: - self._visited_ret_types.add(ret_type) - self.defn += gen_marshal_output(ret_type) - self.decl += gen_marshal_decl(name) - self.defn += gen_marshal(name, arg_type, boxed, ret_type) - self._regy += gen_register_command(name, success_response) - - -def gen_commands(schema, output_dir, prefix): - blurb = ' * Schema-defined QAPI/QMP commands' - genc = QAPIGenC(blurb, __doc__) - genh = QAPIGenH(blurb, __doc__) - - genc.add(mcgen(''' + self._genc.add(mcgen(''' #include "qemu/osdep.h" #include "qemu-common.h" #include "qemu/module.h" @@ -275,19 +246,33 @@ def gen_commands(schema, output_dir, prefix): #include "%(prefix)sqmp-commands.h" ''', - prefix=prefix)) - - genh.add(mcgen(''' + prefix=prefix)) + self._genh.add(mcgen(''' #include "%(prefix)sqapi-types.h" #include "qapi/qmp/dispatch.h" void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds); ''', - prefix=prefix, c_prefix=c_name(prefix, protect=False))) + prefix=prefix, + c_prefix=c_name(prefix, protect=False))) + + def visit_end(self): + self._genc.add(gen_registry(self._regy, self._prefix)) + + def visit_command(self, name, info, arg_type, ret_type, + gen, success_response, boxed): + if not gen: + return + self._genh.add(gen_command_decl(name, arg_type, boxed, ret_type)) + if ret_type and ret_type not in self._visited_ret_types: + self._visited_ret_types.add(ret_type) + self._genc.add(gen_marshal_output(ret_type)) + self._genh.add(gen_marshal_decl(name)) + self._genc.add(gen_marshal(name, arg_type, boxed, ret_type)) + self._regy += gen_register_command(name, success_response) + +def gen_commands(schema, output_dir, prefix): vis = QAPISchemaGenCommandVisitor(prefix) schema.visit(vis) - genc.add(vis.defn) - genh.add(vis.decl) - genc.write(output_dir, prefix + 'qmp-commands.c') - genh.write(output_dir, prefix + 'qmp-commands.h') + vis.write(output_dir) |