diff options
author | Feng Xiao <xfxyjwf@gmail.com> | 2015-08-22 18:25:48 -0700 |
---|---|---|
committer | Feng Xiao <xfxyjwf@gmail.com> | 2015-08-22 18:25:48 -0700 |
commit | eee38b0c018b3279f77d03dff796f440f40d3516 (patch) | |
tree | 7ff0978e30238d493fc7899b75abeb6d66939f07 /python/google/protobuf/pyext/scoped_pyobject_ptr.h | |
parent | c3bc155aceda36ecb01cde2367a3b427f2d7ce40 (diff) |
Down-integrate from google3.
Diffstat (limited to 'python/google/protobuf/pyext/scoped_pyobject_ptr.h')
-rw-r--r-- | python/google/protobuf/pyext/scoped_pyobject_ptr.h | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/python/google/protobuf/pyext/scoped_pyobject_ptr.h b/python/google/protobuf/pyext/scoped_pyobject_ptr.h index 18ddd5cd..9979b83b 100644 --- a/python/google/protobuf/pyext/scoped_pyobject_ptr.h +++ b/python/google/protobuf/pyext/scoped_pyobject_ptr.h @@ -51,16 +51,22 @@ class ScopedPyObjectPtr { // Reset. Deletes the current owned object, if any. // Then takes ownership of a new object, if given. - // this->reset(this->get()) works. + // This function must be called with a reference that you own. + // this->reset(this->get()) is wrong! + // this->reset(this->release()) is OK. PyObject* reset(PyObject* p = NULL) { - if (p != ptr_) { - Py_XDECREF(ptr_); - ptr_ = p; - } + Py_XDECREF(ptr_); + ptr_ = p; return ptr_; } + // ScopedPyObjectPtr should not be copied. + // We explicitly list and delete this overload to avoid automatic conversion + // to PyObject*, which is wrong in this case. + PyObject* reset(const ScopedPyObjectPtr& other) = delete; + // Releases ownership of the object. + // The caller now owns the returned reference. PyObject* release() { PyObject* p = ptr_; ptr_ = NULL; |