diff --git a/qemu/scripts/qapi/common.py b/qemu/scripts/qapi/common.py index d6d57f33..5f5a5d76 100644 --- a/qemu/scripts/qapi/common.py +++ b/qemu/scripts/qapi/common.py @@ -2054,3 +2054,14 @@ class QAPIGenDoc(QAPIGen): return (QAPIGen._top(self, fname) + '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n') +class QAPISchemaMonolithicCVisitor(QAPISchemaVisitor): + + def __init__(self, prefix, what, blurb, pydoc): + self._prefix = prefix + self._what = what + self._genc = QAPIGenC(blurb, pydoc) + self._genh = QAPIGenH(blurb, pydoc) + + def write(self, output_dir): + self._genc.write(output_dir, self._prefix + self._what + '.c') + self._genh.write(output_dir, self._prefix + self._what + '.h') diff --git a/qemu/scripts/qapi/events.py b/qemu/scripts/qapi/events.py index 8791e604..c8436b2d 100644 --- a/qemu/scripts/qapi/events.py +++ b/qemu/scripts/qapi/events.py @@ -148,34 +148,14 @@ out: return ret -class QAPISchemaGenEventVisitor(QAPISchemaVisitor): +class QAPISchemaGenEventVisitor(QAPISchemaMonolithicCVisitor): def __init__(self, prefix): + QAPISchemaMonolithicCVisitor.__init__( + self, prefix, 'qapi-event', + ' * Schema-defined QAPI/QMP events', __doc__) self._enum_name = c_name(prefix + 'QAPIEvent', protect=False) - self.decl = None - self.defn = None - self._event_names = None - - def visit_begin(self, schema): - self.decl = '' - self.defn = '' self._event_names = [] - - def visit_end(self): - 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._enum_name) - self._event_names.append(name) - -def gen_events(schema, output_dir, prefix): - blurb = ' * Schema-defined QAPI/QMP events' - genc = QAPIGenC(blurb, __doc__) - genh = QAPIGenH(blurb, __doc__) - - genc.add(mcgen(''' + self._genc.add(mcgen(''' #include "qemu-common.h" #include "%(prefix)sqapi-event.h" #include "%(prefix)sqapi-visit.h" @@ -185,17 +165,25 @@ def gen_events(schema, output_dir, prefix): #include "qapi/qmp-event.h" ''', - prefix=prefix)) + prefix=prefix)) - genh.add(mcgen(''' + self._genh.add(mcgen(''' #include "%(prefix)sqapi-types.h" ''', - prefix=prefix)) + prefix=prefix)) + def visit_end(self): + self._genh.add(gen_enum(self._enum_name, self._event_names)) + self._genc.add(gen_enum_lookup(self._enum_name, self._event_names)) + + def visit_event(self, name, info, arg_type, boxed): + self._genh.add(gen_event_send_decl(name, arg_type, boxed)) + self._genc.add(gen_event_send(name, arg_type, boxed, self._enum_name)) + self._event_names.append(name) + + +def gen_events(schema, output_dir, prefix): vis = QAPISchemaGenEventVisitor(prefix) schema.visit(vis) - genc.add(vis.defn) - genh.add(vis.decl) - genc.write(output_dir, prefix + 'qapi-event.c') - genh.write(output_dir, prefix + 'qapi-event.h') + vis.write(output_dir) diff --git a/qemu/scripts/qapi/types.py b/qemu/scripts/qapi/types.py index fee5e746..ea05b1c3 100644 --- a/qemu/scripts/qapi/types.py +++ b/qemu/scripts/qapi/types.py @@ -167,36 +167,41 @@ void qapi_free_%(c_name)s(%(c_name)s *obj) return ret -class QAPISchemaGenTypeVisitor(QAPISchemaVisitor): - def __init__(self, opt_builtins): +class QAPISchemaGenTypeVisitor(QAPISchemaMonolithicCVisitor): + + def __init__(self, prefix, opt_builtins): + QAPISchemaMonolithicCVisitor.__init__( + self, prefix, 'qapi-types', ' * Schema-defined QAPI types', + __doc__) self._opt_builtins = opt_builtins - self.decl = None - self.defn = None - self._fwdecl = None - self._btin = None + self._genc.preamble_add(mcgen(''' +#include "qemu/osdep.h" +#include "qapi/dealloc-visitor.h" +#include "%(prefix)sqapi-types.h" +#include "%(prefix)sqapi-visit.h" +''', + prefix=prefix)) + self._genh.preamble_add(mcgen(''' +/* #include "qapi/util.h" */ +''')) + self._btin = '\n' + guardstart('QAPI_TYPES_BUILTIN') def visit_begin(self, schema): # gen_object() is recursive, ensure it doesn't visit the empty type objects_seen.add(schema.the_empty_object_type.name) - self.decl = '' - self.defn = '' - self._fwdecl = '' - self._btin = '\n' + guardstart('QAPI_TYPES_BUILTIN') def visit_end(self): - self.decl = self._fwdecl + self.decl - 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 opt_builtins (command line # option -b). self._btin += guardend('QAPI_TYPES_BUILTIN') - self.decl = self._btin + self.decl + self._genh.preamble_add(self._btin) self._btin = None def _gen_type_cleanup(self, name): - self.decl += gen_type_cleanup_decl(name) - self.defn += gen_type_cleanup(name) + self._genh.add(gen_type_cleanup_decl(name)) + self._genc.add(gen_type_cleanup(name)) def visit_enum_type(self, name, info, values, prefix): # Special case for our lone builtin enum type @@ -204,10 +209,10 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor): if not info: self._btin += gen_enum(name, values, prefix) if self._opt_builtins: - self.defn += gen_enum_lookup(name, values, prefix) + self._genc.add(gen_enum_lookup(name, values, prefix)) else: - self._fwdecl += gen_enum(name, values, prefix) - self.defn += gen_enum_lookup(name, values, prefix) + self._genh.preamble_add(gen_enum(name, values, prefix)) + self._genc.add(gen_enum_lookup(name, values, prefix)) def visit_array_type(self, name, info, element_type): if isinstance(element_type, QAPISchemaBuiltinType): @@ -215,20 +220,20 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor): self._btin += gen_array(name, element_type) self._btin += gen_type_cleanup_decl(name) if self._opt_builtins: - self.defn += gen_type_cleanup(name) + self._genc.add(gen_type_cleanup(name)) else: - self._fwdecl += gen_fwd_object_or_array(name) - self.decl += gen_array(name, element_type) + self._genh.preamble_add(gen_fwd_object_or_array(name)) + self._genh.add(gen_array(name, element_type)) self._gen_type_cleanup(name) def visit_object_type(self, name, info, base, members, variants): # Nothing to do for the special empty builtin if name == 'q_empty': return - self._fwdecl += gen_fwd_object_or_array(name) - self.decl += gen_object(name, base, members, variants) + self._genh.preamble_add(gen_fwd_object_or_array(name)) + self._genh.add(gen_object(name, base, members, variants)) if base and not base.is_implicit(): - self.decl += gen_upcast(name, base) + self._genh.add(gen_upcast(name, base)) # TODO Worth changing the visitor signature, so we could # directly use rather than repeat type.is_implicit()? if not name.startswith('q_'): @@ -236,30 +241,12 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor): self._gen_type_cleanup(name) def visit_alternate_type(self, name, info, variants): - self._fwdecl += gen_fwd_object_or_array(name) - self.decl += gen_object(name, None, [variants.tag_member], variants) + self._genh.preamble_add(gen_fwd_object_or_array(name)) + self._genh.add(gen_object(name, None, + [variants.tag_member], variants)) self._gen_type_cleanup(name) def gen_types(schema, output_dir, prefix, opt_builtins): - blurb = ' * Schema-defined QAPI types' - genc = QAPIGenC(blurb, __doc__) - genh = QAPIGenH(blurb, __doc__) - - genc.add(mcgen(''' -#include "qemu/osdep.h" -#include "qapi/dealloc-visitor.h" -#include "%(prefix)sqapi-types.h" -#include "%(prefix)sqapi-visit.h" -''', - prefix=prefix)) - - genh.add(mcgen(''' -/* #include "qapi/util.h" */ -''')) - - vis = QAPISchemaGenTypeVisitor(opt_builtins) + vis = QAPISchemaGenTypeVisitor(prefix, opt_builtins) schema.visit(vis) - genc.add(vis.defn) - genh.add(vis.decl) - genc.write(output_dir, prefix + 'qapi-types.c') - genh.write(output_dir, prefix + 'qapi-types.h') + vis.write(output_dir) diff --git a/qemu/scripts/qapi/visit.py b/qemu/scripts/qapi/visit.py index 85b58125..d1e81563 100644 --- a/qemu/scripts/qapi/visit.py +++ b/qemu/scripts/qapi/visit.py @@ -263,12 +263,29 @@ out: c_name=c_name(name)) -class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): - def __init__(self, opt_builtins): +class QAPISchemaGenVisitVisitor(QAPISchemaMonolithicCVisitor): + + def __init__(self, prefix, opt_builtins): + QAPISchemaMonolithicCVisitor.__init__( + self, prefix, 'qapi-visit', ' * Schema-defined QAPI visitors', + __doc__) self._opt_builtins = opt_builtins - self.decl = None - self.defn = None - self._btin = None + self._genc.preamble_add(mcgen(''' +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "qapi/error.h" +#include "qapi/qmp/qerror.h" +#include "%(prefix)sqapi-visit.h" +''', + prefix=prefix)) + self._genh.preamble_add(mcgen(''' +#include "qapi/visitor.h" +#include "%(prefix)sqapi-types.h" + +''', + prefix=prefix)) + self._btin = guardstart('QAPI_VISIT_BUILTIN') + def visit_begin(self, schema): self.decl = '' @@ -281,7 +298,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): # simply guard them. See also opt_builtins (command line # option -b). self._btin += guardend('QAPI_VISIT_BUILTIN') - self.decl = self._btin + self.decl + self._genh.preamble_add(self._btin) self._btin = None def visit_enum_type(self, name, info, values, prefix): @@ -290,10 +307,10 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): if not info: self._btin += gen_visit_decl(name, scalar=True) if self._opt_builtins: - self.defn += gen_visit_enum(name) + self._genc.add(gen_visit_enum(name)) else: - self.decl += gen_visit_decl(name, scalar=True) - self.defn += gen_visit_enum(name) + self._genh.add(gen_visit_decl(name, scalar=True)) + self._genc.add(gen_visit_enum(name)) def visit_array_type(self, name, info, element_type): decl = gen_visit_decl(name) @@ -301,52 +318,29 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): if isinstance(element_type, QAPISchemaBuiltinType): self._btin += decl if self._opt_builtins: - self.defn += defn + self._genc.add(defn) else: - self.decl += decl - self.defn += defn + self._genh.add(decl) + self._genc.add(defn) def visit_object_type(self, name, info, base, members, variants): # Nothing to do for the special empty builtin if name == 'q_empty': return - self.decl += gen_visit_members_decl(name) - self.defn += gen_visit_object_members(name, base, members, variants) + self._genh.add(gen_visit_members_decl(name)) + self._genc.add(gen_visit_object_members(name, base, members, variants)) # TODO Worth changing the visitor signature, so we could # directly use rather than repeat type.is_implicit()? if not name.startswith('q_'): # only explicit types need an allocating visit - self.decl += gen_visit_decl(name) - self.defn += gen_visit_object(name, base, members, variants) + self._genh.add(gen_visit_decl(name)) + self._genc.add(gen_visit_object(name, base, members, variants)) def visit_alternate_type(self, name, info, variants): - self.decl += gen_visit_decl(name) - self.defn += gen_visit_alternate(name, variants) + self._genh.add(gen_visit_decl(name)) + self._genc.add(gen_visit_alternate(name, variants)) def gen_visit(schema, output_dir, prefix, opt_builtins): - blurb = ' * Schema-defined QAPI visitors' - genc = QAPIGenC(blurb, __doc__) - genh = QAPIGenH(blurb, __doc__) - - genc.add(mcgen(''' -#include "qemu/osdep.h" -#include "qemu-common.h" -#include "qapi/error.h" -#include "%(prefix)sqapi-visit.h" -''', - prefix=prefix)) - - genh.add(mcgen(''' -#include "qapi/visitor.h" -#include "qapi/qmp/qerror.h" -#include "%(prefix)sqapi-types.h" - -''', - prefix=prefix)) - - vis = QAPISchemaGenVisitVisitor(opt_builtins) + vis = QAPISchemaGenVisitVisitor(prefix, opt_builtins) schema.visit(vis) - genc.add(vis.defn) - genh.add(vis.decl) - genc.write(output_dir, prefix + 'qapi-visit.c') - genh.write(output_dir, prefix + 'qapi-visit.h') + vis.write(output_dir)