From patchwork Sat Mar 5 16:16:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 8510951 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 F2B68C0553 for ; Sat, 5 Mar 2016 16:20:27 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3D19E20222 for ; Sat, 5 Mar 2016 16:20:27 +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 6559320253 for ; Sat, 5 Mar 2016 16:20:26 +0000 (UTC) Received: from localhost ([::1]:47099 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1acEwL-0006wy-Ow for patchwork-qemu-devel@patchwork.kernel.org; Sat, 05 Mar 2016 11:20:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52413) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1acEsl-0001E2-15 for qemu-devel@nongnu.org; Sat, 05 Mar 2016 11:16:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1acEsi-0002e8-BG for qemu-devel@nongnu.org; Sat, 05 Mar 2016 11:16:42 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51694) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1acEsi-0002dk-3w for qemu-devel@nongnu.org; Sat, 05 Mar 2016 11:16:40 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id CCE6791FC2; Sat, 5 Mar 2016 16:16:39 +0000 (UTC) Received: from red.redhat.com (ovpn-113-165.phx2.redhat.com [10.3.113.165]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u25GGb5B019060; Sat, 5 Mar 2016 11:16:39 -0500 From: Eric Blake To: qemu-devel@nongnu.org Date: Sat, 5 Mar 2016 09:16:28 -0700 Message-Id: <1457194595-16189-4-git-send-email-eblake@redhat.com> In-Reply-To: <1457194595-16189-1-git-send-email-eblake@redhat.com> References: <1457194595-16189-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 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 v4 03/10] 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=-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 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 should pass a compile-time constant (well, our use of is_unboxed wasn't constant, but a future patch is about to remove the special case for simple unions, so we can live with the churn of refactoring the code in the meantime), the more object-oriented approach uses different method names that can be overridden as needed, and which convey the intent by the method name. The caller just makes sure to use the right variant, rather than having to worry about boolean flags. It requires slightly more Python, but is arguably easier to read. Suggested-by: Markus Armbruster Signed-off-by: Eric Blake --- v4: hoist earlier in series, rework simple union hack in qapi-types, improve docs [no v3] v2: no change --- scripts/qapi.py | 39 ++++++++++++++++++++++++++++++--------- scripts/qapi-types.py | 7 +++++-- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/scripts/qapi.py b/scripts/qapi.py index dc26ef9..b1b87ee 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -822,8 +822,18 @@ class QAPISchemaVisitor(object): class QAPISchemaType(QAPISchemaEntity): - def c_type(self, is_param=False, is_unboxed=False): - return c_name(self.name) + pointer_suffix + # Return the C type for common use. + # For the types we commonly box, this is a pointer type. + def c_type(self): + pass + + # Return the C type to be used in a parameter list. + def c_param_type(self): + return self.c_type() + + # Return the C type to be used where we suppress boxing. + def c_unboxed_type(self): + return self.c_type() def c_null(self): return 'NULL' @@ -855,8 +865,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 @@ -889,7 +902,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): @@ -921,6 +934,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' @@ -986,12 +1002,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 +1158,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' @@ -1631,7 +1652,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 0306a88..f194bea 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -124,11 +124,14 @@ def gen_variants(variants): for var in variants.variants: # Ugly special case for simple union TODO get rid of it simple_union_type = var.simple_union_type() - typ = simple_union_type or var.type + if simple_union_type: + typ = simple_union_type.c_type() + else: + typ = var.type.c_unboxed_type() ret += mcgen(''' %(c_type)s %(c_name)s; ''', - c_type=typ.c_type(is_unboxed=not simple_union_type), + c_type=typ, c_name=c_name(var.name)) ret += mcgen('''