[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 05/15] qapi: add 'export-marshal' command key
From: |
marcandre . lureau |
Subject: |
[Qemu-devel] [PATCH v3 05/15] qapi: add 'export-marshal' command key |
Date: |
Mon, 8 Aug 2016 18:14:29 +0400 |
From: Marc-André Lureau <address@hidden>
When a command sets the 'export-marshal' key to true, the generated
marshaller will be exported, so it can be called from outside.
Signed-off-by: Marc-André Lureau <address@hidden>
---
scripts/qapi-commands.py | 27 ++++++++++++++-------------
scripts/qapi-introspect.py | 3 ++-
scripts/qapi.py | 15 ++++++++++-----
tests/qapi-schema/test-qapi.py | 2 +-
4 files changed, 27 insertions(+), 20 deletions(-)
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index a06a2c4..4f64c58 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -83,28 +83,28 @@ static void qmp_marshal_output_%(c_name)s(%(c_type)s
ret_in, QObject **ret_out,
c_type=ret_type.c_type(), c_name=ret_type.c_name())
-def gen_marshal_proto(name):
- ret = 'void qmp_marshal_%s(QDict *args, QObject **ret, Error **errp)' %
c_name(name)
- if not middle_mode:
- ret = 'static ' + ret
- return ret
+def gen_marshal_proto(name, export):
+ return mcgen('%(export)svoid qmp_marshal_%(c_name)s(QDict *args, '
+ 'QObject **ret, Error **errp)',
+ c_name=c_name(name),
+ export="" if export else "static ")
-def gen_marshal_decl(name):
+def gen_marshal_decl(name, export):
return mcgen('''
%(proto)s;
''',
- proto=gen_marshal_proto(name))
+ proto=gen_marshal_proto(name, export))
-def gen_marshal(name, arg_type, boxed, ret_type):
+def gen_marshal(name, arg_type, boxed, ret_type, export):
ret = mcgen('''
%(proto)s
{
Error *err = NULL;
''',
- proto=gen_marshal_proto(name))
+ proto=gen_marshal_proto(name, export))
if ret_type:
ret += mcgen('''
@@ -215,16 +215,17 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
self._visited_ret_types = None
def visit_command(self, name, info, arg_type, ret_type,
- gen, success_response, boxed):
+ gen, success_response, boxed, export_marshal):
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)
- if middle_mode:
- self.decl += gen_marshal_decl(name)
- self.defn += gen_marshal(name, arg_type, boxed, ret_type)
+ export = middle_mode or export_marshal
+ if export:
+ self.decl += gen_marshal_decl(name, True)
+ self.defn += gen_marshal(name, arg_type, boxed, ret_type, export)
if not middle_mode:
self._regy += gen_register_command(name, success_response)
diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py
index 541644e..3c85be0 100644
--- a/scripts/qapi-introspect.py
+++ b/scripts/qapi-introspect.py
@@ -154,7 +154,8 @@ const char %(c_name)s[] = %(c_string)s;
for m in variants.variants]})
def visit_command(self, name, info, arg_type, ret_type,
- gen, success_response, boxed):
+ gen, success_response, boxed,
+ export_marshal):
arg_type = arg_type or self._schema.the_empty_object_type
ret_type = ret_type or self._schema.the_empty_object_type
self._gen_json(name, 'command',
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 21bc32f..1d82e71 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -737,7 +737,8 @@ def check_exprs(exprs):
add_struct(expr, info)
elif 'command' in expr:
check_keys(expr_elem, 'command', [],
- ['data', 'returns', 'gen', 'success-response', 'boxed'])
+ ['data', 'returns', 'gen', 'success-response', 'boxed',
+ 'export-marshal'])
add_name(expr['command'], info, 'command')
elif 'event' in expr:
check_keys(expr_elem, 'event', [], ['data', 'boxed'])
@@ -838,7 +839,7 @@ class QAPISchemaVisitor(object):
pass
def visit_command(self, name, info, arg_type, ret_type,
- gen, success_response, boxed):
+ gen, success_response, boxed, export_marshal):
pass
def visit_event(self, name, info, arg_type, boxed):
@@ -1181,7 +1182,7 @@ class QAPISchemaAlternateType(QAPISchemaType):
class QAPISchemaCommand(QAPISchemaEntity):
def __init__(self, name, info, arg_type, ret_type, gen, success_response,
- boxed):
+ boxed, export_marshal):
QAPISchemaEntity.__init__(self, name, info)
assert not arg_type or isinstance(arg_type, str)
assert not ret_type or isinstance(ret_type, str)
@@ -1192,6 +1193,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
self.gen = gen
self.success_response = success_response
self.boxed = boxed
+ self.export_marshal = export_marshal
def check(self, schema):
if self._arg_type_name:
@@ -1216,7 +1218,8 @@ class QAPISchemaCommand(QAPISchemaEntity):
def visit(self, visitor):
visitor.visit_command(self.name, self.info,
self.arg_type, self.ret_type,
- self.gen, self.success_response, self.boxed)
+ self.gen, self.success_response, self.boxed,
+ self.export_marshal)
class QAPISchemaEvent(QAPISchemaEntity):
@@ -1422,6 +1425,7 @@ class QAPISchema(object):
gen = expr.get('gen', True)
success_response = expr.get('success-response', True)
boxed = expr.get('boxed', False)
+ export_marshal = expr.get('export-marshal', False)
if isinstance(data, OrderedDict):
data = self._make_implicit_object_type(
name, info, 'arg', self._make_members(data, info))
@@ -1429,7 +1433,8 @@ class QAPISchema(object):
assert len(rets) == 1
rets = self._make_array_type(rets[0], info)
self._def_entity(QAPISchemaCommand(name, info, data, rets, gen,
- success_response, boxed))
+ success_response, boxed,
+ export_marshal))
def _def_event(self, expr, info):
name = expr['event']
diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py
index ef74e2c..02c6686 100644
--- a/tests/qapi-schema/test-qapi.py
+++ b/tests/qapi-schema/test-qapi.py
@@ -36,7 +36,7 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
self._print_variants(variants)
def visit_command(self, name, info, arg_type, ret_type,
- gen, success_response, boxed):
+ gen, success_response, boxed, export_marshal):
print 'command %s %s -> %s' % \
(name, arg_type and arg_type.name, ret_type and ret_type.name)
print ' gen=%s success_response=%s boxed=%s' % \
--
2.9.0
- [Qemu-devel] [PATCH v3 00/15] qapi: remove the 'middle' mode, marcandre . lureau, 2016/08/08
- [Qemu-devel] [PATCH v3 06/15] monitor: register the qapi generated commands, marcandre . lureau, 2016/08/08
- [Qemu-devel] [PATCH v3 07/15] monitor: remove mhandler.cmd_new, marcandre . lureau, 2016/08/08
- [Qemu-devel] [PATCH v3 08/15] monitor: implement 'qmp_query_commands' without qmp_cmds, marcandre . lureau, 2016/08/08
- [Qemu-devel] [PATCH v3 09/15] qapi: remove the "middle" mode, marcandre . lureau, 2016/08/08
- [Qemu-devel] [PATCH v3 10/15] qapi: check invalid arguments on no-args commands, marcandre . lureau, 2016/08/08