qapi: Clean up modular built-in code generation a bit
We neglect to call .visit_module() for the special module we use for built-ins. Harmless, but clean it up anyway. The tests/qapi-schema/*.out now show the built-in module as 'module None'. Subclasses of QAPISchemaModularCVisitor need to ._add_module() this special module to enable code generation for built-ins. When this hasn't been done, QAPISchemaModularCVisitor.visit_module() does nothing for the special module. That looks like built-ins could accidentally be generated into the wrong module when a subclass neglects to call ._add_module(). Can't happen, because built-ins are all visited before any other module. But that's non-obvious. Switch off code generation explicitly. Rename QAPISchemaModularCVisitor._begin_module() to ._begin_user_module(). New QAPISchemaModularCVisitor._is_builtin_module(), for clarity. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20190214152251.2073-4-armbru@redhat.com>
This commit is contained in:
parent
83a22d89b0
commit
dcac64711e
|
@ -242,7 +242,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
||||||
self._regy = QAPIGenCCode()
|
self._regy = QAPIGenCCode()
|
||||||
self._visited_ret_types = {}
|
self._visited_ret_types = {}
|
||||||
|
|
||||||
def _begin_module(self, name):
|
def _begin_user_module(self, name):
|
||||||
self._visited_ret_types[self._genc] = set()
|
self._visited_ret_types[self._genc] = set()
|
||||||
commands = self._module_basename('qapi-commands', name)
|
commands = self._module_basename('qapi-commands', name)
|
||||||
types = self._module_basename('qapi-types', name)
|
types = self._module_basename('qapi-types', name)
|
||||||
|
|
|
@ -1868,6 +1868,7 @@ class QAPISchema(object):
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
visitor.visit_begin(self)
|
visitor.visit_begin(self)
|
||||||
module = None
|
module = None
|
||||||
|
visitor.visit_module(module)
|
||||||
for entity in self._entity_list:
|
for entity in self._entity_list:
|
||||||
if visitor.visit_needed(entity):
|
if visitor.visit_needed(entity):
|
||||||
if entity.module != module:
|
if entity.module != module:
|
||||||
|
@ -2321,9 +2322,15 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
|
||||||
self._what = what
|
self._what = what
|
||||||
self._blurb = blurb
|
self._blurb = blurb
|
||||||
self._pydoc = pydoc
|
self._pydoc = pydoc
|
||||||
|
self._genc = None
|
||||||
|
self._genh = None
|
||||||
self._module = {}
|
self._module = {}
|
||||||
self._main_module = None
|
self._main_module = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _is_builtin_module(name):
|
||||||
|
return not name
|
||||||
|
|
||||||
def _module_basename(self, what, name):
|
def _module_basename(self, what, name):
|
||||||
if name is None:
|
if name is None:
|
||||||
return re.sub(r'-', '-builtin-', what)
|
return re.sub(r'-', '-builtin-', what)
|
||||||
|
@ -2334,7 +2341,7 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
|
||||||
return basename + '-' + os.path.splitext(os.path.basename(name))[0]
|
return basename + '-' + os.path.splitext(os.path.basename(name))[0]
|
||||||
|
|
||||||
def _add_module(self, name, blurb):
|
def _add_module(self, name, blurb):
|
||||||
if self._main_module is None and name is not None:
|
if self._main_module is None and not self._is_builtin_module(name):
|
||||||
self._main_module = name
|
self._main_module = name
|
||||||
genc = QAPIGenC(blurb, self._pydoc)
|
genc = QAPIGenC(blurb, self._pydoc)
|
||||||
genh = QAPIGenH(blurb, self._pydoc)
|
genh = QAPIGenH(blurb, self._pydoc)
|
||||||
|
@ -2346,22 +2353,27 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
|
||||||
|
|
||||||
def write(self, output_dir, opt_builtins=False):
|
def write(self, output_dir, opt_builtins=False):
|
||||||
for name in self._module:
|
for name in self._module:
|
||||||
if name is None and not opt_builtins:
|
if self._is_builtin_module(name) and not opt_builtins:
|
||||||
continue
|
continue
|
||||||
basename = self._module_basename(self._what, name)
|
basename = self._module_basename(self._what, name)
|
||||||
(genc, genh) = self._module[name]
|
(genc, genh) = self._module[name]
|
||||||
genc.write(output_dir, basename + '.c')
|
genc.write(output_dir, basename + '.c')
|
||||||
genh.write(output_dir, basename + '.h')
|
genh.write(output_dir, basename + '.h')
|
||||||
|
|
||||||
def _begin_module(self, name):
|
def _begin_user_module(self, name):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def visit_module(self, name):
|
def visit_module(self, name):
|
||||||
if name in self._module:
|
if name in self._module:
|
||||||
self._set_module(name)
|
self._set_module(name)
|
||||||
return
|
elif self._is_builtin_module(name):
|
||||||
|
# The built-in module has not been created. No code may
|
||||||
|
# be generated.
|
||||||
|
self._genc = None
|
||||||
|
self._genh = None
|
||||||
|
else:
|
||||||
self._add_module(name, self._blurb)
|
self._add_module(name, self._blurb)
|
||||||
self._begin_module(name)
|
self._begin_user_module(name)
|
||||||
|
|
||||||
def visit_include(self, name, info):
|
def visit_include(self, name, info):
|
||||||
basename = self._module_basename(self._what, name)
|
basename = self._module_basename(self._what, name)
|
||||||
|
|
|
@ -142,7 +142,7 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
|
||||||
self._event_enum_members = []
|
self._event_enum_members = []
|
||||||
self._event_emit_name = c_name(prefix + 'qapi_event_emit')
|
self._event_emit_name = c_name(prefix + 'qapi_event_emit')
|
||||||
|
|
||||||
def _begin_module(self, name):
|
def _begin_user_module(self, name):
|
||||||
types = self._module_basename('qapi-types', name)
|
types = self._module_basename('qapi-types', name)
|
||||||
visit = self._module_basename('qapi-visit', name)
|
visit = self._module_basename('qapi-visit', name)
|
||||||
self._genc.add(mcgen('''
|
self._genc.add(mcgen('''
|
||||||
|
|
|
@ -194,7 +194,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
|
||||||
#include "qapi/util.h"
|
#include "qapi/util.h"
|
||||||
'''))
|
'''))
|
||||||
|
|
||||||
def _begin_module(self, name):
|
def _begin_user_module(self, name):
|
||||||
types = self._module_basename('qapi-types', name)
|
types = self._module_basename('qapi-types', name)
|
||||||
visit = self._module_basename('qapi-visit', name)
|
visit = self._module_basename('qapi-visit', name)
|
||||||
self._genc.preamble_add(mcgen('''
|
self._genc.preamble_add(mcgen('''
|
||||||
|
|
|
@ -298,7 +298,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
|
||||||
''',
|
''',
|
||||||
prefix=prefix))
|
prefix=prefix))
|
||||||
|
|
||||||
def _begin_module(self, name):
|
def _begin_user_module(self, name):
|
||||||
types = self._module_basename('qapi-types', name)
|
types = self._module_basename('qapi-types', name)
|
||||||
visit = self._module_basename('qapi-visit', name)
|
visit = self._module_basename('qapi-visit', name)
|
||||||
self._genc.preamble_add(mcgen('''
|
self._genc.preamble_add(mcgen('''
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
module None
|
||||||
object q_empty
|
object q_empty
|
||||||
enum QType
|
enum QType
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
|
|
Loading…
Reference in a new issue