From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: mdroth@linux.vnet.ibm.com, marcandre.lureau@redhat.com,
Markus Armbruster <armbru@redhat.com>,
qemu-devel@nongnu.org
Subject: Re: [PATCH 05/25] qapi: Clean up member name case checking
Date: Tue, 24 Sep 2019 22:20:09 +0200 [thread overview]
Message-ID: <87blv9a1l2.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <67f5d0d5-b78e-b126-6fe5-4078ceed6f23@redhat.com> (Eric Blake's message of "Tue, 24 Sep 2019 10:07:17 -0500")
Eric Blake <eblake@redhat.com> writes:
> On 9/24/19 8:28 AM, Markus Armbruster wrote:
>> QAPISchemaMember.check_clash() checks for member names that map to the
>> same c_name(). Takes care of rejecting duplicate names.
>>
>> It also checks a naming rule: no uppercase in member names. That's a
>> rather odd place to do it. Enforcing naming rules is
>> check_name_str()'s job.
>>
>> qapi-code-gen.txt specifies the name case rule applies to the name as
>> it appears in the schema. check_clash() checks c_name(name) instead.
>> No difference, as c_name() leaves alone case, but unclean.
>>
>> Move the name case check into check_name_str(), less the c_name().
>> New argument @permit_upper suppresses it. Pass permit_upper=True for
>> definitions (which are not members), and when the member's owner is
>> whitelisted with pragma name-case-whitelist.
>>
>> Bonus: name-case-whitelist now applies to a union's inline base, too.
>> Update qapi/qapi-schema.json pragma to whitelist union CpuInfo instead
>> of CpuInfo's implicit base type's name q_obj_CpuInfo-base.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>> +++ b/qapi/qapi-schema.json
>> @@ -71,7 +71,7 @@
>> 'QapiErrorClass', # all members, visible through errors
>> 'UuidInfo', # UUID, visible through query-uuid
>> 'X86CPURegister32', # all members, visible indirectly through qom-get
>> - 'q_obj_CpuInfo-base' # CPU, visible through query-cpu
>> + 'CpuInfo' # CPU, visible through query-cpu
>
> Yes, much nicer.
>
>> ] } }
>>
>> # Documentation generated with qapi-gen.py is in source order, with
>> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
>> index f0e7d5ad34..ed4bff4479 100644
>> --- a/scripts/qapi/common.py
>> +++ b/scripts/qapi/common.py
>> @@ -704,8 +704,8 @@ valid_name = re.compile(r'^(__[a-zA-Z0-9.-]+_)?'
>> '[a-zA-Z][a-zA-Z0-9_-]*$')
>>
>>
>> -def check_name(info, source, name, allow_optional=False,
>> - enum_member=False):
>> +def check_name(info, source, name,
>> + allow_optional=False, enum_member=False, permit_upper=False):
>> global valid_name
>> membername = name
>>
>> @@ -725,11 +725,14 @@ def check_name(info, source, name, allow_optional=False,
>> if not valid_name.match(membername) or \
>> c_name(membername, False).startswith('q_'):
>> raise QAPISemError(info, "%s uses invalid name '%s'" % (source, name))
>> + if not permit_upper and name.lower() != name:
>> + raise QAPISemError(
>> + info, "%s uses uppercase in name '%s'" % (source, name))
>>
>>
>> def add_name(name, info, meta):
>> global all_names
>> - check_name(info, "'%s'" % meta, name)
>> + check_name(info, "'%s'" % meta, name, permit_upper=True)
>> # FIXME should reject names that differ only in '_' vs. '.'
>> # vs. '-', because they're liable to clash in generated C.
>> if name in all_names:
>> @@ -797,10 +800,12 @@ def check_type(info, source, value,
>> raise QAPISemError(info,
>> "%s should be an object or type name" % source)
>>
>> + permit_upper = allow_dict in name_case_whitelist
>> +
>
> so allow_dict changes from a bool to a string to be looked up...
>
>> # value is a dictionary, check that each member is okay
>> for (key, arg) in value.items():
>> check_name(info, "Member of %s" % source, key,
>> - allow_optional=True)
>> + allow_optional=True, permit_upper=permit_upper)
>> if c_name(key, False) == 'u' or c_name(key, False).startswith('has_'):
>> raise QAPISemError(info, "Member of %s uses reserved name '%s'"
>> % (source, key))
>> @@ -870,7 +875,7 @@ def check_union(expr, info):
>> else:
>> # The object must have a string or dictionary 'base'.
>> check_type(info, "'base' for union '%s'" % name,
>> - base, allow_dict=True,
>> + base, allow_dict=name,
>
> ...and this is an example client affected by the change. That threw me
> for a bit, but seems to work.
I'm not proud of this interface, but I couldn't think of anything
better.
> Reviewed-by: Eric Blake <eblake@redhat.com>
Thanks!
next prev parent reply other threads:[~2019-09-24 20:30 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-24 13:28 [PATCH 00/25] qapi: Pay back some frontend technical debt Markus Armbruster
2019-09-24 13:28 ` [PATCH 01/25] qapi: Tighten QAPISchemaFOO.check() assertions Markus Armbruster
2019-09-24 14:39 ` Eric Blake
2019-09-24 20:18 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 02/25] qapi: Rename .owner to .defined_in Markus Armbruster
2019-09-24 14:41 ` Eric Blake
2019-09-24 13:28 ` [PATCH 03/25] qapi: New QAPISourceInfo, replacing dict Markus Armbruster
2019-09-24 14:51 ` Eric Blake
2019-09-24 20:18 ` Markus Armbruster
2019-09-24 19:12 ` Eric Blake
2019-09-25 6:40 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 04/25] qapi: Prefix frontend errors with an "in definition" line Markus Armbruster
2019-09-24 14:58 ` Eric Blake
2019-09-24 13:28 ` [PATCH 05/25] qapi: Clean up member name case checking Markus Armbruster
2019-09-24 15:07 ` Eric Blake
2019-09-24 20:20 ` Markus Armbruster [this message]
2019-09-24 13:28 ` [PATCH 06/25] qapi: Change frontend error messages to start with lower case Markus Armbruster
2019-09-24 15:17 ` Eric Blake
2019-09-24 20:35 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 07/25] qapi: Improve reporting of member name clashes Markus Armbruster
2019-09-24 15:38 ` Eric Blake
2019-09-24 13:28 ` [PATCH 08/25] qapi: Reorder check_FOO() parameters for consistency Markus Armbruster
2019-09-24 15:41 ` Eric Blake
2019-09-24 13:28 ` [PATCH 09/25] qapi: Improve reporting of invalid name errors Markus Armbruster
2019-09-24 15:48 ` Eric Blake
2019-09-24 13:28 ` [PATCH 10/25] qapi: Use check_name_str() where it suffices Markus Armbruster
2019-09-24 15:50 ` Eric Blake
2019-09-24 13:28 ` [PATCH 11/25] qapi: Report invalid '*' prefix like any other invalid name Markus Armbruster
2019-09-24 15:52 ` Eric Blake
2019-09-24 13:28 ` [PATCH 12/25] qapi: Move check for reserved names out of add_name() Markus Armbruster
2019-09-24 15:56 ` Eric Blake
2019-09-24 13:28 ` [PATCH 13/25] qapi: Make check_type()'s array case a bit more obvious Markus Armbruster
2019-09-24 15:57 ` Eric Blake
2019-09-24 13:28 ` [PATCH 14/25] qapi: Plumb info to the QAPISchemaMember Markus Armbruster
2019-09-24 16:01 ` Eric Blake
2019-09-24 13:28 ` [PATCH 15/25] qapi: Inline check_name() into check_union() Markus Armbruster
2019-09-24 16:39 ` Eric Blake
2019-09-24 13:28 ` [PATCH 16/25] qapi: Move context-sensitive checking to the proper place Markus Armbruster
2019-09-24 17:49 ` Eric Blake
2019-09-24 20:41 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 17/25] qapi: Move context-free " Markus Armbruster
2019-09-24 17:59 ` Eric Blake
2019-09-24 13:28 ` [PATCH 18/25] qapi: Improve reporting of invalid 'if' errors Markus Armbruster
2019-09-24 18:01 ` Eric Blake
2019-09-24 13:28 ` [PATCH 19/25] qapi: Improve reporting of invalid flags Markus Armbruster
2019-09-24 18:07 ` Eric Blake
2019-09-24 20:43 ` Markus Armbruster
2019-09-25 6:13 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 20/25] qapi: Improve reporting of missing / unknown definition keys Markus Armbruster
2019-09-24 18:13 ` Eric Blake
2019-09-24 20:46 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 21/25] qapi: Avoid redundant definition references in error messages Markus Armbruster
2019-09-24 18:46 ` Eric Blake
2019-09-24 20:59 ` Markus Armbruster
2019-09-24 13:28 ` [PATCH 22/25] qapi: Eliminate check_keys(), rename check_known_keys() Markus Armbruster
2019-09-24 18:49 ` Eric Blake
2019-09-24 13:28 ` [PATCH 23/25] qapi: Improve reporting of missing documentation comment Markus Armbruster
2019-09-24 19:44 ` Eric Blake
2019-09-24 13:28 ` [PATCH 24/25] qapi: Improve reporting of redefinition Markus Armbruster
2019-09-24 19:53 ` Eric Blake
2019-09-24 13:28 ` [PATCH 25/25] qapi: Improve source file read error handling Markus Armbruster
2019-09-24 19:57 ` Eric Blake
2019-09-24 20:59 ` Markus Armbruster
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=87blv9a1l2.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=marcandre.lureau@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.