From nobody Mon Feb 9 20:35:04 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1629982224; cv=none; d=zohomail.com; s=zohoarc; b=CaTAc7dXaQSpbvWfXNR0qisWJoN5Zkf2eCcfguThJ3gBEAkMSMVlUw1x1tHBSo/mSTRAsnStdDIPNydO1F7XWzb3ozfkv9VKPlMCi3FKw6sBB3Yl+RScHmtGJnPU3BXYkleLP1w+DIX8T468I/GsIy9XvKMkeOmO334VmCIvIB8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629982224; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=tIMCAFus5h3/DOyji5ypTxBw6l9f+mDSvJBQI0WXow8=; b=gFPTllpVyK+rSK+kkH6bs+RmwklOiHF5pfNuWoGdnOtxA+wjASt1ZrwM3OylVtTXNdZFoBPXwSWAKCIhfuzmhIwl8CxRX7Ye5jbXb2UsY0b3XWFhzm0VrJe6RKm+kfpKKw/hoED8Wkcpe617rHqGRDA/3r+g92Lu0735HJZGDgY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629982224636866.609409141615; Thu, 26 Aug 2021 05:50:24 -0700 (PDT) Received: from localhost ([::1]:51428 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mJEpr-0000PK-I3 for importer@patchew.org; Thu, 26 Aug 2021 08:50:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40682) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mJEYx-0004E7-Jx for qemu-devel@nongnu.org; Thu, 26 Aug 2021 08:32:55 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:23363) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mJEYj-0008E5-Qp for qemu-devel@nongnu.org; Thu, 26 Aug 2021 08:32:55 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-330-mm7X8RUeNiSykpmoAEcI6g-1; Thu, 26 Aug 2021 08:32:32 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 38B8B6409B; Thu, 26 Aug 2021 12:32:31 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-4.ams2.redhat.com [10.36.112.4]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BD2F860D31; Thu, 26 Aug 2021 12:32:28 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A6E6B11380B8; Thu, 26 Aug 2021 14:32:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1629981161; 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: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tIMCAFus5h3/DOyji5ypTxBw6l9f+mDSvJBQI0WXow8=; b=aHaOnv1x8NEiINCBlcPFGTM85CyJbNf7Vfd1T5V+d3N/81hLobATVnEHD7gz3KwXrrVMrd +Lm3BJ4ZhHnbPMf+JvfPvh5uym7M1JhU6D0qXk6iNmiVJ4AaGTYhvBsQyL4IAv9/MsTkjI TaCUaGFOIh5UrH07hNvKSivdzGb86K4= X-MC-Unique: mm7X8RUeNiSykpmoAEcI6g-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 05/11] qapi: introduce QAPISchemaIfCond.cgen() Date: Thu, 26 Aug 2021 14:32:19 +0200 Message-Id: <20210826123225.157891-6-armbru@redhat.com> In-Reply-To: <20210826123225.157891-1-armbru@redhat.com> References: <20210826123225.157891-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.742, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, 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: peter.maydell@linaro.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1629982226406100001 From: Marc-Andr=C3=A9 Lureau Instead of building prepocessor conditions from a list of string, use the result generated from QAPISchemaIfCond.cgen() and hide the implementation details. Note: this patch introduces a minor regression, generating a redundant pair of parenthesis. This is mostly fixed in a later patch in this series ("qapi: replace if condition list with dict [..]") Signed-off-by: Marc-Andr=C3=A9 Lureau Message-Id: <20210804083105.97531-5-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster [Commit message tweaked] Signed-off-by: Markus Armbruster --- scripts/qapi/common.py | 35 ++++++++++++++++++++++------------- scripts/qapi/gen.py | 4 ++-- scripts/qapi/introspect.py | 4 ++-- scripts/qapi/schema.py | 5 ++++- scripts/qapi/types.py | 20 ++++++++++---------- scripts/qapi/visit.py | 12 ++++++------ 6 files changed, 46 insertions(+), 34 deletions(-) diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index 6ad1eeb61d..ba9fe14e4b 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -12,7 +12,12 @@ # See the COPYING file in the top-level directory. =20 import re -from typing import Match, Optional, Sequence +from typing import ( + List, + Match, + Optional, + Union, +) =20 =20 #: Magic string that gets removed along with all space to its right. @@ -194,22 +199,26 @@ def guardend(name: str) -> str: name=3Dc_fname(name).upper()) =20 =20 -def gen_if(ifcond: Sequence[str]) -> str: - ret =3D '' - for ifc in ifcond: - ret +=3D mcgen(''' +def cgen_ifcond(ifcond: Union[str, List[str]]) -> str: + if not ifcond: + return '' + return '(' + ') && ('.join(ifcond) + ')' + + +def gen_if(cond: str) -> str: + if not cond: + return '' + return mcgen(''' #if %(cond)s -''', cond=3Difc) - return ret +''', cond=3Dcond) =20 =20 -def gen_endif(ifcond: Sequence[str]) -> str: - ret =3D '' - for ifc in reversed(ifcond): - ret +=3D mcgen(''' +def gen_endif(cond: str) -> str: + if not cond: + return '' + return mcgen(''' #endif /* %(cond)s */ -''', cond=3Difc) - return ret +''', cond=3Dcond) =20 =20 def must_match(pattern: str, string: str) -> Match[str]: diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py index 1c5b190276..51a597a025 100644 --- a/scripts/qapi/gen.py +++ b/scripts/qapi/gen.py @@ -95,9 +95,9 @@ def _wrap_ifcond(ifcond: QAPISchemaIfCond, before: str, a= fter: str) -> str: if added[0] =3D=3D '\n': out +=3D '\n' added =3D added[1:] - out +=3D gen_if(ifcond.ifcond) + out +=3D gen_if(ifcond.cgen()) out +=3D added - out +=3D gen_endif(ifcond.ifcond) + out +=3D gen_endif(ifcond.cgen()) return out =20 =20 diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py index e23725e2f9..bd4233ecee 100644 --- a/scripts/qapi/introspect.py +++ b/scripts/qapi/introspect.py @@ -124,10 +124,10 @@ def indent(level: int) -> str: if obj.comment: ret +=3D indent(level) + f"/* {obj.comment} */\n" if obj.ifcond.is_present(): - ret +=3D gen_if(obj.ifcond.ifcond) + ret +=3D gen_if(obj.ifcond.cgen()) ret +=3D _tree_to_qlit(obj.value, level) if obj.ifcond.is_present(): - ret +=3D '\n' + gen_endif(obj.ifcond.ifcond) + ret +=3D '\n' + gen_endif(obj.ifcond.cgen()) return ret =20 ret =3D '' diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py index 86fcd6cbd5..4ea7e88846 100644 --- a/scripts/qapi/schema.py +++ b/scripts/qapi/schema.py @@ -19,7 +19,7 @@ import re from typing import Optional =20 -from .common import POINTER_SUFFIX, c_name +from .common import POINTER_SUFFIX, c_name, cgen_ifcond from .error import QAPIError, QAPISemError, QAPISourceError from .expr import check_exprs from .parser import QAPISchemaParser @@ -29,6 +29,9 @@ class QAPISchemaIfCond: def __init__(self, ifcond=3DNone): self.ifcond =3D ifcond or [] =20 + def cgen(self): + return cgen_ifcond(self.ifcond) + def is_present(self): return bool(self.ifcond) =20 diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py index 3673cf0f49..db9ff95bd1 100644 --- a/scripts/qapi/types.py +++ b/scripts/qapi/types.py @@ -51,13 +51,13 @@ def gen_enum_lookup(name: str, ''', c_name=3Dc_name(name)) for memb in members: - ret +=3D gen_if(memb.ifcond.ifcond) + ret +=3D gen_if(memb.ifcond.cgen()) index =3D c_enum_const(name, memb.name, prefix) ret +=3D mcgen(''' [%(index)s] =3D "%(name)s", ''', index=3Dindex, name=3Dmemb.name) - ret +=3D gen_endif(memb.ifcond.ifcond) + ret +=3D gen_endif(memb.ifcond.cgen()) =20 ret +=3D mcgen(''' }, @@ -81,12 +81,12 @@ def gen_enum(name: str, c_name=3Dc_name(name)) =20 for memb in enum_members: - ret +=3D gen_if(memb.ifcond.ifcond) + ret +=3D gen_if(memb.ifcond.cgen()) ret +=3D mcgen(''' %(c_enum)s, ''', c_enum=3Dc_enum_const(name, memb.name, prefix)) - ret +=3D gen_endif(memb.ifcond.ifcond) + ret +=3D gen_endif(memb.ifcond.cgen()) =20 ret +=3D mcgen(''' } %(c_name)s; @@ -126,7 +126,7 @@ def gen_array(name: str, element_type: QAPISchemaType) = -> str: def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str: ret =3D '' for memb in members: - ret +=3D gen_if(memb.ifcond.ifcond) + ret +=3D gen_if(memb.ifcond.cgen()) if memb.optional: ret +=3D mcgen(''' bool has_%(c_name)s; @@ -136,7 +136,7 @@ def gen_struct_members(members: List[QAPISchemaObjectTy= peMember]) -> str: %(c_type)s %(c_name)s; ''', c_type=3Dmemb.type.c_type(), c_name=3Dc_name(memb.nam= e)) - ret +=3D gen_endif(memb.ifcond.ifcond) + ret +=3D gen_endif(memb.ifcond.cgen()) return ret =20 =20 @@ -159,7 +159,7 @@ def gen_object(name: str, ifcond: QAPISchemaIfCond, ret +=3D mcgen(''' =20 ''') - ret +=3D gen_if(ifcond.ifcond) + ret +=3D gen_if(ifcond.cgen()) ret +=3D mcgen(''' struct %(c_name)s { ''', @@ -193,7 +193,7 @@ def gen_object(name: str, ifcond: QAPISchemaIfCond, ret +=3D mcgen(''' }; ''') - ret +=3D gen_endif(ifcond.ifcond) + ret +=3D gen_endif(ifcond.cgen()) =20 return ret =20 @@ -220,13 +220,13 @@ def gen_variants(variants: QAPISchemaVariants) -> str: for var in variants.variants: if var.type.name =3D=3D 'q_empty': continue - ret +=3D gen_if(var.ifcond.ifcond) + ret +=3D gen_if(var.ifcond.cgen()) ret +=3D mcgen(''' %(c_type)s %(c_name)s; ''', c_type=3Dvar.type.c_unboxed_type(), c_name=3Dc_name(var.name)) - ret +=3D gen_endif(var.ifcond.ifcond) + ret +=3D gen_endif(var.ifcond.cgen()) =20 ret +=3D mcgen(''' } u; diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index 67721b2470..56ea516399 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -79,7 +79,7 @@ def gen_visit_object_members(name: str, =20 for memb in members: deprecated =3D 'deprecated' in [f.name for f in memb.features] - ret +=3D gen_if(memb.ifcond.ifcond) + ret +=3D gen_if(memb.ifcond.cgen()) if memb.optional: ret +=3D mcgen(''' if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) { @@ -112,7 +112,7 @@ def gen_visit_object_members(name: str, ret +=3D mcgen(''' } ''') - ret +=3D gen_endif(memb.ifcond.ifcond) + ret +=3D gen_endif(memb.ifcond.cgen()) =20 if variants: tag_member =3D variants.tag_member @@ -126,7 +126,7 @@ def gen_visit_object_members(name: str, for var in variants.variants: case_str =3D c_enum_const(tag_member.type.name, var.name, tag_member.type.prefix) - ret +=3D gen_if(var.ifcond.ifcond) + ret +=3D gen_if(var.ifcond.cgen()) if var.type.name =3D=3D 'q_empty': # valid variant and nothing to do ret +=3D mcgen(''' @@ -142,7 +142,7 @@ def gen_visit_object_members(name: str, case=3Dcase_str, c_type=3Dvar.type.c_name(), c_name=3Dc_name(v= ar.name)) =20 - ret +=3D gen_endif(var.ifcond.ifcond) + ret +=3D gen_endif(var.ifcond.cgen()) ret +=3D mcgen(''' default: abort(); @@ -228,7 +228,7 @@ def gen_visit_alternate(name: str, variants: QAPISchema= Variants) -> str: c_name=3Dc_name(name)) =20 for var in variants.variants: - ret +=3D gen_if(var.ifcond.ifcond) + ret +=3D gen_if(var.ifcond.cgen()) ret +=3D mcgen(''' case %(case)s: ''', @@ -254,7 +254,7 @@ def gen_visit_alternate(name: str, variants: QAPISchema= Variants) -> str: ret +=3D mcgen(''' break; ''') - ret +=3D gen_endif(var.ifcond.ifcond) + ret +=3D gen_endif(var.ifcond.cgen()) =20 ret +=3D mcgen(''' case QTYPE_NONE: --=20 2.31.1