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.

Backports commit dcac64711ea906e844ae60a5927e5580f7252c1e from qemu
This commit is contained in:
Markus Armbruster 2019-02-21 09:56:16 -05:00 committed by Lioncash
parent 5c34cab41c
commit 5d0966ce6b
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
4 changed files with 20 additions and 9 deletions

View file

@ -2265,9 +2265,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)
@ -2278,7 +2284,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)
@ -2290,22 +2296,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)

View file

@ -146,7 +146,7 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
self._enum_name = c_name(prefix + 'QAPIEvent', protect=False) self._enum_name = c_name(prefix + 'QAPIEvent', protect=False)
self._event_names = [] self._event_names = []
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('''

View file

@ -190,7 +190,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('''

View file

@ -292,7 +292,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('''