26#if ! defined (octave_pt_eval_h)
27#define octave_pt_eval_h 1
29#include "octave-config.h"
51 class symbol_info_list;
54 class tree_expression;
88 void push (
const T& val) { m_stack.push (val); }
97 T retval = m_stack.top ();
104 return m_stack.top ();
109 return m_stack.size ();
114 return m_stack.empty ();
119 while (! m_stack.empty ())
128 typedef void (*decl_elt_init_fcn) (tree_decl_elt&);
131 : m_interpreter (interp), m_parser (), m_statement_context (SC_OTHER),
132 m_lvalue_list (nullptr), m_autoload_map (), m_bp_table (*this),
133 m_call_stack (*this), m_profiler (), m_debug_frame (0),
134 m_debug_mode (false), m_quiet_breakpoint_flag (false),
135 m_debugger_stack (), m_exit_status (0), m_max_recursion_depth (256),
136 m_whos_line_format (
" %la:5; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\n"),
137 m_silent_functions (false), m_string_fill_char (
' '), m_PS4 (
"+ "),
138 m_dbstep_flag (0), m_break_on_next_stmt (false), m_echo (ECHO_OFF),
139 m_echo_state (false), m_echo_file_name (), m_echo_file_pos (1),
140 m_echo_files (), m_in_top_level_repl (false),
141 m_server_mode (false), m_in_loop_command (false),
142 m_breaking (0), m_continuing (0), m_returning (0),
143 m_indexed_object (), m_index_list (), m_index_type (),
144 m_index_position (0), m_num_indices (0)
165 bool at_top_level (
void)
const;
167 std::string mfilename (
const std::string& opt =
"")
const;
173 void parse_and_execute (
const std::string&
input,
bool& incomplete_parse);
175 void get_line_and_eval (
void);
181 int server_loop (
void);
187 void eval (std::shared_ptr<tree_statement_list>& stmt_list,
191 int& parse_status,
int nargout);
193 octave_value eval_string (
const std::string& eval_str,
bool silent,
197 int& parse_status,
int nargout);
202 const std::string& catch_code,
int nargout);
205 const std::string& try_code,
int nargout);
208 const std::string& try_code,
209 const std::string& catch_code,
int nargout);
211 void visit_anon_fcn_handle (tree_anon_fcn_handle&);
213 void visit_argument_list (tree_argument_list&);
215 void visit_arguments_block (tree_arguments_block&);
217 void visit_args_block_attribute_list (tree_args_block_attribute_list&);
219 void visit_args_block_validation_list (tree_args_block_validation_list&);
221 void visit_arg_validation (tree_arg_validation&);
223 void visit_arg_size_spec (tree_arg_size_spec&);
225 void visit_arg_validation_fcns (tree_arg_validation_fcns&);
227 void visit_binary_expression (tree_binary_expression&);
229 void visit_boolean_expression (tree_boolean_expression&);
231 void visit_compound_binary_expression (tree_compound_binary_expression&);
233 void visit_break_command (tree_break_command&);
235 void visit_colon_expression (tree_colon_expression&);
237 void visit_continue_command (tree_continue_command&);
239 void visit_decl_command (tree_decl_command&);
241 void visit_decl_elt (tree_decl_elt&);
243 void visit_simple_for_command (tree_simple_for_command&);
245 void visit_complex_for_command (tree_complex_for_command&);
247 void visit_spmd_command (tree_spmd_command&);
265 void visit_function_def (tree_function_def&);
267 void visit_identifier (tree_identifier&);
269 void visit_if_clause (tree_if_clause&);
271 void visit_if_command (tree_if_command&);
273 void visit_if_command_list (tree_if_command_list&);
275 void visit_index_expression (tree_index_expression&);
277 void visit_matrix (tree_matrix&);
279 void visit_cell (tree_cell&);
281 void visit_multi_assignment (tree_multi_assignment&);
283 void visit_no_op_command (tree_no_op_command&);
285 void visit_constant (tree_constant&);
287 void visit_fcn_handle (tree_fcn_handle&);
289 void visit_parameter_list (tree_parameter_list&);
291 void visit_postfix_expression (tree_postfix_expression&);
293 void visit_prefix_expression (tree_prefix_expression&);
295 void visit_return_command (tree_return_command&);
297 void visit_simple_assignment (tree_simple_assignment&);
299 void visit_statement (tree_statement&);
301 void visit_statement_list (tree_statement_list&);
303 void visit_switch_case (tree_switch_case&);
305 void visit_switch_case_list (tree_switch_case_list&);
307 void visit_switch_command (tree_switch_command&);
309 void visit_try_catch_command (tree_try_catch_command&);
311 void do_unwind_protect_cleanup_code (tree_statement_list *list);
313 void visit_unwind_protect_command (tree_unwind_protect_command&);
315 void visit_while_command (tree_while_command&);
316 void visit_do_until_command (tree_do_until_command&);
318 void visit_superclass_ref (tree_superclass_ref&);
319 void visit_metaclass_query (tree_metaclass_query&);
323 bool statement_printing_enabled (
void);
325 void reset_debug_state (
void);
327 void reset_debug_state (
bool mode);
329 void enter_debugger (
const std::string& prompt =
"debug> ");
331 void keyboard (
const std::string& prompt =
"keyboard> ");
333 void dbupdown (
int n,
bool verbose =
false);
343 Matrix ignored_fcn_outputs (
void)
const;
349 void install_variable (
const std::string&
name,
356 void global_assign (
const std::string&
name,
361 void top_level_assign (
const std::string&
name,
364 bool is_variable (
const std::string&
name)
const;
366 bool is_local_variable (
const std::string&
name)
const;
368 bool is_variable (
const tree_expression *expr)
const;
370 bool is_defined (
const tree_expression *expr)
const;
372 bool is_variable (
const symbol_record& sym)
const;
374 bool is_defined (
const symbol_record& sym)
const;
376 bool is_global (
const std::string&
name)
const;
382 void assign (
const std::string&
name,
385 void assignin (
const std::string& context,
const std::string&
name,
389 const std::string& context =
"",
390 bool verbose =
false,
bool require_file =
true);
392 void set_auto_fcn_var (stack_frame::auto_var_type avt,
395 octave_value get_auto_fcn_var (stack_frame::auto_var_type avt)
const;
397 void define_parameter_list_from_arg_vector
400 void undefine_parameter_list (tree_parameter_list *param_list);
405 convert_return_list_to_const_vector
406 (tree_parameter_list *ret_list,
int nargout,
407 const Matrix& ignored_outputs,
const Cell& varargout);
409 bool eval_decl_elt (tree_decl_elt *elt);
411 bool switch_case_label_matches (tree_switch_case *expr,
422 void push_stack_frame (
const symbol_scope& scope);
425 const std::shared_ptr<stack_frame>& closure_frames = std::shared_ptr<stack_frame> ());
428 const stack_frame::local_vars_map& local_vars,
429 const std::shared_ptr<stack_frame>& closure_frames = std::shared_ptr<stack_frame> ());
435 void pop_stack_frame (
void);
439 return m_call_stack.get_current_stack_frame ();
444 return m_call_stack.current_user_frame ();
448 int current_line (
void)
const;
451 int current_column (
void)
const;
454 int debug_user_code_line (
void)
const;
457 int debug_user_code_column (
void)
const;
459 void debug_where (std::ostream& os)
const;
472 bool goto_frame (std::size_t n = 0,
bool verbose =
false);
474 void goto_caller_frame (
void);
476 void goto_base_frame (
void);
478 void restore_frame (std::size_t n);
480 std::string get_dispatch_class (
void)
const;
482 void set_dispatch_class (
const std::string& class_name);
484 bool is_class_method_executing (std::string& dispatch_class)
const;
486 bool is_class_constructor_executing (std::string& dispatch_class)
const;
488 std::list<std::shared_ptr<stack_frame>>
491 std::list<std::shared_ptr<stack_frame>> backtrace_frames ()
const;
493 std::list<frame_info> backtrace_info (
octave_idx_type& curr_user_frame,
494 bool print_subfn =
true)
const;
496 std::list<frame_info> backtrace_info (
void)
const;
499 bool print_subfn =
true)
const;
505 std::string backtrace_message (
void)
const;
507 void push_dummy_scope (
const std::string&
name);
508 void pop_scope (
void);
510 symbol_scope get_top_scope (
void)
const;
511 symbol_scope get_current_scope (
void)
const;
513 void mlock (
bool skip_first =
false)
const;
515 void munlock (
bool skip_first =
false)
const;
517 bool mislocked (
bool skip_first =
false)
const;
522 void display_call_stack (
void)
const;
526 void clear_objects (
void);
528 void clear_variable (
const std::string&
name);
530 void clear_variable_pattern (
const std::string& pattern);
532 void clear_variable_regexp (
const std::string& pattern);
534 void clear_variables (
void);
536 void clear_global_variable (
const std::string&
name);
538 void clear_global_variable_pattern (
const std::string& pattern);
540 void clear_global_variable_regexp (
const std::string& pattern);
542 void clear_global_variables (
void);
544 void clear_all (
bool force =
false);
546 void clear_symbol (
const std::string&
name);
548 void clear_symbol_pattern (
const std::string& pattern);
550 void clear_symbol_regexp (
const std::string& pattern);
552 std::list<std::string> global_variable_names (
void)
const;
554 std::list<std::string> top_level_variable_names (
void)
const;
556 std::list<std::string> variable_names (
void)
const;
559 const std::string& class_name =
"");
561 std::string current_function_name (
bool skip_first =
false)
const;
563 bool in_user_code (
void)
const;
565 symbol_info_list glob_symbol_info (
const std::string& pattern)
const;
567 symbol_info_list regexp_symbol_info (
const std::string& pattern)
const;
569 symbol_info_list get_symbol_info (
void);
571 symbol_info_list top_scope_symbol_info (
void)
const;
575 std::string lookup_autoload (
const std::string& nm)
const;
577 std::list<std::string> autoloaded_functions (
void)
const;
579 std::list<std::string> reverse_lookup_autoload (
const std::string& nm)
const;
581 void add_autoload (
const std::string& fcn,
const std::string& nm);
583 void remove_autoload (
const std::string& fcn,
const std::string& nm);
589 int val = m_max_recursion_depth;
590 m_max_recursion_depth = n;
601 int val = m_silent_functions;
602 m_silent_functions = b;
612 std::string val = m_whos_line_format;
613 m_whos_line_format = s;
624 std::size_t val = m_debug_frame;
631 return m_call_stack.current_frame ();
638 bool val = m_quiet_breakpoint_flag;
639 m_quiet_breakpoint_flag = flag;
647 int val = m_string_fill_char;
648 m_string_fill_char = c;
656 bool in_debug_repl (
void)
const;
663 void dbquit (
bool all =
false);
669 m_debug_watch_expressions.insert (expr);
676 m_debug_watch_expressions.erase (expr);
683 m_debug_watch_expressions.clear ();
690 return m_debug_watch_expressions;
695 std::string
PS4 (
void)
const {
return m_PS4; }
697 std::string
PS4 (
const std::string& s)
699 std::string val = m_PS4;
706 return m_indexed_object;
711 m_indexed_object = obj;
720 const std::list<octave_value_list>& index_list)
722 m_index_type = index_type;
723 m_index_list = index_list;
729 m_index_list.clear ();
734 m_index_type += type;
735 m_index_list.push_back (idx);
751 return m_lvalue_list;
763 int val = m_breaking;
772 int val = m_continuing;
781 int val = m_returning;
790 int old_val = m_dbstep_flag;
799 return m_break_on_next_stmt;
804 bool old_val = m_break_on_next_stmt;
805 m_break_on_next_stmt = val;
811 m_break_on_next_stmt = val;
816 int echo (
void)
const {
return m_echo; }
820 int old_val = m_echo;
828 void final_index_error (index_exception& ie,
const tree_expression *expr);
831 bool return_list,
bool verbose =
false);
834 make_value_list (tree_argument_list *args,
const string_vector& arg_nm);
836 std::list<octave_lvalue> make_lvalue_list (tree_argument_list *);
838 void push_echo_state (
int type,
const std::string& file_name,
int pos = 1);
842 template <
typename T>
843 void execute_range_loop (
const range<T>& rng,
int line,
845 tree_statement_list *loop_body);
847 void set_echo_state (
int type,
const std::string& file_name,
int pos);
849 void maybe_set_echo_state (
void);
851 void push_echo_state_cleanup (unwind_protect& frame);
853 bool maybe_push_echo_state_cleanup (
void);
855 void do_breakpoint (tree_statement& stmt);
857 void do_breakpoint (
bool is_breakpoint,
858 bool is_end_of_fcn_or_script =
false);
860 bool is_logically_true (tree_expression *expr,
const char *warn_for);
863 void uwp_set_echo_state (
bool state,
const std::string& file_name,
int pos);
865 bool echo_this_file (
const std::string& file,
int type)
const;
867 void echo_code (
int line);
869 bool quit_loop_now (
void);
872 const Matrix& ignored_outputs,
int nargin,
873 int nargout,
bool takes_varargs,
876 std::string check_autoload_file (
const std::string& nm)
const;
F77_RET_T const F77_DBLE const F77_DBLE const F77_INT const F77_DBLE const F77_DBLE const F77_DBLE F77_DBLE F77_DBLE F77_INT F77_INT const F77_INT const F77_INT F77_INT F77_INT F77_DBLE *F77_RET_T const F77_DBLE const F77_INT const F77_DBLE const F77_DBLE F77_DBLE F77_DBLE F77_INT F77_INT const F77_INT const F77_INT F77_INT F77_INT F77_DBLE *F77_RET_T const F77_REAL const F77_REAL const F77_INT const F77_REAL const F77_REAL const F77_REAL F77_REAL F77_REAL F77_INT F77_INT const F77_INT const F77_INT F77_INT F77_INT F77_REAL *F77_RET_T const F77_REAL const F77_INT const F77_REAL const F77_REAL F77_REAL F77_REAL F77_INT F77_INT const F77_INT const F77_INT F77_INT F77_INT F77_REAL *static F77_INT user_function(const double &x, int &, double &result)
value_stack(const value_stack &)=default
value_stack(void)=default
std::size_t size(void) const
~value_stack(void)=default
bool in_top_level_repl(void) const
void set_indexed_object(const octave_value &obj=octave_value())
interpreter & get_interpreter(void)
std::size_t m_debug_frame
std::stack< debugger * > m_debugger_stack
int dbstep_flag(void) const
std::list< octave_value_list > m_index_list
std::size_t debug_frame(std::size_t n)
int max_recursion_depth(int n)
interpreter & m_interpreter
char string_fill_char(void) const
stmt_list_type m_statement_context
char string_fill_char(char c)
int max_recursion_depth(void) const
call_stack & get_call_stack(void)
octave_value indexed_object(void) const
std::size_t debug_frame(void) const
std::string whos_line_format(const std::string &s)
std::size_t current_call_stack_frame_number(void) const
bool silent_functions(bool b)
bool m_quiet_breakpoint_flag
void remove_debug_watch_expression(const std::string &expr)
std::map< std::string, std::string > m_autoload_map
int returning(void) const
octave_value m_indexed_object
bool quiet_breakpoint_flag(bool flag)
int index_position(void) const
const std::string & index_type(void) const
std::shared_ptr< stack_frame > get_current_stack_frame(void) const
std::string PS4(void) const
std::shared_ptr< push_parser > m_parser
int num_indices(void) const
void set_break_on_next_statement(bool val)
bp_table & get_bp_table(void)
void add_debug_watch_expression(const std::string &expr)
std::set< std::string > debug_watch_expressions(void) const
bool quiet_breakpoint_flag(void) const
tree_evaluator(interpreter &interp)
void set_parser(const std::shared_ptr< push_parser > &parser)
bool m_break_on_next_stmt
void server_mode(bool arg)
const std::list< octave_lvalue > * m_lvalue_list
void clear_index_list(void)
bool server_mode(void) const
void clear_debug_watch_expressions(void)
int m_max_recursion_depth
const std::list< octave_lvalue > * lvalue_list(void) const
tree_evaluator(const tree_evaluator &)=delete
std::string PS4(const std::string &s)
std::string m_echo_file_name
std::shared_ptr< push_parser > get_parser(void)
bool break_on_next_statement(bool val)
std::set< std::string > m_debug_watch_expressions
bool break_on_next_statement(void) const
void set_lvalue_list(const std::list< octave_lvalue > *lst)
void set_dbstep_flag(int step)
void append_index_list(char type, const octave_value_list &idx)
std::string m_whos_line_format
~tree_evaluator(void)=default
const std::list< octave_value_list > & index_list(void) const
void set_index_list(const std::string &index_type, const std::list< octave_value_list > &index_list)
bool silent_functions(void) const
std::string whos_line_format(void) const
int continuing(void) const
profiler & get_profiler(void)
std::shared_ptr< stack_frame > current_user_frame(void) const
std::map< std::string, bool > m_echo_files
static octave_idx_type find(octave_idx_type i, octave_idx_type *pp)
static uint32_t state[624]
void source_file(const std::string &file_name, const std::string &context, bool verbose, bool require_file)
static int input(yyscan_t yyscanner)
OCTAVE_NAMESPACE_BEGIN octave_value make_fcn_handle(interpreter &interp, const std::string &nm)
static octave::unwind_protect * curr_fcn_unwind_protect_frame(void)