changeset 20725:7164a69472dd

eliminate more uses of error state * daspk.cc, dasrt.cc, dassl.cc, lsode.cc, quad.cc: Eliminate uses of error_state. Handle user-supplied functions consistently.
author John W. Eaton <jwe@octave.org>
date Thu, 19 Nov 2015 15:46:40 -0500
parents 0338dc274ec5
children 25d676f9619c
files NEWS libinterp/corefcn/daspk.cc libinterp/corefcn/dasrt.cc libinterp/corefcn/dassl.cc libinterp/corefcn/lsode.cc libinterp/corefcn/quad.cc
diffstat 6 files changed, 117 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Thu Nov 19 17:09:06 2015 +0000
+++ b/NEWS	Thu Nov 19 15:46:40 2015 -0500
@@ -96,6 +96,10 @@
     makes the error and print_usage functions in C++ work more like the
     corresponding functions in the scripting language.
 
+ ** New configure option, --enable-address-sanitizer-flags, to build
+    Octave with memory allocator checks (similar to those provided by
+    valgrind) built in.
+
 Summary of important user-visible changes for version 4.0:
 ---------------------------------------------------------
 
--- a/libinterp/corefcn/daspk.cc	Thu Nov 19 17:09:06 2015 +0000
+++ b/libinterp/corefcn/daspk.cc	Thu Nov 19 15:46:40 2015 -0500
@@ -73,7 +73,17 @@
 
   if (daspk_fcn)
     {
-      octave_value_list tmp = daspk_fcn->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = daspk_fcn->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("daspk");
+          throw;
+        }
 
       int tlen = tmp.length ();
       if (tlen > 0 && tmp(0).is_defined ())
@@ -116,7 +126,17 @@
 
   if (daspk_jac)
     {
-      octave_value_list tmp = daspk_jac->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = daspk_jac->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("daspk");
+          throw;
+        }
 
       int tlen = tmp.length ();
       if (tlen > 0 && tmp(0).is_defined ())
