Commit 7599697c authored by Eric Blake's avatar Eric Blake Committed by Markus Armbruster
Browse files

qapi: Adjust names of implicit types



The original choice of ':obj-' as the prefix for implicit types
made it obvious that we weren't going to clash with any user-defined
names, which cannot contain ':'.  But now we want to create structs
for implicit types, to get rid of special cases in the generators,
and our use of ':' in implicit names needs a tweak to produce valid
C code.

We could transliterate ':' to '_', except that C99 mandates that
"identifiers that begin with an underscore are always reserved for
use as identifiers with file scope in both the ordinary and tag name
spaces".  So it's time to change our naming convention: we can
instead use the 'q_' prefix that we reserved for ourselves back in
commit 9fb081e0.  Technically, since we aren't planning on exposing
the empty type in generated code, we could keep the name ':empty',
but renaming it to 'q_empty' makes the check for startswith('q_')
cover all implicit types, whether or not code is generated for them.

As long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
clash with c_name() prepending 'q_' to the user's ticklish names.

Signed-off-by: default avatarEric Blake <eblake@redhat.com>
Message-Id: <1458254921-17042-5-git-send-email-eblake@redhat.com>
Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
parent 4040d995
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -575,9 +575,9 @@ names an object type without members.
Example: the SchemaInfo for command query-qmp-schema

    { "name": "query-qmp-schema", "meta-type": "command",
      "arg-type": ":empty", "ret-type": "SchemaInfoList" }
      "arg-type": "q_empty", "ret-type": "SchemaInfoList" }

    Type ":empty" is an object type without members, and type
    Type "q_empty" is an automatic object type without members, and type
    "SchemaInfoList" is the array of SchemaInfo type.

The SchemaInfo for an event has meta-type "event", and variant member
@@ -594,9 +594,9 @@ QAPI schema implicitly defines an object type.
Example: the SchemaInfo for EVENT_C from section Events

    { "name": "EVENT_C", "meta-type": "event",
      "arg-type": ":obj-EVENT_C-arg" }
      "arg-type": "q_obj-EVENT_C-arg" }

    Type ":obj-EVENT_C-arg" is an implicitly defined object type with
    Type "q_obj-EVENT_C-arg" is an implicitly defined object type with
    the two members from the event's definition.

The SchemaInfo for struct and union types has meta-type "object".
@@ -660,11 +660,11 @@ Union types
          { "name": "type", "type": "BlockdevOptionsKind" } ],
      "tag": "type",
      "variants": [
          { "case": "file", "type": ":obj-FileOptions-wrapper" },
          { "case": "qcow2", "type": ":obj-Qcow2Options-wrapper" } ] }
          { "case": "file", "type": "q_obj-FileOptions-wrapper" },
          { "case": "qcow2", "type": "q_obj-Qcow2Options-wrapper" } ] }

    Enumeration type "BlockdevOptionsKind" and the object types
    ":obj-FileOptions-wrapper", ":obj-Qcow2Options-wrapper" are
    "q_obj-FileOptions-wrapper", "q_obj-Qcow2Options-wrapper" are
    implicitly defined.

The SchemaInfo for an alternate type has meta-type "alternate", and
+10 −8
Original line number Diff line number Diff line
@@ -391,7 +391,8 @@ def check_name(expr_info, source, name, allow_optional=False,
    # code always prefixes it with the enum name
    if enum_member and membername[0].isdigit():
        membername = 'D' + membername
    # Reserve the entire 'q_' namespace for c_name()
    # Reserve the entire 'q_' namespace for c_name(), and for 'q_empty'
    # and 'q_obj_*' implicit type names.
    if not valid_name.match(membername) or \
       c_name(membername, False).startswith('q_'):
        raise QAPIExprError(expr_info,
@@ -994,8 +995,9 @@ class QAPISchemaObjectType(QAPISchemaType):
            m.check_clash(info, seen)

    def is_implicit(self):
        # See QAPISchema._make_implicit_object_type()
        return self.name[0] == ':'
        # See QAPISchema._make_implicit_object_type(), as well as
        # _def_predefineds()
        return self.name.startswith('q_')

    def c_name(self):
        assert not self.is_implicit()
@@ -1044,10 +1046,10 @@ class QAPISchemaMember(object):

    def _pretty_owner(self):
        owner = self.owner
        if owner.startswith(':obj-'):
        if owner.startswith('q_obj_'):
            # See QAPISchema._make_implicit_object_type() - reverse the
            # mapping there to create a nice human-readable description
            owner = owner[5:]
            owner = owner[6:]
            if owner.endswith('-arg'):
                return '(parameter of %s)' % owner[:-4]
            else:
@@ -1266,8 +1268,8 @@ class QAPISchema(object):
                  ('bool',   'boolean', 'bool',     'false'),
                  ('any',    'value',   'QObject' + pointer_suffix, 'NULL')]:
            self._def_builtin_type(*t)
        self.the_empty_object_type = QAPISchemaObjectType(':empty', None, None,
                                                          [], None)
        self.the_empty_object_type = QAPISchemaObjectType('q_empty', None,
                                                          None, [], None)
        self._def_entity(self.the_empty_object_type)
        qtype_values = self._make_enum_members(['none', 'qnull', 'qint',
                                                'qstring', 'qdict', 'qlist',
@@ -1295,7 +1297,7 @@ class QAPISchema(object):
        if not members:
            return None
        # See also QAPISchemaObjectTypeMember._pretty_owner()
        name = ':obj-%s-%s' % (name, role)
        name = 'q_obj_%s-%s' % (name, role)
        if not self.lookup_entity(name, QAPISchemaObjectType):
            self._def_entity(QAPISchemaObjectType(name, info, None,
                                                  members, None))
+1 −1
Original line number Diff line number Diff line
object :empty
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
    prefix QTYPE
enum Status ['good', 'bad', 'ugly']
object q_empty
+1 −1
Original line number Diff line number Diff line
object :empty
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
    prefix QTYPE
object q_empty
+1 −1
Original line number Diff line number Diff line
object :empty
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
    prefix QTYPE
event oops None
object q_empty
Loading