mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
qapi: Clean up after recent conversions to QAPISchemaVisitor
Generate just 'FOO' instead of 'struct FOO' when possible. Drop helper functions that are now unused. Make pep8 and pylint reasonably happy. Rename generate_FOO() functions to gen_FOO() for consistency. Use more consistent and sensible variable names. Consistently use c_ for mapping keys when their value is a C identifier or type. Simplify gen_enum() and gen_visit_union() Consistently use single quotes for C text string literals. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <1442401589-24189-14-git-send-email-armbru@redhat.com> Reviewed-by: Daniel P. Berrange <berrange@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
5710153e73
commit
e98859a9b9
6 changed files with 276 additions and 329 deletions
|
@ -13,12 +13,13 @@
|
|||
|
||||
from qapi import *
|
||||
|
||||
def _generate_event_api_name(event_name, params):
|
||||
api_name = "void qapi_event_send_%s(" % c_name(event_name).lower();
|
||||
|
||||
def gen_event_send_proto(name, arg_type):
|
||||
api_name = "void qapi_event_send_%s(" % c_name(name).lower()
|
||||
l = len(api_name)
|
||||
|
||||
if params:
|
||||
for m in params.members:
|
||||
if arg_type:
|
||||
for m in arg_type.members:
|
||||
if m.optional:
|
||||
api_name += "bool has_%s,\n" % c_name(m.name)
|
||||
api_name += "".ljust(l)
|
||||
|
@ -28,53 +29,49 @@ def _generate_event_api_name(event_name, params):
|
|||
api_name += "".ljust(l)
|
||||
|
||||
api_name += "Error **errp)"
|
||||
return api_name;
|
||||
return api_name
|
||||
|
||||
|
||||
# Following are the core functions that generate C APIs to emit event.
|
||||
|
||||
def generate_event_declaration(api_name):
|
||||
def gen_event_send_decl(name, arg_type):
|
||||
return mcgen('''
|
||||
|
||||
%(api_name)s;
|
||||
%(proto)s;
|
||||
''',
|
||||
api_name = api_name)
|
||||
proto=gen_event_send_proto(name, arg_type))
|
||||
|
||||
def generate_event_implement(api_name, event_name, params):
|
||||
# step 1: declare any variables
|
||||
ret = mcgen("""
|
||||
|
||||
%(api_name)s
|
||||
def gen_event_send(name, arg_type):
|
||||
ret = mcgen('''
|
||||
|
||||
%(proto)s
|
||||
{
|
||||
QDict *qmp;
|
||||
Error *local_err = NULL;
|
||||
QMPEventFuncEmit emit;
|
||||
""",
|
||||
api_name = api_name)
|
||||
''',
|
||||
proto=gen_event_send_proto(name, arg_type))
|
||||
|
||||
if params and params.members:
|
||||
ret += mcgen("""
|
||||
if arg_type and arg_type.members:
|
||||
ret += mcgen('''
|
||||
QmpOutputVisitor *qov;
|
||||
Visitor *v;
|
||||
QObject *obj;
|
||||
|
||||
""")
|
||||
''')
|
||||
|
||||
# step 2: check emit function, create a dict
|
||||
ret += mcgen("""
|
||||
ret += mcgen('''
|
||||
emit = qmp_event_get_func_emit();
|
||||
if (!emit) {
|
||||
return;
|
||||
}
|
||||
|
||||
qmp = qmp_event_build_dict("%(event_name)s");
|
||||
qmp = qmp_event_build_dict("%(name)s");
|
||||
|
||||
""",
|
||||
event_name = event_name)
|
||||
''',
|
||||
name=name)
|
||||
|
||||
# step 3: visit the params if params != None
|
||||
if params and params.members:
|
||||
ret += mcgen("""
|
||||
if arg_type and arg_type.members:
|
||||
ret += mcgen('''
|
||||
qov = qmp_output_visitor_new();
|
||||
g_assert(qov);
|
||||
|
||||
|
@ -82,45 +79,46 @@ def generate_event_implement(api_name, event_name, params):
|
|||
g_assert(v);
|
||||
|
||||
/* Fake visit, as if all members are under a structure */
|
||||
visit_start_struct(v, NULL, "", "%(event_name)s", 0, &local_err);
|
||||
visit_start_struct(v, NULL, "", "%(name)s", 0, &local_err);
|
||||
if (local_err) {
|
||||
goto clean;
|
||||
}
|
||||
|
||||
""",
|
||||
event_name = event_name)
|
||||
''',
|
||||
name=name)
|
||||
|
||||
for memb in params.members:
|
||||
for memb in arg_type.members:
|
||||
if memb.optional:
|
||||
ret += mcgen("""
|
||||
if (has_%(var)s) {
|
||||
""",
|
||||
var=c_name(memb.name))
|
||||
ret += mcgen('''
|
||||
if (has_%(c_name)s) {
|
||||
''',
|
||||
c_name=c_name(memb.name))
|
||||
push_indent()
|
||||
|
||||
# Ugly: need to cast away the const
|
||||
if memb.type.name == "str":
|
||||
var_type = "(char **)"
|
||||
cast = '(char **)'
|
||||
else:
|
||||
var_type = ""
|
||||
cast = ''
|
||||
|
||||
ret += mcgen("""
|
||||
visit_type_%(type)s(v, %(var_type)s&%(var)s, "%(name)s", &local_err);
|
||||
ret += mcgen('''
|
||||
visit_type_%(c_type)s(v, %(cast)s&%(c_name)s, "%(name)s", &local_err);
|
||||
if (local_err) {
|
||||
goto clean;
|
||||
}
|
||||
""",
|
||||
var_type = var_type,
|
||||
var=c_name(memb.name),
|
||||
type=memb.type.c_name(),
|
||||
''',
|
||||
cast=cast,
|
||||
c_name=c_name(memb.name),
|
||||
c_type=memb.type.c_name(),
|
||||
name=memb.name)
|
||||
|
||||
if memb.optional:
|
||||
pop_indent()
|
||||
ret += mcgen("""
|
||||
ret += mcgen('''
|
||||
}
|
||||
""")
|
||||
''')
|
||||
|
||||
ret += mcgen("""
|
||||
ret += mcgen('''
|
||||
|
||||
visit_end_struct(v, &local_err);
|
||||
if (local_err) {
|
||||
|
@ -131,27 +129,24 @@ def generate_event_implement(api_name, event_name, params):
|
|||
g_assert(obj != NULL);
|
||||
|
||||
qdict_put_obj(qmp, "data", obj);
|
||||
""")
|
||||
''')
|
||||
|
||||
# step 4: call qmp event api
|
||||
ret += mcgen("""
|
||||
emit(%(event_enum_value)s, qmp, &local_err);
|
||||
ret += mcgen('''
|
||||
emit(%(c_enum)s, qmp, &local_err);
|
||||
|
||||
""",
|
||||
event_enum_value = c_enum_const(event_enum_name, event_name))
|
||||
''',
|
||||
c_enum=c_enum_const(event_enum_name, name))
|
||||
|
||||
# step 5: clean up
|
||||
if params and params.members:
|
||||
ret += mcgen("""
|
||||
if arg_type and arg_type.members:
|
||||
ret += mcgen('''
|
||||
clean:
|
||||
qmp_output_visitor_cleanup(qov);
|
||||
""")
|
||||
ret += mcgen("""
|
||||
''')
|
||||
ret += mcgen('''
|
||||
error_propagate(errp, local_err);
|
||||
QDECREF(qmp);
|
||||
}
|
||||
""")
|
||||
|
||||
''')
|
||||
return ret
|
||||
|
||||
|
||||
|
@ -167,14 +162,13 @@ class QAPISchemaGenEventVisitor(QAPISchemaVisitor):
|
|||
self._event_names = []
|
||||
|
||||
def visit_end(self):
|
||||
self.decl += generate_enum(event_enum_name, self._event_names)
|
||||
self.defn += generate_enum_lookup(event_enum_name, self._event_names)
|
||||
self.decl += gen_enum(event_enum_name, self._event_names)
|
||||
self.defn += gen_enum_lookup(event_enum_name, self._event_names)
|
||||
self._event_names = None
|
||||
|
||||
def visit_event(self, name, info, arg_type):
|
||||
api_name = _generate_event_api_name(name, arg_type)
|
||||
self.decl += generate_event_declaration(api_name)
|
||||
self.defn += generate_event_implement(api_name, name, arg_type)
|
||||
self.decl += gen_event_send_decl(name, arg_type)
|
||||
self.defn += gen_event_send(name, arg_type)
|
||||
self._event_names.append(name)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue