From: Markus Armbruster <armbru@redhat.com>
To: John Snow <jsnow@redhat.com>
Cc: "Kevin Wolf" <kwolf@redhat.com>,
pkrempa@redhat.com, "Daniel Berrange" <berrange@redhat.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
qemu-block@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
libvir-list@redhat.com, qemu-devel <qemu-devel@nongnu.org>,
mdroth@linux.vnet.ibm.com,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
libguestfs@redhat.com
Subject: Re: [PATCH 4/9] qapi: Tools for sets of special feature flags in generated code
Date: Tue, 26 Oct 2021 10:48:05 +0200 [thread overview]
Message-ID: <87sfwo5fzu.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <CAFn=p-a41vWkiS_sCKjk_-DNt7=V741q0FntQXWZMAt3m76bBQ@mail.gmail.com> (John Snow's message of "Mon, 25 Oct 2021 15:21:43 -0400")
John Snow <jsnow@redhat.com> writes:
> On Mon, Oct 25, 2021 at 1:25 AM Markus Armbruster <armbru@redhat.com> wrote:
>
>> New enum QapiSpecialFeature enumerates the special feature flags.
>>
>> New helper gen_special_features() returns code to represent a
>> collection of special feature flags as a bitset.
>>
>> The next few commits will put them to use.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>> include/qapi/util.h | 4 ++++
>> scripts/qapi/gen.py | 13 +++++++++++++
>> scripts/qapi/schema.py | 3 +++
>> 3 files changed, 20 insertions(+)
>>
>> diff --git a/include/qapi/util.h b/include/qapi/util.h
>> index 257c600f99..7a8d5c7d72 100644
>> --- a/include/qapi/util.h
>> +++ b/include/qapi/util.h
>> @@ -11,6 +11,10 @@
>> #ifndef QAPI_UTIL_H
>> #define QAPI_UTIL_H
>>
>> +typedef enum {
>> + QAPI_DEPRECATED,
>> +} QapiSpecialFeature;
>> +
>> /* QEnumLookup flags */
>> #define QAPI_ENUM_DEPRECATED 1
>>
>> diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py
>> index 2ec1e7b3b6..9d07b88cf6 100644
>> --- a/scripts/qapi/gen.py
>> +++ b/scripts/qapi/gen.py
>> @@ -29,6 +29,7 @@
>> mcgen,
>> )
>> from .schema import (
>> + QAPISchemaFeature,
>> QAPISchemaIfCond,
>> QAPISchemaModule,
>> QAPISchemaObjectType,
>> @@ -37,6 +38,18 @@
>> from .source import QAPISourceInfo
>>
>>
>> +def gen_special_features(features: QAPISchemaFeature):
>> + ret = ''
>> + sep = ''
>> +
>> + for feat in features:
>> + if feat.is_special():
>> + ret += ('%s1u << QAPI_%s' % (sep, feat.name.upper()))
>>
>
> Building the constant name here "feels" fragile, but I'll trust that the
> test suite and/or the compiler will catch us if we accidentally goof up
> this mapping. In the interest of simplicity, then, "sure, why not."
It relies on .is_special() remaining consistent with enum
QapiSpecialFeature. The C compiler should catch any screwups.
>
>> + sep = ' | '
>> +
>>
> + return ret or '0'
>> +
>>
>
> Subjectively more pythonic:
>
> special_features = [f"1u << QAPI_{feat.name.upper()}" for feat in features
> if feat.is_special()]
> ret = ' | '.join(special_features)
> return ret or '0'
>
> A bit more dense, but more functional. Up to you, but I find join() easier
> to read and reason about for the presence of separators.
Sold!
>> +
>> class QAPIGen:
>> def __init__(self, fname: str):
>> self.fname = fname
>> diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
>> index 6d5f46509a..55f82d7389 100644
>> --- a/scripts/qapi/schema.py
>> +++ b/scripts/qapi/schema.py
>> @@ -725,6 +725,9 @@ def connect_doc(self, doc):
>> class QAPISchemaFeature(QAPISchemaMember):
>> role = 'feature'
>>
>> + def is_special(self):
>> + return self.name in ('deprecated')
>> +
>>
>
> alrighty.
>
> (Briefly wondered: is it worth naming special features as a property of the
> class, but with only two names, it's probably fine enough to leave it
> embedded in the method logic. Only a style thing and doesn't have any
> actual impact that I can imagine, so ... nevermind.)
Let's keep it simple.
>> class QAPISchemaObjectTypeMember(QAPISchemaMember):
>> def __init__(self, name, info, typ, optional, ifcond=None,
>> features=None):
>> --
>> 2.31.1
>>
>>
> Well, either way:
>
> Reviewed-by: John Snow <jsnow@redhat.com>
Thanks!
next prev parent reply other threads:[~2021-10-26 8:52 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-25 5:25 [PATCH 0/9] Configurable policy for handling unstable interfaces Markus Armbruster
2021-10-25 5:25 ` [PATCH 1/9] qapi: New special feature flag "unstable" Markus Armbruster
2021-10-25 7:15 ` Juan Quintela
2021-10-25 12:05 ` Kashyap Chamarthy
2021-10-25 12:18 ` Philippe Mathieu-Daudé
2021-10-26 7:15 ` Markus Armbruster
2021-10-26 8:14 ` Kashyap Chamarthy
2021-10-25 19:01 ` John Snow
2021-10-26 5:35 ` Markus Armbruster
2021-10-26 7:37 ` Kevin Wolf
2021-10-26 8:36 ` [Libguestfs] " Kashyap Chamarthy
2021-10-26 9:22 ` Dr. David Alan Gilbert
2021-10-26 9:28 ` Daniel P. Berrangé
2021-10-26 9:37 ` Markus Armbruster
2021-10-26 11:34 ` Kevin Wolf
2021-10-28 8:36 ` Markus Armbruster
2021-10-26 14:56 ` Daniel P. Berrangé
2021-10-26 15:15 ` Markus Armbruster
2021-10-26 15:22 ` Daniel P. Berrangé
2021-10-27 5:29 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 2/9] qapi: Mark unstable QMP parts with feature 'unstable' Markus Armbruster
2021-10-25 7:16 ` Juan Quintela
2021-10-25 19:05 ` John Snow
2021-10-26 7:56 ` Markus Armbruster
2021-10-26 16:34 ` John Snow
2021-10-27 5:44 ` Markus Armbruster
2021-10-29 13:07 ` Eric Blake
2021-11-02 9:15 ` Kevin Wolf
2021-10-25 5:25 ` [PATCH 3/9] qapi: Eliminate QCO_NO_OPTIONS for a slight simplification Markus Armbruster
2021-10-25 7:17 ` Juan Quintela
2021-10-25 19:08 ` John Snow
2021-10-26 7:58 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 4/9] qapi: Tools for sets of special feature flags in generated code Markus Armbruster
2021-10-25 19:21 ` John Snow
2021-10-26 8:48 ` Markus Armbruster [this message]
2021-10-25 5:25 ` [PATCH 5/9] qapi: Generalize struct member policy checking Markus Armbruster
2021-10-25 19:28 ` John Snow
2021-10-26 9:14 ` Markus Armbruster
2021-10-26 15:43 ` Philippe Mathieu-Daudé
2021-10-27 5:56 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 6/9] qapi: Generalize command " Markus Armbruster
2021-10-25 12:04 ` Philippe Mathieu-Daudé
2021-10-26 9:40 ` Markus Armbruster
2021-10-25 19:30 ` John Snow
2021-10-25 5:25 ` [PATCH 7/9] qapi: Generalize enum member " Markus Armbruster
2021-10-25 19:36 ` John Snow
2021-10-26 9:43 ` Markus Armbruster
2021-10-26 16:14 ` John Snow
2021-10-25 5:25 ` [PATCH 8/9] qapi: Factor out compat_policy_input_ok() Markus Armbruster
2021-10-25 12:13 ` Philippe Mathieu-Daudé
2021-10-26 9:46 ` Markus Armbruster
2021-10-26 10:39 ` Philippe Mathieu-Daudé
2021-10-29 14:08 ` Markus Armbruster
2021-10-25 19:38 ` John Snow
2021-10-25 5:25 ` [PATCH 9/9] qapi: Extend -compat to set policy for unstable interfaces Markus Armbruster
2021-10-25 19:40 ` John Snow
2021-10-26 18:45 ` Dr. David Alan Gilbert
2021-10-27 5: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=87sfwo5fzu.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=libguestfs@redhat.com \
--cc=libvir-list@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/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.