annotate libinterp/corefcn/stack-frame.cc @ 30564:796f54d4ddbf stable

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2021. In all .txi and .texi files except gpl.txi and gpl.texi in the doc/liboctave and doc/interpreter directories, change the copyright to "Octave Project Developers", the same as used for other source files. Update copyright notices for 2022 (not done since 2019). For gpl.txi and gpl.texi, change the copyright notice to be "Free Software Foundation, Inc." and leave the date at 2007 only because this file only contains the text of the GPL, not anything created by the Octave Project Developers. Add Paul Thomas to contributors.in.
author John W. Eaton <jwe@octave.org>
date Tue, 28 Dec 2021 18:22:40 -0500
parents 3e419a830e90
children 83f9f8bda883
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 //
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 30200
diff changeset
3 // Copyright (C) 1995-2022 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,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
59 std::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,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
180 std::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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
198 static std::size_t get_num_symbols (octave_user_script *script);
28425
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,
30199
37ddca7ad9cb avoid internal error and segfault with eval and scripts (bug #61191)
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
203 symbol_record>& symbols);
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
217 std::size_t size (void) const { return m_lexical_frame_offsets.size (); }
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
218
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
219 void resize (std::size_t size)
28425
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,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
226 std::size_t& frame_offset,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
227 std::size_t& data_offset);
28425
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,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
230 std::size_t& frame_offset,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
231 std::size_t& data_offset) const;
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
232
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
233 bool get_val_offsets (const symbol_record& sym, std::size_t& frame_offset,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
234 std::size_t& data_offset) const;
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
279 std::vector<std::size_t> m_lexical_frame_offsets;
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
280 std::vector<std::size_t> m_value_offsets;
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
292 base_value_stack_frame (tree_evaluator& tw, std::size_t num_symbols,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
293 std::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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
310 std::size_t size (void) const
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
315 void resize (std::size_t size)
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
321 stack_frame::scope_flags get_scope_flag (std::size_t data_offset) const
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
326 void set_scope_flag (std::size_t data_offset, scope_flags flag)
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
347 octave_value varval (std::size_t data_offset) const
28425
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
352 octave_value& varref (std::size_t data_offset)
28425
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,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
399 std::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,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
412 std::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,
29477
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
415 const local_vars_map& local_vars,
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
416 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
417 : 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
418 parent_link, static_link,
29477
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
419 (access_link
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
420 ? access_link
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
421 : get_access_link (fcn, 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
422 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
423 {
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
424 // 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
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 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
427 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
428 }
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
429
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
430 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
431
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
432 user_fcn_stack_frame&
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
433 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
434
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
435 ~user_fcn_stack_frame (void)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
436 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
437 delete m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
438 }
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
439
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
440 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
441
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
442 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
443 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
444 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
445
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
446 static std::size_t get_num_symbols (octave_user_function *fcn)
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
447 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
448 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
449
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
450 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
451 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
452
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
453 void clear_values (void);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
454
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
455 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
456
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
457 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
458
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
459 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
460
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
461 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
462
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
463 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
464
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
465 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
466
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
467 // 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
468 // 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
469 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
470 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
471 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
472
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
473 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
474
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
475 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
476
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
477 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
478
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
479 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
480
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
481 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
482
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
483 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
484
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
485 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
486
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
487 // 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
488 // always be valid.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
489 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
490
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
491 // 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
492 // 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
493 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
494 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
495
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
496 // 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
497 // 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
498 // 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
499 //
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
500 // 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
501 // 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
502
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
503 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
504 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
505 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
506
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
507 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
508
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
509 scope_stack_frame (tree_evaluator& tw, const symbol_scope& scope,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
510 std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
511 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
512 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
513 : 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
514 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
515 m_scope (scope)
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
518 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
519
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
520 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
521
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
522 ~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
523
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
524 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
525
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
526 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
527
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
528 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
529 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
530 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
531 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
532
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
533 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
534
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
535 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
536
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
537 // 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
538 // 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
539 // virtual functions.
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
540 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
541 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
542
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
543 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
544
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
545 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
546
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
547 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
548
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
549 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
550
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
551 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
552
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
553 private:
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 // 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
556 symbol_scope m_scope;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
557 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
558
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
559 // 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
560 // 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
561 // 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
562
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
563 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
564 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
565 if (scope)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
566 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
567 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
568
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
569 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
570 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
571 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
572 << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
573
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
574 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
575
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
576 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
577 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
578 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
579 << ", " << 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
580 << ")" << std::endl;
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 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
583 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
584 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
585
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
586 class stack_frame_walker
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
587 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
588 protected:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
589
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
590 stack_frame_walker (void) { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
591
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
592 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
593
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
594 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
595
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
596 // No copying!
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
597
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
598 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
599
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
600 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
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_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
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_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
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_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
610
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
611 virtual void
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
612 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
613 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
614
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
615 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
616 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
617 public:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
618
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
619 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
620 : 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
621 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
622 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
623 { }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
624
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
625 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
626 : 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
627 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
628 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
629 { }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
630
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
631 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
632 : 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
633 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
634 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
635 { }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
636
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
637 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
638
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
639 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
640
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
641 ~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
642
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
643 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
644 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
645 // 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
646 // 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
647 // link?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
648
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
649 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
650
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
651 if (slink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
652 slink->accept (*this);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
653 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
654
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
655 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
656 {
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
657 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
658
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
659 if (alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
660 alink->accept (*this);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
663 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
664 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
665 clean_frame (frame);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
666
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
667 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
668
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
669 if (alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
670 alink->accept (*this);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
673 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
674 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
675 clean_frame (frame);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
676
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
677 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
678
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
679 if (alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
680 alink->accept (*this);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
683 private:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
684
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
685 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
686 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
687 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
688
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
689 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
690 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
691 // 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
692 // 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
693 // 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
694
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
695 // 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
696 // 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
697 // 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
698
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
699 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
700 return;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
701
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
702 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
703
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
704 frame.clear (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
705 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
706 }
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 // 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
709 // function.
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 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
712 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
713 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
714 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
715 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
716 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
717 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
718 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
719 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
720 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
721 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
722
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
723 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
724 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
725 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
726
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
727 regexp pat (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
728
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
729 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
730 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
731 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
732 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
733 }
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 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
736 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
737 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
738 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
739
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
740 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
741 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
742 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
743
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
744 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
745
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
746 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
747 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
748 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
749 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
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 }
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
755 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
756 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
757 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
758
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
759 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
760
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
761 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
762 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
763 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
764
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
765 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
766
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
767 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
768 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
769 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
770
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
771 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
772 };
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
773
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
774 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
775 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
776 public:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
777
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
778 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
779 bool have_regexp = false)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
780 : 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
781 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
782 m_found_names ()
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
783 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
784
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
785 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
786 bool have_regexp = false)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
787 : 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
788 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
789 m_found_names ()
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
790 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
791
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
792 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
793 : 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
794 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
795 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
796 { }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
797
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
798 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
799
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
800 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
801
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
802 ~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
803
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
804 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
805 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
806 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
807 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
808 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
809
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
810 if (! lst.empty ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
811 return false;
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 return true;
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
817 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
818 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
819 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
820
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
821 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
822 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
823 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
824
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
825 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
826
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
827 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
828 retval.push_back (nm);
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 return retval;
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
834 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
835 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
836 symbol_info_list retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
837
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
838 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
839 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
840 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
841
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
842 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
843 retval.push_back (syminf);
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 return retval;
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
849 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
850 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
851 octave_map retval;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
852
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
853 // 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
854
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
855 std::size_t n_frames = m_sym_inf_list.size ();
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
856
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
857 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
858
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
859 std::size_t j = 0;
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
860 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
861 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
862 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
863 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
864
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
865 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
866
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
867 j++;
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 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
871 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
872
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
873 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
874 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
875 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
876 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
877 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
878
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
879 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
880
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
881 lst.display (os, format);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
882 }
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
885 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
886 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
887 // 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
888 // 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
889 // link?
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
890
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
891 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
892
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
893 if (slink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
894 slink->accept (*this);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
895 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
896
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
897 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
898 {
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
899 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
900
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
901 if (alink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
902 alink->accept (*this);
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
905 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
906 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
907 append_list (frame);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
908
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
909 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
910
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
911 if (alink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
912 alink->accept (*this);
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
915 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
916 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
917 append_list (frame);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
918
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
919 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
920
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
921 if (alink)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
922 alink->accept (*this);
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
925 private:
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
926
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
927 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
928
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
929 // 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
930 // 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
931 // 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
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>
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
934 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
935 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
936 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
937
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
938 if (m_match_all)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
939 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
940 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
941 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
942 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
943 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
944 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
945
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
946 if (m_first_only
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
947 && 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
948 continue;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
949
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
950 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
951
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
952 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
953 }
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 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
956 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
957 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
958 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
959
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
960 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
961 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
962 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
963
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
964 regexp pat (pattern);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
965
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
966 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
967 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
968 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
969
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
970 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
971 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
972 if (m_first_only
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
973 && 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
974 continue;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
975
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
976 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
977
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
978 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
979 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
980 }
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 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
983 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
984 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
985 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
986
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
987 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
988 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
989 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
990
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
991 glob_match pat (pattern);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
992
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
993 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
994 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
995 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
996
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
997 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
998 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
999 if (m_first_only
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1000 && 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
1001 continue;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1002
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1003 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
1004
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1005 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
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 }
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 return new_symbols;
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
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1014 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
1015 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1016 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
1017
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1018 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
1019
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1020 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
1021 symbols = filter (frame, symbols);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1022
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1023 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
1024
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1025 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
1026 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1027
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1028 string_vector m_patterns;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1029
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1030 bool m_match_all;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1031 bool m_first_only;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1032 bool m_have_regexp;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1033
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1034 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
1035
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1036 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
1037 };
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1038
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1039 stack_frame * stack_frame::create (tree_evaluator& tw, octave_function *fcn,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1040 std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1041 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
1042 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
1043 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1044 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
1045 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1046
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1047 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
1048 octave_user_script *script,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1049 std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1050 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
1051 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
1052 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1053 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
1054 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1055
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1056 stack_frame * stack_frame::create (tree_evaluator& tw,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1057 octave_user_function *fcn, std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1058 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
1059 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
1060 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
1061 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1062 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
1063 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1064
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1065 stack_frame * stack_frame::create (tree_evaluator& tw,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1066 octave_user_function *fcn, std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1067 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
1068 const std::shared_ptr<stack_frame>& static_link,
29477
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
1069 const local_vars_map& local_vars,
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
1070 const std::shared_ptr<stack_frame>& access_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
1071 {
29477
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29476
diff changeset
1072 return new user_fcn_stack_frame (tw, fcn, index, parent_link, static_link, local_vars, access_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
1073 }
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1074
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
1075 stack_frame * stack_frame::create (tree_evaluator& tw,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1076 const symbol_scope& scope, std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1077 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
1078 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
1079 {
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1080 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
1081 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1082
29064
336356206de7 don't clear stack frame values indirectly through call stack (bug #59432)
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1083 // 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
1084 // 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
1085 // 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
1086
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1087 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
1088 {
29064
336356206de7 don't clear stack frame values indirectly through call stack (bug #59432)
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1089 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
1090 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1091
28329
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1092 symbol_info_list
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1093 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
1094 {
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1095 symbol_info_list symbol_stats;
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 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
1098 {
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1099 octave_value value = varval (sym);
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1100
29854
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1101 if (! value.is_defined ()
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1102 || (is_user_fcn_frame () && sym.frame_offset () > 0))
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1103 continue;
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1104
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1105 symbol_info syminf (sym.name (), value, sym.is_formal (),
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1106 is_global (sym), is_persistent (sym));
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1107
2bb72743d3eb who() should not display duplicate named variables from different scopes (bug #60845).
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
1108 symbol_stats.append (syminf);
28329
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1109 }
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1110
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1111 return symbol_stats;
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1112 }
6349915869f2 move function definition from header to source file
John W. Eaton <jwe@octave.org>
parents: 28328
diff changeset
1113
28425
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1114 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
1115 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
1116 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
1117 const std::string& msg)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1118 {
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1119 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
1120
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1121 accept (sym_inf_accum);
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1122
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1123 if (return_list)
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 if (verbose)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1126 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
1127 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1128 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
1129 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1130 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
1131 {
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 (msg.empty ())
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1134 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
1135 else
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1136 octave_stdout << msg;
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1137
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1138 if (verbose)
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1139 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
1140 else
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 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
1144 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
1145 }
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 octave_stdout << "\n";
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1148 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1149
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1150 return octave_value ();
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1151 }
a5be4fc661d6 hide specific stack frame and stack frame walker classes
John W. Eaton <jwe@octave.org>
parents: 28329
diff changeset
1152
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1153 // 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
1154 // 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
1155
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1156 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
1157 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1158 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
1159
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1160 accept (sia);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1161
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1162 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
1163 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1164
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
1165 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
1166 {
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 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
1168
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 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
1170
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 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
1172 {
28857
43ad651cf5a0 eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents: 28793
diff changeset
1173 symbol_info_list symbols = frame->all_variables ();
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
1174
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 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
1176
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 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
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 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
1180
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 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
1182 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
1183 }
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 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
1186
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 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
1188 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
1189 }
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
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 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
1192
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 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
1194 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
1195 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
1196
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
1197 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
1198 }
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
1199
28327
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1200 // 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
1201 // 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
1202
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1203 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
1204 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1205 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
1206
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1207 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
1208
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1209 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
1210
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1211 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
1212 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1213 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
1214 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
1215 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1216
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1217 retval.sort ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1218
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1219 return retval;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1220 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1221
28327
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1222 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
1223 {
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1224 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
1225
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1226 accept (sia);
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 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
1229 }
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1230
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1231 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
1232 {
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1233 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
1234
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1235 accept (sia);
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1236
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1237 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
1238 }
8db2d4c9a64f correctly find all symbols in script when saving values (bug #58382)
John W. Eaton <jwe@octave.org>
parents: 27932
diff changeset
1239
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1240 std::size_t stack_frame::size (void) const
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1241 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1242 // 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
1243 // 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
1244 // the implementation.
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 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1247 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1248
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1249 void stack_frame::resize (std::size_t)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1250 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1251 // 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
1252 // 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
1253 // the implementation.
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 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1256 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1257
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1258 stack_frame::scope_flags stack_frame::get_scope_flag (std::size_t) const
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1259 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1260 // 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
1261 // 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
1262 // the implementation.
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 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1265 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1266
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1267 void stack_frame::set_scope_flag (std::size_t, scope_flags)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1268 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1269 // 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
1270 // 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
1271 // the implementation.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1272
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1273 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1274 }
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 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
1277 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
1278 {
26673
4271b53b24a6 when installing global variable don't warn if it is already global
John W. Eaton <jwe@octave.org>
parents: 26663
diff changeset
1279 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
1280 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1281 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
1282
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1283 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
1284 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1285 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
1286
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1287 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
1288 "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
1289 nm.c_str ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1290 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
1291 "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
1292
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1293 // 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
1294 // 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
1295 // 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
1296 // 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
1297 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
1298
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1299 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
1300 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1301 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
1302 "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
1303
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1304 clear (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1305 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1306 else
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 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
1309 "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
1310
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1311 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
1312 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1313 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1314
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1315 mark_global (sym);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1318 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
1319 assign (sym, value);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1320 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1321
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1322 octave_value stack_frame::varval (std::size_t) const
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1323 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1324 // 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
1325 // 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
1326 // the implementation.
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 panic_impossible ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1329 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1330
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1331 octave_value& stack_frame::varref (std::size_t)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1332 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1333 // 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
1334 // 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
1335 // the implementation.
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 panic_impossible ();
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1340 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
1341 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1342 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
1343
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1344 accept (sc);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1347 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
1348 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1349 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
1350
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1351 accept (sc);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1354 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
1355 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1356 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
1357
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1358 accept (sc);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1361 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
1362 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1363 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
1364
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1365 accept (sc);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1368 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
1369 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1370 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
1371
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1372 accept (sc);
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1375 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
1376 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1377 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
1378
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1379 accept (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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1382 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
1383 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1384 symbol_cleaner sc;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1385
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1386 accept (sc);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1387 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1388
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1389 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
1390 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1391 if (index () == 0)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1392 os << "at top level" << std::endl;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1393 else
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1394 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1395 os << "stopped in " << fcn_name ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1396
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1397 int l = line ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1398 if (l > 0)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1399 os << " at line " << line ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1400
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1401 os << " [" << fcn_file_name () << "] " << std::endl;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1402 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1403 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 26824
diff changeset
1404
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1405 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
1406 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1407 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
1408
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1409 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
1410
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1411 os << "parent link: ";
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1412 if (m_parent_link)
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1413 os << m_parent_link.get ();
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1414 else
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1415 os << "NULL";
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1416 os << std::endl;
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1417
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1418 os << "static link: ";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1419 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
1420 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
1421 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1422 os << "NULL";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1423 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1424
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1425 os << "access link: ";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1426 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
1427 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
1428 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1429 os << "NULL";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1430 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1431
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1432 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
1433 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
1434 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
1435
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1436 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1437
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1438 if (! follow)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1439 return;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1440
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1441 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
1442 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
1443 while (frm)
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 frm->display (false);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1446 os << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1447
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1448 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
1449 }
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1452 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
1453 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1454 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
1455
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1456 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
1457 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
1458
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1459 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
1460 << " (" << 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
1461 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1462
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1463 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
1464 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1465 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
1466 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1467
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27149
diff changeset
1468 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
1469 octave_user_script *script,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1470 std::size_t index,
28793
c5953e65c6aa track direct caller in stack frames
John W. Eaton <jwe@octave.org>
parents: 28538
diff changeset
1471 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
1472 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
1473 : 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
1474 get_access_link (static_link)),
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1475 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
1476 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
1477 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
1478 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1479 set_script_offsets ();
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
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1482 std::size_t script_stack_frame::get_num_symbols (octave_user_script *script)
26661
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 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
1485
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1486 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
1487 }
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 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
1490 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1491 // 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
1492 // scope(s).
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1493
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1494 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
1495
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1496 std::size_t num_script_symbols = script_scope.num_symbols ();
26661
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 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
1499
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1500 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
1501 = script_scope.symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1502
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1503 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
1504 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1505
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1506 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
1507 (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
1508 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1509 // 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
1510 // 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
1511
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1512 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
1513
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1514 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
1515 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1516 bool found = false;
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 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
1519 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1520 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
1521 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
1522
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1523 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
1524
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1525 std::size_t count = 1;
26661
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 while (parent_scope)
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 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
1530 = parent_scope.symbols ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1531
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1532 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
1533
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1534 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
1535 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1536 found = true;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1537 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
1538
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1539 std::size_t script_sr_data_offset = script_sr.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1540
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1541 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
1542 = 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
1543
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1544 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
1545 = 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
1546
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1547 break;
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 else
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 count++;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1552 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
1553 }
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 if (! found)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1557 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
1558 name.c_str ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1559 }
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 else
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 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
1564 = eval_scope.symbols ();
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 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
1567 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1568 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
1569 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
1570
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1571 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
1572
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1573 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
1574
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1575 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
1576 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
1577 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1578 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
1579
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1580 std::size_t script_sr_data_offset = script_sr.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1581
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1582 // 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
1583 // 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
1584
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1585 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
1586 = 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
1587
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1588 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
1589 = 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
1590 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1591 }
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1594 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
1595 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1596 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1597
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1598 // 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
1599 // 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
1600 // 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
1601
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1602 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
1603
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1604 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
1605
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1606 // 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
1607 // 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
1608 // 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
1609
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1610 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
1611 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
1612 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
1613 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1614
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1615 // 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
1616 // 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
1617
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
1618 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
1619 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
1620 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1621 // 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
1622 // 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
1623
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
1624 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
1625
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1626 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
1627 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1628 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
1629 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
1630 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1631 break;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1632 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1633
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1634 return alink;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1635 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1636
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1637 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
1638 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1639 if (! m_unwind_protect_frame)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1640 m_unwind_protect_frame = new unwind_protect ();
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1641
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1642 return m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1643 }
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
1644
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1645 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
1646 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1647 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
1648
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1649 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
1650
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1651 if (sym)
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 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
1654
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1655 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1656 }
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 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
1659
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1660 // 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
1661 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
1662
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1663 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
1664
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1665 return new_sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1666 }
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_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
1669 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1670 // 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
1671 // 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
1672
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1673 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
1674
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1675 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
1676
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1677 if (sym)
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 // 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
1680 // 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
1681 // 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
1682 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
1683
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1684 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1685 }
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 // 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
1688 // 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
1689
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1690 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
1691
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1692 assert (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1693
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1694 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
1695
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1696 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1697 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1698
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
1699 // 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
1700 // 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
1701 // 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
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
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 script_stack_frame::get_val_offsets_internal (const symbol_record& script_sr,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1705 std::size_t& frame_offset,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1706 std::size_t& data_offset) const
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
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 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
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 // 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
1711 // 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
1712
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 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
1714
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 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
1716 {
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 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
1718
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 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
1720
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1721 std::size_t count = 1;
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
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 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
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 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
1726 = 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
1727
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 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
1729
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1730 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
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 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
1733 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
1734
28538
c09bc9e108b5 fix lookup of variables in scripts called inside nested functions (bug #58691)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
1735 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
1736
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 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
1738
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 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
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 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
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 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
1744 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
1745 }
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 }
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 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
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 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
1751 = 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
1752
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 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
1754
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 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
1756
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 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
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 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
1760 {
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 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
1762 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
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 // 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
1765 // 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
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 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
1768
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 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
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 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1772
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1773 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
1774 }
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1775
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1776 bool script_stack_frame::get_val_offsets (const symbol_record& sym,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1777 std::size_t& frame_offset,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1778 std::size_t& data_offset) const
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1779 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1780 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
1781 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
1782
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1783 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
1784 {
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
1785 // 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
1786 // 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
1787 // 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
1788 // 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
1789 // to do.
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1790
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1791 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
1792 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
1793
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1794 // 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
1795 // 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
1796 // 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
1797 // 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
1798 // invoked.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1799
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1800 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
1801
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1802 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
1803 {
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1804 // 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
1805 // 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
1806 // 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
1807 // 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
1808 // 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
1809
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1810 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
1811 }
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1812
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1813 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
1814 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1815 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1816 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1817 // 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
1818 // 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
1819 // 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
1820 }
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
1821
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1822 return true;
26661
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1825 void script_stack_frame::get_val_offsets_with_insert (const symbol_record& sym,
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1826 std::size_t& frame_offset,
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1827 std::size_t& data_offset)
26661
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 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
1830 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
1831
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1832 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
1833 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1834 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
1835 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1836 // 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
1837 // 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
1838 // update the offsets.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1839
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1840 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
1841 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1842
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1843 // 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
1844 // 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
1845 // 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
1846 // 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
1847 // invoked.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1848
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1849 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
1850
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1851 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
1852 {
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1853 // 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
1854 // 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
1855 // 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
1856 // 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
1857 // 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
1858
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1859 // 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
1860
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1861 // 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
1862 // 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
1863 // 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
1864 // duplication?
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1865
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1866 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
1867 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
1868 set_script_offsets_internal (tmp_symbols);
30199
37ddca7ad9cb avoid internal error and segfault with eval and scripts (bug #61191)
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
1869
37ddca7ad9cb avoid internal error and segfault with eval and scripts (bug #61191)
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
1870 // set_script_offsets_internal may have modified
37ddca7ad9cb avoid internal error and segfault with eval and scripts (bug #61191)
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
1871 // m_lexical_frame_offsets and m_value_offsets.
37ddca7ad9cb avoid internal error and segfault with eval and scripts (bug #61191)
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
1872
37ddca7ad9cb avoid internal error and segfault with eval and scripts (bug #61191)
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
1873 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
1874 }
61226b7bd6b9 fix calculation of value offsets for variables added to script scopes
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
1875
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1876 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
1877 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1878 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1879 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1880 // 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
1881 // 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
1882 // 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
1883 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1884 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1885
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1886 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
1887 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
1888 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1889 std::size_t frame_offset;
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1890 std::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
1891
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1892 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
1893
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1894 // 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
1895 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
1896 return LOCAL;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1897
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1898 // 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
1899 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1900
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1901 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
1902
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1903 for (std::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
1904 {
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
1905 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
1906 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
1907 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1908
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1909 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1910 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
1911
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1912 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
1913 return LOCAL;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1914
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1915 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
1916 }
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 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
1919 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1920 std::size_t frame_offset;
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1921 std::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
1922
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1923 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
1924
fad3f19de1be don't fail if symbol in script can't be found (bug #55626)
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1925 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
1926 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
1927
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1928 // 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
1929 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1930
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1931 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
1932
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1933 for (std::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
1934 {
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
1935 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
1936 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
1937 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1938
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1939 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1940 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
1941
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1942 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
1943 return octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1944
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1945 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
1946 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1947 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1948 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
1949
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1950 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1951 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1952 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
1953
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1954 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
1955 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1956
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1957 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
1958 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
1959 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1960
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1961 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
1962 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1963
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1964 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
1965 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1966 std::size_t frame_offset;
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1967 std::size_t data_offset;
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1968 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
1969
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1970 // 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
1971 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1972
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1973 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
1974
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
1975 for (std::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
1976 {
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
1977 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
1978 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
1979 }
26661
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 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
1982 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
1983
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1984 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
1985 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1986 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1987 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
1988
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1989 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1990 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1991 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
1992
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1993 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
1994 }
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 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
1997 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
1998 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1999
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2000 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
2001 }
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 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
2004 scope_flags flag)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2005 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2006 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2007
29324
1a20cb5be8da avoid crash when evaling global variables into existence in script (bug #59937)
John W. Eaton <jwe@octave.org>
parents: 29064
diff changeset
2008 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
2009 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
2010
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2011 // 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
2012
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2013 std::size_t frame_offset = m_lexical_frame_offsets.at (data_offset);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2014 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
2015
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2016 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
2017 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
2018
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
2019 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
2020
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2021 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
2022 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
2023
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2024 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
2025 }
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 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
2028 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2029 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
2030
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2031 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
2032 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
2033
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2034 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
2035 << " (" << 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
2036
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2037 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
2038 << " elements:";
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2039
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2040 for (std::size_t i = 0; i < m_lexical_frame_offsets.size (); i++)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2041 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
2042 os << std::endl;
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 os << "value_offsets: " << m_value_offsets.size () << " elements:";
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2045 for (std::size_t i = 0; i < m_value_offsets.size (); i++)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2046 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
2047 os << std::endl;
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 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
2050 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2051
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2052 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
2053 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2054 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
2055 }
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 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
2058 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2059 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
2060
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2061 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
2062 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
2063
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2064 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
2065 << " 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
2066
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2067 for (std::size_t i = 0; i < m_values.size (); i++)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2068 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2069 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
2070
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2071 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
2072
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2073 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
2074 << std::endl;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2075 }
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2078 // 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
2079 // 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
2080
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
2081 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
2082 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
2083 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
2084 {
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
2085 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
2086
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2087 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
2088
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2089 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
2090 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2091 if (! static_link)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2092 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
2093
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2094 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
2095
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2096 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
2097 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
2098
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2099 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
2100 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2101 // 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
2102 // 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
2103 // 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
2104
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2105 alink = static_link;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2106 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2107 else
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2108 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2109 // 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
2110 // 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
2111 // 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
2112 // for now?
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 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
2115
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2116 alink = static_link;
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 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
2119 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
2120
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2121 if (! alink)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2122 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
2123 }
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2126 return alink;
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2129 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
2130 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2131 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
2132
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2133 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
2134
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2135 if (size () == 0)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2136 return;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2137
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2138 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
2139 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2140 std::size_t frame_offset = sym.frame_offset ();
26661
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 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
2143 continue;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2144
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2145 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2146
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2147 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
2148 continue;
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 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
2151 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2152 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
2153
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2154 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
2155 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2156 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
2157 ref = octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2158 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2159 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2160 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2161 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2162
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2163 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
2164 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2165 if (! m_unwind_protect_frame)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2166 m_unwind_protect_frame = new unwind_protect ();
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2167
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2168 return m_unwind_protect_frame;
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2169 }
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2170
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2171 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
2172 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2173 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
2174
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2175 while (frame)
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 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
2178
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2179 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
2180
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2181 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2182 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2183
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
2184 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
2185 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
2186 }
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 return symbol_record ();
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2191 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
2192 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2193 // 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
2194 // 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
2195
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2196 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
2197
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2198 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
2199
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2200 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2201 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2202
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2203 // 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
2204 // 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
2205 // 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
2206 // "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
2207 // 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
2208 // 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
2209
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2210 // 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
2211 // 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
2212 // 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
2213
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2214 // 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
2215 // 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
2216 // name.c_str ());
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 // 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
2219 // 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
2220 // 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
2221
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2222 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
2223
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2224 assert (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2225
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2226 return sym;
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
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2229 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
2230 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
2231 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2232 std::size_t frame_offset = sym.frame_offset ();
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2233 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2234
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2235 // 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
2236 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2237
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2238 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
2239
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2240 for (std::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
2241 {
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
2242 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
2243 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
2244 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2245
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2246 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2247 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
2248
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2249 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
2250 return LOCAL;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2251
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2252 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
2253 }
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 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
2256 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2257 std::size_t frame_offset = sym.frame_offset ();
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2258 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2259
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2260 // 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
2261 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2262
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2263 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
2264
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2265 for (std::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
2266 {
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
2267 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
2268 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
2269 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2270
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2271 if (! frame)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2272 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
2273
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2274 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
2275 return octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2276
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2277 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
2278 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2279 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2280 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
2281
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2282 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2283 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2284 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
2285
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2286 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
2287 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2288
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2289 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
2290 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
2291 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2292
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2293 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
2294 }
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 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
2297 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2298 std::size_t frame_offset = sym.frame_offset ();
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2299 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2300
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2301 // 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
2302 // the value.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2303
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2304 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
2305
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2306 for (std::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
2307 {
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
2308 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
2309 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
2310 }
26661
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 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
2313 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
2314
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2315 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
2316 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2317 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2318 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
2319
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2320 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2321 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2322 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
2323
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2324 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
2325 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2326
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2327 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
2328 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
2329 }
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 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
2332 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2333
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2334 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
2335 {
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2336 std::size_t frame_offset = sym.frame_offset ();
26661
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 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
2339 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
2340
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2341 std::size_t data_offset = sym.data_offset ();
26661
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 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
2344 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
2345
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2346 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
2347 }
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 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
2350 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2351 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
2352
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2353 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
2354 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
2355
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2356 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
2357 << " (" << 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
2358
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2359 display_scope (os, get_scope ());
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27923
diff changeset
2360 }
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2361
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2362 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
2363 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2364 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
2365 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2366
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2367 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
2368 {
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2369 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
2370 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
2371
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2372 if (m_access_link)
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2373 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
2374 }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
2375
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2376 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
2377 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2378 // 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
2379 // 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
2380
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2381 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
2382
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2383 if (sym)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2384 return sym;
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 // 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
2387 // 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
2388
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2389 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
2390
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2391 assert (sym);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2392
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2393 return sym;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2394 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2395
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2396 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
2397 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
2398 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2399 // 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
2400 // 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
2401
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2402 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2403
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2404 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
2405 return LOCAL;
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 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
2408 }
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 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
2411 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2412 // 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
2413 // 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
2414
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2415 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2416
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2417 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
2418 return octave_value ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2419
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2420 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
2421 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2422 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2423 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
2424
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2425 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2426 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
2427
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2428 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
2429 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
2430 }
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 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
2433 }
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 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
2436 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2437 // 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
2438 // 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
2439
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2440 std::size_t data_offset = sym.data_offset ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2441
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2442 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
2443 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
2444
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2445 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
2446 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2447 case LOCAL:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2448 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
2449
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2450 case PERSISTENT:
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2451 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
2452
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2453 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
2454 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
2455 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2456
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2457 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
2458 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2459
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2460 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
2461 scope_flags 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 // 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
2464 // 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
2465
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
2466 std::size_t data_offset = sym.data_offset ();
26661
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 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
2469 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
2470
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2471 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
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::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
2475 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2476 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
2477
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2478 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
2479 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
2480
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2481 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
2482 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2483
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2484 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
2485 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2486 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
2487 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2488 }