annotate libinterp/corefcn/stack-frame.cc @ 29476:c74ff452e2bb stable

avoid memory leaks when returning handles to nested functions When a handle to a nested function is created with a std::shared_ptr object holding a reference to the stack frames associated with the parent function, we create a circular reference because the referenced stack frame contains the function handle object. To break the link, we'll scan the stack frame associated with the nested function handle and convert the shared_ptr links to be weak_ptr links instead, breaking the circular reference allowing the resources held by the closure frames to be released when all external references are cleared. Another possible solution to this problem is to create weak_ptr links initially and then convert them to shared_ptr links when the closure "escapes" the scope of the function. While that might be slightly more efficient (we would only have to look at assignments to global variables and the values that are actually returned from the function) the current design of global assignments does not make that easy because it is possible to ask for a reference to a global variable, so either all places where we grab references and then later perform assignments must be checked for assignments of handles to nested functions, or we must eliminate the interface that returns references to global variables and only allow assignments so that we would only have to perform the check in the assignment function(s). Perhaps this can be done in a future version, but for now, it works well enough to break the closure cycles in local variables when a function returns. * call-stack.cc (call_stack::pop): If popped stack frame is a closure context, then break closure cycles. * stack-frame.h, stack-frame.cc (stack_frame::m_is_closure_context): New member variable. (stack_frame::break_closure_cycles, user_fcn_stack_frame::break_closure_cycles): New functions. (stack_frame::mark_closure_context, stack_frame::is_closure_context): New functions. * ov-fcn-handle.h, ov-fcn-handle.cc (base_nested_fcn_handle): New base class for handles to nested functions. (nested_fcn_handle, weak_nested_fcn_handle): New classes to represent handles to nested functions. Currently, all handles to nested functions begin as nested_fcn_handle objects but are converted to weak_nested_fcn_handles when the functions where they are created return. (base_fcn_handle::is_nested (const std::shared_ptr<stack_frame>&) const, base_fcn_handle::make_weak_nested_handle, New virtual functions. (octave_fcn_handle::is_nested, octave_fcn_handle::is_weak_nested, octave_fcn_handle::make_weak_nested_handle): New functions. * ov-struct.h, ov-struct.cc (octave_scalar_map::break_closure_cycles, octave_map::break_closure_cycles): New functions. * ov.h, ov.cc (octave_value::break_closure_cycles): New function. * ov-base.h (octave_base_value::break_closure_cycles): New virtual function. * cdef-object.h (cdef_object::break_closure_cycles): New function. (cdef_object_rep::break_closure_cycles): New virtual function. * cdef-object.h, cdef-object.cc (cdef_object_scalar::break_closure_cycles): New function. * ov-cell.h, ov-cell.cc (octave_cell::break_closure_cycles): New function. * ov-class.h, ov-class.cc (octave_class::break_closure_cycles): New function. * ov-classdef.h (octave_classdef::break_closure_cycles): New function.
author John W. Eaton <jwe@octave.org>
date Fri, 05 Mar 2021 16:14:34 -0500
parents 0a5b15007766
children 34d06c73b48d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
29358
0a5b15007766 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29324
diff changeset
3 // Copyright (C) 1995-2021 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26 #if defined (HAVE_CONFIG_H)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
27 # include "config.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 #endif
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
29
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 #include "lo-regexp.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31 #include "str-vec.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 #include "defun.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 #include "interpreter.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 #include "interpreter-private.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
36 #include "oct-map.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 #include "ov.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38 #include "ov-fcn.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39 #include "ov-fcn-handle.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
40 #include "ov-usr-fcn.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
41 #include "pager.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
42 #include "parse.h"
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
43 #include "pt-eval.h"
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
44 #include "stack-frame.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
45 #include "syminfo.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
46 #include "symrec.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
47 #include "symscope.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
48 #include "variables.h"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
50 namespace octave
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
51 {
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
52 class compiled_fcn_stack_frame : public stack_frame
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
53 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
54 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
55
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
56 compiled_fcn_stack_frame (void) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
57
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
58 compiled_fcn_stack_frame (tree_evaluator& tw, octave_function *fcn,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
59 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
60 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
61 const std::shared_ptr<stack_frame>& static_link)
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
62 : stack_frame (tw, index, parent_link, static_link,
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
63 static_link->access_link ()),
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
64 m_fcn (fcn)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
65 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
66
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
67 compiled_fcn_stack_frame (const compiled_fcn_stack_frame& elt) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
68
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
69 compiled_fcn_stack_frame&
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
70 operator = (const compiled_fcn_stack_frame& elt) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
71
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
72 ~compiled_fcn_stack_frame (void) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
73
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
74 bool is_compiled_fcn_frame (void) const { return true; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
75
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
76 symbol_scope get_scope (void) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
77 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
78 return m_static_link->get_scope ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
79 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
80
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
81 octave_function * function (void) const { return m_fcn; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
82
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
83 symbol_record lookup_symbol (const std::string& name) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
84 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
85 return m_static_link->lookup_symbol (name);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
86 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
87
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
88 symbol_record insert_symbol (const std::string& name)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
89 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
90 return m_static_link->insert_symbol (name);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
91 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
92
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
93 stack_frame::scope_flags scope_flag (const symbol_record& sym) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
94 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
95 // Look in closest stack frame that contains values (either the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
96 // top scope, or a user-defined function or script).
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
97
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
98 return m_static_link->scope_flag (sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
99 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
100
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
101 void set_auto_fcn_var (auto_var_type avt, const octave_value& val)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
102 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
103 m_static_link->set_auto_fcn_var (avt, val);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
104 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
105
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
106 octave_value get_auto_fcn_var (auto_var_type avt) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
107 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
108 return m_static_link->get_auto_fcn_var (avt);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
109 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
110
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
111 // We only need to override one of each of these functions. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
112 // using declaration will avoid warnings about partially-overloaded
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
113 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
114 using stack_frame::varval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
115 using stack_frame::varref;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
116
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
117 octave_value varval (const symbol_record& sym) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
118 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
119 // Look in closest stack frame that contains values (either the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
120 // top scope, or a user-defined function or script).
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
121
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
122 return m_static_link->varval (sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
123 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
124
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
125 octave_value& varref (const symbol_record& sym)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
126 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
127 // Look in closest stack frame that contains values (either the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
128 // top scope, or a user-defined function or script).
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
129
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
130 return m_static_link->varref (sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
131 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
132
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
133 void mark_scope (const symbol_record& sym, scope_flags flag)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
134 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
135 // Look in closest stack frame that contains values (either the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
136 // top scope, or a user-defined function or script).
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
137
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
138 m_static_link->mark_scope (sym, flag);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
139 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
140
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
141 void display (bool follow = true) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
142
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
143 void accept (stack_frame_walker& sfw);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
144
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
145 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
146
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
147 // Compiled function object associated with this stack frame.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
148 // Should always be a built-in, .oct or .mex file function and
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
149 // should always be valid.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
150 octave_function *m_fcn;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
151 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
152
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
153 // Scripts have a symbol_scope object to store the set of variables
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
154 // in the script, but values for those variables are stored in the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
155 // stack frame corresponding to the nearest calling function or in
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
156 // the top-level scope (the evaluation stack frame).
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
157 //
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
158 // Accessing values in a scope requires a mapping from the index of
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
159 // the variable for the script scope to the list of values in the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
160 // evaluation frame(s). The frame offset tells us how many access
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
161 // links we must follow to find the stack frame that holds the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
162 // value. The value offset is the index into the vector of values
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
163 // in that stack frame that we should use to find the value.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
164 //
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
165 // Frame and value offsets are set in this stack frame when it is
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
166 // created using information from the script and enclosing scopes.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
167 //
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
168 // If a script is invoked in a nested function context, the frame
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
169 // offsets for individual values may be different. Some may be
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
170 // accessed from the invoking function and some may come from a
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
171 // parent function.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
172
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
173 class script_stack_frame : public stack_frame
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
174 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
175 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
176
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
177 script_stack_frame (void) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
178
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
179 script_stack_frame (tree_evaluator& tw, octave_user_script *script,
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
180 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
181 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
182 const std::shared_ptr<stack_frame>& static_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
183
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
184 script_stack_frame (const script_stack_frame& elt) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
185
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
186 script_stack_frame& operator = (const script_stack_frame& elt) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
187
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
188 ~script_stack_frame (void)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
189 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
190 delete m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
191 }
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
192
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
193 bool is_user_script_frame (void) const { return true; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
194
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
195 static std::shared_ptr<stack_frame>
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
196 get_access_link (const std::shared_ptr<stack_frame>& static_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
197
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
198 static size_t get_num_symbols (octave_user_script *script);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
199
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
200 void set_script_offsets (void);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
201
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
202 void set_script_offsets_internal (const std::map<std::string,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
203 symbol_record>& symbols);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
204
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
205 void resize_and_update_script_offsets (const symbol_record& sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
206
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
207 symbol_scope get_scope (void) const { return m_script->scope (); }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
208
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
209 octave_function * function (void) const { return m_script; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
210
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
211 unwind_protect * unwind_protect_frame (void);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
212
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
213 symbol_record lookup_symbol (const std::string& name) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
214
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
215 symbol_record insert_symbol (const std::string&);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
216
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
217 size_t size (void) const { return m_lexical_frame_offsets.size (); }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
218
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
219 void resize (size_t size)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
220 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
221 m_lexical_frame_offsets.resize (size, 0);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
222 m_value_offsets.resize (size, 0);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
223 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
224
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
225 void get_val_offsets_with_insert (const symbol_record& sym,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
226 size_t& frame_offset,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
227 size_t& data_offset);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
228
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
229 bool get_val_offsets_internal (const symbol_record& sym,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
230 size_t& frame_offset,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
231 size_t& data_offset) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
232
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
233 bool get_val_offsets (const symbol_record& sym, size_t& frame_offset,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
234 size_t& data_offset) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
235
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
236 scope_flags scope_flag (const symbol_record& sym) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
237
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
238 void set_auto_fcn_var (auto_var_type avt, const octave_value& val)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
239 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
240 m_access_link->set_auto_fcn_var (avt, val);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
241 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
242
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
243 octave_value get_auto_fcn_var (auto_var_type avt) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
244 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
245 return m_access_link->get_auto_fcn_var (avt);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
246 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
247
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
248 // We only need to override one of each of these functions. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
249 // using declaration will avoid warnings about partially-overloaded
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
250 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
251 using stack_frame::varval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
252 using stack_frame::varref;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
253
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
254 octave_value varval (const symbol_record& sym) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
255
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
256 octave_value& varref (const symbol_record& sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
257
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
258 void mark_scope (const symbol_record& sym, scope_flags flag);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
259
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
260 void display (bool follow = true) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
261
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
262 void accept (stack_frame_walker& sfw);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
263
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
264 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
265
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
266 // Script object associated with this stack frame. Should always
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
267 // be valid.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
268 octave_user_script *m_script;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
269
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
270 // The nearest unwind protect frame that was active when this
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
271 // stack frame was created. Should always be valid.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
272 unwind_protect *m_unwind_protect_frame;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
273
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
274 // Mapping between the symbols in the symbol_scope object of the
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
275 // script to the stack frame in which the script is executed. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
276 // frame offsets may be greater than one if the script is executed
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
277 // in a nested function context.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
278
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
279 std::vector<size_t> m_lexical_frame_offsets;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
280 std::vector<size_t> m_value_offsets;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
281 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
282
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
283 // Base class for values and offsets shared by user_fcn and scope
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
284 // frames.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
285
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
286 class base_value_stack_frame : public stack_frame
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
287 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
288 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
289
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
290 base_value_stack_frame (void) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
291
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
292 base_value_stack_frame (tree_evaluator& tw, size_t num_symbols,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
293 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
294 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
295 const std::shared_ptr<stack_frame>& static_link,
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
296 const std::shared_ptr<stack_frame>& access_link)
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
297 : stack_frame (tw, index, parent_link, static_link, access_link),
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
298 m_values (num_symbols, octave_value ()),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
299 m_flags (num_symbols, LOCAL),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
300 m_auto_vars (NUM_AUTO_VARS, octave_value ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
301 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
302
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
303 base_value_stack_frame (const base_value_stack_frame& elt) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
304
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
305 base_value_stack_frame&
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
306 operator = (const base_value_stack_frame& elt) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
307
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
308 ~base_value_stack_frame (void) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
309
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
310 size_t size (void) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
311 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
312 return m_values.size ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
313 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
314
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
315 void resize (size_t size)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
316 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
317 m_values.resize (size, octave_value ());
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
318 m_flags.resize (size, LOCAL);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
319 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
320
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
321 stack_frame::scope_flags get_scope_flag (size_t data_offset) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
322 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
323 return m_flags.at (data_offset);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
324 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
325
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
326 void set_scope_flag (size_t data_offset, scope_flags flag)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
327 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
328 m_flags.at (data_offset) = flag;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
329 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
330
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
331 octave_value get_auto_fcn_var (auto_var_type avt) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
332 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
333 return m_auto_vars.at (avt);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
334 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
335
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
336 void set_auto_fcn_var (auto_var_type avt, const octave_value& val)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
337 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
338 m_auto_vars.at (avt) = val;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
339 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
340
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
341 // We only need to override one of each of these functions. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
342 // using declaration will avoid warnings about partially-overloaded
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
343 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
344 using stack_frame::varval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
345 using stack_frame::varref;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
346
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
347 octave_value varval (size_t data_offset) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
348 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
349 return m_values.at (data_offset);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
350 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
351
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
352 octave_value& varref (size_t data_offset)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
353 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
354 return m_values.at (data_offset);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
355 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
356
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
357 void display (bool follow = true) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
358
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
359 protected:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
360
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
361 // Variable values. This array is indexed by the data_offset
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
362 // value stored in the symbol_record objects of the scope
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
363 // associated with this stack frame.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
364 std::vector<octave_value> m_values;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
365
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
366 // The type of each variable (local, global, persistent) of each
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
367 // value. This array is indexed by the data_offset value stored
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
368 // in the symbol_record objects of the scope associated with this
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
369 // stack frame. Local values are found in the M_VALUES array.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
370 // Global values are stored in the tree_evaluator object that contains
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
371 // the stack frame. Persistent values are stored in the function
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
372 // scope corresponding to the stack frame.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
373 std::vector<scope_flags> m_flags;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
374
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
375 // A fixed list of Automatic variables created for this function.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
376 // The elements of this vector correspond to the auto_var_type
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
377 // enum.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
378 std::vector<octave_value> m_auto_vars;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
379 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
380
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
381 // User-defined functions have a symbol_scope object to store the set
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
382 // of variables in the function and values are stored in the stack
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
383 // frame corresponding to the invocation of the function or one of
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
384 // its parents. The frame offset tells us how many access links we
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
385 // must follow to find the stack frame that holds the value. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
386 // value offset is the index into the vector of values in that stack
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
387 // frame that we should use to find the value.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
388 //
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
389 // Frame and value offsets are determined when the corresponding
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
390 // function is parsed.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
391
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
392 class user_fcn_stack_frame : public base_value_stack_frame
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
393 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
394 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
395
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
396 user_fcn_stack_frame (void) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
397
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
398 user_fcn_stack_frame (tree_evaluator& tw, octave_user_function *fcn,
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
399 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
400 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
401 const std::shared_ptr<stack_frame>& static_link,
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
402 const std::shared_ptr<stack_frame>& access_link = std::shared_ptr<stack_frame> ())
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
403 : base_value_stack_frame (tw, get_num_symbols (fcn), index,
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
404 parent_link, static_link,
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
405 (access_link
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
406 ? access_link
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
407 : get_access_link (fcn, static_link))),
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
408 m_fcn (fcn), m_unwind_protect_frame (nullptr)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
409 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
410
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
411 user_fcn_stack_frame (tree_evaluator& tw, octave_user_function *fcn,
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
412 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
413 const std::shared_ptr<stack_frame>& parent_link,
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
414 const std::shared_ptr<stack_frame>& static_link,
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
415 const local_vars_map& local_vars)
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
416 : base_value_stack_frame (tw, get_num_symbols (fcn), index,
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
417 parent_link, static_link,
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
418 get_access_link (fcn, static_link)),
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
419 m_fcn (fcn), m_unwind_protect_frame (nullptr)
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
420 {
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
421 // Initialize local variable values.
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
422
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
423 for (const auto& nm_ov : local_vars)
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
424 assign (nm_ov.first, nm_ov.second);
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
425 }
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
426
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
427 user_fcn_stack_frame (const user_fcn_stack_frame& elt) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
428
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
429 user_fcn_stack_frame&
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
430 operator = (const user_fcn_stack_frame& elt) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
431
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
432 ~user_fcn_stack_frame (void)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
433 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
434 delete m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
435 }
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
436
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
437 bool is_user_fcn_frame (void) const { return true; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
438
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
439 static std::shared_ptr<stack_frame>
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
440 get_access_link (octave_user_function *fcn,
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
441 const std::shared_ptr<stack_frame>& static_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
442
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
443 static size_t get_num_symbols (octave_user_function *fcn)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
444 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
445 symbol_scope fcn_scope = fcn->scope ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
446
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
447 return fcn_scope.num_symbols ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
448 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
449
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
450 void clear_values (void);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
451
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
452 symbol_scope get_scope (void) const { return m_fcn->scope (); }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
453
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
454 octave_function * function (void) const { return m_fcn; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
455
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
456 unwind_protect * unwind_protect_frame (void);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
457
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
458 symbol_record lookup_symbol (const std::string& name) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
459
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
460 symbol_record insert_symbol (const std::string&);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
461
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
462 scope_flags scope_flag (const symbol_record& sym) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
463
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
464 // We only need to override one of each of these functions. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
465 // using declaration will avoid warnings about partially-overloaded
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
466 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
467 using base_value_stack_frame::varval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
468 using base_value_stack_frame::varref;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
469
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
470 octave_value varval (const symbol_record& sym) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
471
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
472 octave_value& varref (const symbol_record& sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
473
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
474 void mark_scope (const symbol_record& sym, scope_flags flag);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
475
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
476 void display (bool follow = true) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
477
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
478 void accept (stack_frame_walker& sfw);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
479
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
480 void break_closure_cycles (const std::shared_ptr<stack_frame>& frame);
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
481
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
482 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
483
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
484 // User-defined object associated with this stack frame. Should
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
485 // always be valid.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
486 octave_user_function *m_fcn;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
487
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
488 // The nearest unwind protect frame that was active when this
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
489 // stack frame was created. Should always be valid.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
490 unwind_protect *m_unwind_protect_frame;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
491 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
492
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
493 // Pure scope stack frames (primarily the top-level workspace) have
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
494 // a set of variables and values are stored in the stack frame. All
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
495 // variable accesses are direct as there are no parent stack frames.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
496 //
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
497 // Value offsets are determined when the corresponding variable is
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
498 // entered into the symbol_scope object corresponding to the frame.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
499
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
500 class scope_stack_frame : public base_value_stack_frame
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
501 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
502 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
503
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
504 scope_stack_frame (void) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
505
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
506 scope_stack_frame (tree_evaluator& tw, const symbol_scope& scope,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
507 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
508 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
509 const std::shared_ptr<stack_frame>& static_link)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
510 : base_value_stack_frame (tw, scope.num_symbols (), index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
511 parent_link, static_link, nullptr),
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
512 m_scope (scope)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
513 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
514
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
515 scope_stack_frame (const scope_stack_frame& elt) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
516
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
517 scope_stack_frame& operator = (const scope_stack_frame& elt) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
518
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
519 ~scope_stack_frame (void) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
520
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
521 bool is_scope_frame (void) const { return true; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
522
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
523 symbol_scope get_scope (void) const { return m_scope; }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
524
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
525 symbol_record lookup_symbol (const std::string& name) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
526 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
527 return m_scope.lookup_symbol (name);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
528 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
529
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
530 symbol_record insert_symbol (const std::string&);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
531
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
532 scope_flags scope_flag (const symbol_record& sym) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
533
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
534 // We only need to override one of each of these functions. The
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
535 // using declaration will avoid warnings about partially-overloaded
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
536 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
537 using base_value_stack_frame::varval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
538 using base_value_stack_frame::varref;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
539
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
540 octave_value varval (const symbol_record& sym) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
541
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
542 octave_value& varref (const symbol_record& sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
543
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
544 void mark_scope (const symbol_record& sym, scope_flags flag);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
545
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
546 void display (bool follow = true) const;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
547
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
548 void accept (stack_frame_walker& sfw);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
549
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
550 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
551
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
552 // The scope object associated with this stack frame.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
553 symbol_scope m_scope;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
554 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
555
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
556 // FIXME: There should probably be a display method for the script,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
557 // fcn, and scope objects and the script and function objects should
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
558 // be responsible for displaying the scopes they contain.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
559
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
560 static void display_scope (std::ostream& os, const symbol_scope& scope)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
561 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
562 if (scope)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
563 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
564 os << "scope: " << scope.name () << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
565
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
566 if (scope.num_symbols () > 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
567 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
568 os << "name (frame offset, data offset, storage class):"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
569 << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
570
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
571 std::list<symbol_record> symbols = scope.symbol_list ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
572
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
573 for (auto& sym : symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
574 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
575 os << " " << sym.name () << " (" << sym.frame_offset ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
576 << ", " << sym.data_offset () << ", " << sym.storage_class ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
577 << ")" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
578 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
579 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
580 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
581 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
582
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
583 class stack_frame_walker
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
584 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
585 protected:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
586
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
587 stack_frame_walker (void) { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
588
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
589 virtual ~stack_frame_walker (void) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
590
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
591 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
592
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
593 // No copying!
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
594
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
595 stack_frame_walker (const stack_frame_walker&) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
596
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
597 stack_frame_walker& operator = (const stack_frame_walker&) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
598
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
599 virtual void
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
600 visit_compiled_fcn_stack_frame (compiled_fcn_stack_frame&) = 0;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
601
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
602 virtual void
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
603 visit_script_stack_frame (script_stack_frame&) = 0;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
604
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
605 virtual void
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
606 visit_user_fcn_stack_frame (user_fcn_stack_frame&) = 0;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
607
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
608 virtual void
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
609 visit_scope_stack_frame (scope_stack_frame&) = 0;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
610 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
611
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
612 class symbol_cleaner : public stack_frame_walker
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
613 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
614 public:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
615
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
616 symbol_cleaner (const std::string& pattern, bool have_regexp = false)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
617 : stack_frame_walker (), m_patterns (pattern),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
618 m_clear_all_names (false), m_clear_objects (false),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
619 m_have_regexp (have_regexp), m_cleared_names ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
620 { }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
621
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
622 symbol_cleaner (const string_vector& patterns, bool have_regexp = false)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
623 : stack_frame_walker (), m_patterns (patterns),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
624 m_clear_all_names (false), m_clear_objects (false),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
625 m_have_regexp (have_regexp), m_cleared_names ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
626 { }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
627
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
628 symbol_cleaner (bool clear_all_names = true, bool clear_objects = false)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
629 : stack_frame_walker (), m_patterns (),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
630 m_clear_all_names (clear_all_names), m_clear_objects (clear_objects),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
631 m_have_regexp (false), m_cleared_names ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
632 { }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
633
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
634 symbol_cleaner (const symbol_cleaner&) = delete;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
635
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
636 symbol_cleaner& operator = (const symbol_cleaner&) = delete;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
637
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
638 ~symbol_cleaner (void) = default;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
639
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
640 void visit_compiled_fcn_stack_frame (compiled_fcn_stack_frame& frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
641 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
642 // This one follows static link always. Hmm, should the access
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
643 // link for a compiled_fcn_stack_frame be the same as the static
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
644 // link?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
645
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
646 std::shared_ptr<stack_frame> slink = frame.static_link ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
647
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
648 if (slink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
649 slink->accept (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
650 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
651
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
652 void visit_script_stack_frame (script_stack_frame& frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
653 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
654 std::shared_ptr<stack_frame> alink = frame.access_link ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
655
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
656 if (alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
657 alink->accept (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
658 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
659
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
660 void visit_user_fcn_stack_frame (user_fcn_stack_frame& frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
661 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
662 clean_frame (frame);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
663
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
664 std::shared_ptr<stack_frame> alink = frame.access_link ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
665
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
666 if (alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
667 alink->accept (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
668 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
669
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
670 void visit_scope_stack_frame (scope_stack_frame& frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
671 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
672 clean_frame (frame);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
673
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
674 std::shared_ptr<stack_frame> alink = frame.access_link ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
675
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
676 if (alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
677 alink->accept (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
678 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
679
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
680 private:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
681
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
682 void maybe_clear_symbol (stack_frame& frame, const symbol_record& sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
683 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
684 std::string name = sym.name ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
685
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
686 if (m_cleared_names.find (name) == m_cleared_names.end ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
687 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
688 // FIXME: Should we check that the name is defined and skip if
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
689 // it is not? Is it possible for another symbol with the same
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
690 // name to appear in a later stack frame?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
691
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
692 // FIXME: If we are clearing objects and a symbol is found,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
693 // should we add it to the list of cleared names (since
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
694 // we did find a symbol) but skip clearing the object?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
695
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
696 if (m_clear_objects && ! frame.is_object (sym))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
697 return;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
698
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
699 m_cleared_names.insert (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
700
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
701 frame.clear (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
702 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
703 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
704
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
705 // FIXME: It would be nice to avoid the duplication in the following
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
706 // function.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
707
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
708 void clear_symbols (stack_frame& frame,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
709 const std::list<symbol_record>& symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
710 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
711 if (m_clear_all_names)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
712 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
713 for (const auto& sym : symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
714 maybe_clear_symbol (frame, sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
715 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
716 else if (m_have_regexp)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
717 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
718 octave_idx_type npatterns = m_patterns.numel ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
719
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
720 for (octave_idx_type j = 0; j < npatterns; j++)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
721 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
722 std::string pattern = m_patterns[j];
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
723
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
724 regexp pat (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
725
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
726 for (const auto& sym : symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
727 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
728 if (pat.is_match (sym.name ()))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
729 maybe_clear_symbol (frame, sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
730 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
731 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
732 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
733 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
734 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
735 octave_idx_type npatterns = m_patterns.numel ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
736
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
737 for (octave_idx_type j = 0; j < npatterns; j++)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
738 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
739 std::string pattern = m_patterns[j];
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
740
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
741 glob_match pat (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
742
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
743 for (const auto& sym : symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
744 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
745 if (pat.match (sym.name ()))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
746 maybe_clear_symbol (frame, sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
747 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
748 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
749 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
750 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
751
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
752 void clean_frame (stack_frame& frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
753 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
754 symbol_scope scope = frame.get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
755
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
756 std::list<symbol_record> symbols = scope.symbol_list ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
757
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
758 if (m_clear_all_names || ! m_patterns.empty ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
759 clear_symbols (frame, symbols);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
760 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
761
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
762 string_vector m_patterns;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
763
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
764 bool m_clear_all_names;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
765 bool m_clear_objects;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
766 bool m_have_regexp;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
767
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
768 std::set<std::string> m_cleared_names;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
769 };
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
770
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
771 class symbol_info_accumulator : public stack_frame_walker
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
772 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
773 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
774
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
775 symbol_info_accumulator (const std::string& pattern,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
776 bool have_regexp = false)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
777 : stack_frame_walker (), m_patterns (pattern), m_match_all (false),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
778 m_first_only (false), m_have_regexp (have_regexp), m_sym_inf_list (),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
779 m_found_names ()
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
780 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
781
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
782 symbol_info_accumulator (const string_vector& patterns,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
783 bool have_regexp = false)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
784 : stack_frame_walker (), m_patterns (patterns), m_match_all (false),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
785 m_first_only (false), m_have_regexp (have_regexp), m_sym_inf_list (),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
786 m_found_names ()
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
787 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
788
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
789 symbol_info_accumulator (bool match_all = true, bool first_only = true)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
790 : stack_frame_walker (), m_patterns (), m_match_all (match_all),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
791 m_first_only (first_only), m_have_regexp (false),
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
792 m_sym_inf_list (), m_found_names ()
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
793 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
794
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
795 symbol_info_accumulator (const symbol_info_accumulator&) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
796
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
797 symbol_info_accumulator& operator = (const symbol_info_accumulator&) = delete;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
798
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
799 ~symbol_info_accumulator (void) = default;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
800
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
801 bool is_empty (void) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
802 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
803 for (const auto& nm_sil : m_sym_inf_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
804 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
805 const symbol_info_list& lst = nm_sil.second;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
806
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
807 if (! lst.empty ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
808 return false;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
809 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
810
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
811 return true;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
812 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
813
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
814 std::list<std::string> names (void) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
815 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
816 std::list<std::string> retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
817
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
818 for (const auto& nm_sil : m_sym_inf_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
819 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
820 const symbol_info_list& lst = nm_sil.second;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
821
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
822 std::list<std::string> nm_list = lst.names ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
823
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
824 for (const auto& nm : nm_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
825 retval.push_back (nm);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
826 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
827
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
828 return retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
829 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
830
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
831 symbol_info_list symbol_info (void) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
832 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
833 symbol_info_list retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
834
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
835 for (const auto& nm_sil : m_sym_inf_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
836 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
837 const symbol_info_list& lst = nm_sil.second;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
838
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
839 for (const auto& syminf : lst)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
840 retval.push_back (syminf);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
841 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
842
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
843 return retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
844 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
845
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
846 octave_map map_value (void) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
847 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
848 octave_map retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
849
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
850 // FIXME: is there a better way to concatenate structures?
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
851
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
852 size_t n_frames = m_sym_inf_list.size ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
853
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
854 OCTAVE_LOCAL_BUFFER (octave_map, map_list, n_frames);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
855
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
856 size_t j = 0;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
857 for (const auto& nm_sil : m_sym_inf_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
858 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
859 std::string scope_name = nm_sil.first;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
860 const symbol_info_list& lst = nm_sil.second;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
861
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
862 map_list[j] = lst.map_value (scope_name, n_frames-j);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
863
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
864 j++;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
865 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
866
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
867 return octave_map::cat (-1, n_frames, map_list);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
868 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
869
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
870 void display (std::ostream& os, const std::string& format) const
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
871 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
872 for (const auto& nm_sil : m_sym_inf_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
873 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
874 os << "\nvariables in scope: " << nm_sil.first << "\n\n";
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
875
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
876 const symbol_info_list& lst = nm_sil.second;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
877
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
878 lst.display (os, format);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
879 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
880 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
881
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
882 void visit_compiled_fcn_stack_frame (compiled_fcn_stack_frame& frame)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
883 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
884 // This one follows static link always. Hmm, should the access
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
885 // link for a compiled_fcn_stack_frame be the same as the static
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
886 // link?
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
887
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
888 std::shared_ptr<stack_frame> slink = frame.static_link ();
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
889
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
890 if (slink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
891 slink->accept (*this);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
892 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
893
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
894 void visit_script_stack_frame (script_stack_frame& frame)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
895 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
896 std::shared_ptr<stack_frame> alink = frame.access_link ();
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
897
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
898 if (alink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
899 alink->accept (*this);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
900 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
901
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
902 void visit_user_fcn_stack_frame (user_fcn_stack_frame& frame)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
903 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
904 append_list (frame);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
905
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
906 std::shared_ptr<stack_frame> alink = frame.access_link ();
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
907
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
908 if (alink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
909 alink->accept (*this);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
910 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
911
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
912 void visit_scope_stack_frame (scope_stack_frame& frame)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
913 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
914 append_list (frame);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
915
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
916 std::shared_ptr<stack_frame> alink = frame.access_link ();
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
917
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
918 if (alink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
919 alink->accept (*this);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
920 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
921
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
922 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
923
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
924 typedef std::pair<std::string, symbol_info_list> syminf_list_elt;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
925
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
926 // FIXME: the following is too complex and duplicates too much
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
927 // code. Maybe it should be split up so we have separate classes
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
928 // that do each job that is needed?
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
929
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
930 std::list<symbol_record>
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
931 filter (stack_frame& frame, const std::list<symbol_record>& symbols)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
932 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
933 std::list<symbol_record> new_symbols;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
934
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
935 if (m_match_all)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
936 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
937 for (const auto& sym : symbols)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
938 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
939 if (frame.is_defined (sym))
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
940 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
941 std::string name = sym.name ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
942
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
943 if (m_first_only
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
944 && m_found_names.find (name) != m_found_names.end ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
945 continue;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
946
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
947 m_found_names.insert (name);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
948
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
949 new_symbols.push_back (sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
950 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
951 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
952 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
953 else if (m_have_regexp)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
954 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
955 octave_idx_type npatterns = m_patterns.numel ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
956
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
957 for (octave_idx_type j = 0; j < npatterns; j++)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
958 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
959 std::string pattern = m_patterns[j];
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
960
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
961 regexp pat (pattern);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
962
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
963 for (const auto& sym : symbols)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
964 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
965 std::string name = sym.name ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
966
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
967 if (pat.is_match (name) && frame.is_defined (sym))
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
968 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
969 if (m_first_only
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
970 && m_found_names.find (name) != m_found_names.end ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
971 continue;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
972
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
973 m_found_names.insert (name);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
974
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
975 new_symbols.push_back (sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
976 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
977 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
978 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
979 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
980 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
981 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
982 octave_idx_type npatterns = m_patterns.numel ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
983
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
984 for (octave_idx_type j = 0; j < npatterns; j++)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
985 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
986 std::string pattern = m_patterns[j];
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
987
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
988 glob_match pat (pattern);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
989
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
990 for (const auto& sym : symbols)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
991 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
992 std::string name = sym.name ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
993
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
994 if (pat.match (name) && frame.is_defined (sym))
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
995 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
996 if (m_first_only
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
997 && m_found_names.find (name) == m_found_names.end ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
998 continue;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
999
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1000 m_found_names.insert (name);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1001
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1002 new_symbols.push_back (sym);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1003 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1004 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1005 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1006 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1007
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1008 return new_symbols;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1009 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1010
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1011 void append_list (stack_frame& frame)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1012 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1013 symbol_scope scope = frame.get_scope ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1014
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1015 std::list<symbol_record> symbols = scope.symbol_list ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1016
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1017 if (m_match_all || ! m_patterns.empty ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1018 symbols = filter (frame, symbols);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1019
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1020 symbol_info_list syminf_list = frame.make_symbol_info_list (symbols);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1021
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1022 m_sym_inf_list.push_back (syminf_list_elt (scope.name (), syminf_list));
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1023 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1024
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1025 string_vector m_patterns;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1026
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1027 bool m_match_all;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1028 bool m_first_only;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1029 bool m_have_regexp;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1030
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1031 std::list<std::pair<std::string, symbol_info_list>> m_sym_inf_list;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1032
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1033 std::set<std::string> m_found_names;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1034 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1035
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1036 stack_frame * stack_frame::create (tree_evaluator& tw, octave_function *fcn,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1037 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1038 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1039 const std::shared_ptr<stack_frame>& static_link)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1040 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1041 return new compiled_fcn_stack_frame (tw, fcn, index, parent_link, static_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1042 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1043
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1044 stack_frame * stack_frame::create (tree_evaluator& tw,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1045 octave_user_script *script,
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1046 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1047 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1048 const std::shared_ptr<stack_frame>& static_link)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1049 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1050 return new script_stack_frame (tw, script, index, parent_link, static_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1051 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1052
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1053 stack_frame * stack_frame::create (tree_evaluator& tw,
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1054 octave_user_function *fcn, size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1055 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1056 const std::shared_ptr<stack_frame>& static_link,
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1057 const std::shared_ptr<stack_frame>& access_link)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1058 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1059 return new user_fcn_stack_frame (tw, fcn, index, parent_link, static_link, access_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1060 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1061
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1062 stack_frame * stack_frame::create (tree_evaluator& tw,
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1063 octave_user_function *fcn, size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1064 const std::shared_ptr<stack_frame>& parent_link,
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1065 const std::shared_ptr<stack_frame>& static_link,
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1066 const local_vars_map& local_vars)
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1067 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1068 return new user_fcn_stack_frame (tw, fcn, index, parent_link, static_link, local_vars);
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1069 }
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1070
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1071 stack_frame * stack_frame::create (tree_evaluator& tw,
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1072 const symbol_scope& scope, size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1073 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1074 const std::shared_ptr<stack_frame>& static_link)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1075 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1076 return new scope_stack_frame (tw, scope, index, parent_link, static_link);
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1077 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1078
29064
336356206de7 don't clear stack frame values indirectly through call stack (bug #59432)
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1079 // This function is only implemented and should only be called for
336356206de7 don't clear stack frame values indirectly through call stack (bug #59432)
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1080 // user_fcn stack frames. Anything else indicates an error in the
336356206de7 don't clear stack frame values indirectly through call stack (bug #59432)
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1081 // implementation, but we'll simply warn if that happens.
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1082
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1083 void stack_frame::clear_values (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1084 {
29064
336356206de7 don't clear stack frame values indirectly through call stack (bug #59432)
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1085 warning ("invalid call to stack_frame::clear_values; please report");
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1086 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1087
28329
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1088 symbol_info_list
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1089 stack_frame::make_symbol_info_list (const std::list<symbol_record>& symrec_list) const
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1090 {
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1091 symbol_info_list symbol_stats;
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1092
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1093 for (const auto& sym : symrec_list)
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1094 {
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1095 octave_value value = varval (sym);
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1096
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1097 if (value.is_defined ())
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1098 {
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1099 symbol_info syminf (sym.name (), value, sym.is_formal (),
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1100 is_global (sym), is_persistent (sym));
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1101
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1102 symbol_stats.append (syminf);
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1103 }
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1104 }
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1105
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1106 return symbol_stats;
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1107 }
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1108
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1109 octave_value stack_frame::who (const string_vector& patterns,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1110 bool have_regexp, bool return_list,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1111 bool verbose, const std::string& whos_line_fmt,
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1112 const std::string& msg)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1113 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1114 symbol_info_accumulator sym_inf_accum (patterns, have_regexp);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1115
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1116 accept (sym_inf_accum);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1117
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1118 if (return_list)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1119 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1120 if (verbose)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1121 return sym_inf_accum.map_value ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1122 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1123 return Cell (string_vector (sym_inf_accum.names ()));
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1124 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1125 else if (! sym_inf_accum.is_empty ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1126 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1127
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1128 if (msg.empty ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1129 octave_stdout << "Variables visible from the current scope:\n";
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1130 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1131 octave_stdout << msg;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1132
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1133 if (verbose)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1134 sym_inf_accum.display (octave_stdout, whos_line_fmt);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1135 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1136 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1137 octave_stdout << "\n";
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1138 string_vector names (sym_inf_accum.names ());
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1139 names.list_in_columns (octave_stdout);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1140 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1141
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1142 octave_stdout << "\n";
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1143 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1144
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1145 return octave_value ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1146 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1147
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1148 // Return first occurrence of variables in current stack frame and any
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1149 // parent frames reachable through access links.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1150
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1151 symbol_info_list stack_frame::all_variables (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1152 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1153 symbol_info_accumulator sia (true, true);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1154
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1155 accept (sia);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1156
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1157 return sia.symbol_info ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1158 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1159
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1160 octave_value stack_frame::workspace (void)
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1161 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1162 std::list<octave_scalar_map> ws_list;
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1163
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1164 stack_frame *frame = this;
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1165
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1166 while (frame)
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1167 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1168 octave::symbol_info_list symbols = frame->all_variables ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1169
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1170 octave_scalar_map ws;
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1171
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1172 for (const auto& sym_name : symbols.names ())
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1173 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1174 octave_value val = symbols.varval (sym_name);
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1175
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1176 if (val.is_defined ())
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1177 ws.assign (sym_name, val);
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1178 }
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1179
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1180 ws_list.push_back (ws);
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1181
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1182 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1183 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1184 }
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1185
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1186 Cell ws_frames (ws_list.size (), 1);
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1187
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1188 octave_idx_type i = 0;
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1189 for (const auto& elt : ws_list)
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1190 ws_frames(i++) = elt;
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1191
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1192 return ws_frames;
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1193 }
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1194
28327
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1195 // FIXME: Should this function also find any variables in parent
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1196 // scopes accessible through access_links?
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1197
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1198 std::list<std::string> stack_frame::variable_names (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1199 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1200 std::list<std::string> retval;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1201
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1202 symbol_scope scope = get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1203
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1204 const std::map<std::string, symbol_record>& symbols = scope.symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1205
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1206 for (const auto& nm_sr : symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1207 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1208 if (is_variable (nm_sr.second))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1209 retval.push_back (nm_sr.first);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1210 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1211
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1212 retval.sort ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1213
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1214 return retval;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1215 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1216
28327
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1217 symbol_info_list stack_frame::glob_symbol_info (const std::string& pattern)
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1218 {
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1219 symbol_info_accumulator sia (pattern, false);
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1220
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1221 accept (sia);
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1222
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1223 return sia.symbol_info ();
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1224 }
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1225
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1226 symbol_info_list stack_frame::regexp_symbol_info (const std::string& pattern)
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1227 {
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1228 symbol_info_accumulator sia (pattern, true);
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1229
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1230 accept (sia);
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1231
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1232 return sia.symbol_info ();
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1233 }
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1234
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1235 size_t stack_frame::size (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1236 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1237 // This function should only be called for user_fcn_stack_frame or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1238 // scope_stack_frame objects. Anything else indicates an error in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1239 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1240
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1241 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1242 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1243
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1244 void stack_frame::resize (size_t)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1245 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1246 // This function should only be called for user_fcn_stack_frame or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1247 // scope_stack_frame objects. Anything else indicates an error in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1248 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1249
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1250 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1251 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1252
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1253 stack_frame::scope_flags stack_frame::get_scope_flag (size_t) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1254 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1255 // This function should only be called for user_fcn_stack_frame or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1256 // scope_stack_frame objects. Anything else indicates an error in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1257 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1258
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1259 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1260 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1261
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1262 void stack_frame::set_scope_flag (size_t, scope_flags)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1263 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1264 // This function should only be called for user_fcn_stack_frame or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1265 // scope_stack_frame objects. Anything else indicates an error in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1266 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1267
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1268 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1269 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1270
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1271 void stack_frame::install_variable (const symbol_record& sym,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1272 const octave_value& value, bool global)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1273 {
26673
4271b53b24a6 when installing global variable don't warn if it is already global
John W. Eaton <jwe@octave.org>
parents: 26663
diff changeset
1274 if (global && ! is_global (sym))
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1275 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1276 octave_value val = varval (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1277
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1278 if (val.is_defined ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1279 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1280 std::string nm = sym.name ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1281
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1282 warning_with_id ("Octave:global-local-conflict",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1283 "global: '%s' is defined in the current scope.\n",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1284 nm.c_str ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1285 warning_with_id ("Octave:global-local-conflict",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1286 "global: in a future version, global variables must be declared before use.\n");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1287
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1288 // If the symbol is defined in the local but not the
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1289 // global scope, then use the local value as the
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1290 // initial value. This value will also override any
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1291 // initializer in the global statement.
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1292 octave_value global_val = m_evaluator.global_varval (nm);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1293
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1294 if (global_val.is_defined ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1295 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1296 warning_with_id ("Octave:global-local-conflict",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1297 "global: global value overrides existing local value");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1298
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1299 clear (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1300 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1301 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1302 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1303 warning_with_id ("Octave:global-local-conflict",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1304 "global: existing local value used to initialize global variable");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1305
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1306 m_evaluator.global_varref (nm) = val;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1307 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1308 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1309
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1310 mark_global (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1311 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1312
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1313 if (value.is_defined ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1314 assign (sym, value);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1315 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1316
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1317 octave_value stack_frame::varval (size_t) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1318 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1319 // This function should only be called for user_fcn_stack_frame or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1320 // scope_stack_frame objects. Anything else indicates an error in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1321 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1322
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1323 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1324 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1325
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1326 octave_value& stack_frame::varref (size_t)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1327 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1328 // This function should only be called for user_fcn_stack_frame or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1329 // scope_stack_frame objects. Anything else indicates an error in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1330 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1331
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1332 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1333 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1334
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1335 void stack_frame::clear_objects (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1336 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1337 symbol_cleaner sc (true, true);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1338
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1339 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1340 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1341
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1342 void stack_frame::clear_variable (const std::string& name)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1343 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1344 symbol_cleaner sc (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1345
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1346 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1347 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1348
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1349 void stack_frame::clear_variable_pattern (const std::string& pattern)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1350 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1351 symbol_cleaner sc (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1352
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1353 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1354 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1355
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1356 void stack_frame::clear_variable_pattern (const string_vector& patterns)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1357 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1358 symbol_cleaner sc (patterns);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1359
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1360 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1361 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1362
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1363 void stack_frame::clear_variable_regexp (const std::string& pattern)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1364 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1365 symbol_cleaner sc (pattern, true);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1366
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1367 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1368 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1369
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1370 void stack_frame::clear_variable_regexp (const string_vector& patterns)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1371 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1372 symbol_cleaner sc (patterns, true);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1373
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1374 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1375 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1376
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1377 void stack_frame::clear_variables (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1378 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1379 symbol_cleaner sc;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1380
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1381 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1382 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1383
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1384 void stack_frame::display_stopped_in_message (std::ostream& os) const
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1385 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1386 if (index () == 0)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1387 os << "at top level" << std::endl;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1388 else
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1389 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1390 os << "stopped in " << fcn_name ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1391
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1392 int l = line ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1393 if (l > 0)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1394 os << " at line " << line ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1395
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1396 os << " [" << fcn_file_name () << "] " << std::endl;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1397 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1398 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1399
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1400 void stack_frame::display (bool follow) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1401 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1402 std::ostream& os = octave_stdout;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1403
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1404 os << "-- [stack_frame] (" << this << ") --" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1405
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1406 os << "parent link: ";
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1407 if (m_parent_link)
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1408 os << m_parent_link.get ();
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1409 else
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1410 os << "NULL";
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1411 os << std::endl;
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1412
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1413 os << "static link: ";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1414 if (m_static_link)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1415 os << m_static_link.get ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1416 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1417 os << "NULL";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1418 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1419
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1420 os << "access link: ";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1421 if (m_access_link)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1422 os << m_access_link.get ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1423 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1424 os << "NULL";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1425 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1426
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1427 os << "line: " << m_line << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1428 os << "column: " << m_column << std::endl;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1429 os << "index: " << m_index << std::endl;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1430
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1431 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1432
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1433 if (! follow)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1434 return;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1435
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1436 os << "FOLLOWING ACCESS LINKS:" << std::endl;
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1437 std::shared_ptr<stack_frame> frm = access_link ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1438 while (frm)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1439 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1440 frm->display (false);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1441 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1442
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1443 frm = frm->access_link ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1444 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1445 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1446
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1447 void compiled_fcn_stack_frame::display (bool follow) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1448 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1449 std::ostream& os = octave_stdout;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1450
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1451 os << "-- [compiled_fcn_stack_frame] (" << this << ") --" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1452 stack_frame::display (follow);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1453
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1454 os << "fcn: " << m_fcn->name ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1455 << " (" << m_fcn->type_name () << ")" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1456 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1457
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1458 void compiled_fcn_stack_frame::accept (stack_frame_walker& sfw)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1459 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1460 sfw.visit_compiled_fcn_stack_frame (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1461 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1462
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1463 script_stack_frame::script_stack_frame (tree_evaluator& tw,
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1464 octave_user_script *script,
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1465 size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1466 const std::shared_ptr<stack_frame>& parent_link,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1467 const std::shared_ptr<stack_frame>& static_link)
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1468 : stack_frame (tw, index, parent_link, static_link,
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1469 get_access_link (static_link)),
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1470 m_script (script), m_unwind_protect_frame (nullptr),
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1471 m_lexical_frame_offsets (get_num_symbols (script), 1),
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1472 m_value_offsets (get_num_symbols (script), 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1473 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1474 set_script_offsets ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1475 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1476
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1477 size_t script_stack_frame::get_num_symbols (octave_user_script *script)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1478 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1479 symbol_scope script_scope = script->scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1480
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1481 return script_scope.num_symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1482 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1483
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1484 void script_stack_frame::set_script_offsets (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1485 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1486 // Set frame and data offsets inside stack frame based on enclosing
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1487 // scope(s).
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1488
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1489 symbol_scope script_scope = m_script->scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1490
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1491 size_t num_script_symbols = script_scope.num_symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1492
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1493 resize (num_script_symbols);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1494
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1495 const std::map<std::string, symbol_record>& script_symbols
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1496 = script_scope.symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1497
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1498 set_script_offsets_internal (script_symbols);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1499 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1500
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1501 void script_stack_frame::set_script_offsets_internal
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1502 (const std::map<std::string, symbol_record>& script_symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1503 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1504 // This scope will be used to evaluate the script. Find (or
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1505 // possibly insert) symbols from the dummy script scope here.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1506
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1507 symbol_scope eval_scope = m_access_link->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1508
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1509 if (eval_scope.is_nested ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1510 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1511 bool found = false;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1512
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1513 for (const auto& nm_sr : script_symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1514 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1515 std::string name = nm_sr.first;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1516 symbol_record script_sr = nm_sr.second;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1517
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1518 symbol_scope parent_scope = eval_scope;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1519
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1520 size_t count = 1;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1521
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1522 while (parent_scope)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1523 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1524 const std::map<std::string, symbol_record>& parent_scope_symbols
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1525 = parent_scope.symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1526
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1527 auto p = parent_scope_symbols.find (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1528
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1529 if (p != parent_scope_symbols.end ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1530 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1531 found = true;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1532 symbol_record parent_scope_sr = p->second;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1533
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1534 size_t script_sr_data_offset = script_sr.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1535
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1536 m_lexical_frame_offsets.at (script_sr_data_offset)
28538
c09bc9e108b5 fix lookup of variables in scripts called inside nested functions (bug #58691)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
1537 = parent_scope_sr.frame_offset () + count;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1538
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1539 m_value_offsets.at (script_sr_data_offset)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1540 = parent_scope_sr.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1541
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1542 break;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1543 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1544 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1545 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1546 count++;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1547 parent_scope = parent_scope.parent_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1548 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1549 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1550
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1551 if (! found)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1552 error ("symbol '%s' cannot be added to static scope",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1553 name.c_str ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1554 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1555 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1556 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1557 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1558 const std::map<std::string, symbol_record>& eval_scope_symbols
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1559 = eval_scope.symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1560
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1561 for (const auto& nm_sr : script_symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1562 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1563 std::string name = nm_sr.first;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1564 symbol_record script_sr = nm_sr.second;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1565
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1566 auto p = eval_scope_symbols.find (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1567
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1568 symbol_record eval_scope_sr;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1569
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1570 if (p == eval_scope_symbols.end ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1571 eval_scope_sr = eval_scope.insert (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1572 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1573 eval_scope_sr = p->second;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1574
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1575 size_t script_sr_data_offset = script_sr.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1576
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1577 // The +1 is for going from the script frame to the eval
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1578 // frame. Only one access_link should need to be followed.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1579
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1580 m_lexical_frame_offsets.at (script_sr_data_offset)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1581 = eval_scope_sr.frame_offset () + 1;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1582
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1583 m_value_offsets.at (script_sr_data_offset)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1584 = eval_scope_sr.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1585 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1586 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1587 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1588
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1589 void script_stack_frame::resize_and_update_script_offsets (const symbol_record& sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1590 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1591 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1592
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1593 // This function is called when adding new symbols to a script
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1594 // scope. If the symbol wasn't present before, it should be outside
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1595 // the range so we need to resize then update offsets.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1596
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1597 assert (data_offset >= size ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1598
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1599 resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1600
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1601 // FIXME: We should be able to avoid creating the map object and the
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1602 // looping in the set_scripts_offsets_internal function. Can we do
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1603 // that without (or with minimal) code duplication?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1604
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1605 std::map<std::string, symbol_record> tmp_symbols;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1606 tmp_symbols[sym.name ()] = sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1607 set_script_offsets_internal (tmp_symbols);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1608 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1609
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1610 // If this is a nested scope, set access_link to nearest parent
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1611 // stack frame that corresponds to the lexical parent of this scope.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1612
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1613 std::shared_ptr<stack_frame>
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1614 script_stack_frame::get_access_link (const std::shared_ptr<stack_frame>& static_link)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1615 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1616 // If this script is called from another script, set access
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1617 // link to ultimate parent stack frame.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1618
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1619 std::shared_ptr<stack_frame> alink = static_link;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1620
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1621 while (alink->is_user_script_frame ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1622 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1623 if (alink->access_link ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1624 alink = alink->access_link ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1625 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1626 break;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1627 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1628
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1629 return alink;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1630 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1631
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1632 unwind_protect * script_stack_frame::unwind_protect_frame (void)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1633 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1634 if (! m_unwind_protect_frame)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1635 m_unwind_protect_frame = new unwind_protect ();
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1636
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1637 return m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1638 }
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1639
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1640 symbol_record script_stack_frame::lookup_symbol (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1641 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1642 symbol_scope scope = get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1643
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1644 symbol_record sym = scope.lookup_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1645
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1646 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1647 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1648 assert (sym.frame_offset () == 0);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1649
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1650 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1651 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1652
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1653 sym = m_access_link->lookup_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1654
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1655 // Return symbol record with adjusted frame offset.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1656 symbol_record new_sym = sym.dup ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1657
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1658 new_sym.set_frame_offset (sym.frame_offset () + 1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1659
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1660 return new_sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1661 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1662
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1663 symbol_record script_stack_frame::insert_symbol (const std::string& name)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1664 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1665 // If the symbols is already in the immediate scope, there is
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1666 // nothing more to do.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1667
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1668 symbol_scope scope = get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1669
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1670 symbol_record sym = scope.lookup_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1671
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1672 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1673 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1674 // All symbol records in a script scope should have zero offset,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1675 // which means we redirect our lookup using
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1676 // lexical_frame_offsets and values_offets.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1677 assert (sym.frame_offset () == 0);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1678
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1679 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1680 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1681
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1682 // Insert the symbol in the current scope then resize and update
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1683 // offsets. This operation should never fail.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1684
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1685 sym = scope.find_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1686
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1687 assert (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1688
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1689 resize_and_update_script_offsets (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1690
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1691 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1692 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1693
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1694 // Similar to set_script_offsets_internal except that we only return
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1695 // frame and data offsets for symbols found by name in parent scopes
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1696 // instead of updating the offsets stored in the script frame itself.
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1697
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1698 bool
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1699 script_stack_frame::get_val_offsets_internal (const symbol_record& script_sr,
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1700 size_t& frame_offset,
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1701 size_t& data_offset) const
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1702 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1703 bool found = false;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1704
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1705 // This scope will be used to evaluate the script. Find symbols
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1706 // here by name.
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1707
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1708 symbol_scope eval_scope = m_access_link->get_scope ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1709
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1710 if (eval_scope.is_nested ())
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1711 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1712 std::string name = script_sr.name ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1713
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1714 symbol_scope parent_scope = eval_scope;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1715
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1716 size_t count = 1;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1717
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1718 while (parent_scope)
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1719 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1720 const std::map<std::string, symbol_record>& parent_scope_symbols
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1721 = parent_scope.symbols ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1722
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1723 auto p = parent_scope_symbols.find (name);
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1724
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1725 if (p != parent_scope_symbols.end ())
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1726 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1727 found = true;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1728 symbol_record parent_scope_sr = p->second;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1729
28538
c09bc9e108b5 fix lookup of variables in scripts called inside nested functions (bug #58691)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
1730 frame_offset = parent_scope_sr.frame_offset () + count;
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1731
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1732 data_offset = parent_scope_sr.data_offset ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1733
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1734 break;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1735 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1736 else
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1737 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1738 count++;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1739 parent_scope = parent_scope.parent_scope ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1740 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1741 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1742 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1743 else
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1744 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1745 const std::map<std::string, symbol_record>& eval_scope_symbols
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1746 = eval_scope.symbols ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1747
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1748 std::string name = script_sr.name ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1749
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1750 auto p = eval_scope_symbols.find (name);
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1751
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1752 symbol_record eval_scope_sr;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1753
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1754 if (p != eval_scope_symbols.end ())
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1755 {
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1756 found = true;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1757 eval_scope_sr = p->second;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1758
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1759 // The +1 is for going from the script frame to the eval
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1760 // frame. Only one access_link should need to be followed.
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1761
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1762 frame_offset = eval_scope_sr.frame_offset () + 1;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1763
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1764 data_offset = eval_scope_sr.data_offset ();
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1765 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1766 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1767
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1768 return found;
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1769 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1770
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1771 bool script_stack_frame::get_val_offsets (const symbol_record& sym,
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1772 size_t& frame_offset,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1773 size_t& data_offset) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1774 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1775 data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1776 frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1777
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1778 if (frame_offset == 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1779 {
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1780 // An out of range data_offset value here means that we have a
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1781 // symbol that was not originally in the script. But this
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1782 // function is called in places where we can't insert a new
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1783 // symbol, so we fail and it is up to the caller to decide what
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1784 // to do.
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1785
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1786 if (data_offset >= size ())
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1787 return get_val_offsets_internal (sym, frame_offset, data_offset);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1788
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1789 // Use frame and value offsets stored in this stack frame,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1790 // indexed by data_offset from the symbol_record to find the
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1791 // values. These offsets were determined by
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1792 // script_stack_frame::set_script_offsets when this script was
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1793 // invoked.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1794
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1795 frame_offset = m_lexical_frame_offsets.at (data_offset);
27149
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1796
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1797 if (frame_offset == 0)
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1798 {
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1799 // If the frame offset stored in m_lexical_frame_offsets is
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1800 // zero, then the data offset in the evaluation scope has
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1801 // not been determined so try to do that now. The symbol
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1802 // may have been added by eval and without calling
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1803 // resize_and_update_script_offsets.
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1804
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1805 return get_val_offsets_internal (sym, frame_offset, data_offset);
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1806 }
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1807
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1808 data_offset = m_value_offsets.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1809 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1810 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1811 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1812 // If frame_offset is not zero, then then we must have a symbol
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1813 // that was not originally in the script. The values should
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1814 // have been determined by the script_stack_frame::lookup function.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1815 }
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1816
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1817 return true;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1818 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1819
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1820 void script_stack_frame::get_val_offsets_with_insert (const symbol_record& sym,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1821 size_t& frame_offset,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1822 size_t& data_offset)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1823 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1824 data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1825 frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1826
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1827 if (frame_offset == 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1828 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1829 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1830 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1831 // If the data_offset is out of range, then we must have a
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1832 // symbol that was not originally in the script. Resize and
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1833 // update the offsets.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1834
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1835 resize_and_update_script_offsets (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1836 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1837
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1838 // Use frame and value offsets stored in this stack frame,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1839 // indexed by data_offset from the symbol_record to find the
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1840 // values. These offsets were determined by
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1841 // script_stack_frame::set_script_offsets when this script was
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1842 // invoked.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1843
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1844 frame_offset = m_lexical_frame_offsets.at (data_offset);
27149
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1845
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1846 if (frame_offset == 0)
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1847 {
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1848 // If the frame offset stored in m_lexical_frame_offsets is
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1849 // zero, then the data offset in the evaluation scope has
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1850 // not been determined so try to do that now. The symbol
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1851 // may have been added by eval and without calling
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1852 // resize_and_update_script_offsets.
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1853
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1854 // We don't need to resize here. That case is handled above.
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1855
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1856 // FIXME: We should be able to avoid creating the map object
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1857 // and the looping in the set_scripts_offsets_internal
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1858 // function. Can we do that without (or with minimal) code
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1859 // duplication?
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1860
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1861 std::map<std::string, symbol_record> tmp_symbols;
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1862 tmp_symbols[sym.name ()] = sym;
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1863 set_script_offsets_internal (tmp_symbols);
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1864 }
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1865
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1866 data_offset = m_value_offsets.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1867 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1868 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1869 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1870 // If frame_offset is not zero, then then we must have a symbol
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1871 // that was not originally in the script. The values were
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1872 // determined by the script_stack_frame::lookup function.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1873 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1874 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1875
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1876 stack_frame::scope_flags
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1877 script_stack_frame::scope_flag (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1878 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1879 size_t frame_offset;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1880 size_t data_offset;
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1881
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1882 bool found = get_val_offsets (sym, frame_offset, data_offset);
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1883
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1884 // It can't be global or persistent, so call it local.
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1885 if (! found)
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1886 return LOCAL;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1887
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1888 // Follow frame_offset access links to stack frame that holds
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1889 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1890
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1891 const stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1892
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1893 for (size_t i = 0; i < frame_offset; i++)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1894 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1895 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1896 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1897 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1898
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1899 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1900 error ("internal error: invalid access link in function call stack");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1901
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1902 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1903 return LOCAL;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1904
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1905 return frame->get_scope_flag (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1906 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1907
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1908 octave_value script_stack_frame::varval (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1909 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1910 size_t frame_offset;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1911 size_t data_offset;
26663
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1912
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1913 bool found = get_val_offsets (sym, frame_offset, data_offset);
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1914
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1915 if (! found)
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1916 return octave_value ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1917
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1918 // Follow frame_offset access links to stack frame that holds
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1919 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1920
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1921 const stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1922
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1923 for (size_t i = 0; i < frame_offset; i++)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1924 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1925 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1926 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1927 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1928
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1929 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1930 error ("internal error: invalid access link in function call stack");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1931
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1932 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1933 return octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1934
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1935 switch (frame->get_scope_flag (data_offset))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1936 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1937 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1938 return frame->varval (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1939
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1940 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1941 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1942 symbol_scope scope = frame->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1943
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1944 return scope.persistent_varval (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1945 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1946
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1947 case GLOBAL:
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1948 return m_evaluator.global_varval (sym.name ());
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1949 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1950
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1951 error ("internal error: invalid switch case");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1952 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1953
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1954 octave_value& script_stack_frame::varref (const symbol_record& sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1955 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1956 size_t frame_offset;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1957 size_t data_offset;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1958 get_val_offsets_with_insert (sym, frame_offset, data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1959
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1960 // Follow frame_offset access links to stack frame that holds
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1961 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1962
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1963 stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1964
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1965 for (size_t i = 0; i < frame_offset; i++)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1966 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1967 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1968 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
1969 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1970
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1971 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1972 frame->resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1973
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1974 switch (frame->get_scope_flag (data_offset))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1975 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1976 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1977 return frame->varref (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1978
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1979 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1980 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1981 symbol_scope scope = frame->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1982
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1983 return scope.persistent_varref (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1984 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1985
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1986 case GLOBAL:
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1987 return m_evaluator.global_varref (sym.name ());
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1988 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1989
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1990 error ("internal error: invalid switch case");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1991 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1992
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1993 void script_stack_frame::mark_scope (const symbol_record& sym,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1994 scope_flags flag)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1995 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1996 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1997
29324
1a20cb5be8da avoid crash when evaling global variables into existence in script (bug #59937)
John W. Eaton <jwe@octave.org>
parents: 29064
diff changeset
1998 if (data_offset >= size ())
1a20cb5be8da avoid crash when evaling global variables into existence in script (bug #59937)
John W. Eaton <jwe@octave.org>
parents: 29064
diff changeset
1999 resize_and_update_script_offsets (sym);
1a20cb5be8da avoid crash when evaling global variables into existence in script (bug #59937)
John W. Eaton <jwe@octave.org>
parents: 29064
diff changeset
2000
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2001 // Redirection to evaluation context for the script.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2002
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2003 size_t frame_offset = m_lexical_frame_offsets.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2004 data_offset = m_value_offsets.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2005
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2006 if (frame_offset > 1)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2007 error ("variables must be made PERSISTENT or GLOBAL in the first scope in which they are used");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2008
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2009 std::shared_ptr<stack_frame> frame = access_link ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2010
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2011 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2012 frame->resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2013
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2014 frame->set_scope_flag (data_offset, flag);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2015 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2016
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2017 void script_stack_frame::display (bool follow) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2018 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2019 std::ostream& os = octave_stdout;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2020
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2021 os << "-- [script_stack_frame] (" << this << ") --" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2022 stack_frame::display (follow);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2023
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2024 os << "script: " << m_script->name ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2025 << " (" << m_script->type_name () << ")" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2026
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2027 os << "lexical_offsets: " << m_lexical_frame_offsets.size ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2028 << " elements:";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2029
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2030 for (size_t i = 0; i < m_lexical_frame_offsets.size (); i++)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2031 os << " " << m_lexical_frame_offsets.at (i);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2032 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2033
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2034 os << "value_offsets: " << m_value_offsets.size () << " elements:";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2035 for (size_t i = 0; i < m_value_offsets.size (); i++)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2036 os << " " << m_value_offsets.at (i);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2037 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2038
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2039 display_scope (os, get_scope ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2040 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2041
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2042 void script_stack_frame::accept (stack_frame_walker& sfw)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2043 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2044 sfw.visit_script_stack_frame (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2045 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2046
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2047 void base_value_stack_frame::display (bool follow) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2048 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2049 std::ostream& os = octave_stdout;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2050
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2051 os << "-- [base_value_stack_frame] (" << this << ") --" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2052 stack_frame::display (follow);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2053
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2054 os << "values: " << m_values.size ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2055 << " elements (idx, scope flag, type):" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2056
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2057 for (size_t i = 0; i < m_values.size (); i++)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2058 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2059 os << " (" << i << ", " << m_flags.at (i) << ", ";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2060
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2061 octave_value val = varval (i);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2062
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2063 os << (val.is_defined () ? val.type_name () : " UNDEFINED") << ")"
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2064 << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2065 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2066 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2067
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2068 // If this is a nested scope, set access_link to nearest parent
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2069 // stack frame that corresponds to the lexical parent of this scope.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2070
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2071 std::shared_ptr<stack_frame>
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2072 user_fcn_stack_frame::get_access_link (octave_user_function *fcn,
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2073 const std::shared_ptr<stack_frame>& static_link)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2074 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2075 std::shared_ptr<stack_frame> alink;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2076
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2077 symbol_scope fcn_scope = fcn->scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2078
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2079 if (fcn_scope.is_nested ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2080 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2081 if (! static_link)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2082 error ("internal call stack error (invalid static link)");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2083
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2084 symbol_scope caller_scope = static_link->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2085
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2086 int nesting_depth = fcn_scope.nesting_depth ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2087 int caller_nesting_depth = caller_scope.nesting_depth ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2088
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2089 if (caller_nesting_depth < nesting_depth)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2090 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2091 // FIXME: do we need to ensure that the called
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2092 // function is a child of the caller? Does it hurt
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2093 // to assert this condition, at least for now?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2094
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2095 alink = static_link;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2096 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2097 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2098 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2099 // FIXME: do we need to check that the parent of the
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2100 // called function is also a parent of the caller?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2101 // Does it hurt to assert this condition, at least
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2102 // for now?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2103
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2104 int links_to_follow = caller_nesting_depth - nesting_depth + 1;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2105
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2106 alink = static_link;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2107
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2108 while (alink && --links_to_follow >= 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2109 alink = alink->access_link ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2110
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2111 if (! alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2112 error ("internal function nesting error (invalid access link)");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2113 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2114 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2115
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2116 return alink;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2117 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2118
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2119 void user_fcn_stack_frame::clear_values (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2120 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2121 symbol_scope fcn_scope = m_fcn->scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2122
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2123 const std::list<symbol_record>& symbols = fcn_scope.symbol_list ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2124
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2125 if (size () == 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2126 return;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2127
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2128 for (const auto& sym : symbols)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2129 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2130 size_t frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2131
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2132 if (frame_offset > 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2133 continue;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2134
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2135 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2136
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2137 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2138 continue;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2139
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2140 if (get_scope_flag (data_offset) == LOCAL)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2141 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2142 octave_value& ref = m_values.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2143
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2144 if (ref.get_count () == 1)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2145 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2146 ref.call_object_destructor ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2147 ref = octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2148 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2149 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2150 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2151 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2152
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2153 unwind_protect * user_fcn_stack_frame::unwind_protect_frame (void)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2154 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2155 if (! m_unwind_protect_frame)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2156 m_unwind_protect_frame = new unwind_protect ();
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2157
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2158 return m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2159 }
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2160
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2161 symbol_record user_fcn_stack_frame::lookup_symbol (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2162 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2163 const stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2164
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2165 while (frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2166 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2167 symbol_scope scope = frame->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2168
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2169 symbol_record sym = scope.lookup_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2170
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2171 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2172 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2173
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2174 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2175 frame = nxt.get ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2176 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2177
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2178 return symbol_record ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2179 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2180
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2181 symbol_record user_fcn_stack_frame::insert_symbol (const std::string& name)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2182 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2183 // If the symbols is already in the immediate scope, there is
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2184 // nothing more to do.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2185
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2186 symbol_scope scope = get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2187
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2188 symbol_record sym = scope.lookup_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2189
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2190 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2191 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2192
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2193 // FIXME: This needs some thought... We may need to add a symbol to
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2194 // a static workspace, but the symbol can never be defined as a
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2195 // variable. This currently works by tagging the added symbol as
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2196 // "added_static". Aside from the bad name, this doesn't seem like
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2197 // the best solution. Maybe scopes should have a separate set of
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2198 // symbols that may only be defined as functions?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2199
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2200 // Insert the symbol in the current scope. This is not possible for
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2201 // anonymous functions, nested functions, or functions that contain
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2202 // nested functions (their scopes will all be marked static).
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2203
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2204 // if (scope.is_static ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2205 // error ("can not add variable '%s' to a static workspace",
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2206 // name.c_str ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2207
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2208 // At this point, non-local references are not possible so we only
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2209 // need to look in the current scope and insert there. This
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2210 // operation should never fail.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2211
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2212 sym = scope.find_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2213
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2214 assert (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2215
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2216 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2217 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2218
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2219 stack_frame::scope_flags
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2220 user_fcn_stack_frame::scope_flag (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2221 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2222 size_t frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2223 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2224
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2225 // Follow frame_offset access links to stack frame that holds
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2226 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2227
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2228 const stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2229
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2230 for (size_t i = 0; i < frame_offset; i++)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2231 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2232 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2233 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2234 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2235
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2236 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2237 error ("internal error: invalid access link in function call stack");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2238
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2239 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2240 return LOCAL;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2241
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2242 return frame->get_scope_flag (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2243 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2244
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2245 octave_value user_fcn_stack_frame::varval (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2246 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2247 size_t frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2248 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2249
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2250 // Follow frame_offset access links to stack frame that holds
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2251 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2252
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2253 const stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2254
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2255 for (size_t i = 0; i < frame_offset; i++)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2256 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2257 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2258 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2259 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2260
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2261 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2262 error ("internal error: invalid access link in function call stack");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2263
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2264 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2265 return octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2266
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2267 switch (frame->get_scope_flag (data_offset))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2268 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2269 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2270 return frame->varval (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2271
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2272 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2273 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2274 symbol_scope scope = frame->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2275
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2276 return scope.persistent_varval (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2277 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2278
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2279 case GLOBAL:
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
2280 return m_evaluator.global_varval (sym.name ());
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2281 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2282
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2283 error ("internal error: invalid switch case");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2284 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2285
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2286 octave_value& user_fcn_stack_frame::varref (const symbol_record& sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2287 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2288 size_t frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2289 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2290
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2291 // Follow frame_offset access links to stack frame that holds
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2292 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2293
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2294 stack_frame *frame = this;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2295
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2296 for (size_t i = 0; i < frame_offset; i++)
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2297 {
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2298 std::shared_ptr<stack_frame> nxt = frame->access_link ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2299 frame = nxt.get ();
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28425
diff changeset
2300 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2301
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2302 if (data_offset >= frame->size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2303 frame->resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2304
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2305 switch (frame->get_scope_flag (data_offset))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2306 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2307 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2308 return frame->varref (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2309
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2310 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2311 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2312 symbol_scope scope = frame->get_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2313
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2314 return scope.persistent_varref (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2315 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2316
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2317 case GLOBAL:
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
2318 return m_evaluator.global_varref (sym.name ());
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2319 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2320
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2321 error ("internal error: invalid switch case");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2322 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2323
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2324 void user_fcn_stack_frame::mark_scope (const symbol_record& sym, scope_flags flag)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2325 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2326 size_t frame_offset = sym.frame_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2327
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2328 if (frame_offset > 0 && (flag == PERSISTENT || flag == GLOBAL))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2329 error ("variables must be made PERSISTENT or GLOBAL in the first scope in which they are used");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2330
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2331 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2332
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2333 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2334 resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2335
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2336 set_scope_flag (data_offset, flag);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2337 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2338
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2339 void user_fcn_stack_frame::display (bool follow) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2340 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2341 std::ostream& os = octave_stdout;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2342
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2343 os << "-- [user_fcn_stack_frame] (" << this << ") --" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2344 base_value_stack_frame::display (follow);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2345
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2346 os << "fcn: " << m_fcn->name ()
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2347 << " (" << m_fcn->type_name () << ")" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2348
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2349 display_scope (os, get_scope ());
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27923
diff changeset
2350 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2351
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2352 void user_fcn_stack_frame::accept (stack_frame_walker& sfw)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2353 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2354 sfw.visit_user_fcn_stack_frame (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2355 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2356
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2357 void user_fcn_stack_frame::break_closure_cycles (const std::shared_ptr<stack_frame>& frame)
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2358 {
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2359 for (auto& val : m_values)
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2360 val.break_closure_cycles (frame);
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2361
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2362 if (m_access_link)
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2363 m_access_link->break_closure_cycles (frame);
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2364 }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2365
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2366 symbol_record scope_stack_frame::insert_symbol (const std::string& name)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2367 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2368 // There is no access link for scope frames, so there is no other
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2369 // frame to search in and the offset must be zero.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2370
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2371 symbol_record sym = m_scope.lookup_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2372
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2373 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2374 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2375
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2376 // If the symbol is not found, insert it. We only need to search in
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2377 // the local scope object. This operation should never fail.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2378
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2379 sym = m_scope.find_symbol (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2380
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2381 assert (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2382
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2383 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2384 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2385
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2386 stack_frame::scope_flags
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2387 scope_stack_frame::scope_flag (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2388 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2389 // There is no access link for scope frames, so the frame
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2390 // offset must be zero.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2391
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2392 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2393
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2394 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2395 return LOCAL;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2396
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2397 return get_scope_flag (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2398 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2399
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2400 octave_value scope_stack_frame::varval (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2401 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2402 // There is no access link for scope frames, so the frame
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2403 // offset must be zero.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2404
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2405 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2406
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2407 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2408 return octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2409
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2410 switch (get_scope_flag (data_offset))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2411 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2412 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2413 return m_values.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2414
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2415 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2416 return m_scope.persistent_varval (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2417
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2418 case GLOBAL:
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
2419 return m_evaluator.global_varval (sym.name ());
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2420 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2421
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2422 error ("internal error: invalid switch case");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2423 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2424
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2425 octave_value& scope_stack_frame::varref (const symbol_record& sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2426 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2427 // There is no access link for scope frames, so the frame
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2428 // offset must be zero.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2429
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2430 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2431
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2432 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2433 resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2434
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2435 switch (get_scope_flag (data_offset))
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2436 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2437 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2438 return m_values.at (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2439
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2440 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2441 return m_scope.persistent_varref (data_offset);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2442
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2443 case GLOBAL:
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
2444 return m_evaluator.global_varref (sym.name ());
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2445 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2446
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2447 error ("internal error: invalid switch case");
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2448 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2449
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2450 void scope_stack_frame::mark_scope (const symbol_record& sym,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2451 scope_flags flag)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2452 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2453 // There is no access link for scope frames, so the frame
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2454 // offset must be zero.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2455
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2456 size_t data_offset = sym.data_offset ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2457
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2458 if (data_offset >= size ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2459 resize (data_offset+1);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2460
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2461 set_scope_flag (data_offset, flag);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2462 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2463
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2464 void scope_stack_frame::display (bool follow) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2465 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2466 std::ostream& os = octave_stdout;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2467
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2468 os << "-- [scope_stack_frame] (" << this << ") --" << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2469 base_value_stack_frame::display (follow);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2470
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2471 display_scope (os, m_scope);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2472 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2473
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2474 void scope_stack_frame::accept (stack_frame_walker& sfw)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2475 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2476 sfw.visit_scope_stack_frame (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2477 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2478 }