From patchwork Thu Feb 25 23:38:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 8427781 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 6B6779F52D for ; Thu, 25 Feb 2016 23:47:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D186320268 for ; Thu, 25 Feb 2016 23:47:42 +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 29DD620266 for ; Thu, 25 Feb 2016 23:47:42 +0000 (UTC) Received: from localhost ([::1]:46509 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aZ5dF-0001pR-KU for patchwork-qemu-devel@patchwork.kernel.org; Thu, 25 Feb 2016 18:47:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51361) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aZ5V9-000377-OT for qemu-devel@nongnu.org; Thu, 25 Feb 2016 18:39:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aZ5V7-0005Uu-V8 for qemu-devel@nongnu.org; Thu, 25 Feb 2016 18:39:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42275) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aZ5V7-0005UZ-NL for qemu-devel@nongnu.org; Thu, 25 Feb 2016 18:39:17 -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 23BA37EBB2; Thu, 25 Feb 2016 23:39:15 +0000 (UTC) Received: from red.redhat.com (ovpn-113-105.phx2.redhat.com [10.3.113.105]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u1PNd2Nr002433; Thu, 25 Feb 2016 18:39:14 -0500 From: Eric Blake To: qemu-devel@nongnu.org Date: Thu, 25 Feb 2016 16:38:48 -0700 Message-Id: <1456443528-13901-20-git-send-email-eblake@redhat.com> In-Reply-To: <1456443528-13901-1-git-send-email-eblake@redhat.com> References: <1456443528-13901-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: armbru@redhat.com, Michael Roth Subject: [Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like 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=-1.9 required=5.0 tests=BAYES_00, 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 QAPISchemaType.c_type() was a bit awkward. Rather than having two optional orthogonal boolean flags that should never both be true, and where all callers pass a compile-time constant, provide three different method names that can be overridden as needed, and where the caller just uses the right variant. It requires slightly more Python, but is arguably easier to read. Suggested-by: Markus Armbruster Signed-off-by: Eric Blake --- v2: no change --- scripts/qapi.py | 38 +++++++++++++++++++++++++++++--------- scripts/qapi-types.py | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/scripts/qapi.py b/scripts/qapi.py index d5f4e28..32f37d8 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -826,8 +826,17 @@ class QAPISchemaVisitor(object): class QAPISchemaType(QAPISchemaEntity): - def c_type(self, is_param=False, is_unboxed=False): - return c_name(self.name) + pointer_suffix + # Normal usage of the type, such as declaring a local variable + def c_type(self): + pass + + # Use of a type in a parameter list + def c_param_type(self): + return self.c_type() + + # Use of a type in a struct declaration + def c_unboxed_type(self): + return self.c_type() def c_null(self): return 'NULL' @@ -859,8 +868,11 @@ class QAPISchemaBuiltinType(QAPISchemaType): def c_name(self): return self.name - def c_type(self, is_param=False, is_unboxed=False): - if is_param and self.name == 'str': + def c_type(self): + return self._c_type_name + + def c_param_type(self): + if self.name == 'str': return 'const ' + self._c_type_name return self._c_type_name @@ -893,7 +905,7 @@ class QAPISchemaEnumType(QAPISchemaType): # See QAPISchema._make_implicit_enum_type() return self.name.endswith('Kind') - def c_type(self, is_param=False, is_unboxed=False): + def c_type(self): return c_name(self.name) def member_names(self): @@ -925,6 +937,9 @@ class QAPISchemaArrayType(QAPISchemaType): def is_implicit(self): return True + def c_type(self): + return c_name(self.name) + pointer_suffix + def json_type(self): return 'array' @@ -994,12 +1009,14 @@ class QAPISchemaObjectType(QAPISchemaType): assert not self.is_implicit() return QAPISchemaType.c_name(self) - def c_type(self, is_param=False, is_unboxed=False): + def c_type(self): assert not self.is_implicit() - if is_unboxed: - return c_name(self.name) return c_name(self.name) + pointer_suffix + def c_unboxed_type(self): + assert not self.is_implicit() + return c_name(self.name) + def json_type(self): return 'object' @@ -1140,6 +1157,9 @@ class QAPISchemaAlternateType(QAPISchemaType): for v in self.variants.variants: v.check_clash(self.info, seen) + def c_type(self): + return c_name(self.name) + pointer_suffix + def json_type(self): return 'value' @@ -1634,7 +1654,7 @@ def gen_params(arg_type, extra): sep = ', ' if memb.optional: ret += 'bool has_%s, ' % c_name(memb.name) - ret += '%s %s' % (memb.type.c_type(is_param=True), c_name(memb.name)) + ret += '%s %s' % (memb.type.c_param_type(), c_name(memb.name)) if extra: ret += sep + extra return ret diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 161443e..ce6d6f9 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -140,7 +140,7 @@ def gen_variants(variants): ret += mcgen(''' %(c_type)s %(c_name)s; ''', - c_type=var.type.c_type(is_unboxed=True), + c_type=var.type.c_unboxed_type(), c_name=c_name(var.name)) ret += mcgen('''