changeset 8121:061febbf23ad

clear index before throwing error in Array indexed assignment functions
author John W. Eaton <jwe@octave.org>
date Fri, 19 Sep 2008 11:05:34 -0400
parents 8f0150a0d19e
children 99602635172a
files liboctave/Array.cc liboctave/ChangeLog
diffstat 2 files changed, 54 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array.cc	Thu Sep 18 21:54:00 2008 +0200
+++ b/liboctave/Array.cc	Fri Sep 19 11:05:34 2008 -0400
@@ -2154,8 +2154,12 @@
       retval = index (idx[0]);
     }
   else
-    (*current_liboctave_error_handler)
-      ("Array<T>::value: invalid number of indices specified");
+    {
+      clear_index ();
+
+      (*current_liboctave_error_handler)
+	("Array<T>::value: invalid number of indices specified");
+    }
 
   clear_index ();
 
@@ -2943,6 +2947,8 @@
 	    }
 	  else
 	    {
+	      lhs.clear_index ();
+
 	      (*current_liboctave_error_handler)
 		("A(I) = X: X must be a scalar or a vector with same length as I");
 
@@ -2951,6 +2957,8 @@
 	}
       else
 	{
+	  lhs.clear_index ();
+
 	  (*current_liboctave_error_handler)
 	    ("A(I) = X: unable to resize A");
 
@@ -2971,11 +2979,17 @@
 	    lhs.xelem (i) = rhs.elem (i);
 	}
       else if (rhs_len != lhs_len)
-	(*current_liboctave_error_handler)
-	  ("A(:) = X: A must be the same size as X");
+	{
+	  lhs.clear_index ();
+
+	  (*current_liboctave_error_handler)
+	    ("A(:) = X: A must be the same size as X");
+	}
     }
   else if (! (rhs_len == 1 || rhs_len == 0))
     {
+      lhs.clear_index ();
+
       (*current_liboctave_error_handler)
 	("A([]) = X: X must also be an empty matrix or a scalar");
 
@@ -3037,6 +3051,7 @@
 	  break;
 
 	default:
+	  lhs.clear_index ();
 	  (*current_liboctave_error_handler)
 	    ("Array<T>::assign2: Dimension mismatch");
 	  return 0;
@@ -3151,6 +3166,8 @@
 		{
 		  if (! (rhs_is_scalar || (rhs_nr == 0 || rhs_nc == 0)))
 		    {
+		      lhs.clear_index ();
+
 		      (*current_liboctave_error_handler)
 		("A([], []) = X: X must be an empty matrix or a scalar");
 
@@ -3159,12 +3176,10 @@
 		}
 	      else
 		{
-		  (*current_liboctave_error_handler)
-    ("A(I, J) = X: X must be a scalar or the number of elements in I must");
+		  lhs.clear_index ();
+
 		  (*current_liboctave_error_handler)
-    ("match the number of rows in X and the number of elements in J must");
-		  (*current_liboctave_error_handler)
-    ("match the number of columns in X");
+    ("A(I, J) = X: X must be a scalar or the number of elements in I must match the number of rows in X and the number of elements in J must match the number of columns in X");
 
 		  retval = 0;
 		}
@@ -3279,8 +3294,14 @@
 	      else if (len == 0)
 		{
 		  if (! (rhs_is_scalar || (rhs_nr == 0 || rhs_nc == 0)))
-		    (*current_liboctave_error_handler)
-		      ("A([]) = X: X must be an empty matrix or scalar");
+		    {
+		      lhs.clear_index ();
+
+		      (*current_liboctave_error_handler)
+			("A([]) = X: X must be an empty matrix or scalar");
+
+		      retval = 0;
+		    }
 		}
 	      else if (len == rhs_nr * rhs_nc)
 		{
@@ -3322,6 +3343,8 @@
 		}
 	      else
 		{
+		  lhs.clear_index ();
+
 		  (*current_liboctave_error_handler)
       ("A(I) = X: X must be a scalar or a matrix with the same size as I");
 
@@ -3368,6 +3391,8 @@
     }
   else if (n_idx == 0)
     {
+      lhs.clear_index ();
+
       (*current_liboctave_error_handler)
 	("invalid number of indices for matrix expression");
 
@@ -3392,6 +3417,8 @@
 	    {
 	      if (! (rhs_dims.all_ones () || rhs_dims.any_zero ()))
 		{
+		  lhs.clear_index ();
+
 		  (*current_liboctave_error_handler)
 		    ("A([]) = X: X must be an empty matrix or scalar");
 
@@ -3440,6 +3467,8 @@
 	    }
 	  else
 	    {
+	      lhs.clear_index ();
+
 	      (*current_liboctave_error_handler)
 		("A(I) = X: X must be a scalar or a matrix with the same size as I");
 
@@ -3551,6 +3580,8 @@
 		    }
 		  else if (new_dims_numel != rhs_dims_numel || new_dims_vec > 1)
 		    {
+		      lhs.clear_index ();
+
 		      (*current_liboctave_error_handler)
 			("A(IDX-LIST) = RHS: mismatched index and RHS dimension");
 		      return retval;
@@ -3578,6 +3609,8 @@
 			k++;
 		      else if (nelem != 1)
 			{
+			  lhs.clear_index ();
+
 			  (*current_liboctave_error_handler)
 			    ("A(IDX-LIST) = RHS: mismatched index and RHS dimension");
 			  return retval;
@@ -3620,6 +3653,8 @@
 	      // be an error, because we don't know how to undo that
 	      // later...
 
+	      lhs.clear_index ();
+
 	      (*current_liboctave_error_handler)
 		("array index %d (= %d) for assignment requires invalid resizing operation",
 		 n_idx, new_dims(n_idx-1));
@@ -3746,6 +3781,8 @@
 
 		  if (n != rhs.numel ())
 		    {
+		      lhs.clear_index ();
+
 		      (*current_liboctave_error_handler)
 			("A(IDX-LIST) = X: X must be a scalar or size of X must equal number of elements indexed by IDX-LIST");
 
--- a/liboctave/ChangeLog	Thu Sep 18 21:54:00 2008 +0200
+++ b/liboctave/ChangeLog	Fri Sep 19 11:05:34 2008 -0400
@@ -1,3 +1,9 @@
+2008-09-19  John W. Eaton  <jwe@octave.org>
+
+	* Array.cc (assign1, assign2, assignN):
+	Clear lhs index before throwing error.
+	(Array<T>::value): Clear index before throwing error.
+
 2008-09-18  Jaroslav Hajek  <highegg@gmail.com>
 
 	* Array.cc (maybe_delete_elements_2 (idx_vector&)): Fix tests to get