3
Copyright (C) 1996-2013 John W. Eaton
5
This file is part of Octave.
7
Octave is free software; you can redistribute it and/or modify it
8
under the terms of the GNU General Public License as published by the
9
Free Software Foundation; either version 3 of the License, or (at your
10
option) any later version.
12
Octave is distributed in the hope that it will be useful, but WITHOUT
13
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17
You should have received a copy of the GNU General Public License
18
along with Octave; see the file COPYING. If not, see
19
<http://www.gnu.org/licenses/>.
35
#include "octave-link.h"
36
#include "oct-lvalue.h"
44
#include "pt-pr-code.h"
47
#include "unwind-prot.h"
49
#include "variables.h"
51
// A list of commands to be executed.
53
tree_statement::~tree_statement (void)
61
tree_statement::set_print_flag (bool print_flag)
64
expr->set_print_flag (print_flag);
68
tree_statement::print_result (void)
70
return expr && expr->print_result ();
74
tree_statement::set_breakpoint (void)
77
cmd->set_breakpoint ();
79
expr->set_breakpoint ();
83
tree_statement::delete_breakpoint (void)
86
cmd->delete_breakpoint ();
88
expr->delete_breakpoint ();
92
tree_statement::is_breakpoint (void) const
94
return cmd ? cmd->is_breakpoint () : (expr ? expr->is_breakpoint () : false);
98
tree_statement::line (void) const
100
return cmd ? cmd->line () : (expr ? expr->line () : -1);
104
tree_statement::column (void) const
106
return cmd ? cmd->column () : (expr ? expr->column () : -1);
110
tree_statement::set_location (int l, int c)
113
cmd->set_location (l, c);
115
expr->set_location (l, c);
119
tree_statement::echo_code (void)
121
tree_print_code tpc (octave_stdout, VPS4);
127
tree_statement::is_end_of_fcn_or_script (void) const
133
tree_no_op_command *no_op_cmd
134
= dynamic_cast<tree_no_op_command *> (cmd);
137
retval = no_op_cmd->is_end_of_fcn_or_script ();
144
tree_statement::is_end_of_file (void) const
150
tree_no_op_command *no_op_cmd
151
= dynamic_cast<tree_no_op_command *> (cmd);
154
retval = no_op_cmd->is_end_of_file ();
161
tree_statement::dup (symbol_table::scope_id scope,
162
symbol_table::context_id context) const
164
tree_statement *new_stmt = new tree_statement ();
166
new_stmt->cmd = cmd ? cmd->dup (scope, context) : 0;
168
new_stmt->expr = expr ? expr->dup (scope, context) : 0;
170
new_stmt->comm = comm ? comm->dup () : 0;
176
tree_statement::accept (tree_walker& tw)
178
tw.visit_statement (*this);
182
tree_statement_list::set_breakpoint (int line)
184
tree_breakpoint tbp (line, tree_breakpoint::set);
187
return tbp.get_line ();
191
tree_statement_list::delete_breakpoint (int line)
195
octave_value_list bp_lst = list_breakpoints ();
197
int len = bp_lst.length ();
199
for (int i = 0; i < len; i++)
201
tree_breakpoint tbp (i, tree_breakpoint::clear);
207
tree_breakpoint tbp (line, tree_breakpoint::clear);
213
tree_statement_list::list_breakpoints (void)
215
tree_breakpoint tbp (0, tree_breakpoint::list);
218
return tbp.get_list ();
222
tree_statement_list::add_breakpoint (const std::string& file,
223
const bp_table::intmap& line)
225
bp_table::intmap retval;
227
octave_idx_type len = line.size ();
229
for (int i = 0; i < len; i++)
231
bp_table::const_intmap_iterator p = line.find (i);
233
if (p != line.end ())
235
int lineno = p->second;
237
retval[i] = set_breakpoint (lineno);
239
if (retval[i] != 0 && ! file.empty ())
240
octave_link::update_breakpoint (true, file, retval[i]);
248
tree_statement_list::remove_all_breakpoints (const std::string& file)
250
bp_table::intmap retval;
252
octave_value_list bkpts = list_breakpoints ();
254
for (int i = 0; i < bkpts.length (); i++)
256
int lineno = static_cast<int> (bkpts(i).int_value ());
258
delete_breakpoint (lineno);
263
octave_link::update_breakpoint (false, file, lineno);
270
tree_statement_list *
271
tree_statement_list::dup (symbol_table::scope_id scope,
272
symbol_table::context_id context) const
274
tree_statement_list *new_list = new tree_statement_list ();
276
new_list->function_body = function_body;
278
for (const_iterator p = begin (); p != end (); p++)
280
const tree_statement *elt = *p;
282
new_list->append (elt ? elt->dup (scope, context) : 0);
289
tree_statement_list::accept (tree_walker& tw)
291
tw.visit_statement_list (*this);