changeset 26093:6a03af2c4c9e

use symbol_info_list to gather data for saving workspace on crash * call-stack.h, call-stack.cc (stack_frame::make_symbol_info_list): New function. (stack_frame::glob_symbol_info): Use it. (stack_frame::regexp_symbol_info, stack_frame::get_symbol_info): New functions. * (call_stack::regexp_symbol_info, call_stack::get_symbol_info, call_stack::top_scope_symbol_info): New functions. * load-save.cc (load_save_system::dump_octave_core): Call call_stack::top_scope_symbol_info to get data to save.
author John W. Eaton <jwe@octave.org>
date Fri, 16 Nov 2018 02:42:26 -0500
parents 661dfb062485
children 8fb0df0c8772
files libinterp/corefcn/call-stack.cc libinterp/corefcn/call-stack.h libinterp/corefcn/load-save.cc
diffstat 3 files changed, 64 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/call-stack.cc	Fri Nov 16 00:18:57 2018 -0500
+++ b/libinterp/corefcn/call-stack.cc	Fri Nov 16 02:42:26 2018 -0500
@@ -95,13 +95,12 @@
   }
 
   symbol_info_list
-  call_stack::stack_frame::glob_symbol_info (const std::string& pat) const
+  call_stack::stack_frame::make_symbol_info_list
+    (const std::list<symbol_record>& symrec_list) const
   {
-    std::list<octave::symbol_record> tmp = m_scope.glob (pat, true);
+    symbol_info_list symbol_stats;
 
-    octave::symbol_info_list symbol_stats;
-
-    for (const auto& sr : tmp)
+    for (const auto& sr : symrec_list)
       {
         octave_value value = sr.varval (m_context);
 
@@ -118,6 +117,23 @@
     return symbol_stats;
   }
 
+  symbol_info_list
+  call_stack::stack_frame::glob_symbol_info (const std::string& pat) const
+  {
+    return make_symbol_info_list (m_scope.glob (pat, true));
+  }
+
+  symbol_info_list
+  call_stack::stack_frame::regexp_symbol_info (const std::string& pat) const
+  {
+    return make_symbol_info_list (m_scope.regexp (pat, true));
+  }
+
+  symbol_info_list call_stack::stack_frame::get_symbol_info (void) const
+  {
+    return make_symbol_info_list (m_scope.all_variables ());
+  }
+
   call_stack::call_stack (interpreter& interp)
     : cs (), curr_frame (0), m_max_stack_depth (1024), m_interpreter (interp)
   {
@@ -688,6 +704,22 @@
     return cs[curr_frame].glob_symbol_info (pat);
   }
 
+  symbol_info_list
+  call_stack::regexp_symbol_info (const std::string& pat) const
+  {
+    return cs[curr_frame].glob_symbol_info (pat);
+  }
+
+  symbol_info_list call_stack::get_symbol_info (void) const
+  {
+    return cs[curr_frame].get_symbol_info ();
+  }
+
+  symbol_info_list call_stack::top_scope_symbol_info (void) const
+  {
+    return cs[0].get_symbol_info ();
+  }
+
   octave_value
   call_stack::max_stack_depth (const octave_value_list& args, int nargout)
   {
--- a/libinterp/corefcn/call-stack.h	Fri Nov 16 00:18:57 2018 -0500
+++ b/libinterp/corefcn/call-stack.h	Fri Nov 16 02:42:26 2018 -0500
@@ -82,8 +82,15 @@
 
       bool operator == (const stack_frame& rhs) const;
 
+      symbol_info_list
+      make_symbol_info_list (const std::list<symbol_record>& srl) const;
+
       symbol_info_list glob_symbol_info (const std::string& pat) const;
 
+      symbol_info_list regexp_symbol_info (const std::string& pat) const;
+
+      symbol_info_list get_symbol_info (void) const;
+
     private:
 
       octave_function *m_fcn;
@@ -265,6 +272,12 @@
 
     symbol_info_list glob_symbol_info (const std::string& pat) const;
 
+    symbol_info_list regexp_symbol_info (const std::string& pat) const;
+
+    symbol_info_list get_symbol_info (void) const;
+
+    symbol_info_list top_scope_symbol_info (void) const;
+
     octave_value max_stack_depth (const octave_value_list& args, int nargout);
 
   private:
--- a/libinterp/corefcn/load-save.cc	Fri Nov 16 00:18:57 2018 -0500
+++ b/libinterp/corefcn/load-save.cc	Fri Nov 16 02:42:26 2018 -0500
@@ -1032,37 +1032,30 @@
   {
     write_header (os, fmt);
 
-    symbol_table& symtab = m_interpreter.get_symbol_table ();
-
-    symbol_scope top_scope = symtab.top_scope ();
+    call_stack& cs = m_interpreter.get_call_stack ();
 
-    symbol_record::context_id context = top_scope.current_context ();
-
-    std::list<symbol_record> vars = top_scope.all_variables ();
+    symbol_info_list syminfo_list = cs.top_scope_symbol_info ();
 
     double save_mem_size = 0;
 
-    for (const auto& var : vars)
+    for (const auto& syminfo : syminfo_list)
       {
-        octave_value val = var.varval (context);
+        octave_value val = syminfo.value ();
 
-        if (val.is_defined ())
-          {
-            std::string name = var.name ();
-            std::string help;
-            bool global = var.is_global ();
+        std::string name = syminfo.name ();
+        std::string help;
+        bool global = syminfo.is_global ();
 
-            double val_size = val.byte_size () / 1024;
+        double val_size = val.byte_size () / 1024;
 
-            // FIXME: maybe we should try to throw out the largest first...
+        // FIXME: maybe we should try to throw out the largest first...
 
-            if (m_octave_core_file_limit < 0
-                || save_mem_size + val_size < m_octave_core_file_limit)
-              {
-                save_mem_size += val_size;
+        if (m_octave_core_file_limit < 0
+            || save_mem_size + val_size < m_octave_core_file_limit)
+          {
+            save_mem_size += val_size;
 
-                do_save (os, val, name, help, global, fmt, save_as_floats);
-              }
+            do_save (os, val, name, help, global, fmt, save_as_floats);
           }
       }