diff src/pt-stmt.cc @ 5858:6bd94066d360

[project @ 2006-06-13 18:55:53 by jwe]
author jwe
date Tue, 13 Jun 2006 18:55:53 +0000
parents 92d2be71e7cc
children 2a6cb4ed8f1e
line wrap: on
line diff
--- a/src/pt-stmt.cc
+++ b/src/pt-stmt.cc
@@ -154,42 +154,58 @@
 {
   octave_value_list retval;
 
+  static octave_value_list empty_list;
+
   if (error_state)
     return retval;
 
-  for (iterator p = begin (); p != end (); p++)
-    {
-      tree_statement *elt = *p;
+  iterator p = begin ();
 
-      if (elt)
+  if (p != end ())
+    {
+      while (true)
 	{
-	  OCTAVE_QUIT;
+	  tree_statement *elt = *p++;
+
+	  if (elt)
+	    {
+	      OCTAVE_QUIT;
 
-	  // Clear preivous values before next statement is evaluated
-	  // so that we aren't holding an extra reference to a value
-	  // that may be used next.  For example, in code like this:
-	  //
-	  //   X = rand (N);  ## refcount should be 1 after this statement.
-	  //   X(idx) = val;  ## no extra copy should be needed, but
-	  //                  ## we will be faked out if retval is not
-	  //                  ## cleared between statements here.
+	      retval = elt->eval (silent, nargout, function_body);
+
+	      if (error_state)
+		break;
+
+	      if (tree_break_command::breaking
+		  || tree_continue_command::continuing)
+		break;
+
+	      if (tree_return_command::returning)
+		break;
 
-	  retval = octave_value_list ();
-
-	  retval = elt->eval (silent, nargout, function_body);
-
-	  if (error_state)
-	    break;
+	      if (p == end ())
+		break;
+	      else
+		{
+		  // Clear preivous values before next statement is
+		  // evaluated so that we aren't holding an extra
+		  // reference to a value that may be used next.  For
+		  // example, in code like this:
+		  //
+		  //   X = rand (N);  ## refcount for X should be 1
+		  //                  ## after this statement
+		  //
+		  //   X(idx) = val;  ## no extra copy of X should be
+		  //                  ## needed, but we will be faked
+		  //                  ## out if retval is not cleared
+		  //                  ## between statements here
 
-	  if (tree_break_command::breaking
-	      || tree_continue_command::continuing)
-	    break;
-
-	  if (tree_return_command::returning)
-	    break;
+		  retval = empty_list;
+		}
+	    }
+	  else
+	    error ("invalid statement found in statement list!");
 	}
-      else
-	error ("invalid statement found in statement list!");
     }
 
   return retval;