From patchwork Thu Dec 27 19:26:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 30868 Received: (qmail 16384 invoked by alias); 27 Dec 2018 19:26:52 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 16256 invoked by uid 89); 27 Dec 2018 19:26:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=union, consisting, artificial X-HELO: gateway30.websitewelcome.com Received: from gateway30.websitewelcome.com (HELO gateway30.websitewelcome.com) (192.185.146.7) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 27 Dec 2018 19:26:47 +0000 Received: from cm12.websitewelcome.com (cm12.websitewelcome.com [100.42.49.8]) by gateway30.websitewelcome.com (Postfix) with ESMTP id 905B32AB5C for ; Thu, 27 Dec 2018 13:26:46 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id cbIsguXSniQercbIsgyTlH; Thu, 27 Dec 2018 13:26:46 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=OkyphVk9L/cbtmigEWb3FhE/+I403Fa27RUQVm05zjk=; b=gQ2MCDInp+MAw22IMJ6C++W67H z0LYaEkNnE5T1vMi6cp/iQ4hxhHJwWQb2TUlE4h9rQRFI1GrlWu1ZtyCMj4iMfsxUxdb7XDmlq/7I 21i3eFS3zlL/p2Z4mvDcDEbXY; Received: from 75-166-72-210.hlrn.qwest.net ([75.166.72.210]:47364 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gcbIs-0004pC-1P; Thu, 27 Dec 2018 13:26:46 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 4/5] Improve reference counting in py-type.c Date: Thu, 27 Dec 2018 12:26:36 -0700 Message-Id: <20181227192637.17862-5-tom@tromey.com> In-Reply-To: <20181227192637.17862-1-tom@tromey.com> References: <20181227192637.17862-1-tom@tromey.com> This improves the reference counting in py-type.c by using gdbpy_ref and gdbpy_ref::new_reference in more places. 2018-12-27 Tom Tromey * python/py-type.c (convert_field): Use new_reference. Return gdbpy_ref. (make_fielditem): Return gdbpy_ref. (typy_fields): Update. (typy_getitem): Update. (field_name): Return gdbpy_ref. Use new_reference. (typy_iterator_iternext): Update. --- gdb/ChangeLog | 10 ++++++++ gdb/python/py-type.c | 55 ++++++++++++++++++-------------------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index a3584e20d3..00498ba08a 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -165,7 +165,7 @@ typy_get_code (PyObject *self, void *closure) /* Helper function for typy_fields which converts a single field to a gdb.Field object. Returns NULL on error. */ -static PyObject * +static gdbpy_ref<> convert_field (struct type *type, int field) { gdbpy_ref<> result (field_new ()); @@ -218,23 +218,21 @@ convert_field (struct type *type, int field) } } if (arg == NULL) - { - arg.reset (Py_None); - Py_INCREF (arg.get ()); - } + arg = gdbpy_ref<>::new_reference (Py_None); + if (PyObject_SetAttrString (result.get (), "name", arg.get ()) < 0) return NULL; - arg.reset (TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False); - Py_INCREF (arg.get ()); + arg = gdbpy_ref<>::new_reference (TYPE_FIELD_ARTIFICIAL (type, field) + ? Py_True : Py_False); if (PyObject_SetAttrString (result.get (), "artificial", arg.get ()) < 0) return NULL; if (TYPE_CODE (type) == TYPE_CODE_STRUCT) - arg.reset (field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False); + arg = gdbpy_ref<>::new_reference (field < TYPE_N_BASECLASSES (type) + ? Py_True : Py_False); else - arg.reset (Py_False); - Py_INCREF (arg.get ()); + arg = gdbpy_ref<>::new_reference (Py_False); if (PyObject_SetAttrString (result.get (), "is_base_class", arg.get ()) < 0) return NULL; @@ -246,10 +244,7 @@ convert_field (struct type *type, int field) /* A field can have a NULL type in some situations. */ if (TYPE_FIELD_TYPE (type, field) == NULL) - { - arg.reset (Py_None); - Py_INCREF (arg.get ()); - } + arg = gdbpy_ref<>::new_reference (Py_None); else arg.reset (type_to_type_object (TYPE_FIELD_TYPE (type, field))); if (arg == NULL) @@ -257,24 +252,22 @@ convert_field (struct type *type, int field) if (PyObject_SetAttrString (result.get (), "type", arg.get ()) < 0) return NULL; - return result.release (); + return result; } /* Helper function to return the name of a field, as a gdb.Field object. If the field doesn't have a name, None is returned. */ -static PyObject * +static gdbpy_ref<> field_name (struct type *type, int field) { - PyObject *result; + gdbpy_ref<> result; if (TYPE_FIELD_NAME (type, field)) - result = PyString_FromString (TYPE_FIELD_NAME (type, field)); + result.reset (PyString_FromString (TYPE_FIELD_NAME (type, field))); else - { - result = Py_None; - Py_INCREF (result); - } + result = gdbpy_ref<>::new_reference (Py_None); + return result; } @@ -284,7 +277,7 @@ field_name (struct type *type, int field) the field, or a tuple consisting of field name and gdb.Field object. */ -static PyObject * +static gdbpy_ref<> make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind) { switch (kind) @@ -294,7 +287,7 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind) gdbpy_ref<> key (field_name (type, i)); if (key == NULL) return NULL; - gdbpy_ref<> value (convert_field (type, i)); + gdbpy_ref<> value = convert_field (type, i); if (value == NULL) return NULL; gdbpy_ref<> item (PyTuple_New (2)); @@ -302,7 +295,7 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind) return NULL; PyTuple_SET_ITEM (item.get (), 0, key.release ()); PyTuple_SET_ITEM (item.get (), 1, value.release ()); - return item.release (); + return item; } case iter_keys: return field_name (type, i); @@ -371,7 +364,7 @@ typy_fields (PyObject *self, PyObject *args) /* Array type. Handle this as a special case because the common machinery wants struct or union or enum types. Build a list of one entry which is the range for the array. */ - gdbpy_ref<> r (convert_field (type, 0)); + gdbpy_ref<> r = convert_field (type, 0); if (r == NULL) return NULL; @@ -1186,9 +1179,7 @@ typy_getitem (PyObject *self, PyObject *key) const char *t_field_name = TYPE_FIELD_NAME (type, i); if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0)) - { - return convert_field (type, i); - } + return convert_field (type, i).release (); } PyErr_SetObject (PyExc_KeyError, key); return NULL; @@ -1325,14 +1316,14 @@ typy_iterator_iternext (PyObject *self) { typy_iterator_object *iter_obj = (typy_iterator_object *) self; struct type *type = iter_obj->source->type; - PyObject *result; if (iter_obj->field < TYPE_NFIELDS (type)) { - result = make_fielditem (type, iter_obj->field, iter_obj->kind); + gdbpy_ref<> result = make_fielditem (type, iter_obj->field, + iter_obj->kind); if (result != NULL) iter_obj->field++; - return result; + return result.release (); } return NULL;