From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH v10 30/30] qapi: Forbid case-insensitive clashes
Date: Thu, 5 Nov 2015 23:35:54 -0700 [thread overview]
Message-ID: <1446791754-23823-31-git-send-email-eblake@redhat.com> (raw)
In-Reply-To: <1446791754-23823-1-git-send-email-eblake@redhat.com>
We have toyed on list with the idea of a future extension to
QMP of teaching it to be case-insensitive (the user could
request command 'Quit' instead of 'quit', or could spell a
struct field as 'CPU' instead of 'cpu'). But for that to be
a practical extension, we cannot break backwards compatibility
with any existing struct that was already relying on case
sensitivity. Fortunately, after the previous patch cleaned
up CpuInfo, there are no such existing qapi structs.
Another benefit of enforcing a restriction against
case-insensitive is that we no longer have to worry about the
case of enum values that could be distinguished by case if
mapped by c_name(), but which cannot be distinguished when
mapped to C as ALL_CAPS by camel_to_uppper(). Having the
generator look for case collisions up front will prevent
developers from worrying whether different munging rules
for member names compared to enum values as a discriminator
will cause any problems in qapi unions.
Of course, if we never implement a case-insensitive QMP
extension, or find a legitimate reason to need qapi members
that differ only by case, we could always relax this
restriction. But it is easier to relax later than it is to
wish we had the restriction in place earlier.
Signed-off-by: Eric Blake <eblake@redhat.com>
---
v10: new patch
---
docs/qapi-code-gen.txt | 5 +++++
scripts/qapi.py | 4 ++--
tests/Makefile | 1 +
tests/qapi-schema/args-case-clash.err | 1 +
tests/qapi-schema/args-case-clash.exit | 1 +
tests/qapi-schema/args-case-clash.json | 5 +++++
tests/qapi-schema/args-case-clash.out | 0
7 files changed, 15 insertions(+), 2 deletions(-)
create mode 100644 tests/qapi-schema/args-case-clash.err
create mode 100644 tests/qapi-schema/args-case-clash.exit
create mode 100644 tests/qapi-schema/args-case-clash.json
create mode 100644 tests/qapi-schema/args-case-clash.out
diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt
index f9fa6f3..13cec10 100644
--- a/docs/qapi-code-gen.txt
+++ b/docs/qapi-code-gen.txt
@@ -116,6 +116,11 @@ names should be ALL_CAPS with words separated by underscore. Field
names cannot start with 'has-' or 'has_', as this is reserved for
tracking optional fields.
+For now, Client JSON Protocol is case-sensitive, but future extensions
+may allow for case-insensitive recognition of command and event names,
+or of member field names. As such, the generator rejects attempts to
+create entities that only differ by case.
+
Any name (command, event, type, field, or enum value) beginning with
"x-" is marked experimental, and may be withdrawn or changed
incompatibly in a future release. Downstream vendors may add
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 3a359cb..7e7ad6e 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -1039,7 +1039,7 @@ class QAPISchemaObjectTypeMember(object):
assert self.type
def check_clash(self, info, seen):
- name = c_name(self.name)
+ name = c_name(self.name).upper()
if name in seen:
raise QAPIExprError(info,
"%s collides with %s"
@@ -1087,7 +1087,7 @@ class QAPISchemaObjectTypeVariants(object):
def check(self, schema, seen):
if self.tag_name: # flat union
- self.tag_member = seen[c_name(self.tag_name)]
+ self.tag_member = seen[c_name(self.tag_name).upper()]
assert self.tag_name == self.tag_member.name
tag_type = self.tag_member.type
assert isinstance(tag_type, QAPISchemaEnumType)
diff --git a/tests/Makefile b/tests/Makefile
index c84c6cb..d1c6817 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -239,6 +239,7 @@ qapi-schema += args-alternate.json
qapi-schema += args-any.json
qapi-schema += args-array-empty.json
qapi-schema += args-array-unknown.json
+qapi-schema += args-case-clash.json
qapi-schema += args-int.json
qapi-schema += args-invalid.json
qapi-schema += args-member-array-bad.json
diff --git a/tests/qapi-schema/args-case-clash.err b/tests/qapi-schema/args-case-clash.err
new file mode 100644
index 0000000..5495ab8
--- /dev/null
+++ b/tests/qapi-schema/args-case-clash.err
@@ -0,0 +1 @@
+tests/qapi-schema/args-case-clash.json:5: 'A' (argument of oops) collides with 'a' (argument of oops)
diff --git a/tests/qapi-schema/args-case-clash.exit b/tests/qapi-schema/args-case-clash.exit
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/tests/qapi-schema/args-case-clash.exit
@@ -0,0 +1 @@
+1
diff --git a/tests/qapi-schema/args-case-clash.json b/tests/qapi-schema/args-case-clash.json
new file mode 100644
index 0000000..55ae488
--- /dev/null
+++ b/tests/qapi-schema/args-case-clash.json
@@ -0,0 +1,5 @@
+# C member name collision
+# Reject members that clash case-insensitively (our mapping to C names
+# preserves case, but allowing these members now would prevent a future
+# relaxing of QMP to be case-insensitive).
+{ 'command': 'oops', 'data': { 'a': 'str', 'A': 'int' } }
diff --git a/tests/qapi-schema/args-case-clash.out b/tests/qapi-schema/args-case-clash.out
new file mode 100644
index 0000000..e69de29
--
2.4.3
next prev parent reply other threads:[~2015-11-06 6:36 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-06 6:35 [Qemu-devel] [PATCH v10 00/30] qapi member collision (post-introspection cleanups, subset C') Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 01/30] qapi: Use generated TestStruct machinery in tests Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 02/30] qapi: Strengthen test of TestStructList Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 03/30] qobject: Protect against use-after-free in qobject_decref() Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 04/30] qapi: Share test_init code in test-qmp-input* Eric Blake
2015-11-06 15:17 ` Markus Armbruster
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 05/30] qapi: Plug leaks in test-qmp-* Eric Blake
2015-11-06 15:21 ` Markus Armbruster
2015-11-06 15:49 ` Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 06/30] qapi: Simplify non-error testing " Eric Blake
2015-11-06 15:36 ` Markus Armbruster
2015-11-06 15:54 ` Eric Blake
2015-11-06 16:24 ` Markus Armbruster
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 07/30] qapi: Simplify error cleanup " Eric Blake
2015-11-06 15:40 ` Markus Armbruster
2015-11-06 15:59 ` Eric Blake
2015-11-06 16:23 ` Markus Armbruster
2015-11-06 16:32 ` Eric Blake
2015-11-06 17:04 ` [Qemu-devel] [PATCH] fixup! " Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 08/30] qapi: More tests of alternate output Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 09/30] qapi: Test failure in middle of array parse Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 10/30] qapi: More tests of input arrays Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 11/30] qapi: Provide nicer array names in introspection Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 12/30] qapi-introspect: Document lack of sorting Eric Blake
2015-11-06 15:52 ` Markus Armbruster
2015-11-09 20:56 ` Eric Blake
2015-11-10 7:36 ` Markus Armbruster
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 13/30] qapi: Track simple union tag in object.local_members Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 14/30] qapi-types: Consolidate gen_struct() and gen_union() Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 15/30] qapi-types: Simplify gen_struct_field[s] Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 16/30] qapi: Drop obsolete tag value collision assertions Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 17/30] qapi: Simplify QAPISchemaObjectTypeMember.check() Eric Blake
2015-11-09 12:31 ` Markus Armbruster
2015-11-09 14:44 ` Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 18/30] qapi: Clean up after previous commit Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 19/30] qapi: Fix up commit 7618b91's clash sanity checking change Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 20/30] qapi: Eliminate QAPISchemaObjectType.check() variable members Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 21/30] qapi: Factor out QAPISchemaObjectTypeMember.check_clash() Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 22/30] qapi: Simplify QAPISchemaObjectTypeVariants.check() Eric Blake
2015-11-09 12:38 ` Markus Armbruster
2015-11-10 5:04 ` Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 23/30] qapi: Check for qapi collisions of flat union branches Eric Blake
2015-11-09 12:56 ` Markus Armbruster
2015-11-09 15:13 ` Markus Armbruster
2015-11-10 5:18 ` Eric Blake
2015-11-10 5:16 ` Eric Blake
2015-11-10 8:30 ` Markus Armbruster
2015-11-10 13:24 ` Eric Blake
2015-11-10 23:37 ` Eric Blake
2015-11-11 9:50 ` Markus Armbruster
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 24/30] qapi: Factor out QAPISchemaObjectType.check_clash() Eric Blake
2015-11-09 13:00 ` Markus Armbruster
2015-11-09 17:36 ` Eric Blake
2015-11-09 19:11 ` Markus Armbruster
2015-11-10 5:22 ` Eric Blake
2015-11-09 14:49 ` Markus Armbruster
2015-11-10 5:32 ` Eric Blake
2015-11-10 9:15 ` Markus Armbruster
2015-11-10 13:19 ` Eric Blake
2015-11-10 14:43 ` Markus Armbruster
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 25/30] qapi: Hoist tag collision check to Variants.check() Eric Blake
2015-11-09 13:07 ` Markus Armbruster
2015-11-10 5:33 ` Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 26/30] qapi: Remove outdated tests related to QMP/branch collisions Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 27/30] qapi: Track owner of each object member Eric Blake
2015-11-09 14:26 ` Markus Armbruster
2015-11-11 0:17 ` Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 28/30] qapi: Detect collisions in C member names Eric Blake
2015-11-09 15:17 ` Markus Armbruster
2015-11-11 0:34 ` Eric Blake
2015-11-06 6:35 ` [Qemu-devel] [PATCH v10 29/30] cpu: Convert CpuInfo into flat union Eric Blake
2015-11-09 15:22 ` Markus Armbruster
2015-11-11 2:50 ` Eric Blake
2015-11-11 10:19 ` Markus Armbruster
2015-11-11 15:40 ` Eric Blake
2015-11-11 17:00 ` Markus Armbruster
2015-11-06 6:35 ` Eric Blake [this message]
2015-11-09 15:42 ` [Qemu-devel] [PATCH v10 30/30] qapi: Forbid case-insensitive clashes Markus Armbruster
2015-11-06 16:03 ` [Qemu-devel] [PATCH v10 00/30] qapi member collision (post-introspection cleanups, subset C') Markus Armbruster
2015-11-06 16:08 ` Eric Blake
2015-11-09 9:59 ` Markus Armbruster
2015-11-09 14:43 ` Eric Blake
2015-11-09 18:42 ` Markus Armbruster
2015-11-10 11:57 ` Markus Armbruster
2015-11-11 22:48 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1446791754-23823-31-git-send-email-eblake@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).