annotate libinterp/parse-tree/pt-eval.cc @ 29968:7aa4d8c049e5

eliminate obsolete DEFCONSTFUN and DEFCONSTMETHOD macros For some time now, DEFCONSTFUN and DEFCONSTMETHOD have been equivalent to DEFUN and DEFMETHOD so we might as well eliminate them. For now we will eliminate all handling of them in Octave but leave them as aliases in defun.h. * macros.dox: Don't mention DEFCONSTFUN or DEFCONSTMETHOD. * defun.h (DEFCONSTFUN, DEFCONSTMETHOD): Define as direct aliases of DEFUN and DEFMETHOD but eliminate documentation for them. * mk-builtins.pl, mk-doc.pl: Don't handle DEFCONSTFUN or DEFCONSTMETHOD. * pt-eval.cc (Fend): Define with DEFMETHOD instead of DEFCONSTMETHOD.
author John W. Eaton <jwe@octave.org>
date Sun, 15 Aug 2021 15:15:55 -0400
parents 7d6709900da7
children 75fb18f0469a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
29358
0a5b15007766 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29064
diff changeset
3 // Copyright (C) 2009-2021 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21542
diff changeset
26 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21211
diff changeset
27 # include "config.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 #endif
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
29
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 #include <cctype>
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31
29619
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
32 #include <condition_variable>
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 #include <iostream>
25438
cb1606f78f6b prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents: 25407
diff changeset
34 #include <list>
29619
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
35 #include <mutex>
25438
cb1606f78f6b prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents: 25407
diff changeset
36 #include <string>
29619
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
37 #include <thread>
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
39 #include "cmd-edit.h"
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
40 #include "file-ops.h"
27016
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
41 #include "file-stat.h"
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
42 #include "lo-array-errwarn.h"
27100
b453b586da16 improve error message when indexing undefined object with "end" (bug #33637)
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
43 #include "lo-ieee.h"
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
44 #include "oct-env.h"
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
45
23137
334119c390b3 move bp_table class to separate file
John W. Eaton <jwe@octave.org>
parents: 23110
diff changeset
46 #include "bp-table.h"
22091
0f6fc2ec3b1a move call_stack class to a separate file
John W. Eaton <jwe@octave.org>
parents: 21966
diff changeset
47 #include "call-stack.h"
26975
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
48 #include "cdef-manager.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49 #include "defun.h"
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
50 #include "error.h"
21100
e39e05d90788 Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents: 20962
diff changeset
51 #include "errwarn.h"
27263
99aa1bcb8848 rename octave_link and octave_link_events classes, move inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27261
diff changeset
52 #include "event-manager.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
53 #include "input.h"
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23587
diff changeset
54 #include "interpreter-private.h"
22094
9203833cab7d move new interpreter class to separate file
John W. Eaton <jwe@octave.org>
parents: 22091
diff changeset
55 #include "interpreter.h"
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
56 #include "octave.h"
26769
2f847e3e8d6b split classdef into multiple smaller source files
John W. Eaton <jwe@octave.org>
parents: 26718
diff changeset
57 #include "ov-classdef.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
58 #include "ov-fcn-handle.h"
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
59 #include "ov-usr-fcn.h"
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
60 #include "ov-re-sparse.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
61 #include "ov-cx-sparse.h"
26686
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
62 #include "parse.h"
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
63 #include "profiler.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
64 #include "pt-all.h"
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
65 #include "pt-anon-scopes.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
66 #include "pt-eval.h"
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
67 #include "pt-tm-const.h"
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
68 #include "stack-frame.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
69 #include "symtab.h"
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
70 #include "unwind-prot.h"
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
71 #include "utils.h"
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
72 #include "variables.h"
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
73
29960
939bef0b66e0 merge "namespace octave" and OCTAVE_NAMESPACE_BEGIN/END blocks
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
74 OCTAVE_NAMESPACE_BEGIN
939bef0b66e0 merge "namespace octave" and OCTAVE_NAMESPACE_BEGIN/END blocks
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
75
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
76 // Normal evaluator.
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
77
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
78 class quit_debug_exception
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
79 {
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
80 public:
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
81
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
82 quit_debug_exception (bool all = false) : m_all (all) { }
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
83
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
84 quit_debug_exception (const quit_debug_exception&) = default;
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
85
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
86 quit_debug_exception& operator = (const quit_debug_exception&) = default;
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
87
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
88 ~quit_debug_exception (void) = default;
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
89
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
90 bool all (void) const { return m_all; }
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
91
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
92 private:
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
93
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
94 bool m_all;
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
95 };
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
96
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
97 class debugger
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
98 {
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
99 public:
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
100
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
101 enum execution_mode
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
102 {
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
103 EX_NORMAL = 0,
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
104 EX_CONTINUE = 1,
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
105 EX_QUIT = 2,
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
106 EX_QUIT_ALL = 3
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
107 };
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
108
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
109 debugger (interpreter& interp, std::size_t level)
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
110 : m_interpreter (interp), m_level (level), m_debug_frame (0),
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
111 m_execution_mode (EX_NORMAL), m_in_debug_repl (false)
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
112 { }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
113
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
114 int server_loop (void);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
115
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
116 void repl (const std::string& prompt = "debug> ");
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
117
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
118 bool in_debug_repl (void) const { return m_in_debug_repl; }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
119
29306
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
120 void dbcont (void) { m_execution_mode = EX_CONTINUE; }
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
121
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
122 void dbquit (bool all = false)
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
123 {
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
124 if (all)
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
125 m_execution_mode = EX_QUIT_ALL;
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
126 else
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
127 m_execution_mode = EX_QUIT;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
128 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
129
27402
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
130 bool quitting_debugger (void) const;
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
131
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
132 private:
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
133
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
134 interpreter& m_interpreter;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
135
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
136 std::size_t m_level;
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
137 std::size_t m_debug_frame;
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
138 execution_mode m_execution_mode;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
139 bool m_in_debug_repl;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
140 };
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
141
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
142 // FIXME: Could the debugger server_loop and repl functions be merged
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
143 // with the corresponding tree_evaluator functions or do they need to
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
144 // remain separate? They perform nearly the same functions.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
145
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
146 int debugger::server_loop (void)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
147 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
148 // Process events from the event queue.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
149
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
150 tree_evaluator& tw = m_interpreter.get_evaluator ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
151
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
152 void (tree_evaluator::*server_mode_fptr) (bool)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
153 = &tree_evaluator::server_mode;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
154 unwind_action act (server_mode_fptr, &tw, true);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
155
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
156 int exit_status = 0;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
157
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
158 do
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
159 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
160 if (m_execution_mode == EX_CONTINUE || tw.dbstep_flag ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
161 break;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
162
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
163 if (quitting_debugger ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
164 break;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
165
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
166 try
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
167 {
29294
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
168 // FIXME: Should we call octave_quit in the octave::sleep
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
169 // and/or command_editor::run_event_hooks functions?
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
170
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
171 octave_quit ();
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
172
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
173 // FIXME: Running the event queue should be decoupled from
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
174 // the command_editor.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
175
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
176 // FIXME: Is it OK to use command_editor::run_event_hooks
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
177 // here? It may run more than one queued function per call,
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
178 // and it seems that the checks at the top of the loop
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
179 // probably need to be done after each individual event
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
180 // function is executed. For now, maybe the simplest thing
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
181 // would be to pass a predicate function (lambda expression)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
182 // to the command_editor::run_event_hooks and have it check
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
183 // that and break out of the eval loop(s) if the condition
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
184 // is met?
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
185
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
186 // FIXME: We should also use a condition variable to manage
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
187 // the execution of entries in the queue and eliminate the
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
188 // need for the busy-wait loop.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
189
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
190 command_editor::run_event_hooks ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
191
29950
6549fa7558ba eliminate some unnecessary octave:: namespace tags
John W. Eaton <jwe@octave.org>
parents: 29949
diff changeset
192 sleep (0.1);
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
193 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
194 catch (const interrupt_exception&)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
195 {
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
196 octave_interrupt_state = 1;
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
197 m_interpreter.recover_from_exception ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
198
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
199 // Required newline when the user does Ctrl+C at the prompt.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
200 if (m_interpreter.interactive ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
201 octave_stdout << "\n";
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
202 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
203 catch (const index_exception& e)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
204 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
205 m_interpreter.recover_from_exception ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
206
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
207 std::cerr << "error: unhandled index exception: "
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
208 << e.message () << " -- trying to return to prompt"
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
209 << std::endl;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
210 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
211 catch (const execution_exception& ee)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
212 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
213 error_system& es = m_interpreter.get_error_system ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
214
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
215 es.save_exception (ee);
29501
220c6c4a3533 leave error message output stream decision to error_system class
John W. Eaton <jwe@octave.org>
parents: 29493
diff changeset
216 es.display_exception (ee);
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
217
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
218 if (m_interpreter.interactive ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
219 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
220 m_interpreter.recover_from_exception ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
221 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
222 else
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
223 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
224 // We should exit with a nonzero status.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
225 exit_status = 1;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
226 break;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
227 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
228 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
229 catch (const quit_debug_exception& qde)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
230 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
231 if (qde.all ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
232 throw;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
233
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
234 // Continue in this debug level.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
235 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
236 catch (const std::bad_alloc&)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
237 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
238 m_interpreter.recover_from_exception ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
239
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
240 std::cerr << "error: out of memory -- trying to return to prompt"
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
241 << std::endl;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
242 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
243 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
244 while (exit_status == 0);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
245
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
246 if (exit_status == EOF)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
247 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
248 if (m_interpreter.interactive ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
249 octave_stdout << "\n";
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
250
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
251 exit_status = 0;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
252 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
253
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
254 return exit_status;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
255 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
256
27533
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
257 void debugger::repl (const std::string& prompt_arg)
25404
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
258 {
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
259 unwind_protect frame;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
260
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
261 frame.protect_var (m_in_debug_repl);
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
262 frame.protect_var (m_execution_mode);
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
263
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
264 m_in_debug_repl = true;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
265
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
266 tree_evaluator& tw = m_interpreter.get_evaluator ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
267
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
268 bool silent = tw.quiet_breakpoint_flag (false);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
269
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
270 frame.add (&tree_evaluator::restore_frame, &tw,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
271 tw.current_call_stack_frame_number ());
27200
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
272
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
273 tw.goto_frame (tw.debug_frame ());
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
274
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
275 octave_user_code *caller = tw.current_user_code ();
27392
820a87b87c01 clean up use of interpreter in qt_interpreter_events::enter_debugger_event
John W. Eaton <jwe@octave.org>
parents: 27374
diff changeset
276 std::string fcn_file_nm, fcn_nm;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
277
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
278 if (caller)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
279 {
27392
820a87b87c01 clean up use of interpreter in qt_interpreter_events::enter_debugger_event
John W. Eaton <jwe@octave.org>
parents: 27374
diff changeset
280 fcn_file_nm = caller->fcn_file_name ();
820a87b87c01 clean up use of interpreter in qt_interpreter_events::enter_debugger_event
John W. Eaton <jwe@octave.org>
parents: 27374
diff changeset
281 fcn_nm = fcn_file_nm.empty () ? caller->name () : fcn_file_nm;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
282 }
27200
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
283
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
284 int curr_debug_line = tw.current_line ();
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
285
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
286 std::ostringstream buf;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
287
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
288 input_system& input_sys = m_interpreter.get_input_system ();
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
289
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
290 event_manager& evmgr = m_interpreter.get_event_manager ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
291
27392
820a87b87c01 clean up use of interpreter in qt_interpreter_events::enter_debugger_event
John W. Eaton <jwe@octave.org>
parents: 27374
diff changeset
292 if (! fcn_nm.empty ())
25404
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
293 {
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
294 if (input_sys.gud_mode ())
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
295 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
296 static char ctrl_z = 'Z' & 0x1f;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
297
27392
820a87b87c01 clean up use of interpreter in qt_interpreter_events::enter_debugger_event
John W. Eaton <jwe@octave.org>
parents: 27374
diff changeset
298 buf << ctrl_z << ctrl_z << fcn_nm << ':' << curr_debug_line;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
299 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
300 else
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
301 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
302 // FIXME: we should come up with a clean way to detect
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
303 // that we are stopped on the no-op command that marks the
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
304 // end of a function or script.
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
305
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
306 if (! silent)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
307 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
308 std::shared_ptr<stack_frame> frm = tw.current_user_frame ();
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
309
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
310 frm->display_stopped_in_message (buf);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
311 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
312
27392
820a87b87c01 clean up use of interpreter in qt_interpreter_events::enter_debugger_event
John W. Eaton <jwe@octave.org>
parents: 27374
diff changeset
313 evmgr.enter_debugger_event (fcn_nm, fcn_file_nm, curr_debug_line);
27263
99aa1bcb8848 rename octave_link and octave_link_events classes, move inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27261
diff changeset
314
99aa1bcb8848 rename octave_link and octave_link_events classes, move inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27261
diff changeset
315 evmgr.set_workspace ();
99aa1bcb8848 rename octave_link and octave_link_events classes, move inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27261
diff changeset
316
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
317 frame.add (&event_manager::execute_in_debugger_event, &evmgr,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
318 fcn_nm, curr_debug_line);
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
319
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
320 if (! silent)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
321 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
322 std::string line_buf;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
323
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
324 if (caller)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
325 line_buf = caller->get_code_line (curr_debug_line);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
326
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
327 if (! line_buf.empty ())
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
328 buf << curr_debug_line << ": " << line_buf;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
329 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
330 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
331 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
332
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
333 if (silent)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
334 command_editor::erase_empty_line (true);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
335
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
336 std::string stopped_in_msg = buf.str ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
337
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
338 if (m_interpreter.server_mode ())
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
339 {
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
340 if (! stopped_in_msg.empty ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
341 octave_stdout << stopped_in_msg << std::endl;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
342
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
343 evmgr.push_event_queue ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
344
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
345 frame.add (&event_manager::pop_event_queue, &evmgr);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
346
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
347 frame.add (&tree_evaluator::set_parser, &tw, tw.get_parser ());
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
348
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
349 std::shared_ptr<push_parser>
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
350 debug_parser (new push_parser (m_interpreter));
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
351
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
352 tw.set_parser (debug_parser);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
353
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
354 server_loop ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
355 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
356 else
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
357 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
358 if (! stopped_in_msg.empty ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
359 std::cerr << stopped_in_msg << std::endl;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
360
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
361 std::string tmp_prompt = prompt_arg;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
362 if (m_level > 0)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
363 tmp_prompt = "[" + std::to_string (m_level) + "]" + prompt_arg;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
364
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
365 frame.add (&input_system::set_PS1, &input_sys, input_sys.PS1 ());
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
366 input_sys.PS1 (tmp_prompt);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
367
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
368 if (! m_interpreter.interactive ())
27301
a2b1ba6c92d5 eliminate unnecessary application::interative function
John W. Eaton <jwe@octave.org>
parents: 27290
diff changeset
369 {
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
370 void (interpreter::*interactive_fptr) (bool)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
371 = &interpreter::interactive;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
372 frame.add (interactive_fptr, &m_interpreter,
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
373 m_interpreter.interactive ());
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
374
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
375 m_interpreter.interactive (true);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
376
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
377 // FIXME: should debugging be possible in an embedded
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
378 // interpreter?
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
379
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
380 application *app = application::app ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
381
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
382 if (app)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
383 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
384 void (application::*forced_interactive_fptr) (bool)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
385 = &application::forced_interactive;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
386 frame.add (forced_interactive_fptr, app,
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
387 app->forced_interactive ());
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
388
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
389 app->forced_interactive (true);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
390 }
27301
a2b1ba6c92d5 eliminate unnecessary application::interative function
John W. Eaton <jwe@octave.org>
parents: 27290
diff changeset
391 }
27533
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
392
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
393 #if defined (OCTAVE_ENABLE_COMMAND_LINE_PUSH_PARSER)
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
394
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
395 input_reader reader (m_interpreter);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
396
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
397 push_parser debug_parser (m_interpreter);
27533
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
398
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
399 #else
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
400
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
401 parser debug_parser (m_interpreter);
27533
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
402
0abe70896e34 use push parser in debug repl if enabled
John W. Eaton <jwe@octave.org>
parents: 27519
diff changeset
403 #endif
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
404
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
405 error_system& es = m_interpreter.get_error_system ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
406
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
407 while (m_in_debug_repl)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
408 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
409 if (m_execution_mode == EX_CONTINUE || tw.dbstep_flag ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
410 break;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
411
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
412 if (quitting_debugger ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
413 break;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
414
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
415 try
27402
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
416 {
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
417 debug_parser.reset ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
418
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
419 #if defined (OCTAVE_ENABLE_COMMAND_LINE_PUSH_PARSER)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
420
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
421 int retval = 0;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
422
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
423 std::string prompt
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
424 = command_editor::decode_prompt_string (tmp_prompt);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
425
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
426 do
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
427 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
428 bool eof = false;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
429 std::string input_line = reader.get_input (prompt, eof);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
430
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
431 if (eof)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
432 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
433 retval = EOF;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
434 break;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
435 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
436
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
437 retval = debug_parser.run (input_line, false);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
438
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
439 prompt = command_editor::decode_prompt_string (input_sys.PS2 ());
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
440 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
441 while (retval < 0);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
442
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
443 #else
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
444
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
445 int retval = debug_parser.run ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
446
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
447 #endif
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
448 if (command_editor::interrupt (false))
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
449 {
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
450 // Break regardless of m_execution_mode value.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
451
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
452 quitting_debugger ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
453
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
454 break;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
455 }
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
456 else
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
457 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
458 if (retval == 0)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
459 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
460 std::shared_ptr<tree_statement_list> stmt_list
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
461 = debug_parser.statement_list ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
462
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
463 if (stmt_list)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
464 stmt_list->accept (tw);
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
465
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
466 if (octave_completion_matches_called)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
467 octave_completion_matches_called = false;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
468
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
469 // FIXME: the following statement is here because
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
470 // the last command may have been a dbup, dbdown, or
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
471 // dbstep command that changed the current debug
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
472 // frame. If so, we need to reset the current frame
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
473 // for the call stack. But is this right way to do
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
474 // this job? What if the statement list was
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
475 // something like "dbup; dbstack"? Will the call to
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
476 // dbstack use the right frame? If not, how can we
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
477 // fix this problem?
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
478 tw.goto_frame (tw.debug_frame ());
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
479 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
480
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
481 octave_quit ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
482 }
25404
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
483 }
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
484 catch (const execution_exception& ee)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
485 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
486 es.save_exception (ee);
29501
220c6c4a3533 leave error message output stream decision to error_system class
John W. Eaton <jwe@octave.org>
parents: 29493
diff changeset
487 es.display_exception (ee);
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
488
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
489 // Ignore errors when in debugging mode;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
490 m_interpreter.recover_from_exception ();
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
491 }
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
492 catch (const quit_debug_exception& qde)
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
493 {
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
494 if (qde.all ())
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
495 throw;
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
496
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
497 // Continue in this debug level.
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
498 }
25404
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
499 }
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
500 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
501 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
502
27402
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
503 bool debugger::quitting_debugger (void) const
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
504 {
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
505 if (m_execution_mode == EX_QUIT)
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
506 {
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
507 // If there is no enclosing debug level or the top-level
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
508 // repl is not active, handle dbquit the same as dbcont.
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
509
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
510 if (m_level > 0 || m_interpreter.server_mode ()
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
511 || m_interpreter.in_top_level_repl ())
27402
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
512 throw quit_debug_exception ();
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
513 else
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
514 return true;
25404
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
515 }
27402
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
516
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
517 if (m_execution_mode == EX_QUIT_ALL)
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
518 {
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
519 // If the top-level repl is not active, handle "dbquit all"
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
520 // the same as dbcont.
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
521
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
522 if (m_interpreter.server_mode () || m_interpreter.in_top_level_repl ())
27402
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
523 throw quit_debug_exception (true);
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
524 else
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
525 return true;
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
526 }
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
527
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
528 return false;
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
529 }
84d11fcb2f91 also check debugger execution mode after command editor interrupt
John W. Eaton <jwe@octave.org>
parents: 27392
diff changeset
530
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
531 bool tree_evaluator::at_top_level (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
532 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
533 return m_call_stack.at_top_level ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
534 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
535
27015
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
536 std::string
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
537 tree_evaluator::mfilename (const std::string& opt) const
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
538 {
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
539 std::string fname;
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
540
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
541 octave_user_code *fcn = m_call_stack.current_user_code ();
27015
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
542
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
543 if (fcn)
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
544 {
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
545 fname = fcn->fcn_file_name ();
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
546
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
547 if (fname.empty ())
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
548 fname = fcn->name ();
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
549 }
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
550
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
551 if (opt == "fullpathext")
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
552 return fname;
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
553
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
554 std::size_t dpos = fname.rfind (sys::file_ops::dir_sep_char ());
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29477
diff changeset
555 std::size_t epos = fname.rfind ('.');
27015
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
556
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
557 if (epos <= dpos+1)
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
558 epos = std::string::npos;
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
559
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
560 if (epos != std::string::npos)
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
561 fname = fname.substr (0, epos);
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
562
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
563 if (opt == "fullpath")
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
564 return fname;
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
565
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
566 if (dpos != std::string::npos)
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
567 fname = fname.substr (dpos+1);
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
568
4d9e1a832a55 move core of mfilename function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27014
diff changeset
569 return fname;
25404
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
570 }
e37d857716c3 move core of interpreter::main_loop to evaluator
John W. Eaton <jwe@octave.org>
parents: 25403
diff changeset
571
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
572 void tree_evaluator::parse_and_execute (const std::string& input,
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
573 bool& incomplete_parse)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
574 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
575 incomplete_parse = false;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
576
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
577 unwind_protect_var<bool> upv (m_in_top_level_repl, true);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
578
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
579 if (at_top_level ())
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
580 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
581 dbstep_flag (0);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
582 reset_debug_state ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
583 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
584
29307
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
585 // FIXME: OK to do this job here, or should it be in the functions
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
586 // that do the actual prompting?
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
587
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
588 // Update the time stamp for the "prompt" so that automatically
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
589 // finding modified files based on file modification times will
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
590 // work. In the future, we may do something completely different to
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
591 // check for changes to files but for now, we rely on the prompt
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
592 // time stamp to limit the checks for file modification times.
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
593
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
594 Vlast_prompt_time.stamp ();
b2d62cfac9e6 update last prompt time stamp when parsing files in server loop
John W. Eaton <jwe@octave.org>
parents: 29306
diff changeset
595
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
596 bool eof = false;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
597
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
598 event_manager& evmgr = m_interpreter.get_event_manager ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
599
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
600 if (command_history::add (input))
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
601 evmgr.append_history (input);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
602
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
603 m_exit_status = m_parser->run (input, eof);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
604
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
605 if (m_exit_status == 0)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
606 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
607 std::shared_ptr<tree_statement_list>
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
608 stmt_list = m_parser->statement_list ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
609
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
610 if (stmt_list)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
611 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
612 command_editor::increment_current_command_number ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
613
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
614 eval (stmt_list, m_interpreter.interactive ());
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
615
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
616 evmgr.set_workspace ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
617 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
618 else if (m_parser->at_end_of_input ())
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
619 m_exit_status = EOF;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
620 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
621 else
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
622 incomplete_parse = true;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
623
29526
b65824235c7f also reset parser when interpreter recovers from exception
John W. Eaton <jwe@octave.org>
parents: 29503
diff changeset
624 // FIXME: Should we be checking m_exit_status or incomplete_parse or
b65824235c7f also reset parser when interpreter recovers from exception
John W. Eaton <jwe@octave.org>
parents: 29503
diff changeset
625 // both here? Could EOF have a value other than -1, and is there
b65824235c7f also reset parser when interpreter recovers from exception
John W. Eaton <jwe@octave.org>
parents: 29503
diff changeset
626 // possible confusion between that state and the parser returning -1?
b65824235c7f also reset parser when interpreter recovers from exception
John W. Eaton <jwe@octave.org>
parents: 29503
diff changeset
627
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
628 if (m_exit_status == -1)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
629 m_exit_status = 0;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
630 else
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
631 m_parser->reset ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
632
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
633 evmgr.pre_input_event ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
634 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
635
29619
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
636 void tree_evaluator::get_line_and_eval (void)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
637 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
638 std::mutex mtx;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
639 std::unique_lock<std::mutex> lock (mtx);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
640 std::condition_variable cv;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
641 bool incomplete_parse = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
642 bool evaluation_pending = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
643 bool exiting = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
644
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
645 input_system& input_sys = m_interpreter.get_input_system ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
646 event_manager& evmgr = m_interpreter.get_event_manager ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
647
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
648 while (true)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
649 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
650 // FIXME: Detect EOF? Use readline? If
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
651 // so, then we need to disable idle event loop hook function
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
652 // execution.
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
653
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
654 std::string ps = incomplete_parse ? input_sys.PS2 () : input_sys.PS1 ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
655
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
656 std::cout << command_editor::decode_prompt_string (ps);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
657
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
658 std::string input;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
659 std::getline (std::cin, input);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
660
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
661 if (input.empty ())
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
662 continue;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
663
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
664 incomplete_parse = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
665 evaluation_pending = true;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
666 exiting = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
667
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
668 evmgr.post_event
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
669 ([&] (interpreter& interp)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
670 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
671 // INTERPRETER THREAD
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
672
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
673 std::lock_guard<std::mutex> local_lock (mtx);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
674
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
675 try
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
676 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
677 interp.parse_and_execute (input, incomplete_parse);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
678 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
679 catch (const exit_exception&)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
680 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
681 evaluation_pending = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
682 exiting = true;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
683 cv.notify_all ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
684 throw;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
685 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
686 catch (const execution_exception& ee)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
687 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
688 error_system& es = m_interpreter.get_error_system ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
689
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
690 es.save_exception (ee);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
691 es.display_exception (ee);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
692
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
693 if (m_interpreter.interactive ())
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
694 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
695 m_interpreter.recover_from_exception ();
29620
ad720f9c12b3 reset parser if parse error occurs parsing code in get_line_and_eval
John W. Eaton <jwe@octave.org>
parents: 29619
diff changeset
696 m_parser->reset ();
29619
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
697 evaluation_pending = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
698 cv.notify_all ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
699 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
700 else
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
701 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
702 evaluation_pending = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
703 cv.notify_all ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
704 throw exit_exception (1);
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
705 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
706 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
707 catch (...)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
708 {
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
709 evaluation_pending = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
710 cv.notify_all ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
711 throw;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
712 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
713
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
714 evaluation_pending = false;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
715 cv.notify_all ();
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
716 });
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
717
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
718 // Wait until evaluation is finished before prompting for input
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
719 // again.
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
720
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
721 cv.wait (lock, [&] { return ! evaluation_pending; });
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
722
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
723 if (exiting)
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
724 break;
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
725 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
726 }
5cf985f5760a move get_line_and_eval to parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 29572
diff changeset
727
29846
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
728 int tree_evaluator::repl (void)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
729 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
730 // The big loop. Read, Eval, Print, Loop. Normally user
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
731 // interaction at the command line in a terminal session, but we may
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
732 // also end up here when reading from a pipe or when stdin is
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
733 // connected to a file by the magic of input redirection.
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
734
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
735 int exit_status = 0;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
736
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
737 // FIXME: should this choice be a command-line option? Note that we
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
738 // intend that the push parser interface only be used for
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
739 // interactive sessions.
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
740
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
741 #if defined (OCTAVE_ENABLE_COMMAND_LINE_PUSH_PARSER)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
742 static bool use_command_line_push_parser = true;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
743 #else
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
744 static bool use_command_line_push_parser = false;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
745 #endif
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
746
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
747 // The following logic is written as it is to allow easy transition
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
748 // to setting USE_COMMAND_LINE_PUSH_PARSER at run time and to
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
749 // simplify the logic of the main loop below by using the same
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
750 // base_parser::run interface for both push and pull parsers.
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
751
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
752 std::shared_ptr<base_parser> repl_parser;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
753
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
754 if (m_interpreter.interactive ())
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
755 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
756 if (use_command_line_push_parser)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
757 {
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
758 push_parser *pp
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
759 = new push_parser (m_interpreter,
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
760 new input_reader (m_interpreter));
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
761
29846
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
762 repl_parser = std::shared_ptr<base_parser> (pp);
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
763 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
764 else
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
765 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
766 parser *pp = new parser (new lexer (m_interpreter));
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
767 repl_parser = std::shared_ptr<base_parser> (pp);
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
768 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
769 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
770 else
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
771 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
772 parser *pp = new parser (new lexer (stdin, m_interpreter));
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
773 repl_parser = std::shared_ptr<base_parser> (pp);
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
774 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
775
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
776 do
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
777 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
778 try
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
779 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
780 unwind_protect_var<bool> upv (m_in_top_level_repl, true);
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
781
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
782 repl_parser->reset ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
783
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
784 if (at_top_level ())
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
785 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
786 dbstep_flag (0);
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
787 reset_debug_state ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
788 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
789
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
790 exit_status = repl_parser->run ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
791
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
792 if (exit_status == 0)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
793 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
794 std::shared_ptr<tree_statement_list>
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
795 stmt_list = repl_parser->statement_list ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
796
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
797 if (stmt_list)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
798 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
799 command_editor::increment_current_command_number ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
800
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
801 eval (stmt_list, m_interpreter.interactive ());
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
802 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
803 else if (repl_parser->at_end_of_input ())
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
804 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
805 exit_status = EOF;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
806 break;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
807 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
808 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
809 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
810 catch (const interrupt_exception&)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
811 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
812 m_interpreter.recover_from_exception ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
813
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
814 // Required newline when the user does Ctrl+C at the prompt.
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
815 if (m_interpreter.interactive ())
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
816 octave_stdout << "\n";
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
817 }
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
818 catch (const index_exception& ie)
29846
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
819 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
820 m_interpreter.recover_from_exception ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
821
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
822 std::cerr << "error: unhandled index exception: "
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
823 << ie.message () << " -- trying to return to prompt"
29846
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
824 << std::endl;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
825 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
826 catch (const execution_exception& ee)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
827 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
828 error_system& es = m_interpreter.get_error_system ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
829
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
830 es.save_exception (ee);
29501
220c6c4a3533 leave error message output stream decision to error_system class
John W. Eaton <jwe@octave.org>
parents: 29493
diff changeset
831 es.display_exception (ee);
29846
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
832
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
833 if (m_interpreter.interactive ())
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
834 m_interpreter.recover_from_exception ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
835 else
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
836 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
837 // We should exit with a nonzero status.
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
838 exit_status = 1;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
839 break;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
840 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
841 }
29847
c517a55a14ad avoid crash with dbquit when executing command in terminal from gui (bug #60813)
John W. Eaton <jwe@octave.org>
parents: 29846
diff changeset
842 catch (const quit_debug_exception&)
c517a55a14ad avoid crash with dbquit when executing command in terminal from gui (bug #60813)
John W. Eaton <jwe@octave.org>
parents: 29846
diff changeset
843 {
c517a55a14ad avoid crash with dbquit when executing command in terminal from gui (bug #60813)
John W. Eaton <jwe@octave.org>
parents: 29846
diff changeset
844 m_interpreter.recover_from_exception ();
c517a55a14ad avoid crash with dbquit when executing command in terminal from gui (bug #60813)
John W. Eaton <jwe@octave.org>
parents: 29846
diff changeset
845
c517a55a14ad avoid crash with dbquit when executing command in terminal from gui (bug #60813)
John W. Eaton <jwe@octave.org>
parents: 29846
diff changeset
846 // FIXME: Does anything else need to happen here?
c517a55a14ad avoid crash with dbquit when executing command in terminal from gui (bug #60813)
John W. Eaton <jwe@octave.org>
parents: 29846
diff changeset
847 }
29846
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
848 catch (const std::bad_alloc&)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
849 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
850 m_interpreter.recover_from_exception ();
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
851
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
852 std::cerr << "error: out of memory -- trying to return to prompt"
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
853 << std::endl;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
854 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
855 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
856 while (exit_status == 0);
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
857
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
858 if (exit_status == EOF)
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
859 {
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
860 if (m_interpreter.interactive ())
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
861 octave_stdout << "\n";
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
862
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
863 exit_status = 0;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
864 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
865
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
866 return exit_status;
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
867 }
78cb255c78a4 move top-level REPL from interpreter to evaluator
John W. Eaton <jwe@octave.org>
parents: 29832
diff changeset
868
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
869 int tree_evaluator::server_loop (void)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
870 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
871 // Process events from the event queue.
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
872
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
873 unwind_protect_var<bool> upv1 (m_server_mode, true);
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
874
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
875 m_exit_status = 0;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
876
29282
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
877 std::shared_ptr<push_parser> parser (new push_parser (m_interpreter));
0280fd549502 make debugging possible in server mode
John W. Eaton <jwe@octave.org>
parents: 29281
diff changeset
878 unwind_protect_var<std::shared_ptr<push_parser>> upv2 (m_parser, parser);
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
879
29527
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
880 // FIXME: We are currently resetting the parser after every call to
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
881 // recover_from_exception. This action should probably be handled
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
882 // in a more consistent way, but resetting the parser in every call
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
883 // to interpreter::recover_from_exception appears to cause
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
884 // segfaults in the test suite.
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
885
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
886 do
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
887 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
888 try
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
889 {
29294
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
890 // FIXME: Should we call octave_quit in the octave::sleep
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
891 // and/or command_editor::run_event_hooks functions?
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
892
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
893 octave_quit ();
6867e1e12815 respond to interrupt signals when idle in the server loop
John W. Eaton <jwe@octave.org>
parents: 29282
diff changeset
894
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
895 // FIXME: Running the event queue should be decoupled from
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
896 // the command_editor. We should also use a condition
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
897 // variable to manage the execution of entries in the queue
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
898 // and eliminate the need for the busy-wait loop.
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
899
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
900 command_editor::run_event_hooks ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
901
29950
6549fa7558ba eliminate some unnecessary octave:: namespace tags
John W. Eaton <jwe@octave.org>
parents: 29949
diff changeset
902 sleep (0.1);
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
903 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
904 catch (const interrupt_exception&)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
905 {
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
906 octave_interrupt_state = 1;
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
907 m_interpreter.recover_from_exception ();
29527
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
908 m_parser->reset ();
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
909
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
910 // Required newline when the user does Ctrl+C at the prompt.
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
911 if (m_interpreter.interactive ())
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
912 octave_stdout << "\n";
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
913 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
914 catch (const index_exception& e)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
915 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
916 m_interpreter.recover_from_exception ();
29527
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
917 m_parser->reset ();
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
918
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
919 std::cerr << "error: unhandled index exception: "
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
920 << e.message () << " -- trying to return to prompt"
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
921 << std::endl;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
922 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
923 catch (const execution_exception& ee)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
924 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
925 error_system& es = m_interpreter.get_error_system ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
926
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
927 es.save_exception (ee);
29501
220c6c4a3533 leave error message output stream decision to error_system class
John W. Eaton <jwe@octave.org>
parents: 29493
diff changeset
928 es.display_exception (ee);
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
929
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
930 if (m_interpreter.interactive ())
29527
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
931 {
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
932 m_interpreter.recover_from_exception ();
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
933 m_parser->reset ();
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
934 }
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
935 else
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
936 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
937 // We should exit with a nonzero status.
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
938 m_exit_status = 1;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
939 break;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
940 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
941 }
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
942 catch (const quit_debug_exception&)
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
943 {
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
944 octave_interrupt_state = 1;
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
945 m_interpreter.recover_from_exception ();
29527
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
946 m_parser->reset ();
29503
3bfec185c9e2 experimental command window widget with server loop
John W. Eaton <jwe@octave.org>
parents: 29501
diff changeset
947 }
3bfec185c9e2 experimental command window widget with server loop
John W. Eaton <jwe@octave.org>
parents: 29501
diff changeset
948 catch (const exit_exception& xe)
3bfec185c9e2 experimental command window widget with server loop
John W. Eaton <jwe@octave.org>
parents: 29501
diff changeset
949 {
3bfec185c9e2 experimental command window widget with server loop
John W. Eaton <jwe@octave.org>
parents: 29501
diff changeset
950 m_exit_status = xe.exit_status ();
3bfec185c9e2 experimental command window widget with server loop
John W. Eaton <jwe@octave.org>
parents: 29501
diff changeset
951 break;
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
952 }
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
953 catch (const std::bad_alloc&)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
954 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
955 m_interpreter.recover_from_exception ();
29527
c7569a4224bd undo previous change; reset parser in server loop
John W. Eaton <jwe@octave.org>
parents: 29526
diff changeset
956 m_parser->reset ();
29281
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
957
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
958 std::cerr << "error: out of memory -- trying to return to prompt"
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
959 << std::endl;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
960 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
961 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
962 while (m_exit_status == 0);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
963
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
964 if (m_exit_status == EOF)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
965 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
966 if (m_interpreter.interactive ())
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
967 octave_stdout << "\n";
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
968
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
969 m_exit_status = 0;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
970 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
971
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
972 return m_exit_status;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
973 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
974
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
975 void tree_evaluator::eval (std::shared_ptr<tree_statement_list>& stmt_list,
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
976 bool interactive)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
977 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
978 try
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
979 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
980 stmt_list->accept (*this);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
981
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
982 octave_quit ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
983
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
984 if (! interactive)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
985 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
986 bool quit = (m_returning || m_breaking);
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
987
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
988 if (m_returning)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
989 m_returning = 0;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
990
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
991 if (m_breaking)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
992 m_breaking--;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
993
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
994 if (quit)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
995 return;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
996 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
997
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
998 if (octave_completion_matches_called)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
999 octave_completion_matches_called = false;
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1000 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1001 catch (const quit_debug_exception&)
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1002 {
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1003 m_interpreter.recover_from_exception ();
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1004 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1005 }
6dd456257d81 move some eval-related functions from interpreter to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 29253
diff changeset
1006
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1007 octave_value_list
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1008 tree_evaluator::eval_string (const std::string& eval_str, bool silent,
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1009 int& parse_status, int nargout)
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1010 {
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1011 octave_value_list retval;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1012
26512
4d6392c879d7 avoid double free of lexer on exit (bug #55347)
John W. Eaton <jwe@octave.org>
parents: 26509
diff changeset
1013 parser eval_parser (eval_str, m_interpreter);
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1014
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1015 do
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1016 {
26512
4d6392c879d7 avoid double free of lexer on exit (bug #55347)
John W. Eaton <jwe@octave.org>
parents: 26509
diff changeset
1017 eval_parser.reset ();
4d6392c879d7 avoid double free of lexer on exit (bug #55347)
John W. Eaton <jwe@octave.org>
parents: 26509
diff changeset
1018
26662
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1019 // If we are looking at
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1020 //
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1021 // val = eval ("code");
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1022 //
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1023 // then don't allow code to be parsed as a command.
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1024
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1025 if (nargout > 0)
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1026 eval_parser.disallow_command_syntax ();
05fc703b419a update handling of command-style function call syntax in eval
John W. Eaton <jwe@octave.org>
parents: 26661
diff changeset
1027
26512
4d6392c879d7 avoid double free of lexer on exit (bug #55347)
John W. Eaton <jwe@octave.org>
parents: 26509
diff changeset
1028 parse_status = eval_parser.run ();
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1029
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1030 if (parse_status == 0)
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1031 {
27504
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1032 std::shared_ptr<tree_statement_list> stmt_list
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1033 = eval_parser.statement_list ();
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1034
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1035 if (stmt_list)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1036 {
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1037 tree_statement *stmt = nullptr;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1038
27504
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1039 if (stmt_list->length () == 1
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1040 && (stmt = stmt_list->front ())
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1041 && stmt->is_expression ())
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1042 {
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1043 tree_expression *expr = stmt->expression ();
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1044
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1045 if (silent)
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1046 expr->set_print_flag (false);
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1047
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
1048 retval = expr->evaluate_n (*this, nargout);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1049
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1050 bool do_bind_ans = false;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1051
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1052 if (expr->is_identifier ())
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1053 do_bind_ans = ! is_variable (expr);
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1054 else
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1055 do_bind_ans = ! expr->is_assignment_expression ();
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1056
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1057 if (do_bind_ans && ! retval.empty ())
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1058 bind_ans (retval(0), expr->print_result ());
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1059
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1060 if (nargout == 0)
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1061 retval = octave_value_list ();
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1062 }
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1063 else if (nargout == 0)
27504
7a31b25e3252 use shared_ptr for storing classdef and statement_list objects in parser
John W. Eaton <jwe@octave.org>
parents: 27480
diff changeset
1064 stmt_list->accept (*this);
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1065 else
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1066 error ("eval: invalid use of statement list");
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1067
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1068 if (returning () || breaking () || continuing ())
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1069 break;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1070 }
27510
5438a82a18fb declare base_parser class data protected
John W. Eaton <jwe@octave.org>
parents: 27509
diff changeset
1071 else if (eval_parser.at_end_of_input ())
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1072 break;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1073 }
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1074 }
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1075 while (parse_status == 0);
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1076
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1077 return retval;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1078 }
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1079
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1080 octave_value tree_evaluator::eval_string (const std::string& eval_str,
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1081 bool silent, int& parse_status)
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1082 {
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1083 octave_value retval;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1084
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1085 octave_value_list tmp = eval_string (eval_str, silent, parse_status, 1);
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1086
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1087 if (! tmp.empty ())
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1088 retval = tmp(0);
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1089
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1090 return retval;
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1091 }
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1092
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1093 octave_value_list tree_evaluator::eval_string (const octave_value& arg,
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1094 bool silent, int& parse_status,
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1095 int nargout)
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1096 {
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1097 std::string s = arg.xstring_value ("eval: expecting string argument");
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1098
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1099 return eval_string (s, silent, parse_status, nargout);
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1100 }
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1101
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1102 octave_value_list tree_evaluator::eval (const std::string& try_code,
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1103 int nargout)
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1104 {
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1105 int parse_status = 0;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1106
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1107 return eval_string (try_code, nargout > 0, parse_status, nargout);
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1108 }
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1109
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1110 octave_value_list tree_evaluator::eval (const std::string& try_code,
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1111 const std::string& catch_code,
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1112 int nargout)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1113 {
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1114 octave_value_list retval;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1115
27160
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 27123
diff changeset
1116 error_system& es = m_interpreter.get_error_system ();
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 27123
diff changeset
1117
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1118 int parse_status = 0;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1119
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1120 bool execution_error = false;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1121
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1122 octave_value_list tmp;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1123
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1124 try
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1125 {
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1126 tmp = eval_string (try_code, nargout > 0, parse_status, nargout);
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1127 }
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
1128 catch (const execution_exception& ee)
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1129 {
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
1130 es.save_exception (ee);
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
1131 m_interpreter.recover_from_exception ();
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1132
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1133 execution_error = true;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1134 }
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1135
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1136 if (parse_status != 0 || execution_error)
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1137 {
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1138 tmp = eval_string (catch_code, nargout > 0, parse_status, nargout);
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1139
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1140 retval = (nargout > 0) ? tmp : octave_value_list ();
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1141 }
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1142 else
23600
db947ba52118 explicitly limit anonymous functions to a single expression
John W. Eaton <jwe@octave.org>
parents: 23599
diff changeset
1143 {
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1144 if (nargout > 0)
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1145 retval = tmp;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1146
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1147 // FIXME: we should really be rethrowing whatever
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1148 // exception occurred, not just throwing an
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1149 // execution exception.
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1150 if (execution_error)
27480
63b417917f5e remove some obsolete signal handling functions
John W. Eaton <jwe@octave.org>
parents: 27474
diff changeset
1151 throw execution_exception ();
23600
db947ba52118 explicitly limit anonymous functions to a single expression
John W. Eaton <jwe@octave.org>
parents: 23599
diff changeset
1152 }
db947ba52118 explicitly limit anonymous functions to a single expression
John W. Eaton <jwe@octave.org>
parents: 23599
diff changeset
1153
27019
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1154 return retval;
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1155 }
6cb675912f2b move core of eval function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27018
diff changeset
1156
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1157 octave_value_list tree_evaluator::evalin (const std::string& context,
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1158 const std::string& try_code,
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1159 int nargout)
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1160 {
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29527
diff changeset
1161 unwind_action act ([=] (std::size_t frm)
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
1162 {
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
1163 m_call_stack.restore_frame (frm);
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
1164 }, m_call_stack.current_frame ());
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1165
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1166 if (context == "caller")
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1167 m_call_stack.goto_caller_frame ();
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1168 else if (context == "base")
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1169 m_call_stack.goto_base_frame ();
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1170 else
28752
810eb29fc227 maint: Use C++ raw string literals to simplify backlsashing.
Rik <rik@octave.org>
parents: 28727
diff changeset
1171 error (R"(evalin: CONTEXT must be "caller" or "base")");
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1172
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1173 int parse_status = 0;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1174
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1175 return eval_string (try_code, nargout > 0, parse_status, nargout);
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1176 }
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1177
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1178 octave_value_list tree_evaluator::evalin (const std::string& context,
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1179 const std::string& try_code,
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1180 const std::string& catch_code,
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1181 int nargout)
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1182 {
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1183 octave_value_list retval;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1184
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29527
diff changeset
1185 unwind_action act1 ([=] (std::size_t frm)
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
1186 {
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
1187 m_call_stack.restore_frame (frm);
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
1188 }, m_call_stack.current_frame ());
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1189
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1190 if (context == "caller")
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1191 m_call_stack.goto_caller_frame ();
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1192 else if (context == "base")
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1193 m_call_stack.goto_base_frame ();
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1194 else
28752
810eb29fc227 maint: Use C++ raw string literals to simplify backlsashing.
Rik <rik@octave.org>
parents: 28727
diff changeset
1195 error (R"(evalin: CONTEXT must be "caller" or "base")");
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1196
27160
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 27123
diff changeset
1197 error_system& es = m_interpreter.get_error_system ();
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 27123
diff changeset
1198
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1199 int parse_status = 0;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1200
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1201 bool execution_error = false;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1202
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1203 octave_value_list tmp;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1204
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1205 try
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1206 {
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1207 tmp = eval_string (try_code, nargout > 0, parse_status, nargout);
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1208 }
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
1209 catch (const execution_exception& ee)
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1210 {
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
1211 es.save_exception (ee);
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
1212 m_interpreter.recover_from_exception ();
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1213
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1214 execution_error = true;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1215 }
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1216
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1217 if (parse_status != 0 || execution_error)
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1218 {
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1219 tmp = eval_string (catch_code, nargout > 0, parse_status, nargout);
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1220
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1221 retval = (nargout > 0) ? tmp : octave_value_list ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1222 }
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1223 else
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1224 {
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1225 if (nargout > 0)
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1226 retval = tmp;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1227
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1228 // FIXME: we should really be rethrowing whatever
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1229 // exception occurred, not just throwing an
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1230 // execution exception.
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1231 if (execution_error)
27480
63b417917f5e remove some obsolete signal handling functions
John W. Eaton <jwe@octave.org>
parents: 27474
diff changeset
1232 throw execution_exception ();
27018
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1233 }
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1234
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1235 return retval;
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1236 }
a20ead51515d move core of evalin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27017
diff changeset
1237
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1238 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1239 tree_evaluator::visit_anon_fcn_handle (tree_anon_fcn_handle&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1240 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1241 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1242 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1243
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1244 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1245 tree_evaluator::visit_argument_list (tree_argument_list&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1246 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1247 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1248 }
8845
5a6db6bd1a02 eigs.cc (Feigs): fix handling of sigma arg
John W. Eaton <jwe@octave.org>
parents: 8679
diff changeset
1249
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1250 void
29724
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1251 tree_evaluator::visit_arguments_block (tree_arguments_block&)
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1252 {
29729
d0ce7260978d also accept validation syntax for classdef properties
John W. Eaton <jwe@octave.org>
parents: 29724
diff changeset
1253 warning ("function arguments validation blocks are not supported; INCORRECT RESULTS ARE POSSIBLE");
29724
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1254 }
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1255
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1256 void
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1257 tree_evaluator::visit_args_block_attribute_list (tree_args_block_attribute_list&)
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1258 {
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1259 panic_impossible ();
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1260 }
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1261
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1262 void
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1263 tree_evaluator::visit_args_block_validation_list (tree_args_block_validation_list&)
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1264 {
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1265 panic_impossible ();
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1266 }
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1267
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1268 void
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1269 tree_evaluator::visit_arg_validation (tree_arg_validation&)
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1270 {
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1271 panic_impossible ();
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1272 }
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1273
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1274 void
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1275 tree_evaluator::visit_arg_size_spec (tree_arg_size_spec&)
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1276 {
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1277 panic_impossible ();
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1278 }
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1279
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1280 void
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1281 tree_evaluator::visit_arg_validation_fcns (tree_arg_validation_fcns&)
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1282 {
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1283 panic_impossible ();
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1284 }
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1285
c19f8cbe0fd5 initial implementation of parsing for arguments validaton block (bug #59405)
John W. Eaton <jwe@octave.org>
parents: 29657
diff changeset
1286 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1287 tree_evaluator::visit_binary_expression (tree_binary_expression&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1288 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1289 panic_impossible ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1290 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1291
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1292 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1293 tree_evaluator::visit_boolean_expression (tree_boolean_expression&)
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1294 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1295 panic_impossible ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1296 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1297
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1298 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1299 tree_evaluator::visit_compound_binary_expression (tree_compound_binary_expression&)
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1300 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1301 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1302 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1303
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1304 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1305 tree_evaluator::visit_break_command (tree_break_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1306 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1307 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1308 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
1309 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
1310 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
1311 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1312 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1313 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1314 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1315
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
1316 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1317 do_breakpoint (cmd.is_active_breakpoint (*this));
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1318
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1319 if (m_in_loop_command)
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
1320 m_breaking = 1;
22785
9c6661004167 error if break statement is in script file separate from loop (bug #39168)
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
1321 else
9c6661004167 error if break statement is in script file separate from loop (bug #39168)
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
1322 error ("break must appear in a loop in the same file as loop command");
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1323 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1324
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1325 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1326 tree_evaluator::visit_colon_expression (tree_colon_expression&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1327 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1328 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1329 }
10188
97ae300aa73a improve implementation of break, continue, and return commands
John W. Eaton <jwe@octave.org>
parents: 10186
diff changeset
1330
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1331 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1332 tree_evaluator::visit_continue_command (tree_continue_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1333 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1334 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1335 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
1336 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
1337 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
1338 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1339 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1340 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1341 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
1342
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
1343 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
1344 do_breakpoint (cmd.is_active_breakpoint (*this));
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1345
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1346 if (m_in_loop_command)
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
1347 m_continuing = 1;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1348 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1349
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
1350 bool
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
1351 tree_evaluator::statement_printing_enabled (void)
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
1352 {
25401
6f6479125d80 eliminate some globals from tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 25400
diff changeset
1353 return ! (m_silent_functions && (m_statement_context == SC_FUNCTION
6f6479125d80 eliminate some globals from tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 25400
diff changeset
1354 || m_statement_context == SC_SCRIPT));
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
1355 }
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
1356
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1357 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1358 tree_evaluator::reset_debug_state (void)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1359 {
29306
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
1360 m_debug_mode = (m_bp_table.have_breakpoints ()
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
1361 || m_dbstep_flag != 0
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
1362 || m_break_on_next_stmt
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
1363 || in_debug_repl ());
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1364 }
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1365
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1366 void
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1367 tree_evaluator::reset_debug_state (bool mode)
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
1368 {
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
1369 m_debug_mode = mode;
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1370 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1371
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1372 void
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1373 tree_evaluator::enter_debugger (const std::string& prompt)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1374 {
27102
84ff9953faa1 where possible, eliminate octave:: namespace qualifier inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27100
diff changeset
1375 unwind_protect frame;
84ff9953faa1 where possible, eliminate octave:: namespace qualifier inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27100
diff changeset
1376
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1377 frame.add (command_history::ignore_entries,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1378 command_history::ignoring_entries ());
27102
84ff9953faa1 where possible, eliminate octave:: namespace qualifier inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27100
diff changeset
1379
84ff9953faa1 where possible, eliminate octave:: namespace qualifier inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27100
diff changeset
1380 command_history::ignore_entries (false);
84ff9953faa1 where possible, eliminate octave:: namespace qualifier inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 27100
diff changeset
1381
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1382 frame.add (&call_stack::restore_frame, &m_call_stack,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1383 m_call_stack.current_frame ());
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1384
27286
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1385 // Don't allow errors or warnings at the debug prompt to push us
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1386 // into deeper levels of debugging.
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1387
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1388 error_system& es = m_interpreter.get_error_system ();
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1389
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1390 frame.add (&error_system::set_debug_on_error, &es, es.debug_on_error ());
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1391
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1392 frame.add (&error_system::set_debug_on_warning, &es,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
1393 es.debug_on_warning ());
27286
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1394
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1395 es.debug_on_error (false);
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1396 es.debug_on_warning (false);
52542cfcc7dc always disable debug_on_error and debug_on_warning at debug prompt (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27282
diff changeset
1397
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1398 // Go up to the nearest user code frame.
27289
9dcbc0a449af correctly set debug_frame when using "keyboard" (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27286
diff changeset
1399
9dcbc0a449af correctly set debug_frame when using "keyboard" (bug #56625)
John W. Eaton <jwe@octave.org>
parents: 27286
diff changeset
1400 m_debug_frame = m_call_stack.dbupdown (0);
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1401
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1402 // FIXME: probably we just want to print one line, not the
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1403 // entire statement, which might span many lines...
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1404 //
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1405 // tree_print_code tpc (octave_stdout);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1406 // stmt.accept (tpc);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1407
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1408 debugger *dbgr = new debugger (m_interpreter, m_debugger_stack.size ());
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1409
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1410 m_debugger_stack.push (dbgr);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1411
28851
1ac5a76ae91d use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents: 28806
diff changeset
1412 frame.add ([=] (void)
27222
f5b967060442 ensure debuger_stack is popped when exiting a debug level (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27212
diff changeset
1413 {
f5b967060442 ensure debuger_stack is popped when exiting a debug level (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27212
diff changeset
1414 delete m_debugger_stack.top ();
f5b967060442 ensure debuger_stack is popped when exiting a debug level (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27212
diff changeset
1415 m_debugger_stack.pop ();
29305
477f7d6c61e4 reset debug state when popping debugger stack
John W. Eaton <jwe@octave.org>
parents: 29294
diff changeset
1416 reset_debug_state ();
27222
f5b967060442 ensure debuger_stack is popped when exiting a debug level (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27212
diff changeset
1417 });
f5b967060442 ensure debuger_stack is popped when exiting a debug level (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27212
diff changeset
1418
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1419 dbgr->repl (prompt);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1420 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1421
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1422 void
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1423 tree_evaluator::keyboard (const std::string& prompt)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1424 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1425 enter_debugger (prompt);
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1426 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1427
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1428 void
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1429 tree_evaluator::dbupdown (int n, bool verbose)
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1430 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
1431 m_debug_frame = m_call_stack.dbupdown (n, verbose);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
1432 }
10186
095a1e670e68 make dbstep work with keyboard function
John W. Eaton <jwe@octave.org>
parents: 10160
diff changeset
1433
23481
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1434 Matrix
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1435 tree_evaluator::ignored_fcn_outputs (void) const
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1436 {
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1437 Matrix retval;
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1438
27370
a2d3fa82b730 don't use stack to save and restore lvalue list value in evaluator (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27369
diff changeset
1439 const std::list<octave_lvalue> *lvalues = m_lvalue_list;
24349
4ced2bfd737e deprecate defun_isargout functions
John W. Eaton <jwe@octave.org>
parents: 24270
diff changeset
1440
4ced2bfd737e deprecate defun_isargout functions
John W. Eaton <jwe@octave.org>
parents: 24270
diff changeset
1441 if (! lvalues)
23482
c9937e865768 make isargout work again for nested function calls
John W. Eaton <jwe@octave.org>
parents: 23481
diff changeset
1442 return retval;
c9937e865768 make isargout work again for nested function calls
John W. Eaton <jwe@octave.org>
parents: 23481
diff changeset
1443
23481
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1444 octave_idx_type nbh = 0;
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1445
24349
4ced2bfd737e deprecate defun_isargout functions
John W. Eaton <jwe@octave.org>
parents: 24270
diff changeset
1446 for (const auto& lval : *lvalues)
23481
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1447 nbh += lval.is_black_hole ();
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1448
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1449 if (nbh > 0)
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1450 {
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1451 retval.resize (1, nbh);
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1452
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1453 octave_idx_type k = 0;
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1454 octave_idx_type l = 0;
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1455
24349
4ced2bfd737e deprecate defun_isargout functions
John W. Eaton <jwe@octave.org>
parents: 24270
diff changeset
1456 for (const auto& lval : *lvalues)
23481
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1457 {
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1458 if (lval.is_black_hole ())
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1459 retval(l++) = k+1;
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1460
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1461 k += lval.numel ();
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1462 }
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1463 }
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1464
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1465 return retval;
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1466 }
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
1467
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1468 // If NAME is an operator (like "+", "-", ...), convert it to the
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1469 // corresponding function name ("plus", "minus", ...).
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1470
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1471 static std::string
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1472 get_operator_function_name (const std::string& name)
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1473 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1474 // Bow to the god of compatibility.
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1475
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1476 // FIXME: it seems ugly to put this here, but there is no single
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1477 // function in the parser that converts from the operator name to
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1478 // the corresponding function name. At least try to do it without N
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1479 // string compares.
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1480
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
1481 std::size_t len = name.length ();
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1482
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1483 if (len == 3 && name == ".**")
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1484 return "power";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1485 else if (len == 2)
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1486 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1487 if (name[0] == '.')
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1488 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1489 switch (name[1])
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1490 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1491 case '\'':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1492 return "transpose";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1493
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1494 case '+':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1495 return "plus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1496
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1497 case '-':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1498 return "minus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1499
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1500 case '*':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1501 return "times";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1502
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1503 case '/':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1504 return "rdivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1505
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1506 case '^':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1507 return "power";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1508
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1509 case '\\':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1510 return "ldivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1511
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1512 default:
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1513 break;
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1514 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1515 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1516 else if (name[1] == '=')
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1517 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1518 switch (name[0])
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1519 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1520 case '<':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1521 return "le";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1522
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1523 case '=':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1524 return "eq";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1525
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1526 case '>':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1527 return "ge";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1528
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1529 case '~':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1530 case '!':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1531 return "ne";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1532
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1533 default:
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1534 break;
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1535 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1536 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1537 else if (name == "**")
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1538 return "mpower";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1539 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1540 else if (len == 1)
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1541 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1542 switch (name[0])
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1543 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1544 case '~':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1545 case '!':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1546 return "not";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1547
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1548 case '\'':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1549 return "ctranspose";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1550
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1551 case '+':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1552 return "plus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1553
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1554 case '-':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1555 return "minus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1556
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1557 case '*':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1558 return "mtimes";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1559
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1560 case '/':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1561 return "mrdivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1562
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1563 case '^':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1564 return "mpower";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1565
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1566 case '\\':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1567 return "mldivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1568
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1569 case '<':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1570 return "lt";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1571
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1572 case '>':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1573 return "gt";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1574
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1575 case '&':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1576 return "and";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1577
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1578 case '|':
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1579 return "or";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1580
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1581 default:
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1582 break;
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1583 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1584 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1585
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1586 return name;
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1587 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1588
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1589 // Creates a function handle that takes into account the context,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1590 // finding local, nested, private, or sub functions.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1591
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1592 octave_value
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1593 tree_evaluator::make_fcn_handle (const std::string& name)
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1594 {
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1595 octave_value retval;
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1596
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1597 // The str2func function can create a function handle with the name
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1598 // of an operator (for example, "+"). If so, it is converted to the
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1599 // name of the corresponding function ("+" -> "plus") and we create
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1600 // a simple function handle using that name.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1601
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1602 std::string fcn_name = get_operator_function_name (name);
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1603
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1604 // If FCN_NAME is different from NAME, then NAME is an operator. As
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1605 // of version 2020a, Matlab apparently uses the function name
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1606 // corresponding to the operator to search for private and local
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1607 // functions in the current scope but not(!) nested functions.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1608
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1609 bool name_is_operator = fcn_name != name;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1610
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
1611 std::size_t pos = fcn_name.find ('.');
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1612
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1613 if (pos != std::string::npos)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1614 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1615 // Recognize (some of? which ones?) the following cases
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1616 // and create something other than a simple function handle?
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1617 // Should we just be checking for the last two when the first
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1618 // element of the dot-separated list is an object? If so, then
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1619 // should this syntax be limited to a dot-separated list with
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1620 // exactly two elements?
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1621 //
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1622 // object . method
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1623 // object . static-method
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1624 //
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1625 // Code to do that duplicates some of simple_fcn_handle::call.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1626
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1627 // Only accept expressions that contain one '.' separator.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1628
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1629 // FIXME: The logic here is a bit complicated. Is there a good
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1630 // way to simplify it?
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1631
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1632 std::string meth_nm = fcn_name.substr (pos+1);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1633
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1634 if (meth_nm.find ('.') == std::string::npos)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1635 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1636 std::string obj_nm = fcn_name.substr (0, pos);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1637
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1638 // If obj_nm is an object in the current scope with a
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1639 // method named meth_nm, create a classsimple handle.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1640
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1641 octave_value object = varval (obj_nm);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1642
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1643 if (object.is_defined () && object.is_classdef_object ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1644 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1645 octave_classdef *cdef = object.classdef_object_value ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1646
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1647 if (cdef)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1648 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1649 std::string class_nm = cdef->class_name ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1650
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1651 cdef_object cdef_obj = cdef->get_object ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1652
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1653 cdef_class cls = cdef_obj.get_class ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1654
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1655 cdef_method meth = cls.find_method (meth_nm);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1656
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1657 if (meth.ok ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1658 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1659 // If the method we found is static, create a
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1660 // new function name from the class name and
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1661 // method name and create a simple function
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1662 // handle below. Otherwise, create a class
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1663 // simple function handle.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1664
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1665 if (meth.is_static ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1666 fcn_name = class_nm + '.' + meth_nm;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1667 else
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1668 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1669 octave_value meth_fcn = meth.get_function ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1670
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1671 octave_fcn_handle *fh
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1672 = new octave_fcn_handle (object, meth_fcn,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1673 class_nm, meth_nm);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1674
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1675 return octave_value (fh);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1676 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1677 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1678 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1679 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1680 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1681
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1682 // We didn't match anything above, so create handle to SIMPLE
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1683 // package function or static class method. Function resolution
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1684 // is performed when the handle is used.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1685
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1686 return octave_value (new octave_fcn_handle (fcn_name));
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1687 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1688
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1689 // If the function name refers to a sub/local/private function or a
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1690 // class method/constructor, create scoped function handle that is
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1691 // bound to that function. Use the same precedence list as
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1692 // fcn_info::find but limit search to the following types of
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1693 // functions:
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1694 //
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1695 // nested functions (and subfunctions)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1696 // local functions in the current file
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1697 // private function
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1698 // class method
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1699 //
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1700 // For anything else we create a simple function handle that will be
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1701 // resolved dynamically in the scope where it is evaluated.
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1702
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1703 symbol_scope curr_scope = get_current_scope ();
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1704
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1705 symbol_table& symtab = m_interpreter.get_symbol_table ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1706
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1707 if (curr_scope)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1708 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1709 octave_value ov_fcn
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1710 = symtab.find_scoped_function (fcn_name, curr_scope);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1711
29422
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1712 // If name is operator, we are in Fstr2func, so skip the stack
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1713 // frame for that function.
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1714
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1715 bool skip_first = name_is_operator;
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1716 octave_function *curr_fcn = current_function (skip_first);
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1717
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1718 if (ov_fcn.is_defined ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1719 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1720 octave_function *fcn = ov_fcn.function_value ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1721
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1722 if (fcn->is_nested_function ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1723 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1724 if (! name_is_operator)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1725 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1726 // Get current stack frame and return handle to nested
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1727 // function.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1728
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1729 std::shared_ptr<stack_frame> frame
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1730 = m_call_stack.get_current_stack_frame ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1731
29422
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1732 // If we are creating a handle to the current
29832
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1733 // function or a handle to a sibling function (i.e.,
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1734 // not a child of the current function), then use
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1735 // the calling stack frame as the context instead of
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1736 // the current stack frame.
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1737
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1738 // FIXME: Do we need both checks here or is it
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1739 // sufficient to check that the parent of curr_fcn
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1740 // is the same as the parent of fcn? Is there any
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1741 // case where curr_fcn could be nullptr, or does
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1742 // that indicate an internal error of some kind?
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1743
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1744 if (curr_fcn
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1745 && (fcn_name == curr_fcn->name ()
6d1224698acf fix scoping issue for handles to sibling nested functions (bug #60845)
John W. Eaton <jwe@octave.org>
parents: 29656
diff changeset
1746 || fcn->parent_fcn_name () == curr_fcn->parent_fcn_name ()))
29422
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1747 frame = frame->access_link ();
8b9e3f0bd06f fix context link when creating handle to nested function
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
1748
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1749 octave_fcn_handle *fh
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1750 = new octave_fcn_handle (ov_fcn, fcn_name, frame);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1751
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1752 return octave_value (fh);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1753 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1754 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1755 else if (fcn->is_subfunction ()
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1756 /* || fcn->is_localfunction () */
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1757 || fcn->is_private_function ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1758 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1759 // Create handle to SCOPED function (sub/local function
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1760 // or private function).
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1761
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1762 std::list<std::string> parentage = fcn->parent_fcn_names ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1763
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1764 octave_fcn_handle *fh
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1765 = new octave_fcn_handle (ov_fcn, fcn_name, parentage);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1766
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1767 return octave_value (fh);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1768 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1769 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1770
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1771 if (curr_fcn && (curr_fcn->is_class_method ()
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1772 || curr_fcn->is_class_constructor ()))
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1773 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1774 std::string dispatch_class = curr_fcn->dispatch_class ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1775
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1776 octave_value ov_meth
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1777 = symtab.find_method (fcn_name, dispatch_class);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1778
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1779 if (ov_meth.is_defined ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1780 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1781 octave_function *fcn = ov_meth.function_value ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1782
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1783 // FIXME: do we need to check that it is a method of
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1784 // dispatch_class, or is it sufficient to just check
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1785 // that it is a method?
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1786
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1787 if (fcn->is_class_method ())
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1788 {
28481
1be719d8b375 fix dispatch error with classsimple function handle (bug #58572)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
1789 // Create CLASSSIMPLE handle to method but don't
1be719d8b375 fix dispatch error with classsimple function handle (bug #58572)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
1790 // bind to the method. Lookup will be done later.
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1791
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1792 octave_fcn_handle *fh
28481
1be719d8b375 fix dispatch error with classsimple function handle (bug #58572)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
1793 = new octave_fcn_handle (dispatch_class, fcn_name);
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1794
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1795 return octave_value (fh);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1796 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1797 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1798 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1799 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1800
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1801 octave_value ov_fcn = symtab.find_user_function (fcn_name);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1802
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1803 // Create handle to SIMPLE function. If the function is not found
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1804 // now, then we will look for it again when the handle is used.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1805
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
1806 return octave_value (new octave_fcn_handle (ov_fcn, fcn_name));
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1807 }
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1808
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1809 /*
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1810 %!test
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1811 %! x = {".**", "power";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1812 %! ".'", "transpose";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1813 %! ".+", "plus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1814 %! ".-", "minus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1815 %! ".*", "times";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1816 %! "./", "rdivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1817 %! ".^", "power";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1818 %! ".\\", "ldivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1819 %! "<=", "le";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1820 %! "==", "eq";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1821 %! ">=", "ge";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1822 %! "!=", "ne";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1823 %! "~=", "ne";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1824 %! "**", "mpower";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1825 %! "~", "not";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1826 %! "!", "not";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1827 %! "\'", "ctranspose";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1828 %! "+", "plus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1829 %! "-", "minus";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1830 %! "*", "mtimes";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1831 %! "/", "mrdivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1832 %! "^", "mpower";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1833 %! "\\", "mldivide";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1834 %! "<", "lt";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1835 %! ">", "gt";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1836 %! "&", "and";
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1837 %! "|", "or"};
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1838 %! for i = 1:rows (x)
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1839 %! assert (functions (str2func (x{i,1})).function, x{i,2});
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1840 %! endfor
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1841 */
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
1842
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1843 octave_value
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1844 tree_evaluator::evaluate (tree_decl_elt *elt)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1845 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1846 // Do not allow functions to return null values.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1847
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1848 tree_identifier *id = elt->ident ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1849
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
1850 return id ? id->evaluate (*this).storable_value () : octave_value ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1851 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
1852
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1853 bool
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1854 tree_evaluator::is_variable (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1855 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1856 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1857 = m_call_stack.get_current_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: 28256
diff changeset
1858
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1859 return frame->is_variable (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1860 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1861
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1862 bool
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1863 tree_evaluator::is_local_variable (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1864 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1865 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1866 = m_call_stack.get_current_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: 28256
diff changeset
1867
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1868 return frame->is_local_variable (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1869 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1870
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1871 bool
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1872 tree_evaluator::is_variable (const tree_expression *expr) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1873 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1874 if (expr->is_identifier ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1875 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1876 const tree_identifier *id
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1877 = dynamic_cast<const tree_identifier *> (expr);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1878
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1879 if (id->is_black_hole ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1880 return false;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1881
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1882 return is_variable (id->symbol ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1883 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1884
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1885 return false;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1886 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1887
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1888 bool
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1889 tree_evaluator::is_defined (const tree_expression *expr) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1890 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1891 if (expr->is_identifier ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1892 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1893 const tree_identifier *id
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1894 = dynamic_cast<const tree_identifier *> (expr);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1895
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1896 return is_defined (id->symbol ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1897 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1898
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1899 return false;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1900 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1901
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1902 bool
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1903 tree_evaluator::is_variable (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1904 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1905 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1906 = m_call_stack.get_current_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: 28256
diff changeset
1907
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1908 return frame->is_variable (sym);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1909 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1910
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1911 bool
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1912 tree_evaluator::is_defined (const symbol_record& sym) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1913 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1914 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1915 = m_call_stack.get_current_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: 28256
diff changeset
1916
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1917 return frame->is_defined (sym);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1918 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1919
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1920 bool tree_evaluator::is_global (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1921 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1922 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1923 = m_call_stack.get_current_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: 28256
diff changeset
1924
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1925 return frame->is_global (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1926 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1927
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1928 octave_value
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1929 tree_evaluator::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: 26512
diff changeset
1930 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1931 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1932 = m_call_stack.get_current_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: 28256
diff changeset
1933
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1934 return frame->varval (sym);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1935 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1936
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1937 octave_value
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1938 tree_evaluator::varval (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1939 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1940 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1941 = m_call_stack.get_current_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: 28256
diff changeset
1942
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1943 return frame->varval (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1944 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1945
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1946 void tree_evaluator::install_variable (const std::string& name,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1947 const octave_value& value,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1948 bool global)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1949 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1950 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1951 = m_call_stack.get_current_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: 28256
diff changeset
1952
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1953 return frame->install_variable (name, value, global);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1954 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1955
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1956 octave_value
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1957 tree_evaluator::global_varval (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1958 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1959 return m_call_stack.global_varval (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1960 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1961
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
1962 octave_value&
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
1963 tree_evaluator::global_varref (const std::string& name)
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
1964 {
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
1965 return m_call_stack.global_varref (name);
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
1966 }
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
1967
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1968 void
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1969 tree_evaluator::global_assign (const std::string& name,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1970 const octave_value& val)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1971 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1972 m_call_stack.global_varref (name) = val;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1973 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1974
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1975 octave_value
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1976 tree_evaluator::top_level_varval (const std::string& name) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1977 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1978 return m_call_stack.get_top_level_value (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1979 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1980
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1981 void
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1982 tree_evaluator::top_level_assign (const std::string& name,
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27923
diff changeset
1983 const octave_value& val)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1984 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1985 m_call_stack.set_top_level_value (name, val);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1986 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1987
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1988 void
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1989 tree_evaluator::assign (const std::string& name, const octave_value& val)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1990 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1991 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1992 = m_call_stack.get_current_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: 28256
diff changeset
1993
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
1994 frame->assign (name, val);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1995 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1996
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
1997 void
27014
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
1998 tree_evaluator::assignin (const std::string& context,
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
1999 const std::string& name, const octave_value& val)
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2000 {
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2001 // FIXME: Can this be done without an unwind-protect frame, simply
27971
ec769a7ab9fb fix more spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 27957
diff changeset
2002 // by getting a reference to the caller or base stack frame and
27014
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2003 // calling assign on that?
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2004
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29527
diff changeset
2005 unwind_action act ([=] (std::size_t frm)
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
2006 {
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
2007 m_call_stack.restore_frame (frm);
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
2008 }, m_call_stack.current_frame ());
27014
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2009
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2010 if (context == "caller")
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2011 m_call_stack.goto_caller_frame ();
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2012 else if (context == "base")
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2013 m_call_stack.goto_base_frame ();
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2014 else
28752
810eb29fc227 maint: Use C++ raw string literals to simplify backlsashing.
Rik <rik@octave.org>
parents: 28727
diff changeset
2015 error (R"(assignin: CONTEXT must be "caller" or "base")");
27014
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2016
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2017 if (valid_identifier (name))
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2018 {
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2019 // Put the check here so that we don't slow down assignments
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2020 // generally. Any that go through Octave's parser should have
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2021 // already been checked.
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2022
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2023 if (iskeyword (name))
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2024 error ("assignin: invalid assignment to keyword '%s'",
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2025 name.c_str ());
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2026
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2027 assign (name, val);
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2028 }
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2029 else
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2030 error ("assignin: invalid variable name '%s'", name.c_str ());
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2031 }
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2032
daab1b311a98 move core of assignin function to evaluator
John W. Eaton <jwe@octave.org>
parents: 27005
diff changeset
2033 void
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2034 tree_evaluator::source_file (const std::string& file_name,
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2035 const std::string& context,
27507
2d537a089e5d eliminate warn_for argument for source_file and parse_fcn_file functions
John W. Eaton <jwe@octave.org>
parents: 27504
diff changeset
2036 bool verbose, bool require_file)
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2037 {
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2038 // Map from absolute name of script file to recursion level. We
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2039 // use a map instead of simply placing a limit on recursion in the
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2040 // source_file function so that two mutually recursive scripts
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2041 // written as
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2042 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2043 // foo1.m:
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2044 // ------
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2045 // foo2
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2046 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2047 // foo2.m:
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2048 // ------
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2049 // foo1
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2050 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2051 // and called with
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2052 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2053 // foo1
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2054 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2055 // (for example) will behave the same if they are written as
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2056 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2057 // foo1.m:
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2058 // ------
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2059 // source ("foo2.m")
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2060 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2061 // foo2.m:
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2062 // ------
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2063 // source ("foo1.m")
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2064 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2065 // and called with
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2066 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2067 // source ("foo1.m")
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2068 //
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2069 // (for example).
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2070
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2071 static std::map<std::string, int> source_call_depth;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2072
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2073 std::string file_full_name
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2074 = sys::file_ops::tilde_expand (file_name);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2075
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
2076 std::size_t pos
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2077 = file_full_name.find_last_of (sys::file_ops::dir_sep_str ());
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2078
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2079 std::string dir_name = file_full_name.substr (0, pos);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2080
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2081 file_full_name = sys::env::make_absolute (file_full_name);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2082
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2083 unwind_protect frame;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2084
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2085 if (source_call_depth.find (file_full_name) == source_call_depth.end ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2086 source_call_depth[file_full_name] = -1;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2087
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2088 frame.protect_var (source_call_depth[file_full_name]);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2089
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2090 source_call_depth[file_full_name]++;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2091
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2092 if (source_call_depth[file_full_name] >= max_recursion_depth ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2093 error ("max_recursion_depth exceeded");
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2094
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2095 if (! context.empty ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2096 {
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
2097 frame.add (&call_stack::restore_frame, &m_call_stack,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
2098 m_call_stack.current_frame ());
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2099
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2100 if (context == "caller")
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2101 m_call_stack.goto_caller_frame ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2102 else if (context == "base")
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2103 m_call_stack.goto_base_frame ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2104 else
28752
810eb29fc227 maint: Use C++ raw string literals to simplify backlsashing.
Rik <rik@octave.org>
parents: 28727
diff changeset
2105 error (R"(source: CONTEXT must be "caller" or "base")");
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2106 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2107
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2108 // Find symbol name that would be in symbol_table, if it were loaded.
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
2109 std::size_t dir_end
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2110 = file_name.find_last_of (sys::file_ops::dir_sep_chars ());
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2111 dir_end = (dir_end == std::string::npos) ? 0 : dir_end + 1;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2112
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
2113 std::size_t extension = file_name.find_last_of ('.');
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2114 if (extension == std::string::npos)
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2115 extension = file_name.length ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2116
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2117 std::string symbol = file_name.substr (dir_end, extension - dir_end);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2118 std::string full_name = sys::canonicalize_file_name (file_name);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2119
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2120 // Check if this file is already loaded (or in the path)
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2121 symbol_table& symtab = m_interpreter.get_symbol_table ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2122 octave_value ov_code = symtab.fcn_table_find (symbol);
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2123
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2124 // For compatibility with Matlab, accept both scripts and
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2125 // functions.
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2126
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2127 if (ov_code.is_user_code ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2128 {
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2129 octave_user_code *code = ov_code.user_code_value ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2130
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2131 if (! code
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2132 || (sys::canonicalize_file_name (code->fcn_file_name ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2133 != full_name))
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2134 {
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2135 // Wrong file, so load it below.
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2136 ov_code = octave_value ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2137 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2138 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2139 else
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2140 {
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2141 // Not a script, so load it below.
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2142 ov_code = octave_value ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2143 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2144
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2145 // If no symbol of this name, or the symbol is for a different
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2146 // file, load.
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2147
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2148 if (ov_code.is_undefined ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2149 {
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2150 try
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2151 {
27509
fefc780b4e2e move parse_fcn_file from interpreter member function to parser friend
John W. Eaton <jwe@octave.org>
parents: 27507
diff changeset
2152 ov_code = parse_fcn_file (m_interpreter, file_full_name,
fefc780b4e2e move parse_fcn_file from interpreter member function to parser friend
John W. Eaton <jwe@octave.org>
parents: 27507
diff changeset
2153 file_name, dir_name, "", "",
fefc780b4e2e move parse_fcn_file from interpreter member function to parser friend
John W. Eaton <jwe@octave.org>
parents: 27507
diff changeset
2154 require_file, true, false, false);
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2155 }
29163
8f67ad8b3103 maint: Updating naming conventions for exceptions and use const where possible.
Rik <rik@octave.org>
parents: 29117
diff changeset
2156 catch (execution_exception& ee)
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2157 {
29163
8f67ad8b3103 maint: Updating naming conventions for exceptions and use const where possible.
Rik <rik@octave.org>
parents: 29117
diff changeset
2158 error (ee, "source: error sourcing file '%s'",
27017
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2159 file_full_name.c_str ());
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2160 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2161 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2162
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2163 // Return or error if we don't have a valid script or function.
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2164
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2165 if (ov_code.is_undefined ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2166 return;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2167
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2168 if (! ov_code.is_user_code ())
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2169 error ("source: %s is not a script", full_name.c_str ());
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2170
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2171 if (verbose)
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2172 {
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2173 octave_stdout << "executing commands from " << full_name << " ... ";
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2174 octave_stdout.flush ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2175 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2176
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2177 octave_user_code *code = ov_code.user_code_value ();
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2178
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2179 code->call (*this, 0, octave_value_list ());
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2180
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2181 if (verbose)
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2182 octave_stdout << "done." << std::endl;
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2183 }
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2184
24b7e6326e26 move parse_fcn_file to interpreter; source_file to evaluator
John W. Eaton <jwe@octave.org>
parents: 27016
diff changeset
2185 void
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2186 tree_evaluator::set_auto_fcn_var (stack_frame::auto_var_type avt,
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2187 const octave_value& val)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2188 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2189 m_call_stack.set_auto_fcn_var (avt, val);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2190 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2191
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2192 octave_value
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2193 tree_evaluator::get_auto_fcn_var (stack_frame::auto_var_type avt) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2194 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2195 return m_call_stack.get_auto_fcn_var (avt);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2196 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2197
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2198 void
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2199 tree_evaluator::define_parameter_list_from_arg_vector
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2200 (tree_parameter_list *param_list, const octave_value_list& args)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2201 {
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2202 int i = -1;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2203
23449
c763214a8260 maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
2204 for (tree_decl_elt *elt : *param_list)
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2205 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2206 i++;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2207
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
2208 octave_lvalue ref = elt->lvalue (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2209
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2210 if (i < args.length ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2211 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2212 if (args(i).is_defined () && args(i).is_magic_colon ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2213 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2214 if (! eval_decl_elt (elt))
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2215 error ("no default value for argument %d", i+1);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2216 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2217 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2218 ref.define (args(i));
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2219 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2220 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2221 eval_decl_elt (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2222 }
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2223 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2224
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2225 void
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2226 tree_evaluator::undefine_parameter_list (tree_parameter_list *param_list)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2227 {
23449
c763214a8260 maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
2228 for (tree_decl_elt *elt : *param_list)
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2229 {
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
2230 octave_lvalue ref = elt->lvalue (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2231
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2232 ref.assign (octave_value::op_asn_eq, octave_value ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2233 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2234 }
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
2235
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2236 // END is documented in op-kw-docs.
29968
7aa4d8c049e5 eliminate obsolete DEFCONSTFUN and DEFCONSTMETHOD macros
John W. Eaton <jwe@octave.org>
parents: 29961
diff changeset
2237 DEFMETHOD (end, interp, args, ,
7aa4d8c049e5 eliminate obsolete DEFCONSTFUN and DEFCONSTMETHOD macros
John W. Eaton <jwe@octave.org>
parents: 29961
diff changeset
2238 doc: /* -*- texinfo -*-
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2239 @deftypefn {} {} end
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2240 Last element of an array or the end of any @code{for}, @code{parfor},
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2241 @code{if}, @code{do}, @code{while}, @code{function}, @code{switch},
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2242 @code{try}, or @code{unwind_protect} block.
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2243
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2244 As an index of an array, the magic index @qcode{"end"} refers to the
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2245 last valid entry in an indexing operation.
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2246
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2247 Example:
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2248
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2249 @example
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2250 @group
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2251 @var{x} = [ 1 2 3; 4 5 6 ];
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2252 @var{x}(1,end)
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2253 @result{} 3
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2254 @var{x}(end,1)
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2255 @result{} 4
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2256 @var{x}(end,end)
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2257 @result{} 6
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2258 @end group
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2259 @end example
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2260 @seealso{for, parfor, if, do, while, function, switch, try, unwind_protect}
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2261 @end deftypefn */)
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2262 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
2263 tree_evaluator& tw = interp.get_evaluator ();
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2264
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2265 return tw.evaluate_end_expression (args);
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2266 }
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2267
27100
b453b586da16 improve error message when indexing undefined object with "end" (bug #33637)
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
2268 /*
28617
0bac488f17fa throw error if 'end' is applied to undefined symbol (bug #58830)
John W. Eaton <jwe@octave.org>
parents: 28560
diff changeset
2269 %!test <*58830>
0bac488f17fa throw error if 'end' is applied to undefined symbol (bug #58830)
John W. Eaton <jwe@octave.org>
parents: 28560
diff changeset
2270 %! fail ("__undef_sym__ (end)",
0bac488f17fa throw error if 'end' is applied to undefined symbol (bug #58830)
John W. Eaton <jwe@octave.org>
parents: 28560
diff changeset
2271 %! "invalid use of 'end': may only be used to index existing value");
28696
2a47fa406ed8 allow 'end' indexing to work for nested function calls (bug #58953)
John W. Eaton <jwe@octave.org>
parents: 28617
diff changeset
2272
29493
de40b395b9c3 update bug status in test suite
John W. Eaton <jwe@octave.org>
parents: 29478
diff changeset
2273 %!test <*58953>
28696
2a47fa406ed8 allow 'end' indexing to work for nested function calls (bug #58953)
John W. Eaton <jwe@octave.org>
parents: 28617
diff changeset
2274 %! x = 1:10;
2a47fa406ed8 allow 'end' indexing to work for nested function calls (bug #58953)
John W. Eaton <jwe@octave.org>
parents: 28617
diff changeset
2275 %! assert (x(end), 10);
2a47fa406ed8 allow 'end' indexing to work for nested function calls (bug #58953)
John W. Eaton <jwe@octave.org>
parents: 28617
diff changeset
2276 %! assert (x(minus (end, 1)), 9);
2a47fa406ed8 allow 'end' indexing to work for nested function calls (bug #58953)
John W. Eaton <jwe@octave.org>
parents: 28617
diff changeset
2277 %! assert (x(minus (minus (end, 1), 1)), 8);
27100
b453b586da16 improve error message when indexing undefined object with "end" (bug #33637)
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
2278 */
b453b586da16 improve error message when indexing undefined object with "end" (bug #33637)
John W. Eaton <jwe@octave.org>
parents: 27037
diff changeset
2279
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2280 octave_value_list
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2281 tree_evaluator::convert_to_const_vector (tree_argument_list *args)
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2282 {
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2283 std::list<octave_value> arg_vals;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2284
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2285 for (auto elt : *args)
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2286 {
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2287 // FIXME: is it possible for elt to be invalid?
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2288
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2289 if (! elt)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2290 break;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2291
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2292 octave_value tmp = elt->evaluate (*this);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2293
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2294 if (tmp.is_cs_list ())
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2295 {
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2296 octave_value_list tmp_ovl = tmp.list_value ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2297
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2298 for (octave_idx_type i = 0; i < tmp_ovl.length (); i++)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2299 arg_vals.push_back (tmp_ovl(i));
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2300 }
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2301 else if (tmp.is_defined ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2302 arg_vals.push_back (tmp);
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2303 }
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2304
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
2305 return octave_value_list (arg_vals);
25382
749d9e858553 move convert_to_const_vector from tree_argument_list to tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25381
diff changeset
2306 }
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2307
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2308 octave_value_list
23916
85488effc0ff refactor function value return code
John W. Eaton <jwe@octave.org>
parents: 23913
diff changeset
2309 tree_evaluator::convert_return_list_to_const_vector
28540
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2310 (tree_parameter_list *ret_list, int nargout, const Matrix& ignored_outputs,
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2311 const Cell& varargout)
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2312 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2313 octave_idx_type vlen = varargout.numel ();
23916
85488effc0ff refactor function value return code
John W. Eaton <jwe@octave.org>
parents: 23913
diff changeset
2314 int len = ret_list->length ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2315
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2316 // Special case. Will do a shallow copy.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2317 if (len == 0)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2318 return varargout;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2319 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2320 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2321 int i = 0;
28540
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2322 int k = 0;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2323 int num_ignored = ignored_outputs.numel ();
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2324 int ignored = num_ignored > 0 ? ignored_outputs(k) - 1 : -1;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2325
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2326 if (nargout <= len)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2327 {
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2328 int nout = nargout > 0 ? nargout : 1;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2329 octave_value_list retval (nout);
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2330
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2331 for (tree_decl_elt *elt : *ret_list)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2332 {
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2333 if (nargout == 0 && ! is_defined (elt->ident ()))
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2334 break;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2335
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2336 if (ignored >= 0 && i == ignored)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2337 {
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2338 i++;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2339 k++;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2340 ignored = k < num_ignored ? ignored_outputs(k) - 1 : -1;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2341 }
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2342 else
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2343 retval(i++) = evaluate (elt);
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2344
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2345 if (i == nout)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2346 break;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2347 }
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2348
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2349 return retval;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2350 }
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2351 else
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2352 {
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2353 octave_value_list retval (len + vlen);
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2354
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2355 for (tree_decl_elt *elt : *ret_list)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2356 {
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2357 if (ignored >= 0 && i == ignored)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2358 {
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2359 i++;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2360 k++;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2361 ignored = k < num_ignored ? ignored_outputs(k) - 1 : -1;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2362 }
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2363 else
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2364 retval(i++) = evaluate (elt);
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2365 }
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2366
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2367 for (octave_idx_type j = 0; j < vlen; j++)
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2368 retval(i++) = varargout(j);
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2369
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2370 return retval;
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
2371 }
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2372 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2373 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2374
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2375 bool
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2376 tree_evaluator::eval_decl_elt (tree_decl_elt *elt)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2377 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2378 bool retval = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2379
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2380 tree_identifier *id = elt->ident ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2381 tree_expression *expr = elt->expression ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2382
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2383 if (id && expr)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2384 {
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
2385 octave_lvalue ult = id->lvalue (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2386
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
2387 octave_value init_val = expr->evaluate (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2388
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2389 ult.assign (octave_value::op_asn_eq, init_val);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2390
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2391 retval = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2392 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2393
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2394 return retval;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2395 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2396
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2397 bool
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2398 tree_evaluator::switch_case_label_matches (tree_switch_case *expr,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2399 const octave_value& val)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2400 {
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2401 tree_expression *label = expr->case_label ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2402
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
2403 octave_value label_value = label->evaluate (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2404
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2405 if (label_value.is_defined ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2406 {
23576
00e518162fda maint: Deprecate is_cell and replace with iscell.
Rik <rik@octave.org>
parents: 23563
diff changeset
2407 if (label_value.iscell ())
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2408 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2409 Cell cell (label_value.cell_value ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2410
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2411 for (octave_idx_type i = 0; i < cell.rows (); i++)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2412 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2413 for (octave_idx_type j = 0; j < cell.columns (); j++)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2414 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2415 bool match = val.is_equal (cell(i,j));
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2416
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2417 if (match)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2418 return true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2419 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2420 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2421 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2422 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2423 return val.is_equal (label_value);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2424 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2425
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2426 return false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2427 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2428
27210
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2429 void tree_evaluator::push_stack_frame (const symbol_scope& scope)
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2430 {
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2431 m_call_stack.push (scope);
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2432 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2433
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2434 void tree_evaluator::push_stack_frame (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: 28256
diff changeset
2435 const std::shared_ptr<stack_frame>& closure_frames)
27210
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2436 {
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2437 m_call_stack.push (fcn, closure_frames);
27210
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2438 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2439
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
2440 void tree_evaluator::push_stack_frame (octave_user_function *fcn,
29477
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29475
diff changeset
2441 const stack_frame::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: 29475
diff changeset
2442 const std::shared_ptr<stack_frame>& closure_frames)
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
2443 {
29477
34d06c73b48d hold references to closure frames in anon functions if needed (bug #60237)
John W. Eaton <jwe@octave.org>
parents: 29475
diff changeset
2444 m_call_stack.push (fcn, local_vars, closure_frames);
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
2445 }
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28429
diff changeset
2446
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2447 void tree_evaluator::push_stack_frame (octave_user_script *script)
27210
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2448 {
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2449 m_call_stack.push (script);
27210
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2450 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2451
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2452 void tree_evaluator::push_stack_frame (octave_function *fcn)
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2453 {
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2454 m_call_stack.push (fcn);
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2455 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2456
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2457 void tree_evaluator::pop_stack_frame (void)
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2458 {
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2459 m_call_stack.pop ();
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2460 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2461
27200
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2462 int tree_evaluator::current_line (void) const
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2463 {
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2464 return m_call_stack.current_line ();
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2465 }
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2466
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2467 int tree_evaluator::current_column (void) const
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2468 {
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2469 return m_call_stack.current_column ();
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2470 }
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2471
27205
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2472 int tree_evaluator::debug_user_code_line (void) const
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2473 {
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2474 return m_call_stack.debug_user_code_line ();
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2475 }
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2476
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2477 int tree_evaluator::debug_user_code_column (void) const
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2478 {
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2479 return m_call_stack.debug_user_code_column ();
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2480 }
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2481
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2482 void tree_evaluator::debug_where (std::ostream& os) const
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2483 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2484 std::shared_ptr<stack_frame> frm = m_call_stack.current_user_frame ();
27205
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2485
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2486 frm->display_stopped_in_message (os);
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2487 }
6648d1ae05fe eliminate direct access to call stack in debug functions
John W. Eaton <jwe@octave.org>
parents: 27204
diff changeset
2488
27200
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2489 octave_user_code * tree_evaluator::current_user_code (void) const
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2490 {
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2491 return m_call_stack.current_user_code ();
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2492 }
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2493
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
2494 unwind_protect * tree_evaluator::curr_fcn_unwind_protect_frame (void)
27204
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2495 {
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2496 return m_call_stack.curr_fcn_unwind_protect_frame ();
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2497 }
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2498
27202
23962b243bad eliminate direct access to call stack in help functions
John W. Eaton <jwe@octave.org>
parents: 27201
diff changeset
2499 octave_user_code * tree_evaluator::debug_user_code (void) const
23962b243bad eliminate direct access to call stack in help functions
John W. Eaton <jwe@octave.org>
parents: 27201
diff changeset
2500 {
23962b243bad eliminate direct access to call stack in help functions
John W. Eaton <jwe@octave.org>
parents: 27201
diff changeset
2501 return m_call_stack.debug_user_code ();
23962b243bad eliminate direct access to call stack in help functions
John W. Eaton <jwe@octave.org>
parents: 27201
diff changeset
2502 }
23962b243bad eliminate direct access to call stack in help functions
John W. Eaton <jwe@octave.org>
parents: 27201
diff changeset
2503
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2504 octave_function * tree_evaluator::current_function (bool skip_first) const
27201
bd49997051ef eliminate direct access to call stack in defun functions
John W. Eaton <jwe@octave.org>
parents: 27200
diff changeset
2505 {
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2506 return m_call_stack.current_function (skip_first);
27201
bd49997051ef eliminate direct access to call stack in defun functions
John W. Eaton <jwe@octave.org>
parents: 27200
diff changeset
2507 }
bd49997051ef eliminate direct access to call stack in defun functions
John W. Eaton <jwe@octave.org>
parents: 27200
diff changeset
2508
27204
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2509 octave_function * tree_evaluator::caller_function (void) const
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2510 {
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2511 return m_call_stack.current_function (true);
27204
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2512 }
9a3e92d02a03 eliminate direct access to call stack in variables functions
John W. Eaton <jwe@octave.org>
parents: 27203
diff changeset
2513
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
2514 bool tree_evaluator::goto_frame (std::size_t n, bool verbose)
27200
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2515 {
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2516 return m_call_stack.goto_frame (n, verbose);
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2517 }
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2518
27206
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2519 void tree_evaluator::goto_caller_frame (void)
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2520 {
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2521 m_call_stack.goto_caller_frame ();
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2522 }
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2523
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2524 void tree_evaluator::goto_base_frame (void)
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2525 {
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2526 m_call_stack.goto_base_frame ();
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2527 }
4e4a9d7b436e eliminate direct access to call stack in mex functions
John W. Eaton <jwe@octave.org>
parents: 27205
diff changeset
2528
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
2529 void tree_evaluator::restore_frame (std::size_t n)
27200
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2530 {
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2531 return m_call_stack.restore_frame (n);
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2532 }
dc1edf932248 eliminate direct access to call_stack in input functions
John W. Eaton <jwe@octave.org>
parents: 27199
diff changeset
2533
27208
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2534 std::string tree_evaluator::get_dispatch_class (void) const
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2535 {
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2536 return m_call_stack.get_dispatch_class ();
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2537 }
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2538
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2539 void tree_evaluator::set_dispatch_class (const std::string& class_name)
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2540 {
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2541 m_call_stack.set_dispatch_class (class_name);
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2542 }
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27206
diff changeset
2543
27210
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2544 bool
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2545 tree_evaluator::is_class_method_executing (std::string& dclass) const
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2546 {
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2547 return m_call_stack.is_class_method_executing (dclass);
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2548 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2549
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2550 bool
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2551 tree_evaluator::is_class_constructor_executing (std::string& dclass) const
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2552 {
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2553 return m_call_stack.is_class_constructor_executing (dclass);
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2554 }
bd684aad1821 eliminate some direct access to call stack in legacy class and function objects
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
2555
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2556 std::list<std::shared_ptr<stack_frame>>
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2557 tree_evaluator::backtrace_frames (octave_idx_type& curr_user_frame) const
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2558 {
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2559 return m_call_stack.backtrace_frames (curr_user_frame);
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2560 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2561
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2562 std::list<std::shared_ptr<stack_frame>>
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2563 tree_evaluator::backtrace_frames (void) const
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2564 {
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2565 return m_call_stack.backtrace_frames ();
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2566 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2567
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2568 std::list<frame_info>
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2569 tree_evaluator::backtrace_info (octave_idx_type& curr_user_frame,
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2570 bool print_subfn) const
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2571 {
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2572 return m_call_stack.backtrace_info (curr_user_frame, print_subfn);
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2573 }
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2574
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2575 std::list<frame_info> tree_evaluator::backtrace_info (void) const
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2576 {
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2577 return m_call_stack.backtrace_info ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2578 }
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2579
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2580 octave_map
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2581 tree_evaluator::backtrace (octave_idx_type& curr_user_frame,
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2582 bool print_subfn) const
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2583 {
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2584 return m_call_stack.backtrace (curr_user_frame, print_subfn);
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2585 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2586
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2587 octave_map tree_evaluator::backtrace (void) const
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2588 {
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2589 return m_call_stack.backtrace ();
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2590 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2591
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2592 octave_map tree_evaluator::empty_backtrace (void) const
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2593 {
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2594 return m_call_stack.empty_backtrace ();
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2595 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2596
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2597 std::string tree_evaluator::backtrace_message (void) const
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2598 {
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2599 std::list<frame_info> frames = backtrace_info ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2600
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2601 std::ostringstream buf;
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2602
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2603 for (const auto& frm : frames)
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2604 {
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2605 buf << " " << frm.fcn_name ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2606
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2607 int line = frm.line ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2608
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2609 if (line > 0)
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2610 {
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2611 buf << " at line " << line;
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2612
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2613 int column = frm.column ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2614
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2615 if (column > 0)
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2616 buf << " column " << column;
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2617
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2618 buf << "\n";
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2619 }
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2620 }
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2621
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2622 return buf.str ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2623 }
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
2624
27001
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2625 void tree_evaluator::push_dummy_scope (const std::string& name)
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2626 {
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2627 symbol_scope dummy_scope (name + "$dummy");
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2628
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2629 m_call_stack.push (dummy_scope);
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2630 }
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2631
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2632 void tree_evaluator::pop_scope (void)
24037
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2633 {
27001
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2634 m_call_stack.pop ();
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2635 }
3cea1cfb37d3 move toward limiting direct access of call stack
John W. Eaton <jwe@octave.org>
parents: 26975
diff changeset
2636
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2637 symbol_scope tree_evaluator::get_top_scope (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2638 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2639 return m_call_stack.top_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2640 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2641
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2642 symbol_scope tree_evaluator::get_current_scope (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2643 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2644 return m_call_stack.current_scope ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2645 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2646
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2647 void tree_evaluator::mlock (bool skip_first) const
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2648 {
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2649 octave_function *fcn = m_call_stack.current_function (skip_first);
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2650
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2651 if (! fcn)
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2652 error ("mlock: invalid use outside a function");
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2653
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2654 if (fcn->is_builtin_function ())
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2655 {
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2656 warning ("mlock: locking built-in function has no effect");
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2657 return;
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2658 }
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2659
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2660 fcn->lock ();
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2661 }
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2662
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2663 void tree_evaluator::munlock (bool skip_first) const
27212
f84c5528e932 eliminate direct access to call stack in interpreter::mlock
John W. Eaton <jwe@octave.org>
parents: 27211
diff changeset
2664 {
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2665 octave_function *fcn = m_call_stack.current_function (skip_first);
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2666
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2667 if (! fcn)
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2668 error ("munlock: invalid use outside a function");
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2669
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2670 if (fcn->is_builtin_function ())
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2671 {
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2672 warning ("munlock: unlocking built-in function has no effect");
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2673 return;
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2674 }
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2675
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2676 fcn->unlock ();
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2677 }
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2678
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2679 bool tree_evaluator::mislocked (bool skip_first) const
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2680 {
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2681 octave_function *fcn = m_call_stack.current_function (skip_first);
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2682
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2683 if (! fcn)
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2684 error ("mislocked: invalid use outside a function");
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2685
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2686 return fcn->islocked ();
27212
f84c5528e932 eliminate direct access to call stack in interpreter::mlock
John W. Eaton <jwe@octave.org>
parents: 27211
diff changeset
2687 }
f84c5528e932 eliminate direct access to call stack in interpreter::mlock
John W. Eaton <jwe@octave.org>
parents: 27211
diff changeset
2688
27211
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2689 octave_value
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2690 tree_evaluator::max_stack_depth (const octave_value_list& args, int nargout)
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2691 {
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2692 return m_call_stack.max_stack_depth (args, nargout);
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2693 }
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2694
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2695 void tree_evaluator::display_call_stack (void) const
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2696 {
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2697 m_call_stack.display ();
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2698 }
8c27802a76c4 store reference to evaluator instead of call stack in stack frame
John W. Eaton <jwe@octave.org>
parents: 27210
diff changeset
2699
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2700 octave_value tree_evaluator::find (const std::string& name)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2701 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2702 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2703 = m_call_stack.get_current_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: 28256
diff changeset
2704
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2705 octave_value val = frame->varval (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2706
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2707 if (val.is_defined ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2708 return val;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2709
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2710 // Subfunction. I think it only makes sense to check for
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2711 // subfunctions if we are currently executing a function defined
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2712 // from a .m file.
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2713
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2714 octave_value fcn = frame->find_subfunction (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2715
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2716 if (fcn.is_defined ())
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2717 return fcn;
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2718
24037
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2719 symbol_table& symtab = m_interpreter.get_symbol_table ();
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2720
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2721 return symtab.fcn_table_find (name, ovl ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2722 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2723
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2724 void tree_evaluator::clear_objects (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2725 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2726 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2727 = m_call_stack.get_current_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: 28256
diff changeset
2728
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2729 frame->clear_objects ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2730 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2731
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2732 void tree_evaluator::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: 26512
diff changeset
2733 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2734 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2735 = m_call_stack.get_current_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: 28256
diff changeset
2736
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2737 frame->clear_variable (name);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2738 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2739
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2740 void tree_evaluator::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: 26512
diff changeset
2741 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2742 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2743 = m_call_stack.get_current_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: 28256
diff changeset
2744
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2745 frame->clear_variable_pattern (pattern);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2746 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2747
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2748 void tree_evaluator::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: 26512
diff changeset
2749 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2750 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2751 = m_call_stack.get_current_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: 28256
diff changeset
2752
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2753 frame->clear_variable_regexp (pattern);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2754 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2755
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2756 void tree_evaluator::clear_variables (void)
24037
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2757 {
28426
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2758 std::shared_ptr<stack_frame> frame
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2759 = m_call_stack.get_current_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: 28256
diff changeset
2760
9a3deb17b4ea use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
2761 frame->clear_variables ();
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2762 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2763
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2764 void tree_evaluator::clear_global_variable (const std::string& name)
24037
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2765 {
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2766 m_call_stack.clear_global_variable (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2767 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2768
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2769 void
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2770 tree_evaluator::clear_global_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: 26512
diff changeset
2771 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2772 m_call_stack.clear_global_variable_pattern (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2773 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2774
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2775 void tree_evaluator::clear_global_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: 26512
diff changeset
2776 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2777 m_call_stack.clear_global_variable_regexp (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2778 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2779
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2780 void tree_evaluator::clear_global_variables (void)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2781 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2782 m_call_stack.clear_global_variables ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2783 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2784
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2785 void tree_evaluator::clear_all (bool force)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2786 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2787 // FIXME: should this also clear objects?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2788
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2789 clear_variables ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2790 clear_global_variables ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2791
24037
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2792 symbol_table& symtab = m_interpreter.get_symbol_table ();
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2793
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2794 symtab.clear_functions (force);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2795 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2796
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2797 void tree_evaluator::clear_symbol (const std::string& name)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2798 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2799 // FIXME: are we supposed to do both here?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2800
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2801 clear_variable (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2802
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2803 symbol_table& symtab = m_interpreter.get_symbol_table ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2804
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2805 symtab.clear_function (name);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2806 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2807
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2808 void tree_evaluator::clear_symbol_pattern (const std::string& pattern)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2809 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2810 // FIXME: are we supposed to do both here?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2811
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2812 clear_variable_pattern (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2813
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2814 symbol_table& symtab = m_interpreter.get_symbol_table ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2815
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2816 symtab.clear_function_pattern (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2817 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2818
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2819 void tree_evaluator::clear_symbol_regexp (const std::string& pattern)
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2820 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2821 // FIXME: are we supposed to do both here?
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2822
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2823 clear_variable_regexp (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2824
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2825 symbol_table& symtab = m_interpreter.get_symbol_table ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2826
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2827 symtab.clear_function_regexp (pattern);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2828 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2829
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2830 std::list<std::string> tree_evaluator::global_variable_names (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2831 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2832 return m_call_stack.global_variable_names ();
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2833 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2834
27594
e091e09d26f0 restore some symbol table functions for backward compatibility
John W. Eaton <jwe@octave.org>
parents: 27540
diff changeset
2835 std::list<std::string> tree_evaluator::top_level_variable_names (void) const
e091e09d26f0 restore some symbol table functions for backward compatibility
John W. Eaton <jwe@octave.org>
parents: 27540
diff changeset
2836 {
e091e09d26f0 restore some symbol table functions for backward compatibility
John W. Eaton <jwe@octave.org>
parents: 27540
diff changeset
2837 return m_call_stack.top_level_variable_names ();
e091e09d26f0 restore some symbol table functions for backward compatibility
John W. Eaton <jwe@octave.org>
parents: 27540
diff changeset
2838 }
e091e09d26f0 restore some symbol table functions for backward compatibility
John W. Eaton <jwe@octave.org>
parents: 27540
diff changeset
2839
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2840 std::list<std::string> tree_evaluator::variable_names (void) const
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2841 {
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2842 return m_call_stack.variable_names ();
24037
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2843 }
21915520ac7b use more direct method for non-local symbol access (bug #38236)
John W. Eaton <jwe@octave.org>
parents: 23916
diff changeset
2844
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2845 // Return a pointer to the user-defined function FNAME. If FNAME is empty,
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2846 // search backward for the first user-defined function in the
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2847 // current call stack.
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2848
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2849 octave_user_code *
26975
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2850 tree_evaluator::get_user_code (const std::string& fname,
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2851 const std::string& class_name)
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2852 {
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2853 octave_user_code *user_code = nullptr;
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2854
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2855 if (fname.empty ())
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2856 user_code = m_call_stack.debug_user_code ();
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2857 else
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2858 {
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2859 std::string name = fname;
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2860
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2861 if (sys::file_ops::dir_sep_char () != '/' && name[0] == '@')
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2862 {
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2863 auto beg = name.begin () + 2; // never have @/method
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2864 auto end = name.end () - 1; // never have trailing '/'
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2865 std::replace (beg, end, '/', sys::file_ops::dir_sep_char ());
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2866 }
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2867
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
2868 std::size_t name_len = name.length ();
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2869
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2870 if (name_len > 2 && name.substr (name_len-2) == ".m")
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2871 name = name.substr (0, name_len-2);
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2872
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2873 if (name.empty ())
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2874 return nullptr;
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2875
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2876 symbol_table& symtab = m_interpreter.get_symbol_table ();
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2877
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2878 octave_value 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
2879 std::size_t p2 = std::string::npos;
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2880
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2881 if (name[0] == '@')
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2882 {
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
2883 std::size_t p1 = name.find (sys::file_ops::dir_sep_char (), 1);
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2884
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2885 if (p1 == std::string::npos)
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2886 return nullptr;
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2887
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2888 std::string dispatch_type = name.substr (1, p1-1);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2889
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2890 p2 = name.find ('>', p1);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2891
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2892 std::string method = name.substr (p1+1, p2-1);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2893
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2894 fcn = symtab.find_method (method, dispatch_type);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2895 }
26975
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2896 else if (! class_name.empty ())
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2897 {
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2898 cdef_manager& cdm = m_interpreter.get_cdef_manager ();
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2899
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2900 fcn = cdm.find_method (class_name, name);
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2901
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2902 // If there is no classdef method, then try legacy classes.
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2903 if (fcn.is_undefined ())
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2904 fcn = symtab.find_method (name, class_name);
de826e69a5ea make breakpoints in classdef methods work (bug #45404, bug #46451)
John W. Eaton <jwe@octave.org>
parents: 26924
diff changeset
2905 }
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2906 else
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2907 {
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2908 p2 = name.find ('>');
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2909
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2910 std::string main_fcn = name.substr (0, p2);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2911
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2912 fcn = symtab.find_function (main_fcn);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2913 }
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2914
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2915 // List of function names sub1>sub2>...
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2916 std::string subfuns;
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2917
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2918 if (p2 != std::string::npos)
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2919 subfuns = name.substr (p2+1);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2920
26179
a0b63c183d4b Do not attempt to extract user code from oct-files (bug #55184).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 26164
diff changeset
2921 if (fcn.is_defined () && fcn.is_user_code ())
a0b63c183d4b Do not attempt to extract user code from oct-files (bug #55184).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 26164
diff changeset
2922 user_code = fcn.user_code_value ();
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2923
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2924 if (! user_code || subfuns.empty ())
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2925 return user_code;
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2926
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2927 fcn = user_code->find_subfunction (subfuns);
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2928
27178
e3b2d4e442c4 improve message for setting breakpoint in nonexistent function (bug #56157)
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2929 if (fcn.is_undefined ())
e3b2d4e442c4 improve message for setting breakpoint in nonexistent function (bug #56157)
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2930 return nullptr;
e3b2d4e442c4 improve message for setting breakpoint in nonexistent function (bug #56157)
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2931
26065
2eb71b83d3e2 partially refactor function lookup in symbol table
John W. Eaton <jwe@octave.org>
parents: 26039
diff changeset
2932 user_code = fcn.user_code_value ();
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2933 }
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2934
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2935 return user_code;
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2936 }
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2937
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2938 std::string
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2939 tree_evaluator::current_function_name (bool skip_first) const
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2940 {
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
2941 octave_function *curfcn = m_call_stack.current_function (skip_first);
27199
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2942
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2943 if (curfcn)
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2944 return curfcn->name ();
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2945
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2946 return "";
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2947 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2948
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2949 bool
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2950 tree_evaluator::in_user_code (void) const
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2951 {
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2952 return m_call_stack.current_user_code () != nullptr;
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2953 }
f27002104c5b eliminate direct access to call_stack in error functions
John W. Eaton <jwe@octave.org>
parents: 27179
diff changeset
2954
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2955 void
23469
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2956 tree_evaluator::visit_decl_command (tree_decl_command& cmd)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2957 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
2958 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
2959 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
2960 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
2961 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
2962 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
2963 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
2964 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
2965 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
2966
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
2967 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
2968 do_breakpoint (cmd.is_active_breakpoint (*this));
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2969
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
2970 // FIXME: tree_decl_init_list is not derived from tree, so should it
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
2971 // really have an accept method?
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
2972
23469
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2973 tree_decl_init_list *init_list = cmd.initializer_list ();
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2974
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2975 if (init_list)
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2976 init_list->accept (*this);
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2977 }
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2978
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2979 void
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2980 tree_evaluator::visit_decl_elt (tree_decl_elt& elt)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2981 {
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23693
diff changeset
2982 tree_identifier *id = elt.ident ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2983
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2984 if (id)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
2985 {
23469
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2986 if (elt.is_global ())
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2987 m_call_stack.make_global (id->symbol ());
23469
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2988 else if (elt.is_persistent ())
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
2989 m_call_stack.make_persistent (id->symbol ());
23469
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2990 else
2699c5974844 handle global and persistent in tree_decl_command, not as separate classes
John W. Eaton <jwe@octave.org>
parents: 23458
diff changeset
2991 error ("declaration list element not global or persistent");
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2992
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
2993 octave_lvalue ult = id->lvalue (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2994
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2995 if (ult.is_undefined ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2996 {
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23693
diff changeset
2997 tree_expression *expr = elt.expression ();
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2998
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
2999 octave_value init_val;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3000
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3001 if (expr)
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
3002 init_val = expr->evaluate (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3003 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3004 init_val = Matrix ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3005
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3006 ult.assign (octave_value::op_asn_eq, init_val);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3007 }
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3008 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3009 }
24722
af6c1ed60581 avoid splitting namespace blocks unnecessarily
John W. Eaton <jwe@octave.org>
parents: 24690
diff changeset
3010
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3011 template <typename T>
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3012 void
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3013 tree_evaluator::execute_range_loop (const range<T>& rng, int line,
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3014 octave_lvalue& ult,
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3015 tree_statement_list *loop_body)
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3016 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3017 octave_idx_type steps = rng.numel ();
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3018
28857
43ad651cf5a0 eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents: 28851
diff changeset
3019 if (math::isinf (rng.limit ()))
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3020 warning_with_id ("Octave:infinite-loop",
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3021 "FOR loop limit is infinite, will stop after %"
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3022 OCTAVE_IDX_TYPE_FORMAT " steps", steps);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3023
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3024 for (octave_idx_type i = 0; i < steps; i++)
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3025 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3026 if (m_echo_state)
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3027 m_echo_file_pos = line;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3028
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3029 octave_value val (rng.elem (i));
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3030
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3031 ult.assign (octave_value::op_asn_eq, val);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3032
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3033 if (loop_body)
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3034 loop_body->accept (*this);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3035
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3036 if (quit_loop_now ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3037 break;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3038 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3039 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3040
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3041 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3042 tree_evaluator::visit_simple_for_command (tree_simple_for_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3043 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3044 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3045 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3046 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3047
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3048 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3049 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3050 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3051 line++;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3052 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3053
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3054 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3055 do_breakpoint (cmd.is_active_breakpoint (*this));
13245
027a2186cd90 parfor keyword and infrastructure, but handle parfor as normal for loop for now
John W. Eaton <jwe@octave.org>
parents: 13226
diff changeset
3056
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3057 // FIXME: need to handle PARFOR loops here using cmd.in_parallel ()
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3058 // and cmd.maxproc_expr ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3059
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
3060 unwind_protect_var<bool> upv (m_in_loop_command, true);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3061
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3062 tree_expression *expr = cmd.control_expr ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3063
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3064 octave_value rhs = expr->evaluate (*this);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3065
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3066 if (rhs.is_undefined ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3067 return;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3068
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3069 tree_expression *lhs = cmd.left_hand_side ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3070
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
3071 octave_lvalue ult = lhs->lvalue (*this);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3072
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3073 tree_statement_list *loop_body = cmd.body ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3074
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3075 if (rhs.is_range ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3076 {
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3077 // FIXME: is there a better way to dispatch here?
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3078
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3079 if (rhs.is_double_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3080 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3081 execute_range_loop (rhs.range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3082 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3083 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3084
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3085 if (rhs.is_int64_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3086 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3087 execute_range_loop (rhs.int64_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3088 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3089 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3090
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3091 if (rhs.is_uint64_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3092 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3093 execute_range_loop (rhs.uint64_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3094 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3095 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3096
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3097 if (rhs.is_int32_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3098 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3099 execute_range_loop (rhs.int32_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3100 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3101 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3102
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3103 if (rhs.is_uint32_type ())
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3104 {
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3105 execute_range_loop (rhs.uint32_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3106 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3107 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3108
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3109 if (rhs.is_int16_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3110 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3111 execute_range_loop (rhs.int16_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3112 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3113 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3114
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3115 if (rhs.is_uint16_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3116 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3117 execute_range_loop (rhs.uint16_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3118 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3119 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3120
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3121 if (rhs.is_int8_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3122 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3123 execute_range_loop (rhs.int8_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3124 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3125 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3126
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3127 if (rhs.is_uint8_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3128 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3129 execute_range_loop (rhs.uint8_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3130 return;
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3131 }
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3132
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3133 if (rhs.is_single_type ())
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3134 {
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3135 execute_range_loop (rhs.float_range_value (), line, ult, loop_body);
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3136 return;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3137 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3138 }
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3139
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3140 if (rhs.is_scalar_type ())
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3141 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3142 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3143 m_echo_file_pos = line;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3144
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3145 ult.assign (octave_value::op_asn_eq, rhs);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3146
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3147 if (loop_body)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3148 loop_body->accept (*this);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3149
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3150 // Maybe decrement break and continue states.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3151 quit_loop_now ();
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3152
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3153 return;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3154 }
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3155
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3156 // Also handle any range types not explicitly handled above, though
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3157 // not as efficiently as the specialized code above.
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3158
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3159 if (rhs.is_range () || rhs.is_matrix_type () || rhs.iscell ()
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3160 || rhs.is_string () || rhs.isstruct ())
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3161 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3162 // A matrix or cell is reshaped to 2 dimensions and iterated by
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3163 // columns.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3164
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3165 dim_vector dv = rhs.dims ().redim (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3166
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3167 octave_idx_type nrows = dv(0);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3168 octave_idx_type steps = dv(1);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3169
23514
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3170 octave_value arg = rhs;
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3171 if (rhs.ndims () > 2)
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3172 arg = arg.reshape (dv);
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3173
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3174 if (nrows > 0 && steps > 0)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3175 {
23514
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3176 octave_value_list idx;
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3177 octave_idx_type iidx;
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3178
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3179 // for row vectors, use single index to speed things up.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3180 if (nrows == 1)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3181 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3182 idx.resize (1);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3183 iidx = 0;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3184 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3185 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3186 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3187 idx.resize (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3188 idx(0) = octave_value::magic_colon_t;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3189 iidx = 1;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3190 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3191
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3192 for (octave_idx_type i = 1; i <= steps; i++)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3193 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3194 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3195 m_echo_file_pos = line;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3196
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28619
diff changeset
3197 // index_op expects one-based indices.
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3198 idx(iidx) = i;
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28619
diff changeset
3199 octave_value val = arg.index_op (idx);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3200
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3201 ult.assign (octave_value::op_asn_eq, val);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3202
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3203 if (loop_body)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3204 loop_body->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3205
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3206 if (quit_loop_now ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3207 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3208 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3209 }
23514
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3210 else
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3211 {
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3212 // Handle empty cases, while still assigning to loop var.
fd7a16594614 Don't iterate over empty for loop expressions (bug #50893).
Rik <rik@octave.org>
parents: 23503
diff changeset
3213 ult.assign (octave_value::op_asn_eq, arg);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3214 }
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3215
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3216 return;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3217 }
28646
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3218
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3219 error ("invalid type in for loop expression near line %d, column %d",
e26201931ea3 new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
3220 cmd.line (), cmd.column ());
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3221 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3222
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3223 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3224 tree_evaluator::visit_complex_for_command (tree_complex_for_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3225 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3226 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3227 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3228 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3229
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3230 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3231 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3232 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3233 line++;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3234 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3235
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3236 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3237 do_breakpoint (cmd.is_active_breakpoint (*this));
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3238
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
3239 unwind_protect_var<bool> upv (m_in_loop_command, true);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3240
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3241 tree_expression *expr = cmd.control_expr ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3242
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
3243 octave_value rhs = expr->evaluate (*this);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3244
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3245 if (rhs.is_undefined ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3246 return;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3247
23584
7ed6b258db91 maint: Deprecate is_map and replace with isstruct.
Rik <rik@octave.org>
parents: 23577
diff changeset
3248 if (! rhs.isstruct ())
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3249 error ("in statement 'for [X, Y] = VAL', VAL must be a structure");
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3250
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3251 // Cycle through structure elements. First element of id_list
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3252 // is set to value and the second is set to the name of the
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3253 // structure element.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3254
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3255 tree_argument_list *lhs = cmd.left_hand_side ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3256
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
3257 auto p = lhs->begin ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3258
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3259 tree_expression *elt = *p++;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3260
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
3261 octave_lvalue val_ref = elt->lvalue (*this);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3262
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3263 elt = *p;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3264
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
3265 octave_lvalue key_ref = elt->lvalue (*this);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3266
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3267 const octave_map tmp_val = rhs.map_value ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3268
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3269 tree_statement_list *loop_body = cmd.body ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3270
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3271 string_vector keys = tmp_val.keys ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3272
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3273 octave_idx_type nel = keys.numel ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3274
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3275 for (octave_idx_type i = 0; i < nel; i++)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3276 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3277 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3278 m_echo_file_pos = line;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3279
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3280 std::string key = keys[i];
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3281
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3282 const Cell val_lst = tmp_val.contents (key);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3283
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3284 octave_idx_type n = val_lst.numel ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3285
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3286 octave_value val = (n == 1) ? val_lst(0) : octave_value (val_lst);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3287
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3288 val_ref.assign (octave_value::op_asn_eq, val);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3289 key_ref.assign (octave_value::op_asn_eq, key);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3290
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3291 if (loop_body)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3292 loop_body->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3293
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3294 if (quit_loop_now ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3295 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3296 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3297 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3298
28518
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3299 void tree_evaluator::visit_spmd_command (tree_spmd_command& cmd)
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3300 {
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3301 // For now, we just execute the commands serially.
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3302
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3303 tree_statement_list *body = cmd.body ();
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3304
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3305 if (body)
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3306 body->accept (*this);
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3307 }
b8ab8b58547d accept spmd command blocks as language elements (bug #58676)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
3308
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3309 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3310 tree_evaluator::visit_octave_user_script (octave_user_script&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3311 {
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3312 // ??
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3313 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3314 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3315
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3316 octave_value_list
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3317 tree_evaluator::execute_user_script (octave_user_script& user_script,
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3318 int nargout,
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3319 const octave_value_list& args)
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3320 {
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3321 octave_value_list retval;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3322
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3323 std::string file_name = user_script.fcn_file_name ();
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3324
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3325 if (args.length () != 0 || nargout != 0)
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3326 error ("invalid call to script %s", file_name.c_str ());
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3327
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3328 tree_statement_list *cmd_list = user_script.body ();
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3329
25401
6f6479125d80 eliminate some globals from tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 25400
diff changeset
3330 if (! cmd_list)
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3331 return retval;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3332
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3333 // FIXME: Maybe this check belongs in the places where we push a new
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3334 // stack frame? Or in the call_stack push method itself?
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3335
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
3336 if (m_call_stack.size () >= static_cast<std::size_t> (m_max_recursion_depth))
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3337 error ("max_recursion_depth exceeded");
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3338
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3339 unwind_protect_var<stmt_list_type> upv (m_statement_context, SC_SCRIPT);
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3340
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3341 profiler::enter<octave_user_script> block (m_profiler, user_script);
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3342
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3343 if (echo ())
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3344 push_echo_state (tree_evaluator::ECHO_SCRIPTS, file_name);
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3345
29420
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
3346 // FIXME: Should we be using tree_evaluator::eval here?
4ee5a22dd4fe fix interrupt and dbquit behavior when using server mode
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
3347
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3348 cmd_list->accept (*this);
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3349
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3350 if (m_returning)
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3351 m_returning = 0;
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3352
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3353 if (m_breaking)
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3354 m_breaking--;
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3355
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3356 return retval;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3357 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3358
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3359 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3360 tree_evaluator::visit_octave_user_function (octave_user_function&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3361 {
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3362 // ??
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3363 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3364 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3365
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3366 octave_value_list
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3367 tree_evaluator::execute_user_function (octave_user_function& user_function,
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3368 int nargout,
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3369 const octave_value_list& xargs)
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3370 {
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3371 octave_value_list retval;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3372
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3373 // If this function is a classdef constructor, extract the first input
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3374 // argument, which must be the partially constructed object instance.
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3375
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3376 octave_value_list args (xargs);
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3377 octave_value_list ret_args;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3378
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3379 int nargin = args.length ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3380
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3381 if (user_function.is_classdef_constructor ())
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3382 {
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3383 if (nargin > 0)
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3384 {
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3385 ret_args = args.slice (0, 1, true);
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3386 --nargin;
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3387 args = args.slice (1, nargin, true);
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3388 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3389 else
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3390 panic_impossible ();
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3391 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3392
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3393 // FIXME: this probably shouldn't be a double-precision matrix.
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3394 Matrix ignored_outputs = ignored_fcn_outputs ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3395
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3396 tree_parameter_list *param_list = user_function.parameter_list ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3397
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3398 if (param_list)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3399 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3400 int max_inputs = param_list->length ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3401
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3402 if (! param_list->takes_varargs () && nargin > max_inputs)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3403 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3404 std::string name = user_function.name ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3405
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3406 error ("%s: function called with too many inputs", name.c_str ());
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3407 }
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3408
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3409 if (! param_list->varargs_only ())
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3410 define_parameter_list_from_arg_vector (param_list, args);
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3411 }
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3412
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3413 tree_parameter_list *ret_list = user_function.return_list ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3414
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3415 if (ret_list && ! ret_list->takes_varargs ())
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3416 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3417 int max_outputs = ret_list->length ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3418
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3419 if (nargout > max_outputs)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3420 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3421 std::string name = user_function.name ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3422
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3423 error ("%s: function called with too many outputs", name.c_str ());
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3424 }
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3425 }
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3426
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3427 bind_auto_fcn_vars (xargs.name_tags (), ignored_outputs, nargin,
26039
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
3428 nargout, user_function.takes_varargs (),
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
3429 user_function.all_va_args (args));
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3430
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3431 // For classdef constructor, pre-populate the output arguments
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3432 // with the pre-initialized object instance, extracted above.
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3433
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3434 if (user_function.is_classdef_constructor ())
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3435 {
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3436 if (! ret_list)
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3437 error ("%s: invalid classdef constructor, no output argument defined",
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3438 user_function.dispatch_class ().c_str ());
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3439
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3440 define_parameter_list_from_arg_vector (ret_list, ret_args);
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3441 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3442
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3443 // FIXME: Maybe this check belongs in the places where we push a
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3444 // new stack frame? Or in the call_stack push method itself?
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3445
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29527
diff changeset
3446 if (m_call_stack.size () >= static_cast<std::size_t> (m_max_recursion_depth))
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3447 error ("max_recursion_depth exceeded");
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3448
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3449 unwind_action act2 ([&user_function] () {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3450 user_function.restore_warning_states ();
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3451 });
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3452
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3453 // Evaluate the commands that make up the function.
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3454
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3455 unwind_protect_var<stmt_list_type> upv (m_statement_context, SC_FUNCTION);
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
3456
28562
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3457 tree_statement_list *cmd_list = user_function.body ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3458
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3459 if (cmd_list)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3460 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3461 profiler::enter<octave_user_function>
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3462 block (m_profiler, user_function);
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3463
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3464 if (echo ())
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3465 push_echo_state (tree_evaluator::ECHO_FUNCTIONS,
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3466 user_function.fcn_file_name ());
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3467
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3468 if (user_function.is_special_expr ())
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3469 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3470 assert (cmd_list->length () == 1);
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3471
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3472 tree_statement *stmt = cmd_list->front ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3473
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3474 tree_expression *expr = stmt->expression ();
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3475
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3476 if (expr)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3477 {
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3478 m_call_stack.set_location (stmt->line (), stmt->column ());
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3479
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3480 retval = expr->evaluate_n (*this, nargout);
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3481 }
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3482 }
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3483 else
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3484 cmd_list->accept (*this);
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3485
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3486 if (m_returning)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3487 m_returning = 0;
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3488
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3489 if (m_breaking)
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3490 m_breaking--;
b0b80efecea1 error for functions called with too many inputs or outputs
John W. Eaton <jwe@octave.org>
parents: 28561
diff changeset
3491 }
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3492
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3493 // Copy return values out.
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3494
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3495 if (ret_list && ! user_function.is_special_expr ())
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3496 {
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3497 Cell varargout;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3498
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3499 if (ret_list->takes_varargs ())
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3500 {
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
3501 octave_value varargout_varval = varval ("varargout");
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3502
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3503 if (varargout_varval.is_defined ())
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3504 varargout = varargout_varval.xcell_value ("varargout must be a cell array object");
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3505 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3506
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3507 retval = convert_return_list_to_const_vector (ret_list, nargout,
28540
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
3508 ignored_outputs,
25400
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3509 varargout);
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3510 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3511
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3512 return retval;
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3513 }
d423ce60f5c8 evaluate script and function code in tree_evaluator methods
John W. Eaton <jwe@octave.org>
parents: 25399
diff changeset
3514
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3515 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3516 tree_evaluator::visit_octave_user_function_header (octave_user_function&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3517 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3518 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3519 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3520
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3521 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3522 tree_evaluator::visit_octave_user_function_trailer (octave_user_function&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3523 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3524 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3525 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3526
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3527 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3528 tree_evaluator::visit_function_def (tree_function_def& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3529 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3530 octave_value fcn = cmd.function ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3531
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3532 octave_function *f = fcn.function_value ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3533
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3534 if (f)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3535 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3536 std::string nm = f->name ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3537
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23587
diff changeset
3538 symbol_table& symtab = m_interpreter.get_symbol_table ();
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23587
diff changeset
3539
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23587
diff changeset
3540 symtab.install_cmdline_function (nm, fcn);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3541
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3542 // Make sure that any variable with the same name as the new
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3543 // function is cleared.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3544
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
3545 assign (nm);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3546 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3547 }
13225
359153d26cc1 eliminate DO_SIMPLE_FOR_LOOP_ONCE macro
John W. Eaton <jwe@octave.org>
parents: 12833
diff changeset
3548
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3549 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3550 tree_evaluator::visit_identifier (tree_identifier&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3551 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3552 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3553 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3554
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3555 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3556 tree_evaluator::visit_if_clause (tree_if_clause&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3557 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3558 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3559 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3560
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3561 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3562 tree_evaluator::visit_if_command (tree_if_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3563 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3564 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3565 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3566 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3567 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3568 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3569 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3570 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3571 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3572
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3573 // FIXME: tree_if_command_list is not derived from tree, so should it
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3574 // really have an accept method?
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3575
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3576 tree_if_command_list *lst = cmd.cmd_list ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3577
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3578 if (lst)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3579 lst->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3580 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3581
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3582 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3583 tree_evaluator::visit_if_command_list (tree_if_command_list& lst)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3584 {
23449
c763214a8260 maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
3585 for (tree_if_clause *tic : lst)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3586 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3587 tree_expression *expr = tic->condition ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3588
27761
223981108144 fix stack frame location info when using debugger (bug #57315)
John W. Eaton <jwe@octave.org>
parents: 27725
diff changeset
3589 if (! (in_debug_repl ()
223981108144 fix stack frame location info when using debugger (bug #57315)
John W. Eaton <jwe@octave.org>
parents: 27725
diff changeset
3590 && m_call_stack.current_frame () == m_debug_frame))
23553
14723784b9f2 don't use singleton for call_stack
John W. Eaton <jwe@octave.org>
parents: 23532
diff changeset
3591 m_call_stack.set_location (tic->line (), tic->column ());
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3592
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3593 if (m_debug_mode && ! tic->is_else_clause ())
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3594 do_breakpoint (tic->is_active_breakpoint (*this));
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3595
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3596 if (tic->is_else_clause () || is_logically_true (expr, "if"))
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3597 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3598 tree_statement_list *stmt_lst = tic->commands ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3599
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3600 if (stmt_lst)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3601 stmt_lst->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3602
20784
52f6921dde09 * pt-eval.cc: Style fixes.
John W. Eaton <jwe@octave.org>
parents: 20715
diff changeset
3603 break;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3604 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3605 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3606 }
24722
af6c1ed60581 avoid splitting namespace blocks unnecessarily
John W. Eaton <jwe@octave.org>
parents: 24690
diff changeset
3607
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3608 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3609 tree_evaluator::visit_index_expression (tree_index_expression&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3610 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3611 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3612 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3613
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3614 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3615 tree_evaluator::visit_matrix (tree_matrix&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3616 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3617 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3618 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3619
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3620 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3621 tree_evaluator::visit_cell (tree_cell&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3622 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3623 panic_impossible ();
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3624 }
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3625
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3626 void
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3627 tree_evaluator::visit_multi_assignment (tree_multi_assignment&)
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3628 {
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3629 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3630 }
13225
359153d26cc1 eliminate DO_SIMPLE_FOR_LOOP_ONCE macro
John W. Eaton <jwe@octave.org>
parents: 12833
diff changeset
3631
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3632 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3633 tree_evaluator::visit_no_op_command (tree_no_op_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3634 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3635 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3636 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3637 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3638 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3639 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3640 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3641 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3642 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3643
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3644 if (m_debug_mode && cmd.is_end_of_fcn_or_script ())
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3645 do_breakpoint (cmd.is_active_breakpoint (*this), true);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3646 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3647
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3648 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3649 tree_evaluator::visit_constant (tree_constant&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3650 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3651 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3652 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3653
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3654 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3655 tree_evaluator::visit_fcn_handle (tree_fcn_handle&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3656 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3657 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3658 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3659
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3660 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3661 tree_evaluator::visit_parameter_list (tree_parameter_list&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3662 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3663 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3664 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3665
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3666 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3667 tree_evaluator::visit_postfix_expression (tree_postfix_expression&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3668 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3669 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3670 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3671
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3672 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3673 tree_evaluator::visit_prefix_expression (tree_prefix_expression&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3674 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3675 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3676 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3677
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3678 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3679 tree_evaluator::visit_return_command (tree_return_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3680 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3681 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3682 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3683 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3684 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3685 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3686 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3687 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3688 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3689
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3690 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3691 do_breakpoint (cmd.is_active_breakpoint (*this));
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3692
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3693 // Act like dbcont.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3694
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
3695 if (in_debug_repl () && m_call_stack.current_frame () == m_debug_frame)
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
3696 dbcont ();
25401
6f6479125d80 eliminate some globals from tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 25400
diff changeset
3697 else if (m_statement_context == SC_FUNCTION
6f6479125d80 eliminate some globals from tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 25400
diff changeset
3698 || m_statement_context == SC_SCRIPT
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
3699 || m_in_loop_command)
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3700 m_returning = 1;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3701 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3702
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3703 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3704 tree_evaluator::visit_simple_assignment (tree_simple_assignment&)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3705 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3706 panic_impossible ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3707 }
8662
af72c8137d64 improve looping over arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 8658
diff changeset
3708
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3709 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3710 tree_evaluator::visit_statement (tree_statement& stmt)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3711 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3712 tree_command *cmd = stmt.command ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3713 tree_expression *expr = stmt.expression ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3714
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3715 if (cmd || expr)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3716 {
27761
223981108144 fix stack frame location info when using debugger (bug #57315)
John W. Eaton <jwe@octave.org>
parents: 27725
diff changeset
3717 if (! (in_debug_repl ()
223981108144 fix stack frame location info when using debugger (bug #57315)
John W. Eaton <jwe@octave.org>
parents: 27725
diff changeset
3718 && m_call_stack.current_frame () == m_debug_frame))
27540
6971bc1a2f92 deprecate unecessary global variable Vtrack_line_num
John W. Eaton <jwe@octave.org>
parents: 27533
diff changeset
3719 m_call_stack.set_location (stmt.line (), stmt.column ());
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3720
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3721 try
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3722 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3723 if (cmd)
28560
af1a9c1db88e reset pointer to lvalue list before executing commands (bug #58748, bug #58751)
John W. Eaton <jwe@octave.org>
parents: 28540
diff changeset
3724 {
af1a9c1db88e reset pointer to lvalue list before executing commands (bug #58748, bug #58751)
John W. Eaton <jwe@octave.org>
parents: 28540
diff changeset
3725 unwind_protect_var<const std::list<octave_lvalue> *>
af1a9c1db88e reset pointer to lvalue list before executing commands (bug #58748, bug #58751)
John W. Eaton <jwe@octave.org>
parents: 28540
diff changeset
3726 upv (m_lvalue_list, nullptr);
af1a9c1db88e reset pointer to lvalue list before executing commands (bug #58748, bug #58751)
John W. Eaton <jwe@octave.org>
parents: 28540
diff changeset
3727
af1a9c1db88e reset pointer to lvalue list before executing commands (bug #58748, bug #58751)
John W. Eaton <jwe@octave.org>
parents: 28540
diff changeset
3728 cmd->accept (*this);
af1a9c1db88e reset pointer to lvalue list before executing commands (bug #58748, bug #58751)
John W. Eaton <jwe@octave.org>
parents: 28540
diff changeset
3729 }
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3730 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3731 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3732 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3733 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3734 int line = stmt.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3735 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3736 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3737 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3738 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3739 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3740
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3741 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3742 do_breakpoint (expr->is_active_breakpoint (*this));
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3743
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3744 // FIXME: maybe all of this should be packaged in
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3745 // one virtual function that returns a flag saying whether
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3746 // or not the expression will take care of binding ans and
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3747 // printing the result.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3748
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3749 // FIXME: it seems that we should just have to
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3750 // evaluate the expression and that should take care of
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3751 // everything, binding ans as necessary?
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3752
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
3753 octave_value tmp_result = expr->evaluate (*this, 0);
24564
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3754
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3755 if (tmp_result.is_defined ())
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3756 {
24564
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3757 bool do_bind_ans = false;
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3758
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3759 if (expr->is_identifier ())
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
3760 do_bind_ans = ! is_variable (expr);
24564
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3761 else
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
3762 do_bind_ans = ! expr->is_assignment_expression ();
24564
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3763
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3764 if (do_bind_ans)
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3765 bind_ans (tmp_result, expr->print_result ()
07876b7127bf reorganize binding to ans in evaluator for clarity
John W. Eaton <jwe@octave.org>
parents: 24563
diff changeset
3766 && statement_printing_enabled ());
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3767 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3768 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3769 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3770 catch (const std::bad_alloc&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3771 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3772 // FIXME: We want to use error_with_id here so that give users
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3773 // control over this error message but error_with_id will
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3774 // require some memory allocations. Is there anything we can
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3775 // do to make those more likely to succeed?
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3776
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3777 error_with_id ("Octave:bad-alloc",
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3778 "out of memory or dimension too large for Octave's index type");
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3779 }
25336
389757b7b6af eliminate redundant octave:: namespace tags
John W. Eaton <jwe@octave.org>
parents: 25103
diff changeset
3780 catch (const interrupt_exception&)
24583
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3781 {
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3782 // If we are debugging, then continue with next statement.
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3783 // Otherwise, jump out of here.
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3784
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3785 if (m_debug_mode)
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
3786 m_interpreter.recover_from_exception ();
24583
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3787 else
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3788 throw;
466e2aab871b stay in debug mode on Control-C interrupts (bug #52750)
John W. Eaton <jwe@octave.org>
parents: 24565
diff changeset
3789 }
28980
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3790 catch (const execution_exception& ee)
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3791 {
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3792 error_system& es = m_interpreter.get_error_system ();
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3793
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3794 if ((m_interpreter.interactive ()
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3795 || application::forced_interactive ())
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3796 && ((es.debug_on_error ()
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3797 && m_bp_table.debug_on_err (es.last_error_id ()))
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3798 || (es.debug_on_caught ()
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3799 && m_bp_table.debug_on_caught (es.last_error_id ())))
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3800 && in_user_code ())
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3801 {
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3802 es.save_exception (ee);
29501
220c6c4a3533 leave error message output stream decision to error_system class
John W. Eaton <jwe@octave.org>
parents: 29493
diff changeset
3803 es.display_exception (ee);
28980
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3804
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3805 enter_debugger ();
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3806
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3807 // It doesn't make sense to continue execution after an
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3808 // error occurs so force the debugger to quit all debug
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3809 // levels and return the the top prompt.
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3810
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3811 throw quit_debug_exception (true);
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3812 }
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3813 else
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3814 throw;
a745a046b705 handle debug_on_interrupt when execution_exception is caught (bug #59306)
John W. Eaton <jwe@octave.org>
parents: 28804
diff changeset
3815 }
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3816 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3817 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3818
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3819 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3820 tree_evaluator::visit_statement_list (tree_statement_list& lst)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3821 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3822 // FIXME: commented out along with else clause below.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3823 // static octave_value_list empty_list;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3824
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
3825 auto p = lst.begin ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3826
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3827 if (p != lst.end ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3828 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3829 while (true)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3830 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3831 tree_statement *elt = *p++;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3832
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3833 if (! elt)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3834 error ("invalid statement found in statement list!");
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3835
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3836 octave_quit ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3837
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3838 elt->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3839
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3840 if (m_breaking || m_continuing)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3841 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3842
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
3843 if (m_returning)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3844 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3845
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3846 if (p == lst.end ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3847 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3848 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3849 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3850 // Clear previous values before next statement is
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3851 // evaluated so that we aren't holding an extra
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3852 // reference to a value that may be used next. For
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3853 // example, in code like this:
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3854 //
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3855 // X = rand (N); # refcount for X should be 1
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3856 // # after this statement
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3857 //
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3858 // X(idx) = val; # no extra copy of X should be
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3859 // # needed, but we will be faked
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3860 // # out if retval is not cleared
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3861 // # between statements here
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3862
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3863 // result_values = empty_list;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3864 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3865 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3866 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3867 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3868
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3869 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3870 tree_evaluator::visit_switch_case (tree_switch_case&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3871 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3872 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3873 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3874
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3875 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3876 tree_evaluator::visit_switch_case_list (tree_switch_case_list&)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3877 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3878 panic_impossible ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3879 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3880
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3881 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3882 tree_evaluator::visit_switch_command (tree_switch_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3883 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3884 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3885 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3886 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3887 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3888 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3889 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3890 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3891 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3892
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
3893 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
3894 do_breakpoint (cmd.is_active_breakpoint (*this));
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3895
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3896 tree_expression *expr = cmd.switch_value ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3897
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3898 if (! expr)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3899 error ("missing value in switch command near line %d, column %d",
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3900 cmd.line (), cmd.column ());
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3901
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
3902 octave_value val = expr->evaluate (*this);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3903
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3904 tree_switch_case_list *lst = cmd.case_list ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3905
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3906 if (lst)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3907 {
23449
c763214a8260 maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
3908 for (tree_switch_case *t : *lst)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3909 {
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
3910 if (t->is_default_case () || switch_case_label_matches (t, val))
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3911 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3912 tree_statement_list *stmt_lst = t->commands ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3913
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3914 if (stmt_lst)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3915 stmt_lst->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3916
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3917 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3918 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3919 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3920 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3921 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3922
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3923 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3924 tree_evaluator::visit_try_catch_command (tree_try_catch_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3925 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3926 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3927 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3928 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3929 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
3930 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3931 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3932 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3933 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
3934
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3935 bool execution_error = false;
27472
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3936 octave_scalar_map err_map;
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3937
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3938 tree_statement_list *try_code = cmd.body ();
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3939
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3940 if (try_code)
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3941 {
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3942 // unwind frame before catch block
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3943
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3944 unwind_protect frame;
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3945
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
3946 interpreter_try (frame);
27472
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3947
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3948 // The catch code is *not* added to unwind_protect stack; it
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3949 // doesn't need to be run on interrupts.
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3950
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3951 try
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3952 {
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3953 try_code->accept (*this);
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3954 }
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3955 catch (const execution_exception& ee)
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3956 {
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3957 execution_error = true;
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3958
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3959 error_system& es = m_interpreter.get_error_system ();
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3960
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3961 es.save_exception (ee);
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3962
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3963 err_map.assign ("message", es.last_error_message ());
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3964 err_map.assign ("identifier", es.last_error_id ());
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3965 err_map.assign ("stack", es.last_error_stack ());
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3966
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
3967 m_interpreter.recover_from_exception ();
27472
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3968 }
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3969
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3970 // Actions attached to unwind_protect frame will run here, prior
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3971 // to executing the catch block.
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3972 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3973
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3974 if (execution_error)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3975 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3976 tree_statement_list *catch_code = cmd.cleanup ();
27472
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3977
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3978 if (catch_code)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3979 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3980 tree_identifier *expr_id = cmd.identifier ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3981
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3982 if (expr_id)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3983 {
25383
d3a035528c9a use reference to tree_evaluator instead of pointer
John W. Eaton <jwe@octave.org>
parents: 25382
diff changeset
3984 octave_lvalue ult = expr_id->lvalue (*this);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3985
27472
c0883bfc0f36 simplify evaluator logic for try-catch command
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
3986 ult.assign (octave_value::op_asn_eq, err_map);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3987 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3988
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3989 // perform actual "catch" block
26451
0ab258611cc5 pt-eval.cc: Fix static analyzer detected issues (bug #55347).
Rik <rik@octave.org>
parents: 26376
diff changeset
3990 catch_code->accept (*this);
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3991 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3992 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3993 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3994
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3995 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3996 tree_evaluator::do_unwind_protect_cleanup_code (tree_statement_list *list)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
3997 {
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23693
diff changeset
3998 unwind_protect frame;
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
3999
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4000 frame.protect_var (octave_interrupt_state);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4001 octave_interrupt_state = 0;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4002
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4003 // We want to preserve the last location info for possible
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4004 // backtracking.
23553
14723784b9f2 don't use singleton for call_stack
John W. Eaton <jwe@octave.org>
parents: 23532
diff changeset
4005
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4006 frame.add (&call_stack::set_line, &m_call_stack,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4007 m_call_stack.current_line ());
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4008
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4009 frame.add (&call_stack::set_column, &m_call_stack,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4010 m_call_stack.current_column ());
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4011
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4012 // Similarly, if we have seen a return or break statement, allow all
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4013 // the cleanup code to run before returning or handling the break.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4014 // We don't have to worry about continue statements because they can
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4015 // only occur in loops.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4016
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4017 frame.protect_var (m_returning);
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4018 m_returning = 0;
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4019
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4020 frame.protect_var (m_breaking);
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4021 m_breaking = 0;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4022
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4023 try
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4024 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4025 if (list)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4026 list->accept (*this);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4027 }
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4028 catch (const execution_exception& ee)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4029 {
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4030 error_system& es = m_interpreter.get_error_system ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4031
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4032 es.save_exception (ee);
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
4033 m_interpreter.recover_from_exception ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4034
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4035 if (m_breaking || m_returning)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4036 frame.discard (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4037 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4038 frame.run (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4039
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4040 frame.discard (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4041
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4042 throw;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4043 }
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4044
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4045 // The unwind_protects are popped off the stack in the reverse of
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4046 // the order they are pushed on.
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4047
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4048 // FIXME: these statements say that if we see a break or
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4049 // return statement in the cleanup block, that we want to use the
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4050 // new value of the breaking or returning flag instead of restoring
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4051 // the previous value. Is that the right thing to do? I think so.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4052 // Consider the case of
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4053 //
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4054 // function foo ()
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4055 // unwind_protect
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4056 // fprintf (stderr, "1: this should always be executed\n");
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4057 // break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4058 // fprintf (stderr, "1: this should never be executed\n");
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4059 // unwind_protect_cleanup
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4060 // fprintf (stderr, "2: this should always be executed\n");
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4061 // return;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4062 // fprintf (stderr, "2: this should never be executed\n");
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4063 // end_unwind_protect
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4064 // endfunction
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4065 //
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4066 // If we reset the value of the breaking flag, both the returning
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4067 // flag and the breaking flag will be set, and we shouldn't have
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4068 // both. So, use the most recent one. If there is no return or
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4069 // break in the cleanup block, the values should be reset to
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4070 // whatever they were when the cleanup block was entered.
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4071
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
4072 if (m_breaking || m_returning)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4073 frame.discard (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4074 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4075 frame.run (2);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4076 }
20666
e0e2c2ce7e94 defer stack trace until back at top level
John W. Eaton <jwe@octave.org>
parents: 20560
diff changeset
4077
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4078 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4079 tree_evaluator::visit_unwind_protect_command (tree_unwind_protect_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4080 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4081 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4082 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4083 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4084 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4085 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4086 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4087 m_echo_file_pos = line + 1;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4088 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4089
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4090 tree_statement_list *cleanup_code = cmd.cleanup ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4091
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4092 tree_statement_list *unwind_protect_code = cmd.body ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4093
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4094 if (unwind_protect_code)
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4095 {
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4096 try
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4097 {
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4098 unwind_protect_code->accept (*this);
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4099 }
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4100 catch (const execution_exception& ee)
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4101 {
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4102 error_system& es = m_interpreter.get_error_system ();
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4103
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4104 // FIXME: Maybe we should be able to temporarily set the
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4105 // interpreter's exception handling state to something "safe"
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4106 // while the cleanup block runs instead of just resetting it
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4107 // here?
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27441
diff changeset
4108 es.save_exception (ee);
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
4109 m_interpreter.recover_from_exception ();
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4110
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4111 // Run the cleanup code on exceptions, so that it is run even
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4112 // in case of interrupt or out-of-memory.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4113 do_unwind_protect_cleanup_code (cleanup_code);
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4114
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4115 // If an error occurs inside the cleanup code, a new
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4116 // exception will be thrown instead of the original.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4117 throw;
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4118 }
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23693
diff changeset
4119 catch (const interrupt_exception&)
23612
fecca33388f7 also run unwind protect cleanup code on interrupt exceptions (bug #51209)
John W. Eaton <jwe@octave.org>
parents: 23219
diff changeset
4120 {
fecca33388f7 also run unwind protect cleanup code on interrupt exceptions (bug #51209)
John W. Eaton <jwe@octave.org>
parents: 23219
diff changeset
4121 // The comments above apply here as well.
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27472
diff changeset
4122 m_interpreter.recover_from_exception ();
23612
fecca33388f7 also run unwind protect cleanup code on interrupt exceptions (bug #51209)
John W. Eaton <jwe@octave.org>
parents: 23219
diff changeset
4123 do_unwind_protect_cleanup_code (cleanup_code);
fecca33388f7 also run unwind protect cleanup code on interrupt exceptions (bug #51209)
John W. Eaton <jwe@octave.org>
parents: 23219
diff changeset
4124 throw;
fecca33388f7 also run unwind protect cleanup code on interrupt exceptions (bug #51209)
John W. Eaton <jwe@octave.org>
parents: 23219
diff changeset
4125 }
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4126
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4127 // Also execute the unwind_protect_cleanump code if the
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4128 // unwind_protect block runs without error.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4129 do_unwind_protect_cleanup_code (cleanup_code);
21922
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4130 }
c34f9c182dcf Make debug_on_error to apply to the "catch" block of try/catch (bug #47685)
Rik <rik@octave.org>
parents: 21743
diff changeset
4131 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4132
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4133 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4134 tree_evaluator::visit_while_command (tree_while_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4135 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4136 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4137 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4138 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4139
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4140 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4141 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4142 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4143 line++;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4144 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4145
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
4146 unwind_protect_var<bool> upv (m_in_loop_command, true);
20666
e0e2c2ce7e94 defer stack trace until back at top level
John W. Eaton <jwe@octave.org>
parents: 20560
diff changeset
4147
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4148 tree_expression *expr = cmd.condition ();
20824
8848e35e5ef8 better handling of exceptions in unwind-protect blocks
John W. Eaton <jwe@octave.org>
parents: 20784
diff changeset
4149
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4150 if (! expr)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4151 panic_impossible ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4152
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4153 for (;;)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4154 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4155 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4156 m_echo_file_pos = line;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4157
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
4158 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
4159 do_breakpoint (cmd.is_active_breakpoint (*this));
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4160
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4161 if (is_logically_true (expr, "while"))
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4162 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4163 tree_statement_list *loop_body = cmd.body ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4164
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4165 if (loop_body)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4166 loop_body->accept (*this);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4167
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4168 if (quit_loop_now ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4169 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4170 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4171 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4172 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4173 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4174 }
20666
e0e2c2ce7e94 defer stack trace until back at top level
John W. Eaton <jwe@octave.org>
parents: 20560
diff changeset
4175
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4176 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4177 tree_evaluator::visit_do_until_command (tree_do_until_command& cmd)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4178 {
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4179 int line = cmd.line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4180 if (line < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4181 line = 1;
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4182
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4183 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4184 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4185 echo_code (line);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4186 line++;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4187 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4188
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
4189 unwind_protect_var<bool> upv (m_in_loop_command, true);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4190
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4191 tree_expression *expr = cmd.condition ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4192 int until_line = cmd.line ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4193 int until_column = cmd.column ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4194
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4195 if (! expr)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4196 panic_impossible ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4197
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4198 for (;;)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4199 {
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4200 if (m_echo_state)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4201 m_echo_file_pos = line;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4202
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4203 tree_statement_list *loop_body = cmd.body ();
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4204
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4205 if (loop_body)
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4206 loop_body->accept (*this);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4207
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4208 if (quit_loop_now ())
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4209 break;
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4210
25402
ef2b9d4abf4a eliminate some global variables from tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 25401
diff changeset
4211 if (m_debug_mode)
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
4212 do_breakpoint (cmd.is_active_breakpoint (*this));
18325
2a8243d8327a jit compiler: Add support for the do_until statement
LYH <lyh.kernel@gmail.com>
parents: 18270
diff changeset
4213
23553
14723784b9f2 don't use singleton for call_stack
John W. Eaton <jwe@octave.org>
parents: 23532
diff changeset
4214 m_call_stack.set_location (until_line, until_column);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4215
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4216 if (is_logically_true (expr, "do-until"))
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4217 break;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4218 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4219 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4220
26686
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4221 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4222 tree_evaluator::visit_superclass_ref (tree_superclass_ref&)
26686
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4223 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4224 panic_impossible ();
26686
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4225 }
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4226
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4227 void
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4228 tree_evaluator::visit_metaclass_query (tree_metaclass_query&)
26686
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4229 {
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4230 panic_impossible ();
26686
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4231 }
581d01526b34 eliminate unnecessary tree_funcall class
John W. Eaton <jwe@octave.org>
parents: 26662
diff changeset
4232
23702
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4233 void tree_evaluator::bind_ans (const octave_value& val, bool print)
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4234 {
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4235 static std::string ans = "ans";
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4236
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4237 if (val.is_defined ())
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4238 {
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4239 if (val.is_cs_list ())
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4240 {
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4241 octave_value_list lst = val.list_value ();
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4242
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4243 for (octave_idx_type i = 0; i < lst.length (); i++)
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4244 bind_ans (lst(i), print);
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4245 }
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4246 else
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4247 {
28588
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4248 // FIXME: Maybe assign could also return the assigned value,
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4249 // just for convenience?
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4250
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
4251 assign (ans, val);
23702
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4252
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4253 if (print)
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4254 {
28588
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4255 // Use varval instead of displaying VAL directly so that
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4256 // we get the right type and value for things like
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4257 // magic_int values that may mutate when stored.
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4258
ee9b1081471f allow integer constants > flintmax to be represented exactly (bug #45945)
John W. Eaton <jwe@octave.org>
parents: 28562
diff changeset
4259 octave_value_list args = ovl (varval (ans));
23702
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4260 args.stash_name_tags (string_vector (ans));
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4261 feval ("display", args);
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4262 }
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4263 }
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4264 }
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4265 }
d396b5fd9199 move bind_ans to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23696
diff changeset
4266
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4267 void
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4268 tree_evaluator::do_breakpoint (tree_statement& stmt)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4269 {
26113
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
4270 do_breakpoint (stmt.is_active_breakpoint (*this),
8a15f3bace49 move eval_string inside interpreter/evaluator class
John W. Eaton <jwe@octave.org>
parents: 26094
diff changeset
4271 stmt.is_end_of_fcn_or_script ());
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4272 }
8845
5a6db6bd1a02 eigs.cc (Feigs): fix handling of sigma arg
John W. Eaton <jwe@octave.org>
parents: 8679
diff changeset
4273
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4274 void
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4275 tree_evaluator::do_breakpoint (bool is_breakpoint,
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4276 bool is_end_of_fcn_or_script)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4277 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4278 bool break_on_this_statement = false;
21542
7ba48ff6ce83 Record correct line number with "until" command (bug #43249)
Lachlan Andrew <lachlanbis@gmail.com>
parents: 21301
diff changeset
4279
25405
df2f3af2c6c5 eliminate unused octave_debug_on_interrupt_state variable
John W. Eaton <jwe@octave.org>
parents: 25404
diff changeset
4280 if (is_breakpoint)
27233
fc668ac9ce7c re-enter debugger when doing dbstep (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27222
diff changeset
4281 break_on_this_statement = true;
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4282 else if (m_dbstep_flag > 0)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4283 {
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4284 if (m_call_stack.current_frame () == m_debug_frame)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4285 {
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4286 if (m_dbstep_flag == 1 || is_end_of_fcn_or_script)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4287 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4288 // We get here if we are doing a "dbstep" or a "dbstep N" and the
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4289 // count has reached 1 so that we must stop and return to debug
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4290 // prompt. Alternatively, "dbstep N" has been used but the end
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4291 // of the frame has been reached so we stop at the last line and
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4292 // return to prompt.
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4293
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4294 break_on_this_statement = true;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4295 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4296 else
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4297 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4298 // Executing "dbstep N". Decrease N by one and continue.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4299
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4300 m_dbstep_flag--;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4301 }
15574
d20cbfec6df7 Fix off-by-1 error when executing 'dbstep N'
Rik <rik@octave.org>
parents: 15469
diff changeset
4302
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4303 }
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4304 else if (m_dbstep_flag == 1
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4305 && m_call_stack.current_frame () < m_debug_frame)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4306 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4307 // We stepped out from the end of a function.
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4308
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4309 m_debug_frame = m_call_stack.current_frame ();
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4310
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4311 break_on_this_statement = true;
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4312 }
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4313 }
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4314 else if (m_dbstep_flag == -1)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4315 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4316 // We get here if we are doing a "dbstep in".
16396
c6a13c1900fc make "dbstep out" and "dbstep" after "dbstep in" work properly
John W. Eaton <jwe@octave.org>
parents: 16354
diff changeset
4317
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4318 break_on_this_statement = true;
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4319
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4320 m_debug_frame = m_call_stack.current_frame ();
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4321 }
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4322 else if (m_dbstep_flag == -2)
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4323 {
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4324 // We get here if we are doing a "dbstep out". Check for end of
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4325 // function and whether the current frame is the same as the
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4326 // cached value because we want to step out from the frame where
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4327 // "dbstep out" was evaluated, not from any functions called from
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4328 // that frame.
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4329
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4330 if (is_end_of_fcn_or_script
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4331 && m_call_stack.current_frame () == m_debug_frame)
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
4332 m_dbstep_flag = -1;
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4333 }
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4334
29306
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
4335 if (! break_on_this_statement)
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
4336 break_on_this_statement = m_break_on_next_stmt;
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
4337
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
4338 m_break_on_next_stmt = false;
0231189f630d provide interpreter methods for pausing, resuming, and stopping evaluation
John W. Eaton <jwe@octave.org>
parents: 29305
diff changeset
4339
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4340 if (break_on_this_statement)
25407
ab10403a0b50 new input_system class to manage user input for the interpreter
John W. Eaton <jwe@octave.org>
parents: 25405
diff changeset
4341 {
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4342 m_dbstep_flag = 0;
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4343
27233
fc668ac9ce7c re-enter debugger when doing dbstep (bug #56150)
John W. Eaton <jwe@octave.org>
parents: 27222
diff changeset
4344 enter_debugger ();
25407
ab10403a0b50 new input_system class to manage user input for the interpreter
John W. Eaton <jwe@octave.org>
parents: 25405
diff changeset
4345 }
22196
dd992fd74fce put parser, lexer, and evaluator in namespace; interpreter now owns evaluator
John W. Eaton <jwe@octave.org>
parents: 22164
diff changeset
4346 }
10219
979fb2606c4f new tree_evaluator::do_keyoard function
Ryan Rusaw <rrusaw@gmail.com>
parents: 10210
diff changeset
4347
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4348 bool
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4349 tree_evaluator::is_logically_true (tree_expression *expr,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4350 const char *warn_for)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4351 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4352 bool expr_value = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4353
27374
d171d356767b don't apply std::move to temporary values
John W. Eaton <jwe@octave.org>
parents: 27373
diff changeset
4354 octave_value t1 = expr->evaluate (*this);
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4355
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4356 if (t1.is_defined ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4357 return t1.is_true ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4358 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4359 error ("%s: undefined value used in conditional expression", warn_for);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4360
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4361 return expr_value;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23398
diff changeset
4362 }
23481
73558a835b64 eliminate lvalue list arguments from evaluator functions
John W. Eaton <jwe@octave.org>
parents: 23470
diff changeset
4363
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4364 octave_value
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4365 tree_evaluator::max_recursion_depth (const octave_value_list& args,
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4366 int nargout)
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4367 {
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4368 return set_internal_variable (m_max_recursion_depth, args, nargout,
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4369 "max_recursion_depth", 0);
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4370 }
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4371
27203
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4372 symbol_info_list
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4373 tree_evaluator::glob_symbol_info (const std::string& pattern) const
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4374 {
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4375 return m_call_stack.glob_symbol_info (pattern);
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4376 }
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4377
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4378 symbol_info_list
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4379 tree_evaluator::regexp_symbol_info (const std::string& pattern) const
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4380 {
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4381 return m_call_stack.regexp_symbol_info (pattern);
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4382 }
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4383
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4384 symbol_info_list
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4385 tree_evaluator::get_symbol_info (void)
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4386 {
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4387 return m_call_stack.get_symbol_info ();
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4388 }
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4389
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4390 symbol_info_list
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4391 tree_evaluator::top_scope_symbol_info (void) const
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4392 {
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4393 return m_call_stack.top_scope_symbol_info ();
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4394 }
79065f9d5553 eliminate direct access to call stack in load-save functions
John W. Eaton <jwe@octave.org>
parents: 27202
diff changeset
4395
27016
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4396 octave_map tree_evaluator::get_autoload_map (void) const
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4397 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4398 Cell func_names (dim_vector (m_autoload_map.size (), 1));
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4399 Cell file_names (dim_vector (m_autoload_map.size (), 1));
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4400
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4401 octave_idx_type i = 0;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4402 for (const auto& fcn_fname : m_autoload_map)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4403 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4404 func_names(i) = fcn_fname.first;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4405 file_names(i) = fcn_fname.second;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4406
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4407 i++;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4408 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4409
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4410 octave_map m;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4411
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4412 m.assign ("function", func_names);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4413 m.assign ("file", file_names);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4414
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4415 return m;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4416 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4417
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4418 std::string tree_evaluator::lookup_autoload (const std::string& nm) const
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4419 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4420 std::string retval;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4421
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4422 auto p = m_autoload_map.find (nm);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4423
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4424 if (p != m_autoload_map.end ())
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4425 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4426 load_path& lp = m_interpreter.get_load_path ();
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4427
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4428 retval = lp.find_file (p->second);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4429 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4430
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4431 return retval;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4432 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4433
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4434 std::list<std::string> tree_evaluator::autoloaded_functions (void) const
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4435 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4436 std::list<std::string> names;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4437
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4438 for (const auto& fcn_fname : m_autoload_map)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4439 names.push_back (fcn_fname.first);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4440
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4441 return names;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4442 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4443
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4444 std::list<std::string>
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4445 tree_evaluator::reverse_lookup_autoload (const std::string& nm) const
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4446 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4447 std::list<std::string> names;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4448
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4449 for (const auto& fcn_fname : m_autoload_map)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4450 if (nm == fcn_fname.second)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4451 names.push_back (fcn_fname.first);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4452
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4453 return names;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4454 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4455
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4456 void tree_evaluator::add_autoload (const std::string& fcn,
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4457 const std::string& nm)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4458 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4459 std::string file_name = check_autoload_file (nm);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4460
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4461 m_autoload_map[fcn] = file_name;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4462 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4463
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4464 void tree_evaluator::remove_autoload (const std::string& fcn,
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4465 const std::string& nm)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4466 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4467 check_autoload_file (nm);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4468
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4469 // Remove function from symbol table and autoload map.
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4470 symbol_table& symtab = m_interpreter.get_symbol_table ();
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4471
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4472 symtab.clear_dld_function (fcn);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4473
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4474 m_autoload_map.erase (fcn);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4475 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
4476
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4477 octave_value
26087
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4478 tree_evaluator::whos_line_format (const octave_value_list& args, int nargout)
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4479 {
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4480 return set_internal_variable (m_whos_line_format, args, nargout,
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4481 "whos_line_format");
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4482 }
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4483
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
4484 octave_value
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4485 tree_evaluator::silent_functions (const octave_value_list& args, int nargout)
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4486 {
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4487 return set_internal_variable (m_silent_functions, args, nargout,
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4488 "silent_functions");
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
4489 }
23706
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
4490
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4491 octave_value
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4492 tree_evaluator::string_fill_char (const octave_value_list& args, int nargout)
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4493 {
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4494 return set_internal_variable (m_string_fill_char, args, nargout,
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4495 "string_fill_char");
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4496 }
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4497
26094
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4498 // Final step of processing an indexing error. Add the name of the
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4499 // variable being indexed, if any, then issue an error. (Will this also
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4500 // be needed by pt-lvalue, which calls subsref?)
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4501
29171
254ee9af5014 maint: More updates to standardize exception naming scheme.
Rik <rik@octave.org>
parents: 29163
diff changeset
4502 void tree_evaluator::final_index_error (index_exception& ie,
26094
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4503 const tree_expression *expr)
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4504 {
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4505 std::string extra_message;
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4506
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
4507 if (is_variable (expr))
26094
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4508 {
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4509 std::string var = expr->name ();
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4510
29171
254ee9af5014 maint: More updates to standardize exception naming scheme.
Rik <rik@octave.org>
parents: 29163
diff changeset
4511 ie.set_var (var);
26094
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4512
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4513 symbol_table& symtab = m_interpreter.get_symbol_table ();
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4514
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4515 octave_value fcn = symtab.find_function (var);
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4516
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4517 if (fcn.is_function ())
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4518 {
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4519 octave_function *fp = fcn.function_value ();
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4520
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4521 if (fp && fp->name () == var)
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4522 extra_message
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4523 = " (note: variable '" + var + "' shadows function)";
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4524 }
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4525 }
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4526
29171
254ee9af5014 maint: More updates to standardize exception naming scheme.
Rik <rik@octave.org>
parents: 29163
diff changeset
4527 std::string msg = ie.message () + extra_message;
254ee9af5014 maint: More updates to standardize exception naming scheme.
Rik <rik@octave.org>
parents: 29163
diff changeset
4528
254ee9af5014 maint: More updates to standardize exception naming scheme.
Rik <rik@octave.org>
parents: 29163
diff changeset
4529 error_with_id (ie.err_id (), "%s", msg.c_str ());
26094
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4530 }
8fb0df0c8772 eliminate duplicate final_index_error function
John W. Eaton <jwe@octave.org>
parents: 26087
diff changeset
4531
27005
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4532 octave_value
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4533 tree_evaluator::do_who (int argc, const string_vector& argv,
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4534 bool return_list, bool verbose)
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4535 {
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4536 return m_call_stack.do_who (argc, argv, return_list, verbose);
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4537 }
a1ea0e7aecde move do_who inside call_stack, make accessible from evaluator
John W. Eaton <jwe@octave.org>
parents: 27001
diff changeset
4538
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4539 octave_value_list
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4540 tree_evaluator::make_value_list (tree_argument_list *args,
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4541 const string_vector& arg_nm)
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4542 {
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4543 octave_value_list retval;
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4544
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4545 if (args)
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4546 {
27373
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
4547 unwind_protect_var<const std::list<octave_lvalue> *>
25627c524ad8 where possible, use new unwind-protect classes in evaluator
John W. Eaton <jwe@octave.org>
parents: 27371
diff changeset
4548 upv (m_lvalue_list, nullptr);
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4549
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4550 int len = args->length ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4551
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4552 unwind_protect_var<int> upv2 (m_index_position);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4553 unwind_protect_var<int> upv3 (m_num_indices);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4554
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4555 m_num_indices = len;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4556
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4557 std::list<octave_value> arg_vals;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4558
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4559 int k = 0;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4560
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4561 for (auto elt : *args)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4562 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4563 // FIXME: is it possible for elt to be invalid?
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4564
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4565 if (! elt)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4566 break;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4567
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4568 m_index_position = k++;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4569
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4570 octave_value tmp = elt->evaluate (*this);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4571
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4572 if (tmp.is_cs_list ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4573 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4574 octave_value_list tmp_ovl = tmp.list_value ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4575
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4576 for (octave_idx_type i = 0; i < tmp_ovl.length (); i++)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4577 arg_vals.push_back (tmp_ovl(i));
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4578 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4579 else if (tmp.is_defined ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4580 arg_vals.push_back (tmp);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4581 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4582
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4583 retval = octave_value_list (arg_vals);
27371
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4584 }
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4585
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4586 octave_idx_type n = retval.length ();
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4587
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4588 if (n > 0)
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4589 retval.stash_name_tags (arg_nm);
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4590
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4591 return retval;
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4592 }
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4593
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4594 std::list<octave_lvalue>
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4595 tree_evaluator::make_lvalue_list (tree_argument_list *lhs)
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4596 {
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4597 std::list<octave_lvalue> retval;
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4598
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4599 for (tree_expression *elt : *lhs)
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4600 retval.push_back (elt->lvalue (*this));
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4601
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4602 return retval;
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4603 }
fcaecdbc8d8a don't use visitor pattern for expression evaluation (bug #56752)
John W. Eaton <jwe@octave.org>
parents: 27370
diff changeset
4604
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4605 void
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4606 tree_evaluator::push_echo_state (int type, const std::string& file_name,
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4607 int pos)
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4608 {
28429
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4609 unwind_protect *frame = m_call_stack.curr_fcn_unwind_protect_frame ();
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4610
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4611 if (frame)
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4612 {
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4613 push_echo_state_cleanup (*frame);
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4614
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4615 set_echo_state (type, file_name, pos);
8eb8ba8aff9a refactor octave_function call method
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
4616 }
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4617 }
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4618
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4619 void
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4620 tree_evaluator::set_echo_state (int type, const std::string& file_name,
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4621 int pos)
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4622 {
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4623 m_echo_state = echo_this_file (file_name, type);
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4624 m_echo_file_name = file_name;
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4625 m_echo_file_pos = pos;
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4626 }
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4627
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4628 void
25653
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4629 tree_evaluator::uwp_set_echo_state (bool state, const std::string& file_name,
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4630 int pos)
25653
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4631 {
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4632 m_echo_state = state;
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4633 m_echo_file_name = file_name;
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4634 m_echo_file_pos = pos;
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4635 }
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4636
b3d357990b52 better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents: 25483
diff changeset
4637 void
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4638 tree_evaluator::maybe_set_echo_state (void)
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4639 {
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
4640 octave_function *caller = caller_function ();
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4641
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4642 if (caller && caller->is_user_code ())
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4643 {
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4644 octave_user_code *fcn = dynamic_cast<octave_user_code *> (caller);
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4645
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4646 int type = fcn->is_user_function () ? ECHO_FUNCTIONS : ECHO_SCRIPTS;
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4647
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4648 std::string file_name = fcn->fcn_file_name ();
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4649
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4650 // We want the line where "echo" was called, not the line number
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4651 // stored in the stack frame that was created for the echo
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4652 // function (that will always be -1).
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4653
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4654 int pos = m_call_stack.current_user_code_line ();
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4655
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4656 if (pos < 0)
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
4657 pos = 1;
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4658
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4659 set_echo_state (type, file_name, pos);
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4660 }
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4661 }
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4662
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4663 void
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4664 tree_evaluator::push_echo_state_cleanup (unwind_protect& frame)
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4665 {
29253
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4666 frame.add (&tree_evaluator::uwp_set_echo_state, this,
28913793f678 prefer unwind_action over unwind_protect in more places
John W. Eaton <jwe@octave.org>
parents: 29171
diff changeset
4667 m_echo_state, m_echo_file_name, m_echo_file_pos);
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4668 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4669
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4670 bool tree_evaluator::maybe_push_echo_state_cleanup (void)
23706
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
4671 {
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4672 // This function is expected to be called from ECHO, which would be
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4673 // the top of the call stack. If the caller of ECHO is a
25399
6ca2c0d76d84 store unwind protect frame for function evaluation in call_stack object
John W. Eaton <jwe@octave.org>
parents: 25393
diff changeset
4674 // user-defined function or script, then set up unwind-protect
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4675 // elements to restore echo state.
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4676
25399
6ca2c0d76d84 store unwind protect frame for function evaluation in call_stack object
John W. Eaton <jwe@octave.org>
parents: 25393
diff changeset
4677 unwind_protect *frame = m_call_stack.curr_fcn_unwind_protect_frame ();
6ca2c0d76d84 store unwind protect frame for function evaluation in call_stack object
John W. Eaton <jwe@octave.org>
parents: 25393
diff changeset
4678
6ca2c0d76d84 store unwind protect frame for function evaluation in call_stack object
John W. Eaton <jwe@octave.org>
parents: 25393
diff changeset
4679 if (frame)
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4680 {
25399
6ca2c0d76d84 store unwind protect frame for function evaluation in call_stack object
John W. Eaton <jwe@octave.org>
parents: 25393
diff changeset
4681 push_echo_state_cleanup (*frame);
6ca2c0d76d84 store unwind protect frame for function evaluation in call_stack object
John W. Eaton <jwe@octave.org>
parents: 25393
diff changeset
4682 return true;
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4683 }
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4684
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4685 return false;
23706
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
4686 }
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4687
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4688
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4689 octave_value
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4690 tree_evaluator::echo (const octave_value_list& args, int)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4691 {
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4692 bool cleanup_pushed = maybe_push_echo_state_cleanup ();
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4693
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4694 string_vector argv = args.make_argv ();
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4695
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4696 switch (args.length ())
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4697 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4698 case 0:
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4699 if ((m_echo & ECHO_SCRIPTS) || (m_echo & ECHO_FUNCTIONS))
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4700 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4701 m_echo = ECHO_OFF;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4702 m_echo_files.clear ();
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4703 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4704 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4705 m_echo = ECHO_SCRIPTS;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4706 break;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4707
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4708 case 1:
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4709 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4710 std::string arg0 = argv[0];
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4711
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4712 if (arg0 == "on")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4713 m_echo = ECHO_SCRIPTS;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4714 else if (arg0 == "off")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4715 m_echo = ECHO_OFF;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4716 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4717 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4718 std::string file = fcn_file_in_path (arg0);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4719 file = sys::env::make_absolute (file);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4720
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4721 if (file.empty ())
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4722 error ("echo: no such file %s", arg0.c_str ());
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4724 if (m_echo & ECHO_ALL)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4725 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4726 // Echo is enabled for all functions, so turn it off
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4727 // for this one.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4728
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4729 m_echo_files[file] = false;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4730 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4731 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4732 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4733 // Echo may be enabled for specific functions.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4734
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4735 auto p = m_echo_files.find (file);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4736
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4737 if (p == m_echo_files.end ())
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4738 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4739 // Not this one, so enable it.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4740
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4741 m_echo |= ECHO_FUNCTIONS;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4742 m_echo_files[file] = true;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4743 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4744 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4745 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4746 // This one is already in the list. Flip the
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4747 // status for it.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4748
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4749 p->second = ! p->second;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4750 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4751 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4752 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4753 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4754 break;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4755
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4756 case 2:
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4757 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4758 std::string arg0 = argv[0];
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4759 std::string arg1 = argv[1];
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4760
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4761 if (arg1 == "on" || arg1 == "off")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4762 std::swap (arg0, arg1);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4763
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4764 if (arg0 == "on")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4765 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4766 if (arg1 == "all")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4767 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4768 m_echo = (ECHO_SCRIPTS | ECHO_FUNCTIONS | ECHO_ALL);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4769 m_echo_files.clear ();
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4770 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4771 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4772 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4773 std::string file = fcn_file_in_path (arg1);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4774 file = sys::env::make_absolute (file);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4775
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4776 if (file.empty ())
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4777 error ("echo: no such file %s", arg1.c_str ());
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4778
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4779 m_echo |= ECHO_FUNCTIONS;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4780 m_echo_files[file] = true;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4781 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4782 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4783 else if (arg0 == "off")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4784 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4785 if (arg1 == "all")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4786 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4787 m_echo = ECHO_OFF;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4788 m_echo_files.clear ();
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4789 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4790 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4791 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4792 std::string file = fcn_file_in_path (arg1);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4793 file = sys::env::make_absolute (file);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4794
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4795 if (file.empty ())
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4796 error ("echo: no such file %s", arg1.c_str ());
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4797
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4798 m_echo_files[file] = false;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4799 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4800 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4801 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4802 print_usage ();
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4803 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4804 break;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4805
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4806 default:
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4807 print_usage ();
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4808 break;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4809 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4810
23729
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4811 if (cleanup_pushed)
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4812 maybe_set_echo_state ();
06b3d1d54054 allow echo state to be modified from inside functions
John W. Eaton <jwe@octave.org>
parents: 23728
diff changeset
4813
23913
062ce545b21e mark octave_value from octave_value_list constructor explicit
John W. Eaton <jwe@octave.org>
parents: 23876
diff changeset
4814 return octave_value ();
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4815 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4816
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4817 bool tree_evaluator::in_debug_repl (void) const
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4818 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4819 return (m_debugger_stack.empty ()
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4820 ? false : m_debugger_stack.top()->in_debug_repl ());
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4821 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4822
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4823 void tree_evaluator::dbcont (void)
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4824 {
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4825 if (! m_debugger_stack.empty ())
27282
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4826 m_debugger_stack.top()->dbcont ();
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4827 }
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4828
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4829 void tree_evaluator::dbquit (bool all)
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4830 {
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4831 if (! m_debugger_stack.empty ())
49c60d16866f improve dbquit and dbcont behavior
John W. Eaton <jwe@octave.org>
parents: 27277
diff changeset
4832 m_debugger_stack.top()->dbquit (all);
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4833 }
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
4834
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4835 static octave_value end_value (const octave_value& value,
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4836 octave_idx_type index_position,
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4837 octave_idx_type num_indices)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4838 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4839 dim_vector dv = value.dims ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4840 int ndims = dv.ndims ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4841
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4842 if (num_indices < ndims)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4843 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4844 for (int i = num_indices; i < ndims; i++)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4845 dv(num_indices-1) *= dv(i);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4846
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4847 if (num_indices == 1)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4848 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4849 ndims = 2;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4850 dv.resize (ndims);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4851 dv(1) = 1;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4852 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4853 else
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4854 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4855 ndims = num_indices;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4856 dv.resize (ndims);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4857 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4858 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4859
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4860 return (index_position < ndims
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4861 ? octave_value (dv(index_position)) : octave_value (1.0));
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4862 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4863
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4864 octave_value_list
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4865 tree_evaluator::evaluate_end_expression (const octave_value_list& args)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4866 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4867 int nargin = args.length ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4868
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4869 if (nargin != 0 && nargin != 3)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4870 print_usage ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4871
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4872 if (nargin == 3)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4873 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4874 octave_idx_type index_position
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4875 = args(1).xidx_type_value ("end: K must be integer value");
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4876
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4877 if (index_position < 1)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4878 error ("end: K must be greater than zero");
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4879
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4880 octave_idx_type num_indices
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4881 = args(2).xidx_type_value ("end: N must be integer value");
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4882
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4883 if (num_indices < 1)
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4884 error ("end: N must be greater than zero");
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4885
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4886 return end_value (args(0), index_position-1, num_indices);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4887 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4888
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4889 // If m_indexed_object is undefined, then this use of 'end' is
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4890 // either appearing in a function call argument list or in an
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4891 // attempt to index an undefined symbol. There seems to be no
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4892 // reasonable way to provide a better error message. So just fail
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4893 // with an invalid use message. See bug #58830.
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4894
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4895 if (m_indexed_object.is_undefined ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4896 error ("invalid use of 'end': may only be used to index existing value");
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4897
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4898 octave_value expr_result;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4899
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4900 if (m_index_list.empty ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4901 expr_result = m_indexed_object;
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4902 else
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4903 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4904 try
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4905 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4906 // When evaluating "end" with no arguments, we should have
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4907 // been called from the built-in Fend function that appears
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4908 // in the context of an argument list. Fend will be
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4909 // evaluated in its own stack frame. But we need to
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4910 // evaluate the partial expression that the special "end"
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4911 // token applies to in the calling stack frame.
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4912
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29527
diff changeset
4913 unwind_action act ([=] (std::size_t frm)
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4914 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4915 m_call_stack.restore_frame (frm);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4916 }, m_call_stack.current_frame ());
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4917
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
4918 std::size_t n = m_call_stack.find_current_user_frame ();
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4919 m_call_stack.goto_frame (n);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4920
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4921 // End is only valid inside argument lists used for
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4922 // indexing. The dispatch class is set by the function that
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4923 // evaluates the argument list.
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4924
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4925 // Silently ignore extra output values.
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4926
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4927 octave_value_list tmp
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4928 = m_indexed_object.subsref (m_index_type, m_index_list, 1);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4929
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4930 expr_result = tmp.length () ? tmp(0) : octave_value ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4931
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4932 if (expr_result.is_cs_list ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4933 err_indexed_cs_list ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4934 }
29163
8f67ad8b3103 maint: Updating naming conventions for exceptions and use const where possible.
Rik <rik@octave.org>
parents: 29117
diff changeset
4935 catch (const index_exception&)
28804
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4936 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4937 error ("error evaluating partial expression for END");
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4938 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4939 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4940
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4941 if (expr_result.isobject ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4942 {
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4943 // FIXME: is there a better way to lookup and execute a method
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4944 // that handles all the details like setting the dispatch class
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4945 // appropriately?
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4946
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4947 std::string dispatch_class = expr_result.class_name ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4948
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4949 symbol_table& symtab = m_interpreter.get_symbol_table ();
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4950
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4951 octave_value meth = symtab.find_method ("end", dispatch_class);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4952
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4953 if (meth.is_defined ())
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4954 return m_interpreter.feval
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4955 (meth, ovl (expr_result, m_index_position+1, m_num_indices), 1);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4956 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4957
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4958 return end_value (expr_result, m_index_position, m_num_indices);
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4959 }
3719f5d452d4 refactor implementation of END indexing in interpreter (bug #58953)
John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
parents: 28726
diff changeset
4960
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4961 octave_value
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4962 tree_evaluator::PS4 (const octave_value_list& args, int nargout)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4963 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4964 return set_internal_variable (m_PS4, args, nargout, "PS4");
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4965 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4966
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4967 bool tree_evaluator::echo_this_file (const std::string& file, int type) const
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4968 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4969 if ((type & m_echo) == ECHO_SCRIPTS)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4970 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4971 // Asking about scripts and echo is enabled for them.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4972 return true;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4973 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4974
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4975 if ((type & m_echo) == ECHO_FUNCTIONS)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4976 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4977 // Asking about functions and echo is enabled for functions.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4978 // Now, which ones?
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4979
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4980 auto p = m_echo_files.find (file);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4981
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4982 if (m_echo & ECHO_ALL)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4983 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4984 // Return true ulness echo was turned off for a specific
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4985 // file.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4986
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4987 return (p == m_echo_files.end () || p->second);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4988 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4989 else
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4990 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4991 // Return true if echo is specifically enabled for this file.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4992
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4993 return p != m_echo_files.end () && p->second;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4994 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4995 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4996
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4997 return false;
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4998 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
4999
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
5000 void tree_evaluator::echo_code (int line)
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5001 {
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5002 std::string prefix = command_editor::decode_prompt_string (m_PS4);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5003
27873
020d0e8f7ac6 reafactor mlock, munlock, and mislocked functions
John W. Eaton <jwe@octave.org>
parents: 27844
diff changeset
5004 octave_function *curr_fcn = m_call_stack.current_function ();
23728
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5005
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5006 if (curr_fcn && curr_fcn->is_user_code ())
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5007 {
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5008 octave_user_code *code = dynamic_cast<octave_user_code *> (curr_fcn);
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5009
29339
93530bb4bd6f improve behavior of echo (bug #56068)
John W. Eaton <jwe@octave.org>
parents: 29307
diff changeset
5010 int num_lines = line - m_echo_file_pos + 1;
23728
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5011
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5012 std::deque<std::string> lines
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5013 = code->get_code_lines (m_echo_file_pos, num_lines);
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5014
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5015 for (auto& elt : lines)
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5016 octave_stdout << prefix << elt << std::endl;
b40b7243a782 new class for caching file contents for debug and echo
John W. Eaton <jwe@octave.org>
parents: 23723
diff changeset
5017 }
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5018 }
25360
bc5f225bc578 eliminate some global accesses to the breakpoint table
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
5019
25403
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5020 // Decide if it's time to quit a for or while loop.
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5021 bool tree_evaluator::quit_loop_now (void)
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5022 {
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5023 octave_quit ();
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5024
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5025 // Maybe handle 'continue N' someday...
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5026
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5027 if (m_continuing)
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5028 m_continuing--;
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5029
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5030 bool quit = (m_returning || m_breaking || m_continuing);
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5031
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5032 if (m_breaking)
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5033 m_breaking--;
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5034
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5035 return quit;
2b7d7a3f5f57 move returning, breaking, and continuing flags to evaluator
John W. Eaton <jwe@octave.org>
parents: 25402
diff changeset
5036 }
26039
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5037
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5038 void tree_evaluator::bind_auto_fcn_vars (const string_vector& arg_names,
28540
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
5039 const Matrix& ignored_outputs,
26039
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5040 int nargin, int nargout,
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5041 bool takes_varargs,
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5042 const octave_value_list& va_args)
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5043 {
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5044 set_auto_fcn_var (stack_frame::ARG_NAMES, Cell (arg_names));
28540
ea5a632b2553 improve error checking for undefined function outputs (bug #58686, #58695)
John W. Eaton <jwe@octave.org>
parents: 28532
diff changeset
5045 set_auto_fcn_var (stack_frame::IGNORED, ignored_outputs);
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5046 set_auto_fcn_var (stack_frame::NARGIN, nargin);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5047 set_auto_fcn_var (stack_frame::NARGOUT, nargout);
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5048 set_auto_fcn_var (stack_frame::SAVED_WARNING_STATES, octave_value ());
26039
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5049
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5050 if (takes_varargs)
26661
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5051 assign ("varargin", va_args.cell_value ());
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5052 }
cf9e10ce3351 move variable values from symbol_record objects to stack_frame objects
John W. Eaton <jwe@octave.org>
parents: 26512
diff changeset
5053
27016
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5054 std::string
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5055 tree_evaluator::check_autoload_file (const std::string& nm) const
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5056 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5057 if (sys::env::absolute_pathname (nm))
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5058 return nm;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5059
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5060 std::string full_name = nm;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5061
27037
8408acb7ca4f make dbup/dbdown work again (bug #56020)
John W. Eaton <jwe@octave.org>
parents: 27019
diff changeset
5062 octave_user_code *fcn = m_call_stack.current_user_code ();
27016
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5063
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5064 bool found = false;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5065
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5066 if (fcn)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5067 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5068 std::string fname = fcn->fcn_file_name ();
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5069
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5070 if (! fname.empty ())
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5071 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5072 fname = sys::env::make_absolute (fname);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5073 fname = fname.substr (0, fname.find_last_of (sys::file_ops::dir_sep_str ()) + 1);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5074
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5075 sys::file_stat fs (fname + nm);
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5076
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5077 if (fs.exists ())
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5078 {
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5079 full_name = fname + nm;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5080 found = true;
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5081 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5082 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5083 }
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5084
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5085 if (! found)
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5086 warning_with_id ("Octave:autoload-relative-file-name",
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5087 "autoload: '%s' is not an absolute filename",
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5088 nm.c_str ());
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5089
9b261300a001 move file-scope static autoload map variable and functions to evaluator
John W. Eaton <jwe@octave.org>
parents: 27015
diff changeset
5090 return full_name;
26039
d2aae3570c81 perform automatic function variable binding in tree_evaluator
John W. Eaton <jwe@octave.org>
parents: 26004
diff changeset
5091 }
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
5092
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5093 DEFMETHOD (max_recursion_depth, interp, args, nargout,
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5094 doc: /* -*- texinfo -*-
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5095 @deftypefn {} {@var{val} =} max_recursion_depth ()
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5096 @deftypefnx {} {@var{old_val} =} max_recursion_depth (@var{new_val})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5097 @deftypefnx {} {} max_recursion_depth (@var{new_val}, "local")
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5098 Query or set the internal limit on the number of times a function may
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5099 be called recursively.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5100
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5101 If the limit is exceeded, an error message is printed and control returns to
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5102 the top level.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5103
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5104 When called from inside a function with the @qcode{"local"} option, the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5105 variable is changed locally for the function and any subroutines it calls.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5106 The original variable value is restored when exiting the function.
24855
41f80b9af274 prevent stack overflow crash on deeply nested function calls (bug #47620)
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
5107
41f80b9af274 prevent stack overflow crash on deeply nested function calls (bug #47620)
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
5108 @seealso{max_stack_depth}
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5109 @end deftypefn */)
10578
cb0883127251 limit on recursion via calls to source function
John W. Eaton <jwe@octave.org>
parents: 10315
diff changeset
5110 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
5111 tree_evaluator& tw = interp.get_evaluator ();
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5112
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5113 return tw.max_recursion_depth (args, nargout);
10578
cb0883127251 limit on recursion via calls to source function
John W. Eaton <jwe@octave.org>
parents: 10315
diff changeset
5114 }
cb0883127251 limit on recursion via calls to source function
John W. Eaton <jwe@octave.org>
parents: 10315
diff changeset
5115
12833
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5116 /*
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5117 %!test
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5118 %! orig_val = max_recursion_depth ();
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5119 %! old_val = max_recursion_depth (2*orig_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5120 %! assert (orig_val, old_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5121 %! assert (max_recursion_depth (), 2*orig_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5122 %! max_recursion_depth (orig_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5123 %! assert (max_recursion_depth (), orig_val);
14429
eff4a5933e28 Update %!tests in src/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14294
diff changeset
5124
28930
2883b3d08b7e maint: Remove unnecessary parentheses bracketing %!error BIST tests.
Rik <rik@octave.org>
parents: 28857
diff changeset
5125 %!error max_recursion_depth (1, 2)
12833
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5126 */
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5127
26087
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5128 DEFMETHOD (whos_line_format, interp, args, nargout,
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5129 doc: /* -*- texinfo -*-
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5130 @deftypefn {} {@var{val} =} whos_line_format ()
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5131 @deftypefnx {} {@var{old_val} =} whos_line_format (@var{new_val})
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5132 @deftypefnx {} {} whos_line_format (@var{new_val}, "local")
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5133 Query or set the format string used by the command @code{whos}.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5134
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5135 A full format string is:
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5136 @c Set example in small font to prevent overfull line
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5137
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5138 @smallexample
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5139 %[modifier]<command>[:width[:left-min[:balance]]];
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5140 @end smallexample
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5141
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5142 The following command sequences are available:
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5143
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5144 @table @code
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5145 @item %a
29856
56b3e2af0298 Add 's'=sparse attribute for whos function (bug #60687)
Rik <rik@octave.org>
parents: 29848
diff changeset
5146 Prints attributes of variables (c=complex, s=sparse, f=formal parameter,
56b3e2af0298 Add 's'=sparse attribute for whos function (bug #60687)
Rik <rik@octave.org>
parents: 29848
diff changeset
5147 g=global, p=persistent).
26087
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5148
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5149 @item %b
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5150 Prints number of bytes occupied by variables.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5151
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5152 @item %c
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5153 Prints class names of variables.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5154
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5155 @item %e
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5156 Prints elements held by variables.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5157
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5158 @item %n
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5159 Prints variable names.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5160
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5161 @item %s
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5162 Prints dimensions of variables.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5163
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5164 @item %t
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5165 Prints type names of variables.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5166 @end table
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5167
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5168 Every command may also have an alignment modifier:
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5169
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5170 @table @code
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5171 @item l
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5172 Left alignment.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5173
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5174 @item r
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5175 Right alignment (default).
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5176
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5177 @item c
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5178 Column-aligned (only applicable to command %s).
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5179 @end table
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5180
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5181 The @code{width} parameter is a positive integer specifying the minimum
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5182 number of columns used for printing. No maximum is needed as the field will
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5183 auto-expand as required.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5184
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5185 The parameters @code{left-min} and @code{balance} are only available when
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5186 the column-aligned modifier is used with the command @samp{%s}.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5187 @code{balance} specifies the column number within the field width which
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5188 will be aligned between entries. Numbering starts from 0 which indicates
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5189 the leftmost column. @code{left-min} specifies the minimum field width to
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5190 the left of the specified balance column.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5191
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5192 The default format is:
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5193
29856
56b3e2af0298 Add 's'=sparse attribute for whos function (bug #60687)
Rik <rik@octave.org>
parents: 29848
diff changeset
5194 @example
56b3e2af0298 Add 's'=sparse attribute for whos function (bug #60687)
Rik <rik@octave.org>
parents: 29848
diff changeset
5195 " %la:5; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;@backslashchar{}n"
56b3e2af0298 Add 's'=sparse attribute for whos function (bug #60687)
Rik <rik@octave.org>
parents: 29848
diff changeset
5196 @end example
26087
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5197
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5198 When called from inside a function with the @qcode{"local"} option, the
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5199 variable is changed locally for the function and any subroutines it calls.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5200 The original variable value is restored when exiting the function.
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5201 @seealso{whos}
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5202 @end deftypefn */)
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5203 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
5204 tree_evaluator& tw = interp.get_evaluator ();
26087
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5205
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5206 return tw.whos_line_format (args, nargout);
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5207 }
7656fcd0ff9f move whos_line_format to evaluator
John W. Eaton <jwe@octave.org>
parents: 26065
diff changeset
5208
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5209 DEFMETHOD (silent_functions, interp, args, nargout,
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5210 doc: /* -*- texinfo -*-
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5211 @deftypefn {} {@var{val} =} silent_functions ()
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5212 @deftypefnx {} {@var{old_val} =} silent_functions (@var{new_val})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5213 @deftypefnx {} {} silent_functions (@var{new_val}, "local")
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5214 Query or set the internal variable that controls whether internal
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5215 output from a function is suppressed.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5216
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5217 If this option is disabled, Octave will display the results produced by
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5218 evaluating expressions within a function body that are not terminated with
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5219 a semicolon.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5220
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5221 When called from inside a function with the @qcode{"local"} option, the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5222 variable is changed locally for the function and any subroutines it calls.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5223 The original variable value is restored when exiting the function.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21922
diff changeset
5224 @end deftypefn */)
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
5225 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
5226 tree_evaluator& tw = interp.get_evaluator ();
23705
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5227
4c597585ff52 move Vmax_recursion_depth and Vsilent_functions to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23702
diff changeset
5228 return tw.silent_functions (args, nargout);
8658
73c4516fae10 New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
diff changeset
5229 }
12833
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5230
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5231 /*
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5232 %!test
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5233 %! orig_val = silent_functions ();
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5234 %! old_val = silent_functions (! orig_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5235 %! assert (orig_val, old_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5236 %! assert (silent_functions (), ! orig_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5237 %! silent_functions (orig_val);
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5238 %! assert (silent_functions (), orig_val);
14429
eff4a5933e28 Update %!tests in src/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14294
diff changeset
5239
28930
2883b3d08b7e maint: Remove unnecessary parentheses bracketing %!error BIST tests.
Rik <rik@octave.org>
parents: 28857
diff changeset
5240 %!error silent_functions (1, 2)
12833
9f0f2c226053 codesprint: new tests for functions in pt-eval.cc
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
5241 */
23706
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5242
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5243 DEFMETHOD (string_fill_char, interp, args, nargout,
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5244 doc: /* -*- texinfo -*-
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5245 @deftypefn {} {@var{val} =} string_fill_char ()
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5246 @deftypefnx {} {@var{old_val} =} string_fill_char (@var{new_val})
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5247 @deftypefnx {} {} string_fill_char (@var{new_val}, "local")
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5248 Query or set the internal variable used to pad all rows of a character
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5249 matrix to the same length.
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5250
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5251 The value must be a single character and the default is @qcode{" "} (a
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5252 single space). For example:
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5253
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5254 @example
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5255 @group
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5256 string_fill_char ("X");
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5257 [ "these"; "are"; "strings" ]
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5258 @result{} "theseXX"
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5259 "areXXXX"
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5260 "strings"
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5261 @end group
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5262 @end example
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5263
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5264 When called from inside a function with the @qcode{"local"} option, the
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5265 variable is changed locally for the function and any subroutines it calls.
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5266 The original variable value is restored when exiting the function.
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5267 @end deftypefn */)
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5268 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
5269 tree_evaluator& tw = interp.get_evaluator ();
23706
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5270
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5271 return tw.string_fill_char (args, nargout);
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5272 }
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5273
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5274 /*
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5275 ## string_fill_char() function call must be outside of %!test block
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5276 ## due to the way a %!test block is wrapped inside a function
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5277 %!shared orig_val, old_val
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5278 %! orig_val = string_fill_char ();
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5279 %! old_val = string_fill_char ("X");
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5280 %!test
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5281 %! assert (orig_val, old_val);
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5282 %! assert (string_fill_char (), "X");
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5283 %! assert (["these"; "are"; "strings"], ["theseXX"; "areXXXX"; "strings"]);
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5284 %! string_fill_char (orig_val);
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5285 %! assert (string_fill_char (), orig_val);
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5286
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5287 %!assert ( [ [], {1} ], {1} )
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5288
28930
2883b3d08b7e maint: Remove unnecessary parentheses bracketing %!error BIST tests.
Rik <rik@octave.org>
parents: 28857
diff changeset
5289 %!error string_fill_char (1, 2)
23706
6683451b75b2 move Vstring_fill_char to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23705
diff changeset
5290 */
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5291
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5292 DEFMETHOD (PS4, interp, args, nargout,
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5293 doc: /* -*- texinfo -*-
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5294 @deftypefn {} {@var{val} =} PS4 ()
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5295 @deftypefnx {} {@var{old_val} =} PS4 (@var{new_val})
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5296 @deftypefnx {} {} PS4 (@var{new_val}, "local")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5297 Query or set the character string used to prefix output produced
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5298 when echoing commands is enabled.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5299
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5300 The default value is @qcode{"+ "}.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5301 @xref{Diary and Echo Commands}, for a description of echoing commands.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5302
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5303 When called from inside a function with the @qcode{"local"} option, the
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5304 variable is changed locally for the function and any subroutines it calls.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5305 The original variable value is restored when exiting the function.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5306 @seealso{echo, PS1, PS2}
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5307 @end deftypefn */)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5308 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
5309 tree_evaluator& tw = interp.get_evaluator ();
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5310
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5311 return tw.PS4 (args, nargout);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5312 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5313
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5314 DEFMETHOD (echo, interp, args, nargout,
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5315 doc: /* -*- texinfo -*-
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5316 @deftypefn {} {} echo
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5317 @deftypefnx {} {} echo on
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5318 @deftypefnx {} {} echo off
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5319 @deftypefnx {} {} echo on all
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5320 @deftypefnx {} {} echo off all
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5321 @deftypefnx {} {} echo @var{function} on
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5322 @deftypefnx {} {} echo @var{function} off
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5323 Control whether commands are displayed as they are executed.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5324
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5325 Valid options are:
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5326
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5327 @table @code
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5328 @item on
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5329 Enable echoing of commands as they are executed in script files.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5330
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5331 @item off
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5332 Disable echoing of commands as they are executed in script files.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5333
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5334 @item on all
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5335 Enable echoing of commands as they are executed in script files and
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5336 functions.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5337
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5338 @item off all
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5339 Disable echoing of commands as they are executed in script files and
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5340 functions.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5341
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5342 @item @var{function} on
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5343 Enable echoing of commands as they are executed in the named function.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5344
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5345 @item @var{function} off
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5346 Disable echoing of commands as they are executed in the named function.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5347 @end table
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5348
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5349 @noindent
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5350 With no arguments, @code{echo} toggles the current echo state.
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5351
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5352 @seealso{PS4}
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5353 @end deftypefn */)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5354 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29960
diff changeset
5355 tree_evaluator& tw = interp.get_evaluator ();
23723
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5356
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5357 return tw.echo (args, nargout);
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5358 }
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5359
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5360 /*
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5361 %!error echo ([])
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5362 %!error echo (0)
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5363 %!error echo ("")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5364 %!error echo ("Octave")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5365 %!error echo ("off", "invalid")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5366 %!error echo ("on", "invalid")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5367 %!error echo ("on", "all", "all")
ab8831d346c1 revamp echo command and move related variables inside tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 23706
diff changeset
5368 */
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
5369
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
5370 OCTAVE_NAMESPACE_END