[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 08/28] qapi: Support flat unions tag values with leading digit
From: |
Markus Armbruster |
Subject: |
[PATCH 08/28] qapi: Support flat unions tag values with leading digit |
Date: |
Tue, 23 Mar 2021 10:40:05 +0100 |
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. The restriction feels arbitrary. Skip 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>
---
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
Re: [PATCH 10/28] qapi: Rework name checking in preparation of stricter checking, John Snow, 2021/03/23
- Re: [PATCH 10/28] qapi: Rework name checking in preparation of stricter checking, Markus Armbruster, 2021/03/24
- Re: [PATCH 10/28] qapi: Rework name checking in preparation of stricter checking, John Snow, 2021/03/24
- Re: [PATCH 10/28] qapi: Rework name checking in preparation of stricter checking, Markus Armbruster, 2021/03/25
- Re: [PATCH 10/28] qapi: Rework name checking in preparation of stricter checking, John Snow, 2021/03/25
- Re: [PATCH 10/28] qapi: Rework name checking in preparation of stricter checking, Markus Armbruster, 2021/03/26
[PATCH 08/28] qapi: Support flat unions tag values with leading digit,
Markus Armbruster <=
[PATCH 07/28] qapi: Fix to reject optional members with reserved names, Markus Armbruster, 2021/03/23
[PATCH 26/28] qapi: Enforce struct member naming rules, Markus Armbruster, 2021/03/23