From patchwork Sat Feb 20 00:19:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 8365151 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id C0E9FC0553 for ; Sat, 20 Feb 2016 00:20:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1656920570 for ; Sat, 20 Feb 2016 00:20:18 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 48EC52056E for ; Sat, 20 Feb 2016 00:20:17 +0000 (UTC) Received: from localhost ([::1]:56503 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aWvHU-0004n6-GD for patchwork-qemu-devel@patchwork.kernel.org; Fri, 19 Feb 2016 19:20:16 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49043) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aWvHB-0004d0-NP for qemu-devel@nongnu.org; Fri, 19 Feb 2016 19:19:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aWvH9-0003ud-A9 for qemu-devel@nongnu.org; Fri, 19 Feb 2016 19:19:57 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35663) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aWvH9-0003uN-2e for qemu-devel@nongnu.org; Fri, 19 Feb 2016 19:19:55 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id C3253627C2; Sat, 20 Feb 2016 00:19:54 +0000 (UTC) Received: from red.redhat.com (ovpn-113-75.phx2.redhat.com [10.3.113.75]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u1K0Jn6Q025514; Fri, 19 Feb 2016 19:19:54 -0500 From: Eric Blake To: qemu-devel@nongnu.org Date: Fri, 19 Feb 2016 17:19:39 -0700 Message-Id: <1455927587-28033-10-git-send-email-eblake@redhat.com> In-Reply-To: <1455927587-28033-1-git-send-email-eblake@redhat.com> References: <1455927587-28033-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Sat, 20 Feb 2016 00:19:54 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Cc: armbru@redhat.com, Michael Roth Subject: [Qemu-devel] [PATCH 09/17] qapi: Add type.is_empty() helper X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP And use it in qapi-types and qapi-event. Down the road, we may want to lift our artificial restriction of no variants at the top level of an event, at which point, inlining our check for whether members is empty will no longer be sufficient, but adding a check for variants adds verbosity; in the meantime, add some asserts in places where we don't handle variants. More immediately, the new .is_empty() helper will help fix a bug in qapi-visit in the next patch, where the generator did not handle an explicit empty type in the same was as a missing type. No change to generated code. Signed-off-by: Eric Blake --- v1: add some asserts Previously posted as part of qapi cleanup subset E: v9: improve commit message v8: no change v7: rebase to context change v6: new patch --- scripts/qapi.py | 5 +++++ scripts/qapi-event.py | 7 ++++--- scripts/qapi-types.py | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/qapi.py b/scripts/qapi.py index 8497777..8a4f952 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -962,6 +962,7 @@ class QAPISchemaObjectType(QAPISchemaType): assert isinstance(self.base, QAPISchemaObjectType) self.base.check(schema) self.base.check_clash(schema, self.info, seen) + assert not self.base.variants for m in self.local_members: m.check(schema) m.check_clash(self.info, seen) @@ -983,6 +984,10 @@ class QAPISchemaObjectType(QAPISchemaType): # See QAPISchema._make_implicit_object_type() return self.name[0] == ':' + def is_empty(self): + assert self.members is not None + return not self.members and not self.variants + def c_name(self): assert not self.is_implicit() return QAPISchemaType.c_name(self) diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py index 544ae12..8be3b44 100644 --- a/scripts/qapi-event.py +++ b/scripts/qapi-event.py @@ -39,7 +39,7 @@ def gen_event_send(name, arg_type): ''', proto=gen_event_send_proto(name, arg_type)) - if arg_type and arg_type.members: + if arg_type and not arg_type.is_empty(): ret += mcgen(''' QmpOutputVisitor *qov; Visitor *v; @@ -58,7 +58,8 @@ def gen_event_send(name, arg_type): ''', name=name) - if arg_type and arg_type.members: + if arg_type and not arg_type.is_empty(): + assert not arg_type.variants ret += mcgen(''' qov = qmp_output_visitor_new(); v = qmp_output_get_visitor(qov); @@ -88,7 +89,7 @@ out_obj: ''', c_enum=c_enum_const(event_enum_name, name)) - if arg_type and arg_type.members: + if arg_type and not arg_type.is_empty(): ret += mcgen(''' out: qmp_output_visitor_cleanup(qov); diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index b68e85a..1eb5622 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -90,7 +90,7 @@ struct %(c_name)s { # potential issues with attempting to malloc space for zero-length # structs in C, and also incompatibility with C++ (where an empty # struct is size 1). - if not (base and base.members) and not members and not variants: + if (not base or base.is_empty()) and not members and not variants: ret += mcgen(''' char qapi_dummy_field_for_empty_struct; ''')