changeset 18939:83c85d95ac7b stable

Fix assert() segfaults with profiler (bug #39587, bug #39586). * profiler.cc (profile_data_accumulator::tree_node::exit, profile_data_accumulator::exit_function, ): Comment out assert() statements which are not valid when profile is called from within a function. * profiler.cc (F__profiler_reset__, F__profiler_data__, F__profiler_enable__): Use correct function name in Texinfo docstring. * profiler.cc (F__profiler_data__): define retval(1) first to resize return vector just once.
author Rik <rik@octave.org>
date Wed, 14 May 2014 13:59:44 -0700
parents 6cd4d0af8547
children a6d13c62fccf be569698970c
files libinterp/corefcn/profiler.cc
diffstat 1 files changed, 18 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/profiler.cc
+++ b/libinterp/corefcn/profiler.cc
@@ -108,8 +108,10 @@
 profile_data_accumulator::tree_node*
 profile_data_accumulator::tree_node::exit (octave_idx_type fcn)
 {
-  assert (parent);
-  assert (fcn_id == fcn);
+  // FIXME: These assert statements don't make sense if profile() is called
+  //        from within a function hierarchy to begin with.  See bug #39587.
+  //  assert (parent);
+  //  assert (fcn_id == fcn);
 
   return parent;
 }
@@ -132,7 +134,7 @@
           data[parent->fcn_id - 1].children.insert (fcn_id);
         }
 
-      if (!entry.recursive)
+      if (! entry.recursive)
         for (const tree_node* i = parent; i; i = i->parent)
           if (i->fcn_id == fcn_id)
             {
@@ -211,7 +213,7 @@
   if (value)
     {
       // Create a call-tree top-node if there isn't yet one.
-      if (!call_tree)
+      if (! call_tree)
         call_tree = new tree_node (0, 0);
 
       // Let the top-node be the active one.  This ensures we have a clean
@@ -253,13 +255,16 @@
 
   active_fcn = active_fcn->enter (fcn_idx);
   last_time = query_time ();
+
 }
 
 void
 profile_data_accumulator::exit_function (const std::string& fcn)
 {
   assert (call_tree);
-  assert (active_fcn != call_tree);
+  // FIXME: This assert statements doesn't make sense if profile() is called
+  //        from within a function hierarchy to begin with.  See bug #39587.
+  //assert (active_fcn != call_tree);
 
   // Usually, if we are disabled this function is not even called.  But the
   // call disabling the profiler is an exception.  So also check here
@@ -268,7 +273,9 @@
     add_current_time ();
 
   fcn_index_map::iterator pos = fcn_index.find (fcn);
-  assert (pos != fcn_index.end ());
+  // FIXME: This assert statements doesn't make sense if profile() is called
+  //        from within a function hierarchy to begin with.  See bug #39587.
+  //assert (pos != fcn_index.end ());
   active_fcn = active_fcn->exit (pos->second);
 
   // If this was an "inner call", we resume executing the parent function
@@ -412,7 +419,7 @@
 // Enable or disable the profiler data collection.
 DEFUN (__profiler_enable__, args, ,
        "-*- texinfo -*-\n\
-@deftypefn {Function File} __profiler_enable ()\n\
+@deftypefn {Function File} __profiler_enable__ ()\n\
 Undocumented internal function.\n\
 @end deftypefn")
 {
@@ -438,7 +445,7 @@
 // Clear all collected profiling data.
 DEFUN (__profiler_reset__, args, ,
        "-*- texinfo -*-\n\
-@deftypefn {Function File} __profiler_reset ()\n\
+@deftypefn {Function File} __profiler_reset__ ()\n\
 Undocumented internal function.\n\
 @end deftypefn")
 {
@@ -456,7 +463,7 @@
 // Query the timings collected by the profiler.
 DEFUN (__profiler_data__, args, nargout,
        "-*- texinfo -*-\n\
-@deftypefn {Function File} __profiler_data ()\n\
+@deftypefn {Function File} __profiler_data__ ()\n\
 Undocumented internal function.\n\
 @end deftypefn")
 {
@@ -466,9 +473,10 @@
   if (nargin > 0)
     warning ("profiler_data: ignoring extra arguments");
 
-  retval(0) = profiler.get_flat ();
   if (nargout > 1)
     retval(1) = profiler.get_hierarchical ();
+  retval(0) = profiler.get_flat ();
 
   return retval;
 }
+