Re: [PATCH v2 02/53] qapi/introspect: expose the type name map
Marc-André Lureau <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <CAMxuvaxeC3auTDQPaS=pxj3v2BOJypdsyFFe3v1iA-EERt0itA@mail.gmail.com> |
Hi On Thu, Aug 6, 2026 at 1:48 PM Markus Armbruster <[email protected]> wrote: > > Marc-André Lureau <[email protected]> writes: > > > Preserve the internal-to-masked name map computed during introspection > > visitation and return it from gen_introspect(). The type-infos generator > > will consume this map to produce per-type QAPITypeInfo constants with > > correct masked names. > > > > Signed-off-by: Marc-André Lureau <[email protected]> > > --- > > scripts/qapi/introspect.py | 13 ++++++++++++- > > 1 file changed, 12 insertions(+), 1 deletion(-) > > > > diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py > > index 7e28de2279a..d3d3de481f4 100644 > > --- a/scripts/qapi/introspect.py > > +++ b/scripts/qapi/introspect.py > > @@ -178,6 +178,7 @@ def __init__(self, prefix: str, unmask: bool): > > self._trees: List[Annotated[SchemaInfo]] = [] > > self._used_types: List[QAPISchemaType] = [] > > self._name_map: Dict[str, str] = {} > > + self._final_name_map: Dict[str, str] = {} > > self._genc.add(mcgen(''' > > #include "qemu/osdep.h" > > #include "%(prefix)sqapi-introspect.h" > > @@ -208,8 +209,17 @@ def visit_end(self) -> None: > > self._schema = None > > self._trees = [] > > self._used_types = [] > > + self._final_name_map = dict(self._name_map) > > self._name_map = {} > > > > + def name_map(self) -> Dict[str, str]: > > + """Return the QAPI-name-to-schema-name map. > > + > > + Must be called after visit() has completed; the map is > > + populated during visit_end(). > > + """ > > + return self._final_name_map > > Can you explain why ._final_name_map is useful? We clear the map in visit_end(), so this is just keeping a copy of the resulting map. But we could clear the map instead at visit_begin(). Sounds good? > > > + > > def visit_needed(self, entity: QAPISchemaEntity) -> bool: > > # Ignore types on first pass; visit_end() will pick up used types > > return not isinstance(entity, QAPISchemaType) > > @@ -387,7 +397,8 @@ def visit_event(self, name: str, info: Optional[QAPISourceInfo], > > > > > > def gen_introspect(schema: QAPISchema, output_dir: str, prefix: str, > > - opt_unmask: bool) -> None: > > + opt_unmask: bool) -> Dict[str, str]: > > vis = QAPISchemaGenIntrospectVisitor(prefix, opt_unmask) > > schema.visit(vis) > > vis.write(output_dir) > > + return vis.name_map() > > Returning QAPISchemaGenIntrospectVisitor's existing map through > gen_introspect() works. > > Taking a step back... QAPISchemaGenIntrospectVisitor computes the set > of types that are actually used in QMP, and a map from type name to > masked type name. Back when I wrote the class, nothing else was > interested in either of these two things, so keeping them within their > only user made sense. > > Now you want masked type names for QAPISchemaGenTypeInfoVisitor. And > the doc generator could use the set of types used in QMP to trim the QMP > reference manual. Are these things still in the right place? > > If no: we can move them to a better place before or after this series. > Before would be less churn in master, but more in your tree. So perhaps > you'd rather have it done afterwards. Yes, it makes sense to have a common analysis visitor.