changeset 30792:4fc0b7269803 stable

use allocators for sparse mxArray -> octave_value data transfer (bug #61813) * mex.cc (mxArray_base_sparse::to_ov): If std::pmr::polymorphic_allocator is available, use mx_memory_resource as allocator when transferring data to octave_value object, otherwise copy data.
author John W. Eaton <jwe@octave.org>
date Mon, 28 Feb 2022 14:02:17 -0500
parents b1301358b040
children 85a580a6b292 b39ecf7f45ce
files libinterp/corefcn/mex.cc
diffstat 1 files changed, 38 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/mex.cc	Mon Feb 28 13:56:18 2022 -0500
+++ b/libinterp/corefcn/mex.cc	Mon Feb 28 14:02:17 2022 -0500
@@ -2632,14 +2632,46 @@
   {
     ELT_T *ppr = static_cast<ELT_T *> (m_pr);
 
-    Sparse<ELT_T> val (dv, static_cast<octave_idx_type> (m_nzmax),
-                       ppr, m_ir, m_jc);
-
-    maybe_disown_ptr (m_pr);
-    maybe_disown_ptr (m_ir);
-    maybe_disown_ptr (m_jc);
+#if defined (OCTAVE_HAVE_STD_PMR_POLYMORPHIC_ALLOCATOR)
+
+    if (current_mx_memory_resource == &the_mx_deleting_memory_resource)
+      {
+        octave::unwind_action act ([=] () {
+          maybe_disown_ptr (m_pr);
+          maybe_disown_ptr (m_ir);
+          maybe_disown_ptr (m_jc);
+        });
+
+        return octave_value
+          (Sparse<ELT_T> (dv,  static_cast<octave_idx_type> (m_nzmax),
+                          ppr, m_ir, m_jc, current_mx_memory_resource));
+      }
+    else
+      return octave_value
+        (Sparse<ELT_T> (dv,  static_cast<octave_idx_type> (m_nzmax),
+                        ppr, m_ir, m_jc, current_mx_memory_resource));
+#else
+
+    // Copy data instead of allowing the octave_value object to borrow
+    // the mxArray object data.
+
+    octave_idx_type m = dv(0);
+    octave_idx_type n = dv(1);
+
+    Sparse<ELT_T> val (m, n, static_cast<octave_idx_type> (m_nzmax));
+
+    for (mwIndex i = 0; i < m_nzmax; i++)
+      {
+        val.xdata (i) = ppr[i];
+        val.xridx (i) = m_ir[i];
+      }
+
+    for (mwIndex i = 0; i < n + 1; i++)
+      val.xcidx (i) = m_jc[i];
 
     return octave_value (val);
+
+#endif
   }
 
   // Maximun number of nonzero elements.