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>
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 8435a89..e75e32e 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -207,7 +207,7 @@
return ret
-def gen_registry(registry):
+def gen_registry(registry, prefix):
ret = mcgen('''
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
@@ -224,7 +224,8 @@
class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
- def __init__(self):
+ def __init__(self, prefix):
+ self._prefix = prefix
self.decl = None
self.defn = None
self._regy = None
@@ -237,7 +238,7 @@
self._visited_ret_types = set()
def visit_end(self):
- self.defn += gen_registry(self._regy)
+ self.defn += gen_registry(self._regy, self._prefix)
self._regy = None
self._visited_ret_types = None
@@ -287,7 +288,7 @@
prefix=prefix, c_prefix=c_name(prefix, protect=False)))
schema = QAPISchema(input_file)
-vis = QAPISchemaGenCommandVisitor()
+vis = QAPISchemaGenCommandVisitor(prefix)
schema.visit(vis)
genc.add(vis.defn)
genh.add(vis.decl)
diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py
index e063f6b..f65ccdc 100644
--- a/scripts/qapi-event.py
+++ b/scripts/qapi-event.py
@@ -58,7 +58,7 @@
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
# parameter list) can collide with exploded members of the event's
# data type passed in as parameters. If this collision ever hits in
@@ -149,7 +149,8 @@
class QAPISchemaGenEventVisitor(QAPISchemaVisitor):
- def __init__(self):
+ def __init__(self, prefix):
+ self._enum_name = c_name(prefix + 'QAPIEvent', protect=False)
self.decl = None
self.defn = None
self._event_names = None
@@ -160,13 +161,13 @@
self._event_names = []
def visit_end(self):
- self.decl += gen_enum(event_enum_name, self._event_names)
- self.defn += gen_enum_lookup(event_enum_name, self._event_names)
+ self.decl += gen_enum(self._enum_name, self._event_names)
+ self.defn += gen_enum_lookup(self._enum_name, self._event_names)
self._event_names = None
def visit_event(self, name, info, 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)
@@ -197,10 +198,8 @@
''',
prefix=prefix))
-event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
-
schema = QAPISchema(input_file)
-vis = QAPISchemaGenEventVisitor()
+vis = QAPISchemaGenEventVisitor(prefix)
schema.visit(vis)
genc.add(vis.defn)
genh.add(vis.decl)
diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py
index 0638acd..5d9a7ab 100644
--- a/scripts/qapi-introspect.py
+++ b/scripts/qapi-introspect.py
@@ -41,7 +41,8 @@
class QAPISchemaGenIntrospectVisitor(QAPISchemaVisitor):
- def __init__(self, unmask):
+ def __init__(self, prefix, unmask):
+ self._prefix = prefix
self._unmask = unmask
self.defn = None
self.decl = None
@@ -65,7 +66,7 @@
# generate C
# TODO can generate awfully long lines
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('''
extern const char %(c_name)s[];
''',
@@ -190,7 +191,7 @@
prefix=prefix))
schema = QAPISchema(input_file)
-vis = QAPISchemaGenIntrospectVisitor(opt_unmask)
+vis = QAPISchemaGenIntrospectVisitor(prefix, opt_unmask)
schema.visit(vis)
genc.add(vis.defn)
genh.add(vis.decl)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 1eb59b1..6ef8c40 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -168,7 +168,8 @@
class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
- def __init__(self):
+ def __init__(self, opt_builtins):
+ self._opt_builtins = opt_builtins
self.decl = None
self.defn = None
self._fwdecl = None
@@ -187,7 +188,7 @@
self._fwdecl = None
# To avoid header dependency hell, we always generate
# 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).
self._btin += guardend('QAPI_TYPES_BUILTIN')
self.decl = self._btin + self.decl
@@ -202,7 +203,7 @@
# TODO use something cleaner than existence of info
if not info:
self._btin += gen_enum(name, values, prefix)
- if do_builtins:
+ if self._opt_builtins:
self.defn += gen_enum_lookup(name, values, prefix)
else:
self._fwdecl += gen_enum(name, values, prefix)
@@ -213,7 +214,7 @@
self._btin += gen_fwd_object_or_array(name)
self._btin += gen_array(name, element_type)
self._btin += gen_type_cleanup_decl(name)
- if do_builtins:
+ if self._opt_builtins:
self.defn += gen_type_cleanup(name)
else:
self._fwdecl += gen_fwd_object_or_array(name)
@@ -241,16 +242,16 @@
# If you link code generated from multiple schemata, you want only one
# 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().
-do_builtins = False
+opt_builtins = False
(input_file, output_dir, do_c, do_h, prefix, opts) = \
parse_command_line('b', ['builtins'])
for o, a in opts:
if o in ('-b', '--builtins'):
- do_builtins = True
+ opt_builtins = True
blurb = ' * Schema-defined QAPI types'
@@ -270,7 +271,7 @@
'''))
schema = QAPISchema(input_file)
-vis = QAPISchemaGenTypeVisitor()
+vis = QAPISchemaGenTypeVisitor(opt_builtins)
schema.visit(vis)
genc.add(vis.defn)
genh.add(vis.decl)
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 51eeaa1..d5ca480 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -264,7 +264,8 @@
class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
- def __init__(self):
+ def __init__(self, opt_builtins):
+ self._opt_builtins = opt_builtins
self.decl = None
self.defn = None
self._btin = None
@@ -277,7 +278,7 @@
def visit_end(self):
# To avoid header dependency hell, we always generate
# 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).
self._btin += guardend('QAPI_VISIT_BUILTIN')
self.decl = self._btin + self.decl
@@ -288,7 +289,7 @@
# TODO use something cleaner than existence of info
if not info:
self._btin += gen_visit_decl(name, scalar=True)
- if do_builtins:
+ if self._opt_builtins:
self.defn += gen_visit_enum(name)
else:
self.decl += gen_visit_decl(name, scalar=True)
@@ -299,7 +300,7 @@
defn = gen_visit_list(name, element_type)
if isinstance(element_type, QAPISchemaBuiltinType):
self._btin += decl
- if do_builtins:
+ if self._opt_builtins:
self.defn += defn
else:
self.decl += decl
@@ -324,16 +325,16 @@
# If you link code generated from multiple schemata, you want only one
# 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().
-do_builtins = False
+opt_builtins = False
(input_file, output_dir, do_c, do_h, prefix, opts) = \
parse_command_line('b', ['builtins'])
for o, a in opts:
if o in ('-b', '--builtins'):
- do_builtins = True
+ opt_builtins = True
blurb = ' * Schema-defined QAPI visitors'
@@ -357,7 +358,7 @@
prefix=prefix))
schema = QAPISchema(input_file)
-vis = QAPISchemaGenVisitVisitor()
+vis = QAPISchemaGenVisitVisitor(opt_builtins)
schema.visit(vis)
genc.add(vis.defn)
genh.add(vis.decl)