[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 17/40] qapi: Fix c_name() munging
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PULL 17/40] qapi: Fix c_name() munging |
Date: |
Thu, 17 Dec 2015 09:33:22 +0100 |
From: Eric Blake <address@hidden>
The method c_name() is supposed to do two different actions: munge
'-' into '_', and add a 'q_' prefix to ticklish names. But it did
these steps out of order, making it possible to submit input that
is not ticklish until after munging, where the output then lacked
the desired prefix.
The failure is exposed easily if you have a compiler that recognizes
C11 keywords, and try to name a member '_Thread-local', as it would
result in trying to compile the declaration 'uint64_t _Thread_local;'
which is not valid. However, this name violates our conventions
(ultimately, want to enforce that no qapi names start with single
underscore), so the test is slightly weaker by instead testing
'wchar-t'; the declaration 'uint64_t wchar_t;' is valid in C (where
wchar_t is only a typedef) but would fail with a C++ compiler (where
it is a keyword).
Fix things by reversing the order of actions within c_name().
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>
---
scripts/qapi.py | 3 ++-
tests/qapi-schema/qapi-schema-test.json | 5 +++--
tests/qapi-schema/qapi-schema-test.out | 1 +
tests/test-qmp-commands.c | 4 ++++
4 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 4870326..d2ce9b3 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -1482,10 +1482,11 @@ def c_name(name, protect=True):
'not_eq', 'or', 'or_eq', 'xor', 'xor_eq'])
# namespace pollution:
polluted_words = set(['unix', 'errno'])
+ name = name.translate(c_name_trans)
if protect and (name in c89_words | c99_words | c11_words | gcc_words
| cpp_words | polluted_words):
return "q_" + name
- return name.translate(c_name_trans)
+ return name
eatspace = '\033EATSPACE.'
pointer_suffix = ' *' + eatspace
diff --git a/tests/qapi-schema/qapi-schema-test.json
b/tests/qapi-schema/qapi-schema-test.json
index 44638da..4b89527 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -152,12 +152,13 @@
{ 'event': 'EVENT_D',
'data': { 'a' : 'EventStructOne', 'b' : 'str', '*c': 'str', '*enum3':
'EnumOne' } }
-# test that we correctly compile downstream extensions
+# test that we correctly compile downstream extensions, as well as munge
+# ticklish names
{ 'enum': '__org.qemu_x-Enum', 'data': [ '__org.qemu_x-value' ] }
{ 'struct': '__org.qemu_x-Base',
'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
- 'data': { '__org.qemu_x-member2': 'str' } }
+ 'data': { '__org.qemu_x-member2': 'str', '*wchar-t': 'int' } }
{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
{ 'struct': '__org.qemu_x-Struct2',
'data': { 'array': ['__org.qemu_x-Union1'] } }
diff --git a/tests/qapi-schema/qapi-schema-test.out
b/tests/qapi-schema/qapi-schema-test.out
index 786024e..0724a9f 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -185,6 +185,7 @@ enum __org.qemu_x-Enum ['__org.qemu_x-value']
object __org.qemu_x-Struct
base __org.qemu_x-Base
member __org.qemu_x-member2: str optional=False
+ member wchar-t: int optional=True
object __org.qemu_x-Struct2
member array: __org.qemu_x-Union1List optional=False
object __org.qemu_x-Union1
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index 888fb5f..9f35b80 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -65,6 +65,10 @@ __org_qemu_x_Union1
*qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
ret->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
ret->u.__org_qemu_x_branch = strdup("blah1");
+ /* Also test that 'wchar-t' was munged to 'q_wchar_t' */
+ if (b && b->value && !b->value->has_q_wchar_t) {
+ b->value->q_wchar_t = 1;
+ }
return ret;
}
--
2.4.3
- [Qemu-devel] [PULL 09/40] qapi: Factor out QAPISchemaObjectTypeMember.check_clash(), (continued)
- [Qemu-devel] [PULL 09/40] qapi: Factor out QAPISchemaObjectTypeMember.check_clash(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 02/40] qapi-types: Consolidate gen_struct() and gen_union(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 05/40] qapi: Simplify QAPISchemaObjectTypeMember.check(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 07/40] qapi: Fix up commit 7618b91's clash sanity checking change, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 06/40] qapi: Clean up after previous commit, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 10/40] qapi: Simplify QAPISchemaObjectTypeVariants.check(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 04/40] qapi: Drop obsolete tag value collision assertions, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 03/40] qapi-types: Simplify gen_struct_field[s], Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 12/40] qapi: Factor out QAPISchemaObjectType.check_clash(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 01/40] qapi: Track simple union tag in object.local_members, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 17/40] qapi: Fix c_name() munging,
Markus Armbruster <=
- [Qemu-devel] [PULL 19/40] blkdebug: Merge hand-rolled and qapi BlkdebugEvent enum, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 18/40] qapi: Remove dead visitor code, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 24/40] cpu: Convert CpuInfo into flat union, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 25/40] qapi: Add alias for ErrorClass, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 32/40] qapi: Inline _make_implicit_tag(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 14/40] qapi: Remove outdated tests related to QMP/branch collisions, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 08/40] qapi: Eliminate QAPISchemaObjectType.check() variable members, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 13/40] qapi: Hoist tag collision check to Variants.check(), Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 21/40] qapi: Tighten the regex on valid names, Markus Armbruster, 2015/12/17
- [Qemu-devel] [PULL 23/40] qapi: Remove obsolete tests for MAX collision, Markus Armbruster, 2015/12/17