Mercurial > octave
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