qapi/commands: add #if conditions to commands
Wrap generated code with #if/#endif using an 'ifcontext' on QAPIGenCSnippet objects. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20180703155648.11933-10-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Line breaks tweaked] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
d626b6c1ae
commit
1f7b9f3181
@ -239,7 +239,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
||||
QAPISchemaModularCVisitor.__init__(
|
||||
self, prefix, 'qapi-commands',
|
||||
' * Schema-defined QAPI/QMP commands', __doc__)
|
||||
self._regy = ''
|
||||
self._regy = QAPIGenCCode()
|
||||
self._visited_ret_types = {}
|
||||
|
||||
def _begin_module(self, name):
|
||||
@ -275,20 +275,28 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
||||
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
|
||||
''',
|
||||
c_prefix=c_name(self._prefix, protect=False)))
|
||||
genc.add(gen_registry(self._regy, self._prefix))
|
||||
genc.add(gen_registry(self._regy.get_content(), self._prefix))
|
||||
|
||||
def visit_command(self, name, info, ifcond, arg_type, ret_type, gen,
|
||||
success_response, boxed, allow_oob, allow_preconfig):
|
||||
if not gen:
|
||||
return
|
||||
self._genh.add(gen_command_decl(name, arg_type, boxed, ret_type))
|
||||
# FIXME: If T is a user-defined type, the user is responsible
|
||||
# for making this work, i.e. to make T's condition the
|
||||
# conjunction of the T-returning commands' conditions. If T
|
||||
# is a built-in type, this isn't possible: the
|
||||
# qmp_marshal_output_T() will be generated unconditionally.
|
||||
if ret_type and ret_type not in self._visited_ret_types[self._genc]:
|
||||
self._visited_ret_types[self._genc].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, allow_oob,
|
||||
allow_preconfig)
|
||||
with ifcontext(ret_type.ifcond,
|
||||
self._genh, self._genc, self._regy):
|
||||
self._genc.add(gen_marshal_output(ret_type))
|
||||
with ifcontext(ifcond, self._genh, self._genc, self._regy):
|
||||
self._genh.add(gen_command_decl(name, arg_type, boxed, ret_type))
|
||||
self._genh.add(gen_marshal_decl(name))
|
||||
self._genc.add(gen_marshal(name, arg_type, boxed, ret_type))
|
||||
self._regy.add(gen_register_command(name, success_response,
|
||||
allow_oob, allow_preconfig))
|
||||
|
||||
|
||||
def gen_commands(schema, output_dir, prefix):
|
||||
|
@ -12,12 +12,12 @@
|
||||
|
||||
static QmpCommandList qmp_commands;
|
||||
|
||||
/* #if defined(TEST_IF_STRUCT) && defined(TEST_IF_CMD) */
|
||||
#if defined(TEST_IF_STRUCT) && defined(TEST_IF_CMD)
|
||||
UserDefThree *qmp_TestIfCmd(TestIfStruct *foo, Error **errp)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
/* #endif */
|
||||
#endif
|
||||
|
||||
UserDefThree *qmp_TestCmdReturnDefThree(Error **errp)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user