# HG changeset patch # User John W. Eaton # Date 1542354146 18000 # Node ID 6a03af2c4c9ebe2f344732db9fb2a463dc0b59c5 # Parent 661dfb062485435517f4ca0a68c3838f2124dd3d 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. diff -r 661dfb062485 -r 6a03af2c4c9e libinterp/corefcn/call-stack.cc --- 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& symrec_list) const { - std::list 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) { diff -r 661dfb062485 -r 6a03af2c4c9e libinterp/corefcn/call-stack.h --- 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& 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: diff -r 661dfb062485 -r 6a03af2c4c9e libinterp/corefcn/load-save.cc --- 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 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); } }