[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 08/29] qapi: Permit flat union members for any tag value
From: |
Markus Armbruster |
Subject: |
[PULL 08/29] qapi: Permit flat union members for any tag value |
Date: |
Tue, 23 Mar 2021 22:56:37 +0100 |
Flat union branch names match the tag enum's member names. Omitted
branches default to "no members for this tag value".
Branch names starting with a digit get rejected like "'data' member
'0' has an invalid name". However, omitting the branch works.
This is because flat union tag values get checked twice: as enum
member name, and as union branch name. The former accepts leading
digits, the latter doesn't.
Branches whose names start with a digit therefore cannot have members.
Feels wrong. Get rid of the restriction by skipping the latter check.
This can expose c_name() to input it can't handle: a name starting
with a digit. Improve it to return a valid C identifier for any
input.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20210323094025.3569441-9-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[Commit message rewritten]
---
scripts/qapi/common.py | 8 ++++----
scripts/qapi/expr.py | 4 +++-
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 11b86beeab..cbd3fd81d3 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -18,7 +18,6 @@
#: Magic string that gets removed along with all space to its right.
EATSPACE = '\033EATSPACE.'
POINTER_SUFFIX = ' *' + EATSPACE
-_C_NAME_TRANS = str.maketrans('.-', '__')
def camel_to_upper(value: str) -> str:
@@ -109,9 +108,10 @@ def c_name(name: str, protect: bool = True) -> str:
'not_eq', 'or', 'or_eq', 'xor', 'xor_eq'])
# namespace pollution:
polluted_words = set(['unix', 'errno', 'mips', 'sparc', 'i386'])
- name = name.translate(_C_NAME_TRANS)
- if protect and (name in c89_words | c99_words | c11_words | gcc_words
- | cpp_words | polluted_words):
+ name = re.sub(r'[^A-Za-z0-9_]', '_', name)
+ if protect and (name in (c89_words | c99_words | c11_words | gcc_words
+ | cpp_words | polluted_words)
+ or name[0].isdigit()):
return 'q_' + name
return name
diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py
index cf09fa9fd3..507550c340 100644
--- a/scripts/qapi/expr.py
+++ b/scripts/qapi/expr.py
@@ -246,7 +246,9 @@ def check_union(expr, info):
for (key, value) in members.items():
source = "'data' member '%s'" % key
- check_name_str(key, info, source)
+ if discriminator is None:
+ check_name_str(key, info, source)
+ # else: name is in discriminator enum, which gets checked
check_keys(value, info, source, ['type'], ['if'])
check_if(value, info, source)
check_type(value['type'], info, source, allow_array=not base)
--
2.26.3
- [PULL 23/29] qapi: Enforce feature naming rules, (continued)
- [PULL 23/29] qapi: Enforce feature naming rules, Markus Armbruster, 2021/03/23
- [PULL 21/29] tests-qmp-cmds: Drop unused and incorrect qmp_TestIfCmd(), Markus Armbruster, 2021/03/23
- [PULL 12/29] qapi: Consistently permit any case in downstream prefixes, Markus Armbruster, 2021/03/23
- [PULL 16/29] qapi: Factor out QAPISchemaParser._check_pragma_list_of_str(), Markus Armbruster, 2021/03/23
- [PULL 28/29] qapi: Enforce union and alternate branch naming rules, Markus Armbruster, 2021/03/23
- [PULL 17/29] tests/qapi-schema: Rename pragma-*-crap to pragma-value-not-*, Markus Armbruster, 2021/03/23
- [PULL 09/29] qapi: Lift enum-specific code out of check_name_str(), Markus Armbruster, 2021/03/23
- [PULL 13/29] qapi: Enforce event naming rules, Markus Armbruster, 2021/03/23
- [PULL 29/29] block: Remove monitor command block_passwd, Markus Armbruster, 2021/03/23
- [PULL 22/29] qapi: Prepare for rejecting underscore in command and member names, Markus Armbruster, 2021/03/23
- [PULL 08/29] qapi: Permit flat union members for any tag value,
Markus Armbruster <=
- [PULL 24/29] qapi: Enforce command naming rules, Markus Armbruster, 2021/03/23
- [PULL 20/29] qapi/pragma: Streamline comments on member-name-exceptions, Markus Armbruster, 2021/03/23
- [PULL 11/29] qapi: Move uppercase rejection to check_name_lower(), Markus Armbruster, 2021/03/23
- [PULL 10/29] qapi: Rework name checking in preparation of stricter checking, Markus Armbruster, 2021/03/23
- [PULL 26/29] qapi: Enforce struct member naming rules, Markus Armbruster, 2021/03/23
- [PULL 25/29] tests/qapi-schema: Switch member name clash test to struct, Markus Armbruster, 2021/03/23
- [PULL 27/29] qapi: Enforce enum member naming rules, Markus Armbruster, 2021/03/23
- [PULL 19/29] qapi: Rename pragma *-whitelist to *-exceptions, Markus Armbruster, 2021/03/23
- Re: [PULL 00/29] QAPI patches patches for 2021-03-23, Peter Maydell, 2021/03/23