@@ -769,44 +769,32 @@ class usm_memory : public py::object
769769 // create memory object owned by mock_owner, it is a new reference
770770 PyObject * _memory =
771771 api .Memory_Make_ (usm_ref , nbytes , QRef , mock_owner .ptr ());
772+ auto ref_count_decrementer = [](PyObject * o ) noexcept { Py_DECREF (o ); };
772773
773- bool is_ok =
774- (PyObject_TypeCheck (
775- _memory , ::dpctl ::detail ::dpctl_capi ::get ().Py_MemoryType_ ) !=
776- 0 );
777-
778- if (is_ok ) {
779- std ::shared_ptr < void > * opaque_ptr = nullptr ;
780- std ::exception_ptr eptr ;
781- try {
782- opaque_ptr = new std ::shared_ptr < void > (shptr );
783- } catch (const std ::exception & e ) {
784- eptr = std ::make_exception_ptr (e );
785- }
786- if (eptr ) {
787- Py_DECREF (_memory );
788- std ::rethrow_exception (eptr );
789- }
790- Py_MemoryObject * memobj =
791- reinterpret_cast < Py_MemoryObject * > (_memory );
792- // replace mock_owner capsule as the owner
793- memobj -> refobj = Py_None ;
794- // set opaque ptr field, usm_memory now knowns that USM is managed
795- // by smart pointer
796- memobj -> _opaque_ptr = reinterpret_cast < void * > (opaque_ptr );
797-
798- // _memory will delete created copies of sycl::queue, and
799- // std::shared_ptr and the deleter of the shared_ptr<void> is
800- // supposed to free the USM allocation
801- m_ptr = _memory ;
802- q_uptr .release ();
803- }
804- else {
805- Py_DECREF (_memory );
774+ using py_uptrT =
775+ std ::unique_ptr < PyObject , decltype (ref_count_decrementer )> ;
776+ auto memory_uptr = py_uptrT (_memory , ref_count_decrementer );
806777
807- throw std :: runtime_error (
808- "Internal error: _Memory object created did not pass check" );
778+ if (! _memory ) {
779+ throw py :: error_already_set ( );
809780 }
781+
782+ std ::shared_ptr < void > * opaque_ptr = nullptr ;
783+ opaque_ptr = new std ::shared_ptr < void > (shptr );
784+
785+ Py_MemoryObject * memobj = reinterpret_cast < Py_MemoryObject * > (_memory );
786+ // replace mock_owner capsule as the owner
787+ memobj -> refobj = Py_None ;
788+ // set opaque ptr field, usm_memory now knowns that USM is managed
789+ // by smart pointer
790+ memobj -> _opaque_ptr = reinterpret_cast < void * > (opaque_ptr );
791+
792+ // _memory will delete created copies of sycl::queue, and
793+ // std::shared_ptr and the deleter of the shared_ptr<void> is
794+ // supposed to free the USM allocation
795+ m_ptr = _memory ;
796+ q_uptr .release ();
797+ memory_uptr .release ();
810798 }
811799
812800 sycl ::queue get_queue () const
0 commit comments