Mercurial > octave
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); } }