aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-09-24 10:46:33 +0100
committerPeter Maydell <peter.maydell@linaro.org>2018-09-24 10:46:33 +0100
commit850a8242a5303ceddff5d6700ee9d15307bf1b9f (patch)
treedbd6f7fb342fd254e60f8caf6819d4c53174ad6c /scripts
parent19b599f7664b2ebfd0f405fb79c14dd241557452 (diff)
parent8c643361eeba94b7b831ad95b70969d962034345 (diff)
downloadqemu-850a8242a5303ceddff5d6700ee9d15307bf1b9f.zip
qemu-850a8242a5303ceddff5d6700ee9d15307bf1b9f.tar.gz
qemu-850a8242a5303ceddff5d6700ee9d15307bf1b9f.tar.bz2
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2018-08-28' into staging
QAPI patches for 2018-08-28 # gpg: Signature made Tue 28 Aug 2018 17:23:32 BST # gpg: using RSA key 3870B400EB918653 # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-qapi-2018-08-28: qapi: Add comments to aid debugging generated introspection qapi: Minor introspect.py cleanups qapi: Update docs for generator changes since commit 9ee86b85267 qapi: Emit a blank line before dummy declaration qapi: Drop qapi_event_send_FOO()'s Error ** argument qapi: Fix build_params() for empty parameter list Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/qapi/common.py11
-rw-r--r--scripts/qapi/events.py23
-rw-r--r--scripts/qapi/introspect.py34
3 files changed, 35 insertions, 33 deletions
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 02c5c67..7b62a4c 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -2070,16 +2070,14 @@ extern const QEnumLookup %(c_name)s_lookup;
return ret
-def build_params(arg_type, boxed, extra):
- if not arg_type:
- assert not boxed
- return extra
+def build_params(arg_type, boxed, extra=None):
ret = ''
sep = ''
if boxed:
+ assert arg_type
ret += '%s arg' % arg_type.c_param_type()
sep = ', '
- else:
+ elif arg_type:
assert not arg_type.variants
for memb in arg_type.members:
ret += sep
@@ -2090,7 +2088,7 @@ def build_params(arg_type, boxed, extra):
c_name(memb.name))
if extra:
ret += sep + extra
- return ret
+ return ret if ret else 'void'
#
@@ -2220,6 +2218,7 @@ class QAPIGenC(QAPIGenCCode):
def _bottom(self, fname):
return mcgen('''
+
/* Dummy declaration to prevent empty .o file */
char dummy_%(name)s;
''',
diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py
index 764ef17..2ed7902 100644
--- a/scripts/qapi/events.py
+++ b/scripts/qapi/events.py
@@ -18,7 +18,7 @@ from qapi.common import *
def build_event_send_proto(name, arg_type, boxed):
return 'void qapi_event_send_%(c_name)s(%(param)s)' % {
'c_name': c_name(name.lower()),
- 'param': build_params(arg_type, boxed, 'Error **errp')}
+ 'param': build_params(arg_type, boxed)}
def gen_event_send_decl(name, arg_type, boxed):
@@ -70,7 +70,6 @@ def gen_event_send(name, arg_type, boxed, event_enum_name):
%(proto)s
{
QDict *qmp;
- Error *err = NULL;
QMPEventFuncEmit emit;
''',
proto=build_event_send_proto(name, arg_type, boxed))
@@ -103,45 +102,35 @@ def gen_event_send(name, arg_type, boxed, event_enum_name):
''')
if not arg_type.is_implicit():
ret += mcgen('''
- visit_type_%(c_name)s(v, "%(name)s", &arg, &err);
+ visit_type_%(c_name)s(v, "%(name)s", &arg, &error_abort);
''',
name=name, c_name=arg_type.c_name())
else:
ret += mcgen('''
- visit_start_struct(v, "%(name)s", NULL, 0, &err);
- if (err) {
- goto out;
- }
- visit_type_%(c_name)s_members(v, &param, &err);
- if (!err) {
- visit_check_struct(v, &err);
- }
+ visit_start_struct(v, "%(name)s", NULL, 0, &error_abort);
+ visit_type_%(c_name)s_members(v, &param, &error_abort);
+ visit_check_struct(v, &error_abort);
visit_end_struct(v, NULL);
''',
name=name, c_name=arg_type.c_name())
ret += mcgen('''
- if (err) {
- goto out;
- }
visit_complete(v, &obj);
qdict_put_obj(qmp, "data", obj);
''')
ret += mcgen('''
- emit(%(c_enum)s, qmp, &err);
+ emit(%(c_enum)s, qmp);
''',
c_enum=c_enum_const(event_enum_name, name))
if arg_type and not arg_type.is_empty():
ret += mcgen('''
-out:
visit_free(v);
''')
ret += mcgen('''
- error_propagate(errp, err);
qobject_unref(qmp);
}
''')
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 189a4ed..67d6106 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -19,12 +19,17 @@ def to_qlit(obj, level=0, suppress_first_indent=False):
return level * 4 * ' '
if isinstance(obj, tuple):
- ifobj, ifcond = obj
- ret = gen_if(ifcond)
+ ifobj, extra = obj
+ ifcond = extra.get('if')
+ comment = extra.get('comment')
+ ret = ''
+ if comment:
+ ret += indent(level) + '/* %s */\n' % comment
+ if ifcond:
+ ret += gen_if(ifcond)
ret += to_qlit(ifobj, level)
- endif = gen_endif(ifcond)
- if endif:
- ret += '\n' + endif
+ if ifcond:
+ ret += '\n' + gen_endif(ifcond)
return ret
ret = ''
@@ -89,7 +94,6 @@ class QAPISchemaGenIntrospectVisitor(QAPISchemaMonolithicCVisitor):
for typ in self._used_types:
typ.visit(self)
# generate C
- # TODO can generate awfully long lines
name = c_name(self._prefix, protect=False) + 'qmp_schema_qlit'
self._genh.add(mcgen('''
#include "qapi/qmp/qlit.h"
@@ -129,8 +133,8 @@ const QLitObject %(c_name)s = %(c_string)s;
if typ not in self._used_types:
self._used_types.append(typ)
# Clients should examine commands and events, not types. Hide
- # type names to reduce the temptation. Also saves a few
- # characters.
+ # type names as integers to reduce the temptation. Also, it
+ # saves a few characters on the wire.
if isinstance(typ, QAPISchemaBuiltinType):
return typ.name
if isinstance(typ, QAPISchemaArrayType):
@@ -138,11 +142,21 @@ const QLitObject %(c_name)s = %(c_string)s;
return self._name(typ.name)
def _gen_qlit(self, name, mtype, obj, ifcond):
+ extra = {}
if mtype not in ('command', 'event', 'builtin', 'array'):
+ if not self._unmask:
+ # Output a comment to make it easy to map masked names
+ # back to the source when reading the generated output.
+ extra['comment'] = '"%s" = %s' % (self._name(name), name)
name = self._name(name)
obj['name'] = name
obj['meta-type'] = mtype
- self._qlits.append((obj, ifcond))
+ if ifcond:
+ extra['if'] = ifcond
+ if extra:
+ self._qlits.append((obj, extra))
+ else:
+ self._qlits.append(obj)
def _gen_member(self, member):
ret = {'name': member.name, 'type': self._use_type(member.type)}
@@ -185,7 +199,7 @@ const QLitObject %(c_name)s = %(c_string)s;
arg_type = arg_type or self._schema.the_empty_object_type
ret_type = ret_type or self._schema.the_empty_object_type
obj = {'arg-type': self._use_type(arg_type),
- 'ret-type': self._use_type(ret_type) }
+ 'ret-type': self._use_type(ret_type)}
if allow_oob:
obj['allow-oob'] = allow_oob
self._gen_qlit(name, 'command', obj, ifcond)