aboutsummaryrefslogtreecommitdiff
path: root/gdb/python/py-ref.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-11-20 17:48:31 -0700
committerTom Tromey <tom@tromey.com>2017-01-10 19:14:09 -0700
commit50315b21779d71c172eb98a786a9b8281622e407 (patch)
treeff163e54508c6a8c959ff5f9f118debd34481bc0 /gdb/python/py-ref.h
parentfc4007c969ec4208fb7c7cee2f50211a9aa0f40f (diff)
downloadgdb-50315b21779d71c172eb98a786a9b8281622e407.zip
gdb-50315b21779d71c172eb98a786a9b8281622e407.tar.gz
gdb-50315b21779d71c172eb98a786a9b8281622e407.tar.bz2
Add gdb_ref_ptr.h
This adds a new gdb_ref_ptr.h, that implements a reference-counting smart pointer class, where the user of the class supplies a reference-counting policy object. This class will be used in the next patch, which changes most explicit BFD reference counts to use this new type. Meanwhile, this patch changes gdbpy_ref to be a specialization of this new class. This change required adding new nullptr_t overloads some operators in gdb_ref_ptr.h. I suspect this was needed because some Python header redefines NULL, but I'm not certain. 2017-01-10 Tom Tromey <tom@tromey.com> * common/gdb_ref_ptr.h: New file. * python/py-ref.h (struct gdbpy_ref_policy): New. (gdbpy_ref): Now a typedef.
Diffstat (limited to 'gdb/python/py-ref.h')
-rw-r--r--gdb/python/py-ref.h135
1 files changed, 9 insertions, 126 deletions
diff --git a/gdb/python/py-ref.h b/gdb/python/py-ref.h
index f0e4aae..b2479bf 100644
--- a/gdb/python/py-ref.h
+++ b/gdb/python/py-ref.h
@@ -20,140 +20,23 @@
#ifndef GDB_PYTHON_REF_H
#define GDB_PYTHON_REF_H
-/* An instance of this class either holds a reference to a PyObject,
- or is "NULL". If it holds a reference, then when the object is
- destroyed, the PyObject is decref'd.
+#include "common/gdb_ref_ptr.h"
- 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.
-*/
-class gdbpy_ref
+/* A policy class for gdb::ref_ptr for Python reference counting. */
+struct gdbpy_ref_policy
{
- public:
-
- /* Create a new NULL instance. */
- gdbpy_ref ()
- : m_obj (NULL)
- {
- }
-
- /* Create a new instance. OBJ is a reference, management of which
- is now transferred to this class. */
- explicit gdbpy_ref (PyObject *obj)
- : m_obj (obj)
- {
- }
-
- /* Copy another instance. */
- gdbpy_ref (const gdbpy_ref &other)
- : m_obj (other.m_obj)
- {
- Py_XINCREF (m_obj);
- }
-
- /* Transfer ownership from OTHER. */
- gdbpy_ref (gdbpy_ref &&other)
- : m_obj (other.m_obj)
- {
- other.m_obj = NULL;
- }
-
- /* Destroy this instance. */
- ~gdbpy_ref ()
- {
- Py_XDECREF (m_obj);
- }
-
- /* Copy another instance. */
- gdbpy_ref &operator= (const gdbpy_ref &other)
- {
- /* Do nothing on self-assignment. */
- if (this != &other)
- {
- reset (other.m_obj);
- Py_XINCREF (m_obj);
- }
- return *this;
- }
-
- /* Transfer ownership from OTHER. */
- gdbpy_ref &operator= (gdbpy_ref &&other)
+ static void incref (PyObject *ptr)
{
- /* Do nothing on self-assignment. */
- if (this != &other)
- {
- reset (other.m_obj);
- other.m_obj = NULL;
- }
- return *this;
+ Py_INCREF (ptr);
}
- /* Change this instance's referent. OBJ is a reference, management
- of which is now transferred to this class. */
- void reset (PyObject *obj)
+ static void decref (PyObject *ptr)
{
- Py_XDECREF (m_obj);
- m_obj = obj;
+ Py_DECREF (ptr);
}
-
- /* Return this instance's referent. In Python terms this is a
- borrowed pointer. */
- PyObject *get () const
- {
- return m_obj;
- }
-
- /* Return this instance's referent, and stop managing this
- reference. The caller is now responsible for the ownership of
- the reference. */
- PyObject *release ()
- {
- PyObject *result = m_obj;
-
- m_obj = NULL;
- return result;
- }
-
- private:
-
- PyObject *m_obj;
};
-inline bool operator== (const gdbpy_ref &self, const gdbpy_ref &other)
-{
- return self.get () == other.get ();
-}
-
-inline bool operator== (const gdbpy_ref &self, const PyObject *other)
-{
- return self.get () == other;
-}
-
-inline bool operator== (const PyObject *self, const gdbpy_ref &other)
-{
- return self == other.get ();
-}
-
-inline bool operator!= (const gdbpy_ref &self, const gdbpy_ref &other)
-{
- return self.get () != other.get ();
-}
-
-inline bool operator!= (const gdbpy_ref &self, const PyObject *other)
-{
- return self.get () != other;
-}
-
-inline bool operator!= (const PyObject *self, const gdbpy_ref &other)
-{
- return self != other.get ();
-}
+/* A gdb::ref_ptr that has been specialized for Python objects. */
+typedef gdb::ref_ptr<PyObject, gdbpy_ref_policy> gdbpy_ref;
#endif /* GDB_PYTHON_REF_H */