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;