From nobody Fri May 10 02:33:22 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1621524411; cv=none; d=zohomail.com; s=zohoarc; b=YZtNE6krOHJF0PB47gJcUJhZCDb3qVFofY/gefdSE+riZkKnU42K101oQG8mWzxlC4jViwtjnwo4PW7groYQUh9G2Ny2pyYVTJAQTKaPDJUS3L6Cw5rBKVghEmknCj4UrDiW57hObD1SfoEnjccLNAwr05FHUJJn+wZMkYQ6KNo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621524411; 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=z85wLyi/Bh1rXl9DWz5K+raZ30zdPxU2no06+piLtVQ=; b=X7UrEYV+Hq5CN3UpN/elsWFxS+vjdV6HNuekW2wZQTkQSV5iBt5DuSb9f7JsJwH9WVCpLOEc8SRCiWq3U++e/bfauc7nKA/T0yMbhnlU4fu2kZoaMqODOOcusUiFhLsHZXXCcJDU+D9S0l9SgTyCQxHwRxZRqO9V8SpCF/HKCAk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1621524411186880.8557989607182; Thu, 20 May 2021 08:26:51 -0700 (PDT) Received: from localhost ([::1]:35622 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ljkZV-00043s-Tx for importer@patchew.org; Thu, 20 May 2021 11:26:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46902) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljkR5-00054q-Qn for qemu-devel@nongnu.org; Thu, 20 May 2021 11:18:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:59963) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljkR2-0003uC-K8 for qemu-devel@nongnu.org; Thu, 20 May 2021 11:18:07 -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-401-KbtpVRi4MeGCWDuEkri3gA-1; Thu, 20 May 2021 11:18:02 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 23D501013722; Thu, 20 May 2021 15:18:01 +0000 (UTC) Received: from scv.redhat.com (ovpn-117-64.rdu2.redhat.com [10.10.117.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7707A19CBE; Thu, 20 May 2021 15:18:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1621523883; 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=z85wLyi/Bh1rXl9DWz5K+raZ30zdPxU2no06+piLtVQ=; b=CJHaDAN3gHHqGtbXlb4g5W3PDCNYf1P6oqQYNX3grtamA3ZfhYbYNuXCGjeKyHwa2TA2Sf pGwvXYLvN895nQFDDJvID7w0/2BiLBBxY6UXzaGt0fGuUKeME9UcAt01Q/KtFjtQj0RQbP sSFYpKROpFqENZKGP/P0EloHTAagC0Y= X-MC-Unique: KbtpVRi4MeGCWDuEkri3gA-1 From: John Snow To: qemu-devel@nongnu.org Subject: [PATCH 1/3] qapi/expr: Split check_expr out from check_exprs Date: Thu, 20 May 2021 11:17:57 -0400 Message-Id: <20210520151759.91929-2-jsnow@redhat.com> In-Reply-To: <20210520151759.91929-1-jsnow@redhat.com> References: <20210520151759.91929-1-jsnow@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 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-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=216.205.24.124; envelope-from=jsnow@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.39, 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_H4=0.001, RCVD_IN_MSPIKE_WL=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: Michael Roth , John Snow , Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Primarily, this reduces a nesting level of a particularly long block. Mostly code movement, a new docstring is created. (It also has the effect of creating a fairly convenient choke point in check_exprs for try/catch wrappers without making the nesting level even worse.) Signed-off-by: John Snow --- scripts/qapi/expr.py | 189 +++++++++++++++++++++++-------------------- 1 file changed, 100 insertions(+), 89 deletions(-) diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py index 496f7e0333e..9dff0cd9080 100644 --- a/scripts/qapi/expr.py +++ b/scripts/qapi/expr.py @@ -586,6 +586,104 @@ def check_event(expr: _JSONObject, info: QAPISourceIn= fo) -> None: check_type(args, info, "'data'", allow_dict=3Dnot boxed) =20 =20 +def check_expr(expr_elem: _JSONObject) -> None: + """ + Validate and normalize a parsed QAPI schema expression. + + :param expr_elem: The parsed expression to normalize and validate. + + :raise QAPISemError: When this expression fails validation. + :return: None, ``expr`` is normalized in-place as needed. + """ + # Expression + assert isinstance(expr_elem['expr'], dict) + for key in expr_elem['expr'].keys(): + assert isinstance(key, str) + expr: _JSONObject =3D expr_elem['expr'] + + # QAPISourceInfo + assert isinstance(expr_elem['info'], QAPISourceInfo) + info: QAPISourceInfo =3D expr_elem['info'] + + # Optional[QAPIDoc] + tmp =3D expr_elem.get('doc') + assert tmp is None or isinstance(tmp, QAPIDoc) + doc: Optional[QAPIDoc] =3D tmp + + if 'include' in expr: + return + + if 'enum' in expr: + meta =3D 'enum' + elif 'union' in expr: + meta =3D 'union' + elif 'alternate' in expr: + meta =3D 'alternate' + elif 'struct' in expr: + meta =3D 'struct' + elif 'command' in expr: + meta =3D 'command' + elif 'event' in expr: + meta =3D 'event' + else: + raise QAPISemError(info, "expression is missing metatype") + + check_name_is_str(expr[meta], info, "'%s'" % meta) + name =3D cast(str, expr[meta]) + info.set_defn(meta, name) + check_defn_name_str(name, info, meta) + + if doc: + if doc.symbol !=3D name: + raise QAPISemError( + info, "documentation comment is for '%s'" % doc.symbol) + doc.check_expr(expr) + elif info.pragma.doc_required: + raise QAPISemError(info, + "documentation comment required") + + if meta =3D=3D 'enum': + check_keys(expr, info, meta, + ['enum', 'data'], ['if', 'features', 'prefix']) + check_enum(expr, info) + elif meta =3D=3D 'union': + check_keys(expr, info, meta, + ['union', 'data'], + ['base', 'discriminator', 'if', 'features']) + normalize_members(expr.get('base')) + normalize_members(expr['data']) + check_union(expr, info) + elif meta =3D=3D 'alternate': + check_keys(expr, info, meta, + ['alternate', 'data'], ['if', 'features']) + normalize_members(expr['data']) + check_alternate(expr, info) + elif meta =3D=3D 'struct': + check_keys(expr, info, meta, + ['struct', 'data'], ['base', 'if', 'features']) + normalize_members(expr['data']) + check_struct(expr, info) + elif meta =3D=3D 'command': + check_keys(expr, info, meta, + ['command'], + ['data', 'returns', 'boxed', 'if', 'features', + 'gen', 'success-response', 'allow-oob', + 'allow-preconfig', 'coroutine']) + normalize_members(expr.get('data')) + check_command(expr, info) + elif meta =3D=3D 'event': + check_keys(expr, info, meta, + ['event'], ['data', 'boxed', 'if', 'features']) + normalize_members(expr.get('data')) + check_event(expr, info) + else: + assert False, 'unexpected meta type' + + check_if(expr, info, meta) + check_features(expr.get('features'), info) + check_flags(expr, info) + + def check_exprs(exprs: List[_JSONObject]) -> List[_JSONObject]: """ Validate and normalize a list of parsed QAPI schema expressions. @@ -598,93 +696,6 @@ def check_exprs(exprs: List[_JSONObject]) -> List[_JSO= NObject]: :raise QAPISemError: When any expression fails validation. :return: The same list of expressions (now modified). """ - for expr_elem in exprs: - # Expression - assert isinstance(expr_elem['expr'], dict) - for key in expr_elem['expr'].keys(): - assert isinstance(key, str) - expr: _JSONObject =3D expr_elem['expr'] - - # QAPISourceInfo - assert isinstance(expr_elem['info'], QAPISourceInfo) - info: QAPISourceInfo =3D expr_elem['info'] - - # Optional[QAPIDoc] - tmp =3D expr_elem.get('doc') - assert tmp is None or isinstance(tmp, QAPIDoc) - doc: Optional[QAPIDoc] =3D tmp - - if 'include' in expr: - continue - - if 'enum' in expr: - meta =3D 'enum' - elif 'union' in expr: - meta =3D 'union' - elif 'alternate' in expr: - meta =3D 'alternate' - elif 'struct' in expr: - meta =3D 'struct' - elif 'command' in expr: - meta =3D 'command' - elif 'event' in expr: - meta =3D 'event' - else: - raise QAPISemError(info, "expression is missing metatype") - - check_name_is_str(expr[meta], info, "'%s'" % meta) - name =3D cast(str, expr[meta]) - info.set_defn(meta, name) - check_defn_name_str(name, info, meta) - - if doc: - if doc.symbol !=3D name: - raise QAPISemError( - info, "documentation comment is for '%s'" % doc.symbol) - doc.check_expr(expr) - elif info.pragma.doc_required: - raise QAPISemError(info, - "documentation comment required") - - if meta =3D=3D 'enum': - check_keys(expr, info, meta, - ['enum', 'data'], ['if', 'features', 'prefix']) - check_enum(expr, info) - elif meta =3D=3D 'union': - check_keys(expr, info, meta, - ['union', 'data'], - ['base', 'discriminator', 'if', 'features']) - normalize_members(expr.get('base')) - normalize_members(expr['data']) - check_union(expr, info) - elif meta =3D=3D 'alternate': - check_keys(expr, info, meta, - ['alternate', 'data'], ['if', 'features']) - normalize_members(expr['data']) - check_alternate(expr, info) - elif meta =3D=3D 'struct': - check_keys(expr, info, meta, - ['struct', 'data'], ['base', 'if', 'features']) - normalize_members(expr['data']) - check_struct(expr, info) - elif meta =3D=3D 'command': - check_keys(expr, info, meta, - ['command'], - ['data', 'returns', 'boxed', 'if', 'features', - 'gen', 'success-response', 'allow-oob', - 'allow-preconfig', 'coroutine']) - normalize_members(expr.get('data')) - check_command(expr, info) - elif meta =3D=3D 'event': - check_keys(expr, info, meta, - ['event'], ['data', 'boxed', 'if', 'features']) - normalize_members(expr.get('data')) - check_event(expr, info) - else: - assert False, 'unexpected meta type' - - check_if(expr, info, meta) - check_features(expr.get('features'), info) - check_flags(expr, info) - + for expr in exprs: + check_expr(expr) return exprs --=20 2.30.2 From nobody Fri May 10 02:33:22 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1621524111; cv=none; d=zohomail.com; s=zohoarc; b=TInKio8fk07SOQ2+YLfn0/wp9sT+SjkQ3J9qcTF/LXmjKHOzDk9RQXOOapK44V4qc6mk+g4BIwA+EPnhWfpLOFyt+Eu8VFZLch2qinKtGUbNs1fMWGuNqTwvfKGdKHvAlpb/k1370grX1EzTOCdX3vPOMSrUgRgyPLmT2bvhLZE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621524111; 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=d+gK0iWz83spFrtFnLD87oxCq0K8Ibm8tVN5l43FphQ=; b=mpZj0828pN9MUtiDFbE3sGt1747h9RDknwEr7pex77fukpBcVYYIFz46tT0yWF+/udiE6e5Wb1vYHWd3PbvTXxvi6PMAmgWbELyKS6W0tz0MUWrBnd2QMqq5ohVFX0DKbheHWzPDX3uZwVt85QHDy1V45NFeYkrGP6kNOv1oq0U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1621524111230533.4712840628553; Thu, 20 May 2021 08:21:51 -0700 (PDT) Received: from localhost ([::1]:47648 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ljkUg-0001bE-IP for importer@patchew.org; Thu, 20 May 2021 11:21:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46910) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljkR6-00058J-Vo for qemu-devel@nongnu.org; Thu, 20 May 2021 11:18:09 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:58358) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljkR4-0003wQ-SD for qemu-devel@nongnu.org; Thu, 20 May 2021 11:18:08 -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-436-OY74SVZSOKyhISv5G6ECHg-1; Thu, 20 May 2021 11:18:03 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 289D8180FD65; Thu, 20 May 2021 15:18:02 +0000 (UTC) Received: from scv.redhat.com (ovpn-117-64.rdu2.redhat.com [10.10.117.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 48E096062F; Thu, 20 May 2021 15:18:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1621523885; 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=d+gK0iWz83spFrtFnLD87oxCq0K8Ibm8tVN5l43FphQ=; b=HhuUGYcuQ6AmIWF8zKhZmxCBdFfGIwdgbjVYQ2hDJwTo9j6DzzMKy7OikFJabPtuWblh90 isKsQgowu3Qkh1ff5axI3a4cxE4xAnHXcQrzF66N8vNr7pPGI3XmQHoLBFuj9/4VhPnhTD ehzm7G6Ku4tpkviSkoC+Pel9Vcq7kw0= X-MC-Unique: OY74SVZSOKyhISv5G6ECHg-1 From: John Snow To: qemu-devel@nongnu.org Subject: [PATCH 2/3] qapi/parser.py: add ParsedExpression type Date: Thu, 20 May 2021 11:17:58 -0400 Message-Id: <20210520151759.91929-3-jsnow@redhat.com> In-Reply-To: <20210520151759.91929-1-jsnow@redhat.com> References: <20210520151759.91929-1-jsnow@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 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-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=jsnow@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.39, 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_H4=0.001, RCVD_IN_MSPIKE_WL=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: Michael Roth , John Snow , Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" This is an immutable, named, typed tuple. It's nicer than arbitrary dicts for passing data around when using strict typing. We may upgrade this to a @dataclass style class in the future if we want to support mutability at a later time. (And after 3.7+ is available for use.) Turn parser.exprs into a list of ParsedExpressions instead, and adjust expr.py to match. This allows the types we specify in parser.py to be remembered all the way through expr.py and into schema.py. Several assertions around packing and unpacking this data can be removed as a result. Signed-off-by: John Snow --- scripts/qapi/expr.py | 29 +++++++++-------------------- scripts/qapi/parser.py | 29 ++++++++++++++++++----------- scripts/qapi/schema.py | 6 +++--- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py index 9dff0cd9080..6d89343897c 100644 --- a/scripts/qapi/expr.py +++ b/scripts/qapi/expr.py @@ -44,7 +44,7 @@ =20 from .common import c_name from .error import QAPISemError -from .parser import QAPIDoc +from .parser import ParsedExpression from .source import QAPISourceInfo =20 =20 @@ -586,29 +586,17 @@ def check_event(expr: _JSONObject, info: QAPISourceIn= fo) -> None: check_type(args, info, "'data'", allow_dict=3Dnot boxed) =20 =20 -def check_expr(expr_elem: _JSONObject) -> None: +def check_expr(pexpr: ParsedExpression) -> None: """ - Validate and normalize a parsed QAPI schema expression. + Validate and normalize a `ParsedExpression`. =20 - :param expr_elem: The parsed expression to normalize and validate. + :param pexpr: The parsed expression to normalize and validate. =20 :raise QAPISemError: When this expression fails validation. - :return: None, ``expr`` is normalized in-place as needed. + :return: None, ``pexpr`` is normalized in-place as needed. """ - # Expression - assert isinstance(expr_elem['expr'], dict) - for key in expr_elem['expr'].keys(): - assert isinstance(key, str) - expr: _JSONObject =3D expr_elem['expr'] - - # QAPISourceInfo - assert isinstance(expr_elem['info'], QAPISourceInfo) - info: QAPISourceInfo =3D expr_elem['info'] - - # Optional[QAPIDoc] - tmp =3D expr_elem.get('doc') - assert tmp is None or isinstance(tmp, QAPIDoc) - doc: Optional[QAPIDoc] =3D tmp + expr =3D pexpr.expr + info =3D pexpr.info =20 if 'include' in expr: return @@ -633,6 +621,7 @@ def check_expr(expr_elem: _JSONObject) -> None: info.set_defn(meta, name) check_defn_name_str(name, info, meta) =20 + doc =3D pexpr.doc if doc: if doc.symbol !=3D name: raise QAPISemError( @@ -684,7 +673,7 @@ def check_expr(expr_elem: _JSONObject) -> None: check_flags(expr, info) =20 =20 -def check_exprs(exprs: List[_JSONObject]) -> List[_JSONObject]: +def check_exprs(exprs: List[ParsedExpression]) -> List[ParsedExpression]: """ Validate and normalize a list of parsed QAPI schema expressions. =20 diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py index 36d4bd175a0..5ea9b643837 100644 --- a/scripts/qapi/parser.py +++ b/scripts/qapi/parser.py @@ -21,6 +21,7 @@ TYPE_CHECKING, Dict, List, + NamedTuple, Optional, Set, Union, @@ -43,6 +44,12 @@ _ExprValue =3D Union[List[object], Dict[str, object], str, bool] =20 =20 +class ParsedExpression(NamedTuple): + expr: TopLevelExpr + info: QAPISourceInfo + doc: Optional['QAPIDoc'] + + class QAPIParseError(QAPISourceError): """Error class for all QAPI schema parsing errors.""" def __init__(self, parser: 'QAPISchemaParser', msg: str): @@ -95,7 +102,7 @@ def __init__(self, self.line_pos =3D 0 =20 # Parser output: - self.exprs: List[Dict[str, object]] =3D [] + self.exprs: List[ParsedExpression] =3D [] self.docs: List[QAPIDoc] =3D [] =20 # Showtime! @@ -142,8 +149,7 @@ def _parse(self) -> None: "value of 'include' must be a strin= g") incl_fname =3D os.path.join(os.path.dirname(self._fname), include) - self.exprs.append({'expr': {'include': incl_fname}, - 'info': info}) + self._add_expr(OrderedDict({'include': incl_fname}), info) exprs_include =3D self._include(include, info, incl_fname, self._included) if exprs_include: @@ -160,17 +166,18 @@ def _parse(self) -> None: for name, value in pragma.items(): self._pragma(name, value, info) else: - expr_elem =3D {'expr': expr, - 'info': info} - if cur_doc: - if not cur_doc.symbol: - raise QAPISemError( - cur_doc.info, "definition documentation requir= ed") - expr_elem['doc'] =3D cur_doc - self.exprs.append(expr_elem) + if cur_doc and not cur_doc.symbol: + raise QAPISemError( + cur_doc.info, "definition documentation required") + self._add_expr(expr, info, cur_doc) cur_doc =3D None self.reject_expr_doc(cur_doc) =20 + def _add_expr(self, expr: TopLevelExpr, + info: QAPISourceInfo, + doc: Optional['QAPIDoc'] =3D None) -> None: + self.exprs.append(ParsedExpression(expr, info, doc)) + @staticmethod def reject_expr_doc(doc: Optional['QAPIDoc']) -> None: if doc and doc.symbol: diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py index d1d27ff7ee8..025b22cd3df 100644 --- a/scripts/qapi/schema.py +++ b/scripts/qapi/schema.py @@ -1148,9 +1148,9 @@ def _def_event(self, expr, info, doc): =20 def _def_exprs(self, exprs): for expr_elem in exprs: - expr =3D expr_elem['expr'] - info =3D expr_elem['info'] - doc =3D expr_elem.get('doc') + expr =3D expr_elem.expr + info =3D expr_elem.info + doc =3D expr_elem.doc if 'enum' in expr: self._def_enum_type(expr, info, doc) elif 'struct' in expr: --=20 2.30.2 From nobody Fri May 10 02:33:22 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1621524253; cv=none; d=zohomail.com; s=zohoarc; b=e0c3Jii/g2axpnuo5Q7icF5rrmjWygUXxw0/hVtL91Wpy9kGlgmIheIEijLd5KZQUc3aKx0BzicieJheK5M8P3NrzgS9FvyRHf9aUEARQ5znkQwnTc2V9mks39FuLo4LudBAdXIeUTLptqwsZBnczEtrAmGXtJIB0/cqymGpaq0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621524253; 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=ZMwqCxL0/Oie3R9kHWhs0nBDJoiSZY0mAFzDPUPiEcA=; b=nTaXGlE8aARz8K6hy8/VbmAatJ2kkll9pb9BDNv7pO8bFifNW8JX/3y0Lp8RaCUZRaW3kqwsWkmRD65j6OHgbKvNBKjrR6Qrt5Sj+bntgIknfhfKlV0j6JBdBJbF6B/jI/iTSlFB4oQm3F4EEJjhTNHyhVt/Mj/GfTeD2esXEJs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1621524253294125.32751106228773; Thu, 20 May 2021 08:24:13 -0700 (PDT) Received: from localhost ([::1]:55754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ljkWx-0006zC-HQ for importer@patchew.org; Thu, 20 May 2021 11:24:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46928) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljkR9-0005Da-7W for qemu-devel@nongnu.org; Thu, 20 May 2021 11:18:11 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:55912) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljkR7-0003y3-9O for qemu-devel@nongnu.org; Thu, 20 May 2021 11:18:10 -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-551-efBEHYPgOt-IqSewIkjizg-1; Thu, 20 May 2021 11:18:04 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 140F3107ACE3; Thu, 20 May 2021 15:18:03 +0000 (UTC) Received: from scv.redhat.com (ovpn-117-64.rdu2.redhat.com [10.10.117.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 74FA36062F; Thu, 20 May 2021 15:18:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1621523888; 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=ZMwqCxL0/Oie3R9kHWhs0nBDJoiSZY0mAFzDPUPiEcA=; b=b38dfIX0K3M4/GlV3Uba3Og+LhLLCBlB9B8QfdOUxoMKYQufTAC/C1+RGlfhOu5hsOSgQs eXlgYDWy7IXFepK2NiJDAiTHwt9huVwqPTSvhy2B+P8sHXNgFZM2VamgdaMMZehrILQMOb my2w0oSPeOMCTpN8PAdMPaGt5QKEq6M= X-MC-Unique: efBEHYPgOt-IqSewIkjizg-1 From: John Snow To: qemu-devel@nongnu.org Subject: [PATCH 3/3] qapi/parser: Remove _JSONObject Date: Thu, 20 May 2021 11:17:59 -0400 Message-Id: <20210520151759.91929-4-jsnow@redhat.com> In-Reply-To: <20210520151759.91929-1-jsnow@redhat.com> References: <20210520151759.91929-1-jsnow@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 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-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=216.205.24.124; envelope-from=jsnow@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.39, 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_H4=0.001, RCVD_IN_MSPIKE_WL=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: Michael Roth , John Snow , Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Use TopLevelExpr where appropriate now (Any function that accepts exclusively a Top Level Expression), and replace any other remaining user with a generic Dict[str, object]. Signed-off-by: John Snow --- scripts/qapi/expr.py | 43 ++++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py index 6d89343897c..005fbf3a7d8 100644 --- a/scripts/qapi/expr.py +++ b/scripts/qapi/expr.py @@ -44,18 +44,10 @@ =20 from .common import c_name from .error import QAPISemError -from .parser import ParsedExpression +from .parser import ParsedExpression, TopLevelExpr from .source import QAPISourceInfo =20 =20 -# Deserialized JSON objects as returned by the parser. -# The values of this mapping are not necessary to exhaustively type -# here (and also not practical as long as mypy lacks recursive -# types), because the purpose of this module is to interrogate that -# type. -_JSONObject =3D Dict[str, object] - - # See check_name_str(), below. valid_name =3D re.compile(r'(__[a-z0-9.-]+_)?' r'(x-)?' @@ -192,7 +184,7 @@ def check_defn_name_str(name: str, info: QAPISourceInfo= , meta: str) -> None: info, "%s name should not end in '%s'" % (meta, name[-4:])) =20 =20 -def check_keys(value: _JSONObject, +def check_keys(value: Dict[str, object], info: QAPISourceInfo, source: str, required: Collection[str], @@ -229,11 +221,11 @@ def pprint(elems: Iterable[str]) -> str: pprint(unknown), pprint(allowed))) =20 =20 -def check_flags(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_flags(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ Ensure flag members (if present) have valid values. =20 - :param expr: The expression to validate. + :param expr: The `TopLevelExpr` to validate. :param info: QAPI schema source file information. =20 :raise QAPISemError: @@ -257,7 +249,8 @@ def check_flags(expr: _JSONObject, info: QAPISourceInfo= ) -> None: "are incompatible") =20 =20 -def check_if(expr: _JSONObject, info: QAPISourceInfo, source: str) -> None: +def check_if(expr: Dict[str, object], info: QAPISourceInfo, + source: str) -> None: """ Normalize and validate the ``if`` member of an object. =20 @@ -430,9 +423,9 @@ def check_features(features: Optional[object], check_if(feat, info, source) =20 =20 -def check_enum(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_enum(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ - Normalize and validate this expression as an ``enum`` definition. + Normalize and validate this `TopLevelExpr` as an ``enum`` definition. =20 :param expr: The expression to validate. :param info: QAPI schema source file information. @@ -468,9 +461,9 @@ def check_enum(expr: _JSONObject, info: QAPISourceInfo)= -> None: check_if(member, info, source) =20 =20 -def check_struct(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_struct(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ - Normalize and validate this expression as a ``struct`` definition. + Normalize and validate this `TopLevelExpr` as a ``struct`` definition. =20 :param expr: The expression to validate. :param info: QAPI schema source file information. @@ -485,9 +478,9 @@ def check_struct(expr: _JSONObject, info: QAPISourceInf= o) -> None: check_type(expr.get('base'), info, "'base'") =20 =20 -def check_union(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_union(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ - Normalize and validate this expression as a ``union`` definition. + Normalize and validate this `TopLevelExpr` as a ``union`` definition. =20 :param expr: The expression to validate. :param info: QAPI schema source file information. @@ -522,9 +515,9 @@ def check_union(expr: _JSONObject, info: QAPISourceInfo= ) -> None: check_type(value['type'], info, source, allow_array=3Dnot base) =20 =20 -def check_alternate(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_alternate(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ - Normalize and validate this expression as an ``alternate`` definition. + Normalize and validate this `TopLevelExpr` as an ``alternate`` definit= ion. =20 :param expr: The expression to validate. :param info: QAPI schema source file information. @@ -548,9 +541,9 @@ def check_alternate(expr: _JSONObject, info: QAPISource= Info) -> None: check_type(value['type'], info, source) =20 =20 -def check_command(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_command(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ - Normalize and validate this expression as a ``command`` definition. + Normalize and validate this `TopLevelExpr` as a ``command`` definition. =20 :param expr: The expression to validate. :param info: QAPI schema source file information. @@ -568,9 +561,9 @@ def check_command(expr: _JSONObject, info: QAPISourceIn= fo) -> None: check_type(rets, info, "'returns'", allow_array=3DTrue) =20 =20 -def check_event(expr: _JSONObject, info: QAPISourceInfo) -> None: +def check_event(expr: TopLevelExpr, info: QAPISourceInfo) -> None: """ - Normalize and validate this expression as an ``event`` definition. + Normalize and validate this `TopLevelExpr` as an ``event`` definition. =20 :param expr: The expression to validate. :param info: QAPI schema source file information. --=20 2.30.2