26#if defined (HAVE_CONFIG_H)
45symbol_record symbol_scope::symbol_scope_rep::insert_local (
const std::string& name)
49 insert_symbol_record (sym);
55symbol_scope::symbol_scope_rep::insert_symbol_record (
symbol_record& sr)
57 std::size_t data_offset = num_symbols ();
58 std::string name = sr.
name ();
66symbol_scope::symbol_scope_rep::insert (
const std::string& name)
68 table_iterator p = m_symbols.find (name);
70 if (p == m_symbols.end ())
74 std::size_t data_offset = num_symbols ();
76 ret.set_data_offset (data_offset);
78 auto t_parent = m_parent.lock ();
80 std::size_t offset = 0;
82 if (is_nested () && t_parent
83 && t_parent->look_nonlocal (name, offset, ret))
84 return m_symbols[name] = ret;
88 ret.mark_added_static ();
90 return m_symbols[name] = ret;
97std::list<octave_value>
98symbol_scope::symbol_scope_rep::localfunctions ()
const
100 std::list<octave_value> retval;
110 for (
const auto& nm : m_subfunction_names)
112 auto nm_fcn_iter = m_subfunctions.find (nm);
114 if (nm_fcn_iter != m_subfunctions.end ())
136symbol_scope::symbol_scope_rep::dump ()
const
138 std::map<std::string, octave_value> m
139 = {{
"name", m_name },
140 {
"nesting_depth", m_nesting_depth },
141 {
"is_static", m_is_static },
142 {
"symbols", dump_symbols_map () },
143 {
"subfunction_names",
string_vector (m_subfunction_names) },
151symbol_scope::symbol_scope_rep::dump_symbols_map ()
const
153 std::map<std::string, octave_value> info_map;
155 for (
const auto& nm_sr : m_symbols)
157 std::string nm = nm_sr.first;
159 info_map[nm] = sr.
dump ();
165std::list<symbol_record>
166symbol_scope::symbol_scope_rep::symbol_list ()
const
168 std::list<symbol_record> retval;
170 for (
const auto& nm_sr : m_symbols)
171 retval.push_back (nm_sr.second);
177symbol_scope::symbol_scope_rep::find_subfunction (
const std::string& name)
const
179 subfunctions_const_iterator p = m_subfunctions.find (name);
181 if (p != m_subfunctions.end ())
184 auto t_parent = m_parent.
lock ();
187 return t_parent->find_subfunction (name);
193symbol_scope::symbol_scope_rep::mark_subfunctions_in_scope_as_private (
const std::string& class_name)
195 for (
auto& nm_sf : m_subfunctions)
204std::list<std::string>
205symbol_scope::symbol_scope_rep::parent_fcn_names ()
const
207 std::list<std::string> retval;
209 auto pscope = parent_scope_rep ();
213 retval.push_back (pscope->fcn_name ());
215 pscope = pscope->parent_scope_rep ();
222symbol_scope::symbol_scope_rep::set_parent (
const std::shared_ptr<symbol_scope::symbol_scope_rep>& parent)
224 m_parent = std::weak_ptr<symbol_scope::symbol_scope_rep> (parent);
228symbol_scope::symbol_scope_rep::set_primary_parent (
const std::shared_ptr<symbol_scope::symbol_scope_rep>& parent)
230 m_primary_parent = std::weak_ptr<symbol_scope::symbol_scope_rep> (parent);
234symbol_scope::symbol_scope_rep::cache_dir_name (
const std::string& name)
236 m_dir_name = sys::canonicalize_file_name (name);
240symbol_scope::symbol_scope_rep::is_relative (
const std::shared_ptr<symbol_scope::symbol_scope_rep>& scope)
const
247 auto t_parent = m_parent.lock ();
254 if (t_parent == scope)
258 auto t_primary_parent = m_primary_parent.lock ();
260 if (t_primary_parent)
264 if (t_primary_parent == scope)
269 auto scope_primary_parent = scope->primary_parent_scope_rep ();
270 if (t_primary_parent == scope_primary_parent)
279symbol_scope::symbol_scope_rep::mark_as_variable (
const std::string& nm)
281 table_iterator p = m_symbols.find (nm);
283 if (p != m_symbols.end ())
284 p->second.mark_variable ();
288symbol_scope::symbol_scope_rep::mark_as_variables (
const std::list<std::string>& lst)
290 for (
const auto& nm : lst)
291 mark_as_variable (nm);
295symbol_scope::symbol_scope_rep::is_variable (
const std::string& nm)
const
297 table_const_iterator p = m_symbols.find (nm);
301 if (p != m_symbols.end () && p->second.is_variable ())
306 auto t_parent = m_parent.lock ();
308 return t_parent ? t_parent->is_variable (nm) :
false;
315symbol_scope::symbol_scope_rep::update_nest ()
317 auto t_parent = m_parent.lock ();
322 for (
auto& nm_sr : m_symbols)
326 std::size_t offset = 0;
329 t_parent->look_nonlocal (nm_sr.first, offset, ours);
336 else if (m_children.size ())
342 for (
auto& scope_obj : m_children)
343 scope_obj.update_nest ();
347symbol_scope::symbol_scope_rep::look_nonlocal (
const std::string& name,
353 table_iterator p = m_symbols.find (name);
355 if (p == m_symbols.end ())
357 auto t_parent = m_parent.lock ();
359 if (is_nested () && t_parent)
360 return t_parent->look_nonlocal (name, offset, result);
370 std::size_t t_frame_offset = offset + p->second.
frame_offset ();
371 std::size_t t_data_offset = p->second.data_offset ();
382std::list<octave_value>
386 return std::list<octave_value> ();
389 return m_rep->localfunctions ();
391 std::shared_ptr<symbol_scope::symbol_scope_rep> ppsr
392 = m_rep->primary_parent_scope_rep ();
395 return std::list<octave_value> ();
397 return ppsr->localfunctions ();
400OCTAVE_END_NAMESPACE(octave)
virtual octave_function * function_value(bool silent=false)
virtual void mark_as_private_function(const std::string &cname="")
octave::symbol_scope scope()
octave_user_code * user_code_value(bool silent=false) const
void set_data_offset(std::size_t offset)
void set_frame_offset(std::size_t offset)
std::size_t frame_offset() const
octave_value dump() const
bool is_primary_fcn_scope() const
std::list< octave_value > localfunctions() const
std::list< std::string > parent_fcn_names() const
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
octave_value dump_function_map(const std::map< std::string, octave_value > &fcn_map)