To eliminate the temptation for clients to look up types by name (which are not ABI), replace all type names by meaningless strings.
Reduces output of query-schema by 13 out of 85KiB. TODO Either generate comments with the true type names, or provide an option to generate without type name hiding. Signed-off-by: Markus Armbruster <arm...@redhat.com> --- docs/qapi-code-gen.txt | 14 +++++++------- scripts/qapi-introspect.py | 24 +++++++++++++++++++++--- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt index ed04770..3a78cf4 100644 --- a/docs/qapi-code-gen.txt +++ b/docs/qapi-code-gen.txt @@ -868,13 +868,13 @@ Example: [Uninteresting stuff omitted...] const char example_qmp_schema_json[] = "[" - "{ \"arg-type\": \":empty\", \"name\": \"MY_EVENT\", \"meta-type\": \"event\" }, " - "{ \"meta-type\": \"builtin\", \"name\": \"int\", \"json-type\": \"int\" }, " - "{ \"meta-type\": \"builtin\", \"name\": \"str\", \"json-type\": \"string\" }, " - "{ \"meta-type\": \"object\", \"name\": \":empty\", \"members\": [ ] }, " - "{ \"meta-type\": \"object\", \"name\": \":obj-my-command-arg\", \"members\": [{ \"type\": \"UserDefOne\", \"name\": \"arg1\" } ] }, " - "{ \"meta-type\": \"object\", \"name\": \"UserDefOne\", \"members\": [{ \"type\": \"int\", \"name\": \"integer\" }, { \"type\": \"str\", \"name\": \"string\" } ] }, " - "{ \"arg-type\": \":obj-my-command-arg\", \"ret-type\": \"UserDefOne\", \"name\": \"my-command\", \"meta-type\": \"command\" } ]"; + "{ \"arg-type\": \"0\", \"meta-type\": \"event\", \"name\": \"MY_EVENT\" }, " + "{ \"arg-type\": \"1\", \"meta-type\": \"command\", \"name\": \"my-command\", \"ret-type\": \"2\" }, " + "{ \"members\": [ ], \"meta-type\": \"object\", \"name\": \"0\" }, " + "{ \"members\": [{ \"name\": \"arg1\", \"type\": \"2\" } ], \"meta-type\": \"object\", \"name\": \"1\" }, " + "{ \"members\": [{ \"name\": \"integer\", \"type\": \"int\" }, { \"name\": \"string\", \"type\": \"str\" } ], \"meta-type\": \"object\", \"name\": \"2\" }, " + "{ \"json-type\": \"int\", \"meta-type\": \"builtin\", \"name\": \"int\" }, " + "{ \"json-type\": \"string\", \"meta-type\": \"builtin\", \"name\": \"str\" } ]"; $ cat qapi-generated/example-qmp-introspect.h [Uninteresting stuff omitted...] diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py index 05d30e5..5e99d4b 100644 --- a/scripts/qapi-introspect.py +++ b/scripts/qapi-introspect.py @@ -42,25 +42,29 @@ class QAPISchemaGenIntrospectVisitor(QAPISchemaVisitor): self.schema = None self.jsons = None self.used_types = None + self.name_map = None def visit_begin(self, schema): self.schema = schema self.jsons = [] self.used_types = [] + self.name_map = {} return QAPISchemaType # don't visit types for now def visit_end(self): # visit the types that are actually used + jsons = self.jsons + self.jsons = [] for typ in self.used_types: typ.visit(self) - self.jsons.sort() # generate C + jsons.extend(self.jsons) name = prefix + 'qmp_schema_json' self.decl = mcgen(''' extern const char %(c_name)s[]; ''', c_name=c_name(name)) - lines = to_json(self.jsons).split('\n') + lines = to_json(jsons).split('\n') c_string = '\n '.join([to_c_string(line) for line in lines]) self.defn = mcgen(''' const char %(c_name)s[] = %(c_string)s; @@ -70,6 +74,13 @@ const char %(c_name)s[] = %(c_string)s; self.schema = None self.jsons = None self.used_types = None + self.name_map = None + + def _name(self, name): + if name not in self.name_map: + n = len(self.name_map) + self.name_map[name] = '%s' % n + return self.name_map[name] def _use_type(self, typ): # Map the various integer types to plain int @@ -81,9 +92,16 @@ const char %(c_name)s[] = %(c_string)s; # Add type to work queue if new if typ not in self.used_types: self.used_types.append(typ) - return typ.name + # Clients should examine commands and events, not types. Hide + # type names to reduce the temptation. Also saves a few + # characters. + if isinstance(typ, QAPISchemaBuiltinType): + return typ.name + return self._name(typ.name) def _gen_json(self, name, mtype, obj={}): + if mtype != 'command' and mtype != 'event' and mtype != 'builtin': + name = self._name(name) obj['name'] = name obj['meta-type'] = mtype self.jsons.append(obj) -- 2.4.3