* Alf P. Steinbach /Usenet, on 08.07.2010 01:47:

     enum DoAddRef { doAddRef };

     class Ptr
     {
     private:
         PyObject*   p_;

     public:
         Ptr( PyObject* p = 0 ): p_( p )
         {}

         Ptr( PyObject* p, DoAddRef ): p_( p )
         {
             assert( p != 0 );
             Py_INCREF( p_ );
         }

         Ptr( Ptr const& other ): p_( other.p_ )
         {
             Py_XINCREF( p_ );
         }

         ~Ptr()
         {
             Py_XDECREF( p_ );
         }

         void swapWith( Ptr& other ) { std::swap( p_, other.p_ ); }
         Ptr& operator=( Ptr other ) { swapWith( other ); return *this; }

         PyObject* get() const       { return p_; }

         PyObject* release()
         {
             PyObject* const result  = p_;
             Py_XDECREF( p_ );

Hark. This Py_XDECREF shouldn't be there, I don't know how it got there. The whole point of 'release', with conventional semantics, is to /not/ decrement the reference count.


             p_ = 0;
             return result;
         }
     };


Sorry for posting unfinished code,

- Alf


PS: "pyni" was a good name. But in use! When I thought about adding the "s" as disambiguation I thought the pure shock value of that was funny in a way, but now it doesn't seem funny. Is "pytes" (Python Extension Support) a good name?

--
blog at <url: http://alfps.wordpress.com>
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to