diff libinterp/corefcn/symscope.cc @ 24356:8b14ba8296af

refactor symbol_record object When referencing non-local variables, look in correct parent scope context. Cache pointer to parent scope for non-local access. Don't cache pointer to declaration scope. * symrec.h, symrec.cc (symbol_record::symbol_record_rep::m_fwd_scope): New data member. (symbol_record::symbol_record_rep::symbol_record_rep): Eliminate symbol_scope argument. Change all uses. (symbol_record::symbol_record_rep::assign, symbol_record::symbol_record_rep::do_non_const_unary_op): New argument, context Change all uses. Don't look to forward reference here. (symbol_record::symbol_record_rep::varref, symbol_record::symbol_record_rep::varval): New argument, context. Change all uses. Use context from forward scope when forwarding to non-local reference. (symbol_record::symbol_record_rep::clear, symbol_record::symbol_record_rep::is_defind, symbol_record::symbol_record_rep::is_variable, symbol_record::symbol_record_rep::dump): New argument, context. Change all uses. (symbol_record::symbol_record_rep::bind_fwd_rep): New argument, fwd_scope. Change all uses. (symbol_record::symbol_record_rep::bind_fwd_rep, symbol_record::symbol_record_rep::unbind_fwd_rep): Return after forwarding. (symbol_record::symbol_record_rep::get_fwd_scope_context): New function. (symbol_record::symbol_record_rep::get_decl_scope_context): Delete. (symbol_record::symbol_record_rep::m_decl_scope): Delete data member and all uses. (symbol_record::symbol_record): Eliminate symbol_scope argument. Change all uses. (symbol_record::find, symbol_record::assign, symbol_record::do_non_const_unary_opt, symbol_record::varval, symbol_record::clear, symbol_record::is_defined, symbol_record::is_undefined, symbol_record::is_valid, symbol_record::is_variable, symbol_record::dump): New arg, context. Change all uses. (symbol_record::decl_scope): Delete. (symbol_record::bind_fwd_rep): New arg, fwd_scope. Change all uses. * load-save.h, load-save.cc (do_save): New argument, context. Change all uses. (save_vars): Work with scope instead of symbol table. * variables.cc (symbol_info::symbol_info, symbol_info::append): New arg, context. Change all uses. * oct-lvalue.h, oct-lvalue.cc (octave_lvalue::m_context): New data member. (octave_lvalue::octave_lvalue): New argument, context. Change all uses. * pt-decl.h (tree_decl_elt::is_defined, tree_decl_elt::is_variable): New argument, context. Change all uses. * pt-id.h, pt-id.cc (tree_identifier::link_to_global): New argument, global_scope. (tree_identifier::is_defined, tree_identifier::is_variable, tree_black_hole::is_variable): New argument, context. Change all uses. * pt-misc.h, pt-misc.cc (tree_parameter_list::is_defined): New argument, context. Change all uses.
author John W. Eaton <jwe@octave.org>
date Mon, 04 Dec 2017 12:30:40 -0500
parents bff8e3884a88
children 8bcfddad15ec
line wrap: on
line diff
--- a/libinterp/corefcn/symscope.cc	Mon Dec 04 01:26:06 2017 -0500
+++ b/libinterp/corefcn/symscope.cc	Mon Dec 04 12:30:40 2017 -0500
@@ -60,7 +60,7 @@
               return symtab.global_varval (name);
             else
               {
-                octave_value val = sr.varval ();
+                octave_value val = sr.varval (m_context);
 
                 if (val.is_defined ())
                   return val;
@@ -90,7 +90,7 @@
 
     if (p == m_symbols.end ())
       {
-        symbol_record ret (this, name);
+        symbol_record ret (name);
 
         if (m_is_nested && m_parent && m_parent->look_nonlocal (name, ret))
           return m_symbols[name] = ret;
@@ -118,7 +118,7 @@
 
         if (! sr.is_hidden ())
           {
-            octave_value val = sr.varval ();
+            octave_value val = sr.varval (m_context);
 
             if (val.is_defined ())
               {
@@ -180,7 +180,7 @@
       {
         std::string nm = nm_sr.first;
         const symbol_record& sr = nm_sr.second;
-        info_map[nm] = sr.dump ();
+        info_map[nm] = sr.dump (m_context);
       }
 
     return octave_value (info_map);
@@ -301,7 +301,7 @@
       }
     else if (! p->second.is_automatic ())
       {
-        result.bind_fwd_rep (p->second);
+        result.bind_fwd_rep (this, p->second);
         return true;
       }
 
@@ -312,7 +312,8 @@
   symbol_scope::bind_script_symbols (symbol_scope *curr_scope)
   {
     for (auto& nm_sr : m_symbols)
-      nm_sr.second.bind_fwd_rep (curr_scope->find_symbol (nm_sr.first));
+      nm_sr.second.bind_fwd_rep (curr_scope,
+                                 curr_scope->find_symbol (nm_sr.first));
   }
 
   void