1 //////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (C) 2001-2021 The Octave Project Developers 4 // 5 // See the file COPYRIGHT.md in the top-level directory of this 6 // distribution or <https://octave.org/copyright/>. 7 // 8 // This file is part of Octave. 9 // 10 // Octave is free software: you can redistribute it and/or modify it 11 // under the terms of the GNU General Public License as published by 12 // the Free Software Foundation, either version 3 of the License, or 13 // (at your option) any later version. 14 // 15 // Octave is distributed in the hope that it will be useful, but 16 // WITHOUT ANY WARRANTY; without even the implied warranty of 17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 // GNU General Public License for more details. 19 // 20 // You should have received a copy of the GNU General Public License 21 // along with Octave; see the file COPYING. If not, see 22 // <https://www.gnu.org/licenses/>. 23 // 24 //////////////////////////////////////////////////////////////////////// 25 26 #if ! defined (octave_pt_bp_h) 27 #define octave_pt_bp_h 1 28 29 #include "octave-config.h" 30 31 #include "input.h" 32 #include "ov-usr-fcn.h" 33 #include "pt-walk.h" 34 #include "pt-pr-code.h" 35 #include "interpreter.h" 36 37 namespace octave 38 { 39 class tree; 40 class tree_decl_command; 41 42 class tree_breakpoint : public tree_walker 43 { 44 public: 45 46 enum action { set = 1, clear = 2, list = 3 }; 47 48 tree_breakpoint (int l, action a, const std::string& c = "") m_line(l)49 : m_line (l), m_action (a), m_condition (c), m_found (false), 50 m_bp_list (), m_bp_cond_list () 51 { } 52 53 // No copying! 54 55 tree_breakpoint (const tree_breakpoint&) = delete; 56 57 tree_breakpoint& operator = (const tree_breakpoint&) = delete; 58 59 ~tree_breakpoint (void) = default; 60 success(void)61 bool success (void) const { return m_found; } 62 63 void visit_argument_list (tree_argument_list&); 64 65 void visit_binary_expression (tree_binary_expression&); 66 67 void visit_break_command (tree_break_command&); 68 69 void visit_colon_expression (tree_colon_expression&); 70 71 void visit_continue_command (tree_continue_command&); 72 73 void visit_decl_command (tree_decl_command&); 74 75 void visit_decl_init_list (tree_decl_init_list&); 76 77 void visit_decl_elt (tree_decl_elt&); 78 79 void visit_while_command (tree_while_command&); 80 81 void visit_do_until_command (tree_do_until_command&); 82 83 void visit_simple_for_command (tree_simple_for_command&); 84 85 void visit_complex_for_command (tree_complex_for_command&); 86 87 void visit_octave_user_function_header (octave_user_function&); 88 89 void visit_octave_user_function_trailer (octave_user_function&); 90 91 92 void visit_identifier (tree_identifier&); 93 94 void visit_if_clause (tree_if_clause&); 95 96 void visit_if_command_list (tree_if_command_list&); 97 98 void visit_index_expression (tree_index_expression&); 99 100 void visit_matrix (tree_matrix&); 101 102 void visit_cell (tree_cell&); 103 104 void visit_multi_assignment (tree_multi_assignment&); 105 106 void visit_no_op_command (tree_no_op_command&); 107 108 void visit_anon_fcn_handle (tree_anon_fcn_handle&); 109 110 void visit_constant (tree_constant&); 111 112 void visit_fcn_handle (tree_fcn_handle&); 113 114 void visit_parameter_list (tree_parameter_list&); 115 116 void visit_postfix_expression (tree_postfix_expression&); 117 118 void visit_prefix_expression (tree_prefix_expression&); 119 120 void visit_return_command (tree_return_command&); 121 122 void visit_simple_assignment (tree_simple_assignment&); 123 124 void visit_statement (tree_statement&); 125 126 void visit_statement_list (tree_statement_list&); 127 128 void visit_switch_case (tree_switch_case&); 129 130 void visit_switch_case_list (tree_switch_case_list&); 131 132 void visit_switch_command (tree_switch_command&); 133 134 void visit_try_catch_command (tree_try_catch_command&); 135 136 void visit_unwind_protect_command (tree_unwind_protect_command&); 137 get_list(void)138 octave_value_list get_list (void) { return m_bp_list; } 139 get_cond_list(void)140 octave_value_list get_cond_list (void) { return m_bp_cond_list; } 141 get_line(void)142 int get_line (void) { return m_found ? m_line : 0; } 143 144 private: 145 146 void take_action (tree& tr); 147 148 void take_action (tree_statement& stmt); 149 150 // Statement line number we are looking for. 151 int m_line; 152 153 // What to do. 154 action m_action; 155 156 // Expression which must be true to break 157 std::string m_condition; 158 159 // Have we already found the line? 160 bool m_found; 161 162 // List of breakpoint line numbers. 163 octave_value_list m_bp_list; 164 165 // List of breakpoint conditions. 166 octave_value_list m_bp_cond_list; 167 }; 168 } 169 170 #endif 171