diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-05-15 17:51:20 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-05-15 17:51:20 +0100 |
commit | 385057cbec9b4a0eb6150330c572e875ed714965 (patch) | |
tree | 7adc24566bfe8afc56aee25128b2fc3bd5a6a9a5 /scripts/qapi-commands.py | |
parent | 99e7627a70d1a23e30a514e5a4798005cf4eb3aa (diff) | |
parent | 4180978c9205c50acd2d6c385def9b3e81911696 (diff) |
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2015-05-15' into staging
qapi: Fix qapi mangling of downstream names, and more
# gpg: Signature made Fri May 15 17:41:31 2015 BST using RSA key ID EB918653
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
# gpg: aka "Markus Armbruster <armbru@pond.sub.org>"
* remotes/armbru/tags/pull-qapi-2015-05-15: (26 commits)
qapi: Inline gen_command_decl_prologue(), gen_command_def_prologue()
qapi: Drop pointless flush() before close()
qapi: Factor open_output(), close_output() out of generators
qapi: Turn generators' mandatory option -i into an argument
qapi: Fix generators to report command line errors decently
qapi: Factor parse_command_line() out of the generators
qapi: qapi-commands.py option --type is unused, drop it
qapi: qapi-event.py option -b does nothing, drop it
tests: Add missing dependencies on $(qapi-py)
qapi: Support downstream events and commands
qapi: Support downstream alternates
qapi: Support downstream flat unions
qapi: Support downstream simple unions
qapi: Support downstream structs
qapi: Support downstream enums
qapi: Make c_type() consistently convert qapi names
qapi: Tidy c_type() logic
qapi: Move camel_to_upper(), c_enum_const() to closely related code
qapi: Use c_enum_const() in generate_alternate_qtypes()
qapi: Simplify c_enum_const()
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'scripts/qapi-commands.py')
-rw-r--r-- | scripts/qapi-commands.py | 222 |
1 files changed, 74 insertions, 148 deletions
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 93e43f0e48..1c1d3aa029 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -15,28 +15,19 @@ from ordereddict import OrderedDict from qapi import * import re -import sys -import os -import getopt -import errno - -def type_visitor(name): - if type(name) == list: - return 'visit_type_%sList' % name[0] - else: - return 'visit_type_%s' % name def generate_command_decl(name, args, ret_type): arglist="" for argname, argtype, optional in parse_args(args): argtype = c_type(argtype, is_param=True) if optional: - arglist += "bool has_%s, " % c_var(argname) - arglist += "%s %s, " % (argtype, c_var(argname)) + arglist += "bool has_%s, " % c_name(argname) + arglist += "%s %s, " % (argtype, c_name(argname)) return mcgen(''' %(ret_type)s qmp_%(name)s(%(args)sError **errp); ''', - ret_type=c_type(ret_type), name=c_fun(name), args=arglist).strip() + ret_type=c_type(ret_type), name=c_name(name), + args=arglist).strip() def gen_err_check(errvar): if errvar: @@ -55,14 +46,14 @@ def gen_sync_call(name, args, ret_type, indent=0): retval = "retval = " for argname, argtype, optional in parse_args(args): if optional: - arglist += "has_%s, " % c_var(argname) - arglist += "%s, " % (c_var(argname)) + arglist += "has_%s, " % c_name(argname) + arglist += "%s, " % (c_name(argname)) push_indent(indent) ret = mcgen(''' %(retval)sqmp_%(name)s(%(args)s&local_err); ''', - name=c_fun(name), args=arglist, retval=retval).rstrip() + name=c_name(name), args=arglist, retval=retval).rstrip() if ret_type: ret += "\n" + gen_err_check('local_err') ret += "\n" + mcgen('''' @@ -76,7 +67,7 @@ def gen_sync_call(name, args, ret_type, indent=0): def gen_marshal_output_call(name, ret_type): if not ret_type: return "" - return "qmp_marshal_output_%s(retval, ret, &local_err);" % c_fun(name) + return "qmp_marshal_output_%s(retval, ret, &local_err);" % c_name(name) def gen_visitor_input_containers_decl(args, obj): ret = "" @@ -101,17 +92,17 @@ def gen_visitor_input_vars_decl(args): ret += mcgen(''' bool has_%(argname)s = false; ''', - argname=c_var(argname)) + argname=c_name(argname)) if is_c_ptr(argtype): ret += mcgen(''' %(argtype)s %(argname)s = NULL; ''', - argname=c_var(argname), argtype=c_type(argtype)) + argname=c_name(argname), argtype=c_type(argtype)) else: ret += mcgen(''' %(argtype)s %(argname)s = {0}; ''', - argname=c_var(argname), argtype=c_type(argtype)) + argname=c_name(argname), argtype=c_type(argtype)) pop_indent() return ret.rstrip() @@ -144,18 +135,18 @@ v = qmp_input_get_visitor(mi); ret += mcgen(''' visit_optional(v, &has_%(c_name)s, "%(name)s", %(errp)s); ''', - c_name=c_var(argname), name=argname, errp=errparg) + c_name=c_name(argname), name=argname, errp=errparg) ret += gen_err_check(errarg) ret += mcgen(''' if (has_%(c_name)s) { ''', - c_name=c_var(argname)) + c_name=c_name(argname)) push_indent() ret += mcgen(''' -%(visitor)s(v, &%(c_name)s, "%(name)s", %(errp)s); +visit_type_%(visitor)s(v, &%(c_name)s, "%(name)s", %(errp)s); ''', - c_name=c_var(argname), name=argname, argtype=argtype, - visitor=type_visitor(argtype), errp=errparg) + c_name=c_name(argname), name=argname, argtype=argtype, + visitor=type_name(argtype), errp=errparg) ret += gen_err_check(errarg) if optional: pop_indent() @@ -183,7 +174,7 @@ static void qmp_marshal_output_%(c_name)s(%(c_ret_type)s ret_in, QObject **ret_o Visitor *v; v = qmp_output_get_visitor(mo); - %(visitor)s(v, &ret_in, "unused", &local_err); + visit_type_%(visitor)s(v, &ret_in, "unused", &local_err); if (local_err) { goto out; } @@ -194,20 +185,20 @@ out: qmp_output_visitor_cleanup(mo); md = qapi_dealloc_visitor_new(); v = qapi_dealloc_get_visitor(md); - %(visitor)s(v, &ret_in, "unused", NULL); + visit_type_%(visitor)s(v, &ret_in, "unused", NULL); qapi_dealloc_visitor_cleanup(md); } ''', - c_ret_type=c_type(ret_type), c_name=c_fun(name), - visitor=type_visitor(ret_type)) + c_ret_type=c_type(ret_type), c_name=c_name(name), + visitor=type_name(ret_type)) return ret def gen_marshal_input_decl(name, args, ret_type, middle_mode): if middle_mode: - return 'int qmp_marshal_input_%s(Monitor *mon, const QDict *qdict, QObject **ret)' % c_fun(name) + return 'int qmp_marshal_input_%s(Monitor *mon, const QDict *qdict, QObject **ret)' % c_name(name) else: - return 'static void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_fun(name) + return 'static void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name) @@ -304,7 +295,7 @@ def gen_registry(commands): registry += mcgen(''' qmp_register_command("%(name)s", qmp_marshal_input_%(c_name)s, %(opts)s); ''', - name=cmd['command'], c_name=c_fun(cmd['command']), + name=cmd['command'], c_name=c_name(cmd['command']), opts=options) pop_indent() ret = mcgen(''' @@ -318,12 +309,22 @@ qapi_init(qmp_init_marshal); registry=registry.rstrip()) return ret -def gen_command_decl_prologue(header, guard, prefix=""): - ret = mcgen(''' -/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ +middle_mode = False + +(input_file, output_dir, do_c, do_h, prefix, opts) = \ + parse_command_line("m", ["middle"]) + +for o, a in opts: + if o in ("-m", "--middle"): + middle_mode = True +exprs = parse_schema(input_file) +commands = filter(lambda expr: expr.has_key('command'), exprs) +commands = filter(lambda expr: not expr.has_key('gen'), commands) + +c_comment = ''' /* - * schema-defined QAPI function prototypes + * schema-defined QMP->QAPI command dispatch * * Copyright IBM, Corp. 2011 * @@ -334,24 +335,10 @@ def gen_command_decl_prologue(header, guard, prefix=""): * See the COPYING.LIB file in the top-level directory. * */ - -#ifndef %(guard)s -#define %(guard)s - -#include "%(prefix)sqapi-types.h" -#include "qapi/qmp/qdict.h" -#include "qapi/error.h" - -''', - header=basename(header), guard=guardname(header), prefix=prefix) - return ret - -def gen_command_def_prologue(prefix="", proxy=False): - ret = mcgen(''' -/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ - +''' +h_comment = ''' /* - * schema-defined QMP->QAPI command dispatch + * schema-defined QAPI function prototypes * * Copyright IBM, Corp. 2011 * @@ -362,7 +349,13 @@ def gen_command_def_prologue(prefix="", proxy=False): * See the COPYING.LIB file in the top-level directory. * */ +''' + +(fdef, fdecl) = open_output(output_dir, do_c, do_h, prefix, + 'qmp-marshal.c', 'qmp-commands.h', + c_comment, h_comment) +fdef.write(mcgen(''' #include "qemu-common.h" #include "qemu/module.h" #include "qapi/qmp/qerror.h" @@ -374,107 +367,40 @@ def gen_command_def_prologue(prefix="", proxy=False): #include "qapi/dealloc-visitor.h" #include "%(prefix)sqapi-types.h" #include "%(prefix)sqapi-visit.h" +#include "%(prefix)sqmp-commands.h" ''', - prefix=prefix) - if not proxy: - ret += '#include "%sqmp-commands.h"' % prefix - return ret + "\n\n" - - -try: - opts, args = getopt.gnu_getopt(sys.argv[1:], "chp:i:o:m", - ["source", "header", "prefix=", - "input-file=", "output-dir=", - "type=", "middle"]) -except getopt.GetoptError, err: - print str(err) - sys.exit(1) - -output_dir = "" -prefix = "" -dispatch_type = "sync" -c_file = 'qmp-marshal.c' -h_file = 'qmp-commands.h' -middle_mode = False - -do_c = False -do_h = False - -for o, a in opts: - if o in ("-p", "--prefix"): - prefix = a - elif o in ("-i", "--input-file"): - input_file = a - elif o in ("-o", "--output-dir"): - output_dir = a + "/" - elif o in ("-t", "--type"): - dispatch_type = a - elif o in ("-m", "--middle"): - middle_mode = True - elif o in ("-c", "--source"): - do_c = True - elif o in ("-h", "--header"): - do_h = True - -if not do_c and not do_h: - do_c = True - do_h = True - -c_file = output_dir + prefix + c_file -h_file = output_dir + prefix + h_file + prefix=prefix)) -def maybe_open(really, name, opt): - if really: - return open(name, opt) - else: - import StringIO - return StringIO.StringIO() - -try: - os.makedirs(output_dir) -except os.error, e: - if e.errno != errno.EEXIST: - raise - -exprs = parse_schema(input_file) -commands = filter(lambda expr: expr.has_key('command'), exprs) -commands = filter(lambda expr: not expr.has_key('gen'), commands) +fdecl.write(mcgen(''' +#include "%(prefix)sqapi-types.h" +#include "qapi/qmp/qdict.h" +#include "qapi/error.h" -if dispatch_type == "sync": - fdecl = maybe_open(do_h, h_file, 'w') - fdef = maybe_open(do_c, c_file, 'w') - ret = gen_command_decl_prologue(header=basename(h_file), guard=guardname(h_file), prefix=prefix) +''', + prefix=prefix)) + +for cmd in commands: + arglist = [] + ret_type = None + if cmd.has_key('data'): + arglist = cmd['data'] + if cmd.has_key('returns'): + ret_type = cmd['returns'] + ret = generate_command_decl(cmd['command'], arglist, ret_type) + "\n" fdecl.write(ret) - ret = gen_command_def_prologue(prefix=prefix) - fdef.write(ret) - - for cmd in commands: - arglist = [] - ret_type = None - if cmd.has_key('data'): - arglist = cmd['data'] - if cmd.has_key('returns'): - ret_type = cmd['returns'] - ret = generate_command_decl(cmd['command'], arglist, ret_type) + "\n" - fdecl.write(ret) - if ret_type: - ret = gen_marshal_output(cmd['command'], arglist, ret_type, middle_mode) + "\n" - fdef.write(ret) - - if middle_mode: - fdecl.write('%s;\n' % gen_marshal_input_decl(cmd['command'], arglist, ret_type, middle_mode)) - - ret = gen_marshal_input(cmd['command'], arglist, ret_type, middle_mode) + "\n" + if ret_type: + ret = gen_marshal_output(cmd['command'], arglist, ret_type, middle_mode) + "\n" fdef.write(ret) - fdecl.write("\n#endif\n"); + if middle_mode: + fdecl.write('%s;\n' % gen_marshal_input_decl(cmd['command'], arglist, ret_type, middle_mode)) - if not middle_mode: - ret = gen_registry(commands) - fdef.write(ret) + ret = gen_marshal_input(cmd['command'], arglist, ret_type, middle_mode) + "\n" + fdef.write(ret) + +if not middle_mode: + ret = gen_registry(commands) + fdef.write(ret) - fdef.flush() - fdef.close() - fdecl.flush() - fdecl.close() +close_output(fdef, fdecl) |