Mercurial > octave
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.