qapi: Reduce use of global variables in generators some

In preparation of the next commit, which will turn the generators into
modules.  These global variables will become local to main() then.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20180211093607.27351-7-armbru@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Markus Armbruster 2018-02-11 10:35:44 +01:00 committed by Eric Blake
parent 47a6ea9aab
commit 93b564c444
5 changed files with 34 additions and 31 deletions

View file

@ -207,7 +207,7 @@ def gen_register_command(name, success_response):
return ret return ret
def gen_registry(registry): def gen_registry(registry, prefix):
ret = mcgen(''' ret = mcgen('''
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds) void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
@ -224,7 +224,8 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
class QAPISchemaGenCommandVisitor(QAPISchemaVisitor): class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
def __init__(self): def __init__(self, prefix):
self._prefix = prefix
self.decl = None self.decl = None
self.defn = None self.defn = None
self._regy = None self._regy = None
@ -237,7 +238,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
self._visited_ret_types = set() self._visited_ret_types = set()
def visit_end(self): def visit_end(self):
self.defn += gen_registry(self._regy) self.defn += gen_registry(self._regy, self._prefix)
self._regy = None self._regy = None
self._visited_ret_types = None self._visited_ret_types = None
@ -287,7 +288,7 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
prefix=prefix, c_prefix=c_name(prefix, protect=False))) prefix=prefix, c_prefix=c_name(prefix, protect=False)))
schema = QAPISchema(input_file) schema = QAPISchema(input_file)
vis = QAPISchemaGenCommandVisitor() vis = QAPISchemaGenCommandVisitor(prefix)
schema.visit(vis) schema.visit(vis)
genc.add(vis.defn) genc.add(vis.defn)
genh.add(vis.decl) genh.add(vis.decl)

View file

@ -58,7 +58,7 @@ def gen_param_var(typ):
return ret return ret
def gen_event_send(name, arg_type, boxed): def gen_event_send(name, arg_type, boxed, event_enum_name):
# FIXME: Our declaration of local variables (and of 'errp' in the # FIXME: Our declaration of local variables (and of 'errp' in the
# parameter list) can collide with exploded members of the event's # parameter list) can collide with exploded members of the event's
# data type passed in as parameters. If this collision ever hits in # data type passed in as parameters. If this collision ever hits in
@ -149,7 +149,8 @@ out:
class QAPISchemaGenEventVisitor(QAPISchemaVisitor): class QAPISchemaGenEventVisitor(QAPISchemaVisitor):
def __init__(self): def __init__(self, prefix):
self._enum_name = c_name(prefix + 'QAPIEvent', protect=False)
self.decl = None self.decl = None
self.defn = None self.defn = None
self._event_names = None self._event_names = None
@ -160,13 +161,13 @@ class QAPISchemaGenEventVisitor(QAPISchemaVisitor):
self._event_names = [] self._event_names = []
def visit_end(self): def visit_end(self):
self.decl += gen_enum(event_enum_name, self._event_names) self.decl += gen_enum(self._enum_name, self._event_names)
self.defn += gen_enum_lookup(event_enum_name, self._event_names) self.defn += gen_enum_lookup(self._enum_name, self._event_names)
self._event_names = None self._event_names = None
def visit_event(self, name, info, arg_type, boxed): def visit_event(self, name, info, arg_type, boxed):
self.decl += gen_event_send_decl(name, arg_type, boxed) self.decl += gen_event_send_decl(name, arg_type, boxed)
self.defn += gen_event_send(name, arg_type, boxed) self.defn += gen_event_send(name, arg_type, boxed, self._enum_name)
self._event_names.append(name) self._event_names.append(name)
@ -197,10 +198,8 @@ genh.add(mcgen('''
''', ''',
prefix=prefix)) prefix=prefix))
event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
schema = QAPISchema(input_file) schema = QAPISchema(input_file)
vis = QAPISchemaGenEventVisitor() vis = QAPISchemaGenEventVisitor(prefix)
schema.visit(vis) schema.visit(vis)
genc.add(vis.defn) genc.add(vis.defn)
genh.add(vis.decl) genh.add(vis.decl)

View file

@ -41,7 +41,8 @@ def to_c_string(string):
class QAPISchemaGenIntrospectVisitor(QAPISchemaVisitor): class QAPISchemaGenIntrospectVisitor(QAPISchemaVisitor):
def __init__(self, unmask): def __init__(self, prefix, unmask):
self._prefix = prefix
self._unmask = unmask self._unmask = unmask
self.defn = None self.defn = None
self.decl = None self.decl = None
@ -65,7 +66,7 @@ class QAPISchemaGenIntrospectVisitor(QAPISchemaVisitor):
# generate C # generate C
# TODO can generate awfully long lines # TODO can generate awfully long lines
jsons.extend(self._jsons) jsons.extend(self._jsons)
name = c_name(prefix, protect=False) + 'qmp_schema_json' name = c_name(self._prefix, protect=False) + 'qmp_schema_json'
self.decl = mcgen(''' self.decl = mcgen('''
extern const char %(c_name)s[]; extern const char %(c_name)s[];
''', ''',
@ -190,7 +191,7 @@ genc.add(mcgen('''
prefix=prefix)) prefix=prefix))
schema = QAPISchema(input_file) schema = QAPISchema(input_file)
vis = QAPISchemaGenIntrospectVisitor(opt_unmask) vis = QAPISchemaGenIntrospectVisitor(prefix, opt_unmask)
schema.visit(vis) schema.visit(vis)
genc.add(vis.defn) genc.add(vis.defn)
genh.add(vis.decl) genh.add(vis.decl)

