From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 69959 invoked by alias); 10 Nov 2016 23:48:54 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 69936 invoked by uid 89); 10 Nov 2016 23:48:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.8 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=acquires, initializing, Assignment, wrapping X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 10 Nov 2016 23:48:51 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B99548EB45; Thu, 10 Nov 2016 23:48:50 +0000 (UTC) Received: from [127.0.0.1] (ovpn03.gateway.prod.ext.phx2.redhat.com [10.5.9.3]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uAANmnQH007383; Thu, 10 Nov 2016 18:48:50 -0500 Subject: Re: [RFA 01/14] Introduce py-ref.h To: Tom Tromey , gdb-patches@sourceware.org References: <1478497656-11832-1-git-send-email-tom@tromey.com> <1478497656-11832-2-git-send-email-tom@tromey.com> From: Pedro Alves Message-ID: <7df8b22f-cd05-c0d6-5ede-e9dc29bca6e2@redhat.com> Date: Thu, 10 Nov 2016 23:48:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1478497656-11832-2-git-send-email-tom@tromey.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2016-11/txt/msg00276.txt.bz2 On 11/07/2016 05:47 AM, Tom Tromey wrote: > +/* An instance of this class holds a reference to a PyObject. When > + the object is destroyed, the PyObject is decref'd. > + > + Normally an instance is constructed using a PyObject*. This sort > + of initialization lets this class manage the lifetime of that > + reference. > + > + Assignment and copy construction will make a new reference as > + appropriate. Assignment from a plain PyObject* is disallowed to > + avoid confusion about whether this acquires a new reference; > + instead use the "reset" method -- which, like the PyObject* > + constructor, transfers ownership. I think this should say something about supporting explicitly wrapping a NULL PyObject *, and how to check whether there's a managed object. > +*/ > +class gdbpy_reference > +{ > + public: > + > + /* Create a new NULL instance. */ > + gdbpy_reference () > + : m_obj (NULL) > + { > + } > + > + /* Create a new NULL instance. */ > + gdbpy_reference (nullptr_t) > + : m_obj (NULL) > + { > + } I don't think this overload is needed, since there's no ambiguity without it. If you don't provide it, initializing with nullptr selects the one below, with the same result. Otherwise, shouldn't this overload be explicit too? > + > + /* Create a new instance. OBJ is a reference, management of which > + is now transferred to this class. */ > + explicit gdbpy_reference (PyObject *obj) > + : m_obj (obj) > + { > + } > + /* Equality. */ > + bool operator== (const PyObject *other) const > + { > + return m_obj == other; > + } > + > + /* Inequality. */ > + bool operator!= (const PyObject *other) const > + { > + return m_obj != other; > + } This supports: gdbpy_reference == PyObject * Seems to me we should support these too: gdbpy_reference == gdbpy_reference PyObject * == gdbpy_reference Thanks, Pedro Alves