Mercurial > octave
changeset 33545:11b5c462f640 bytecode-interpreter
maint: Merge default to bytecode-interpreter
author | Arun Giridhar <arungiridhar@gmail.com> |
---|---|
date | Wed, 08 May 2024 08:58:50 -0400 |
parents | 2f920b7e07e4 (current diff) 31bc9accbe6e (diff) |
children | b6189d2a3d3c |
files | |
diffstat | 2 files changed, 26 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/data.cc Tue May 07 20:56:20 2024 -0400 +++ b/libinterp/corefcn/data.cc Wed May 08 08:58:50 2024 -0400 @@ -7120,9 +7120,13 @@ } else { + // Forbid vector or array input if (! args(1).is_scalar_type ()) error ("sort: DIM must be a positive scalar integer"); - dim = args(1).nint_value () - 1; + + // Forbid fractional value input, also nan input. + dim = args(1).strict_int_value ("sort: DIM must be a positive scalar integer") - 1; + if (dim < 0) error ("sort: DIM must be a positive scalar integer"); } @@ -7385,10 +7389,18 @@ %! [v, i] = sort (a); %! assert (i, [1, 4, 2, 5, 3]); +## Test sort dimension being very large +%!test <*65712> +%! A = [1 2; 3 4]; +%! assert (sort (A, 100), A) +%! assert (sort (A, inf), A) + %!error <Invalid call> sort () %!error <Invalid call> sort (1, 2, 3, 4) %!error <MODE must be either "ascend" or "descend"> sort (1, "foobar") %!error <DIM must be a positive scalar integer> sort (1, [1 2 3]) +%!error <DIM must be a positive scalar integer> sort ([1 2; 3 4], 1.234) +%!error <DIM must be a positive scalar integer> sort ([1 2; 3 4], nan) %!error <DIM argument must precede MODE argument> sort (1, "ascend", 1) %!error <MODE must be a string> sort (1, 1, 1) %!error <MODE must be either "ascend" or "descend"> sort (1, 1, "foobar")
--- a/liboctave/array/Array-base.cc Tue May 07 20:56:20 2024 -0400 +++ b/liboctave/array/Array-base.cc Wed May 08 08:58:50 2024 -0400 @@ -1814,7 +1814,19 @@ return m; if (dim >= dv.ndims ()) - dv.resize (dim+1, 1); + { + // The dimension to sort along exceeds the array's dimensions, + // ==> array is already trivially sorted in such higher dimensions, + // ==> copy and return. + + T *v = m.rwdata (); + const T *ov = data (); + + for (octave_idx_type i = 0; i < m.numel (); i++) + v[i] = ov[i]; + + return m; + } octave_idx_type ns = dv(dim); octave_idx_type iter = dv.numel () / ns;