From dcac64711ea906e844ae60a5927e5580f7252c1e Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 14 Feb 2019 16:22:36 +0100 Subject: 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 Reviewed-by: Marc-André Lureau Message-Id: <20190214152251.2073-4-armbru@redhat.com> --- scripts/qapi/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts/qapi/types.py') diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py index 62d4cf9f95..9fa510f7df 100644 --- a/scripts/qapi/types.py +++ b/scripts/qapi/types.py @@ -194,7 +194,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor): #include "qapi/util.h" ''')) - def _begin_module(self, name): + def _begin_user_module(self, name): types = self._module_basename('qapi-types', name) visit = self._module_basename('qapi-visit', name) self._genc.preamble_add(mcgen(''' -- cgit v1.2.3-55-g7522 From c2e196a9b41235a308fb6d1c516aa91ba0a807c8 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 14 Feb 2019 16:22:37 +0100 Subject: qapi: Prepare for system modules other than 'builtin' The next commit wants to generate qapi-emit-events.{c.h}. To enable that, extend QAPISchemaModularCVisitor to support additional "system modules", i.e. modules that don't correspond to a (user-defined) QAPI schema module. Signed-off-by: Markus Armbruster Reviewed-by: Marc-André Lureau Message-Id: <20190214152251.2073-5-armbru@redhat.com> --- scripts/qapi/common.py | 35 +++++++++++++++++++++++++---------- scripts/qapi/types.py | 2 +- scripts/qapi/visit.py | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) (limited to 'scripts/qapi/types.py') diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index 0e3ec598a4..c327ae5036 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -2327,27 +2327,42 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor): self._module = {} self._main_module = None + @staticmethod + def _is_user_module(name): + return name and not name.startswith('./') + @staticmethod def _is_builtin_module(name): return not name def _module_basename(self, what, name): - if name is None: - return re.sub(r'-', '-builtin-', what) - basename = os.path.join(os.path.dirname(name), - self._prefix + what) - if name == self._main_module: - return basename - return basename + '-' + os.path.splitext(os.path.basename(name))[0] + ret = '' if self._is_builtin_module(name) else self._prefix + if self._is_user_module(name): + dirname, basename = os.path.split(name) + ret += what + if name != self._main_module: + ret += '-' + os.path.splitext(basename)[0] + ret = os.path.join(dirname, ret) + else: + name = name[2:] if name else 'builtin' + ret += re.sub(r'-', '-' + name + '-', what) + return ret def _add_module(self, name, blurb): - if self._main_module is None and not self._is_builtin_module(name): - self._main_module = name genc = QAPIGenC(blurb, self._pydoc) genh = QAPIGenH(blurb, self._pydoc) self._module[name] = (genc, genh) self._set_module(name) + def _add_user_module(self, name, blurb): + assert self._is_user_module(name) + if self._main_module is None: + self._main_module = name + self._add_module(name, blurb) + + def _add_system_module(self, name, blurb): + self._add_module(name and './' + name, blurb) + def _set_module(self, name): self._genc, self._genh = self._module[name] @@ -2372,7 +2387,7 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor): self._genc = None self._genh = None else: - self._add_module(name, self._blurb) + self._add_user_module(name, self._blurb) self._begin_user_module(name) def visit_include(self, name, info): diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py index 9fa510f7df..2bd6fcd44f 100644 --- a/scripts/qapi/types.py +++ b/scripts/qapi/types.py @@ -183,7 +183,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor): QAPISchemaModularCVisitor.__init__( self, prefix, 'qapi-types', ' * Schema-defined QAPI types', __doc__) - self._add_module(None, ' * Built-in QAPI types') + self._add_system_module(None, ' * Built-in QAPI types') self._genc.preamble_add(mcgen(''' #include "qemu/osdep.h" #include "qapi/dealloc-visitor.h" diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index ca86009398..826b8066e1 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -284,7 +284,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor): QAPISchemaModularCVisitor.__init__( self, prefix, 'qapi-visit', ' * Schema-defined QAPI visitors', __doc__) - self._add_module(None, ' * Built-in QAPI visitors') + self._add_system_module(None, ' * Built-in QAPI visitors') self._genc.preamble_add(mcgen(''' #include "qemu/osdep.h" #include "qemu-common.h" -- cgit v1.2.3-55-g7522