View file

@ -168,7 +168,8 @@ void qapi_free_%(c_name)s(%(c_name)s *obj)
class QAPISchemaGenTypeVisitor(QAPISchemaVisitor): class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
def __init__(self): def __init__(self, opt_builtins):
self._opt_builtins = opt_builtins
self.decl = None self.decl = None
self.defn = None self.defn = None
self._fwdecl = None self._fwdecl = None
@ -187,7 +188,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
self._fwdecl = None self._fwdecl = None
# To avoid header dependency hell, we always generate # To avoid header dependency hell, we always generate
# declarations for built-in types in our header files and # declarations for built-in types in our header files and
# simply guard them. See also do_builtins (command line # simply guard them. See also opt_builtins (command line
# option -b). # option -b).
self._btin += guardend('QAPI_TYPES_BUILTIN') self._btin += guardend('QAPI_TYPES_BUILTIN')
self.decl = self._btin + self.decl self.decl = self._btin + self.decl
@ -202,7 +203,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
# TODO use something cleaner than existence of info # TODO use something cleaner than existence of info
if not info: if not info:
self._btin += gen_enum(name, values, prefix) self._btin += gen_enum(name, values, prefix)
if do_builtins: if self._opt_builtins:
self.defn += gen_enum_lookup(name, values, prefix) self.defn += gen_enum_lookup(name, values, prefix)
else: else:
self._fwdecl += gen_enum(name, values, prefix) self._fwdecl += gen_enum(name, values, prefix)
@ -213,7 +214,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
self._btin += gen_fwd_object_or_array(name) self._btin += gen_fwd_object_or_array(name)
self._btin += gen_array(name, element_type) self._btin += gen_array(name, element_type)
self._btin += gen_type_cleanup_decl(name) self._btin += gen_type_cleanup_decl(name)
if do_builtins: if self._opt_builtins:
self.defn += gen_type_cleanup(name) self.defn += gen_type_cleanup(name)
else: else:
self._fwdecl += gen_fwd_object_or_array(name) self._fwdecl += gen_fwd_object_or_array(name)
@ -241,16 +242,16 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
# If you link code generated from multiple schemata, you want only one # If you link code generated from multiple schemata, you want only one
# instance of the code for built-in types. Generate it only when # instance of the code for built-in types. Generate it only when
# do_builtins, enabled by command line option -b. See also # opt_builtins, enabled by command line option -b. See also
# QAPISchemaGenTypeVisitor.visit_end(). # QAPISchemaGenTypeVisitor.visit_end().
do_builtins = False opt_builtins = False
(input_file, output_dir, do_c, do_h, prefix, opts) = \ (input_file, output_dir, do_c, do_h, prefix, opts) = \
parse_command_line('b', ['builtins']) parse_command_line('b', ['builtins'])
for o, a in opts: for o, a in opts:
if o in ('-b', '--builtins'): if o in ('-b', '--builtins'):
do_builtins = True opt_builtins = True
blurb = ' * Schema-defined QAPI types' blurb = ' * Schema-defined QAPI types'
@ -270,7 +271,7 @@ genh.add(mcgen('''
''')) '''))
schema = QAPISchema(input_file) schema = QAPISchema(input_file)
vis = QAPISchemaGenTypeVisitor() vis = QAPISchemaGenTypeVisitor(opt_builtins)
schema.visit(vis) schema.visit(vis)
genc.add(vis.defn) genc.add(vis.defn)
genh.add(vis.decl) genh.add(vis.decl)

View file

@ -264,7 +264,8 @@ out:
class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
def __init__(self): def __init__(self, opt_builtins):
self._opt_builtins = opt_builtins
self.decl = None self.decl = None
self.defn = None self.defn = None
self._btin = None self._btin = None
@ -277,7 +278,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
def visit_end(self): def visit_end(self):
# To avoid header dependency hell, we always generate # To avoid header dependency hell, we always generate
# declarations for built-in types in our header files and # declarations for built-in types in our header files and
# simply guard them. See also do_builtins (command line # simply guard them. See also opt_builtins (command line
# option -b). # option -b).
self._btin += guardend('QAPI_VISIT_BUILTIN') self._btin += guardend('QAPI_VISIT_BUILTIN')
self.decl = self._btin + self.decl self.decl = self._btin + self.decl
@ -288,7 +289,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
# TODO use something cleaner than existence of info # TODO use something cleaner than existence of info
if not info: if not info:
self._btin += gen_visit_decl(name, scalar=True) self._btin += gen_visit_decl(name, scalar=True)
if do_builtins: if self._opt_builtins:
self.defn += gen_visit_enum(name) self.defn += gen_visit_enum(name)
else: else:
self.decl += gen_visit_decl(name, scalar=True) self.decl += gen_visit_decl(name, scalar=True)
@ -299,7 +300,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
defn = gen_visit_list(name, element_type) defn = gen_visit_list(name, element_type)
if isinstance(element_type, QAPISchemaBuiltinType): if isinstance(element_type, QAPISchemaBuiltinType):
self._btin += decl self._btin += decl
if do_builtins: if self._opt_builtins:
self.defn += defn self.defn += defn
else: else:
self.decl += decl self.decl += decl
@ -324,16 +325,16 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
# If you link code generated from multiple schemata, you want only one # If you link code generated from multiple schemata, you want only one
# instance of the code for built-in types. Generate it only when # instance of the code for built-in types. Generate it only when
# do_builtins, enabled by command line option -b. See also # opt_builtins, enabled by command line option -b. See also
# QAPISchemaGenVisitVisitor.visit_end(). # QAPISchemaGenVisitVisitor.visit_end().
do_builtins = False opt_builtins = False
(input_file, output_dir, do_c, do_h, prefix, opts) = \ (input_file, output_dir, do_c, do_h, prefix, opts) = \
parse_command_line('b', ['builtins']) parse_command_line('b', ['builtins'])
for o, a in opts: for o, a in opts:
if o in ('-b', '--builtins'): if o in ('-b', '--builtins'):
do_builtins = True opt_builtins = True
blurb = ' * Schema-defined QAPI visitors' blurb = ' * Schema-defined QAPI visitors'
@ -357,7 +358,7 @@ genh.add(mcgen('''
prefix=prefix)) prefix=prefix))
schema = QAPISchema(input_file) schema = QAPISchema(input_file)
vis = QAPISchemaGenVisitVisitor() vis = QAPISchemaGenVisitVisitor(opt_builtins)
schema.visit(vis) schema.visit(vis)
genc.add(vis.defn) genc.add(vis.defn)
genh.add(vis.decl) genh.add(vis.decl)