--- a/libinterp/corefcn/dasrt.cc	Thu Nov 19 17:09:06 2015 +0000
+++ b/libinterp/corefcn/dasrt.cc	Thu Nov 19 15:46:40 2015 -0500
@@ -73,7 +73,17 @@
 
   if (dasrt_f)
     {
-      octave_value_list tmp = dasrt_f->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = dasrt_f->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("dasrt");
+          throw;
+        }
 
       if (tmp.length () > 0 && tmp(0).is_defined ())
         {
@@ -107,7 +117,17 @@
 
   if (dasrt_cf)
     {
-      octave_value_list tmp = dasrt_cf->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = dasrt_cf->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("dasrt");
+          throw;
+        }
 
       if (tmp.length () > 0 && tmp(0).is_defined ())
         {
@@ -146,7 +166,17 @@
 
   if (dasrt_j)
     {
-      octave_value_list tmp = dasrt_j->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = dasrt_j->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("dasrt");
+          throw;
+        }
 
       int tlen = tmp.length ();
       if (tlen > 0 && tmp(0).is_defined ())
--- a/libinterp/corefcn/dassl.cc	Thu Nov 19 17:09:06 2015 +0000
+++ b/libinterp/corefcn/dassl.cc	Thu Nov 19 15:46:40 2015 -0500
@@ -73,7 +73,17 @@
 
   if (dassl_fcn)
     {
-      octave_value_list tmp = dassl_fcn->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = dassl_fcn->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("dassl");
+          throw;
+        }
 
       int tlen = tmp.length ();
       if (tlen > 0 && tmp(0).is_defined ())
@@ -116,7 +126,17 @@
 
   if (dassl_jac)
     {
-      octave_value_list tmp = dassl_jac->do_multi_index_op (1, args);
+      octave_value_list tmp;
+
+      try
+        {
+          tmp = dassl_jac->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
+          gripe_user_supplied_eval ("dassl");
+          throw;
+        }
 
       int tlen = tmp.length ();
       if (tlen > 0 && tmp(0).is_defined ())
--- a/libinterp/corefcn/lsode.cc	Thu Nov 19 17:09:06 2015 +0000
+++ b/libinterp/corefcn/lsode.cc	Thu Nov 19 15:46:40 2015 -0500
@@ -70,12 +70,16 @@
 
   if (lsode_fcn)
     {
-      octave_value_list tmp = lsode_fcn->do_multi_index_op (1, args);
+      octave_value_list tmp;
 
-      if (error_state)
+      try
+        {
+          tmp = lsode_fcn->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
         {
           gripe_user_supplied_eval ("lsode");
-          return retval;
+          throw;
         }
 
       if (tmp.length () > 0 && tmp(0).is_defined ())
@@ -86,9 +90,9 @@
               warned_fcn_imaginary = true;
             }
 
-          retval = ColumnVector (tmp(0).vector_value ());
+          retval = tmp(0).xvector_value ("lsode: expecting user supplied function to return numeric vector");
 
-          if (error_state || retval.numel () == 0)
+          if (retval.numel () == 0)
             gripe_user_supplied_eval ("lsode");
         }
       else
@@ -109,12 +113,16 @@
 
   if (lsode_jac)
     {
-      octave_value_list tmp = lsode_jac->do_multi_index_op (1, args);
+      octave_value_list tmp;
 
-      if (error_state)
+      try
+        {
+          tmp = lsode_jac->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
         {
           gripe_user_supplied_eval ("lsode");
-          return retval;
+          throw;
         }
 
       if (tmp.length () > 0 && tmp(0).is_defined ())
@@ -125,9 +133,9 @@
               warned_jac_imaginary = true;
             }
 
-          retval = tmp(0).matrix_value ();
+          retval = tmp(0).xmatrix_value ("lsode: expecting user supplied jacobian function to return numeric array");
 
-          if (error_state || retval.numel () == 0)
+          if (retval.numel () == 0)
             gripe_user_supplied_eval ("lsode");
         }
       else
--- a/libinterp/corefcn/quad.cc	Thu Nov 19 17:09:06 2015 +0000
+++ b/libinterp/corefcn/quad.cc	Thu Nov 19 15:46:40 2015 -0500
@@ -67,13 +67,16 @@
 
   if (quad_fcn)
     {
-      octave_value_list tmp = quad_fcn->do_multi_index_op (1, args);
+      octave_value_list tmp;
 
-      if (error_state)
+      try
         {
-          quad_integration_error = 1;  // FIXME
+          tmp = quad_fcn->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
           gripe_user_supplied_eval ("quad");
-          return retval;
+          throw;
         }
 
       if (tmp.length () && tmp(0).is_defined ())
@@ -84,19 +87,10 @@
               warned_imaginary = true;
             }
 
-          retval = tmp(0).double_value ();
-
-          if (error_state)
-            {
-              quad_integration_error = 1;  // FIXME
-              gripe_user_supplied_eval ("quad");
-            }
+          retval = tmp(0).xdouble_value ("quad: expecting user supplied function to return numeric value");
         }
       else
-        {
-          quad_integration_error = 1;  // FIXME
-          gripe_user_supplied_eval ("quad");
-        }
+        gripe_user_supplied_eval ("quad");
     }
 
   return retval;
@@ -112,13 +106,16 @@
 
   if (quad_fcn)
     {
-      octave_value_list tmp = quad_fcn->do_multi_index_op (1, args);
+      octave_value_list tmp;
 
-      if (error_state)
+      try
         {
-          quad_integration_error = 1;  // FIXME
+          tmp = quad_fcn->do_multi_index_op (1, args);
+        }
+      catch (const octave_execution_exception&)
+        {
           gripe_user_supplied_eval ("quad");
-          return retval;
+          throw;
         }
 
       if (tmp.length () && tmp(0).is_defined ())
@@ -129,19 +126,11 @@
               warned_imaginary = true;
             }
 
-          retval = tmp(0).float_value ();
+          retval = tmp(0).xfloat_value ("quad: expecting user supplied function to return numeric value");
 
-          if (error_state)
-            {
-              quad_integration_error = 1;  // FIXME
-              gripe_user_supplied_eval ("quad");
-            }
         }
       else
-        {
-          quad_integration_error = 1;  // FIXME
-          gripe_user_supplied_eval ("quad");
-        }
+        gripe_user_supplied_eval ("quad");
     }
 
   return retval;