diff options
author | Tom Tromey <tom@tromey.com> | 2016-11-20 17:48:31 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-01-10 19:14:09 -0700 |
commit | 50315b21779d71c172eb98a786a9b8281622e407 (patch) | |
tree | ff163e54508c6a8c959ff5f9f118debd34481bc0 /gdb/python/py-ref.h | |
parent | fc4007c969ec4208fb7c7cee2f50211a9aa0f40f (diff) | |
download | gdb-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.h | 135 |
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 */ |