From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 81F93C4332F for ; Mon, 25 Oct 2021 19:38:18 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2891260C4B for ; Mon, 25 Oct 2021 19:38:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2891260C4B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=nongnu.org Received: from localhost ([::1]:51688 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mf5nV-0003TI-7E for qemu-devel@archiver.kernel.org; Mon, 25 Oct 2021 15:38:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43598) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mf5Xm-0000Vt-JS for qemu-devel@nongnu.org; Mon, 25 Oct 2021 15:22:03 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:47667) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mf5Xi-0007AQ-BJ for qemu-devel@nongnu.org; Mon, 25 Oct 2021 15:22:00 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635189717; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=lWjKBUIo4dTPSWcY0FqtKY7MXgiNMqAhWuPpQHhNyOQ=; b=Q9+i4WIK88afvaWGaZjSKHlntSUm++azKnYQjqmdxBHBHBIffKtkFhvg3ZzVI1e3077uX+ 288f+p++FS5PFEu467HTyOmCYF6c1zwu9W6fntYhoxSveTRiamWYryNN9z5BYbh32tU4wh lSxRaDosvq2zZx/vS7VF0pyTBbBC87k= Received: from mail-vk1-f199.google.com (mail-vk1-f199.google.com [209.85.221.199]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-368-NZl_Zm1UMWqyxZXbZIrbag-1; Mon, 25 Oct 2021 15:21:56 -0400 X-MC-Unique: NZl_Zm1UMWqyxZXbZIrbag-1 Received: by mail-vk1-f199.google.com with SMTP id a186-20020a1f98c3000000b002dc2d7639b9so2530488vke.10 for ; Mon, 25 Oct 2021 12:21:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=lWjKBUIo4dTPSWcY0FqtKY7MXgiNMqAhWuPpQHhNyOQ=; b=AIhJmmswgKljWn9CoQCOGibIE+LUFTitqZmW0yNcgAjGvH93T0a0Jd9Piu3Xj6Paw2 9hbl6nfmke0ADhnPgTLYiAvT//4PR5PsOmVJkLD+8IJ3fW91bjHUO0aqF3DOViH9gGRc Eyr9KvS5ZPmX+Wj8arqK8vbUkywqggbn981U0R6rQln5Mr659rVXVxstfH2AxT9rtM5+ oyfv1oc3h70t1QDfaiDKCg5btdgYqHov5ulBFI4s3cefv5TQGNFLsnQsJh8JwgUi7uhJ dxrAUYYFJ0agFTEA0wrBIg3bXoihBnIDJlDpOSAaHBCPGUER/BVysEkWijVeq5tZ5iLN j1+w== X-Gm-Message-State: AOAM532L0WNGst1TmBwwBwtrZXdnFNSVeVaSbBLZLieLKkaK3EyIsZqK zHX9MCp4T5jAh+gHqAD8+oOW231U8IEG8m2IzegECrVLSlSt+7hWLEER9+7QC5ttF+BbpyS3koO 2ijJbAo8k3lbd6Nph0K6xZB0nValmVhs= X-Received: by 2002:a67:33ce:: with SMTP id z197mr7778876vsz.13.1635189714134; Mon, 25 Oct 2021 12:21:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzGRbALyqpTlpdLXD9lEUKorao8LFohcHFA4G0vMOpcFrguUFrliS5vgRAKp3BZL0JTAeuXBGle6+PHMblWfV4= X-Received: by 2002:a67:33ce:: with SMTP id z197mr7778855vsz.13.1635189713974; Mon, 25 Oct 2021 12:21:53 -0700 (PDT) MIME-Version: 1.0 References: <20211025052532.3859634-1-armbru@redhat.com> <20211025052532.3859634-5-armbru@redhat.com> In-Reply-To: <20211025052532.3859634-5-armbru@redhat.com> From: John Snow Date: Mon, 25 Oct 2021 15:21:43 -0400 Message-ID: Subject: Re: [PATCH 4/9] qapi: Tools for sets of special feature flags in generated code To: Markus Armbruster Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jsnow@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/alternative; boundary="0000000000000ad03105cf324694" Received-SPF: pass client-ip=170.10.133.124; envelope-from=jsnow@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , pkrempa@redhat.com, Daniel Berrange , Eduardo Habkost , qemu-block@nongnu.org, Juan Quintela , libvir-list@redhat.com, qemu-devel , mdroth@linux.vnet.ibm.com, "Dr. David Alan Gilbert" , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6kgTHVyZWF1?= , Eric Blake , libguestfs@redhat.com Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" --0000000000000ad03105cf324694 Content-Type: text/plain; charset="UTF-8" On Mon, Oct 25, 2021 at 1:25 AM Markus Armbruster 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 > --- > 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." > + 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. > + > 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.) > > class QAPISchemaObjectTypeMember(QAPISchemaMember): > def __init__(self, name, info, typ, optional, ifcond=None, > features=None): > -- > 2.31.1 > > Well, either way: Reviewed-by: John Snow --0000000000000ad03105cf324694 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Mon, Oct 25, 2021 at 1:25 AM Marku= s 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>
---
=C2=A0include/qapi/util.h=C2=A0 =C2=A0 |=C2=A0 4 ++++
=C2=A0scripts/qapi/gen.py=C2=A0 =C2=A0 | 13 +++++++++++++
=C2=A0scripts/qapi/schema.py |=C2=A0 3 +++
=C2=A03 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 @@
=C2=A0#ifndef QAPI_UTIL_H
=C2=A0#define QAPI_UTIL_H

+typedef enum {
+=C2=A0 =C2=A0 QAPI_DEPRECATED,
+} QapiSpecialFeature;
+
=C2=A0/* QEnumLookup flags */
=C2=A0#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 @@
=C2=A0 =C2=A0 =C2=A0mcgen,
=C2=A0)
=C2=A0from .schema import (
+=C2=A0 =C2=A0 QAPISchemaFeature,
=C2=A0 =C2=A0 =C2=A0QAPISchemaIfCond,
=C2=A0 =C2=A0 =C2=A0QAPISchemaModule,
=C2=A0 =C2=A0 =C2=A0QAPISchemaObjectType,
@@ -37,6 +38,18 @@
=C2=A0from .source import QAPISourceInfo


+def gen_special_features(features: QAPISchemaFeature):
+=C2=A0 =C2=A0 ret =3D ''
+=C2=A0 =C2=A0 sep =3D ''
+
+=C2=A0 =C2=A0 for feat in features:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 if feat.is_special():
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret +=3D ('%s1u << QAP= I_%s' % (sep, feat.name.upper()))

B= uilding the constant name here "feels" fragile, but I'll trus= t that the test suite and/or the compiler will catch us if we=20 accidentally goof up this mapping. In the interest of simplicity, then,=20 "sure, why not."
=C2=A0
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sep =3D ' | '
+
+=C2=A0 =C2=A0 return ret or '0'
+

Subjectively more pythonic:
=

special_features =3D [f"1u << QAPI_{feat.name.uppe= r()}" for feat in features if feat.is_special()]
ret =3D = 9; | '.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= .
=C2=A0
+
=C2=A0class QAPIGen:
=C2=A0 =C2=A0 =C2=A0def __init__(self, fname: str):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.fname =3D 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):
=C2=A0class QAPISchemaFeature(QAPISchemaMember):
=C2=A0 =C2=A0 =C2=A0role =3D 'feature'

+=C2=A0 =C2=A0 def is_special(self):
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 return self.name in ('deprecated')
+

alrighty.

(B= riefly wondered: is it worth naming special features as a property of the c= lass, but with only two names, it's probably fine enough to leave it em= bedded in the method logic. Only a style thing and doesn't have any act= ual impact that I can imagine, so ... nevermind.)
=C2=A0

=C2=A0class QAPISchemaObjectTypeMember(QAPISchemaMember):
=C2=A0 =C2=A0 =C2=A0def __init__(self, name, info, typ, optional, ifcond=3D= None, features=3DNone):
--
2.31.1


Well, either way:

=
Reviewed-by: John Snow <jsnow@r= edhat.com>
--0000000000000ad03105cf324694--