Mercurial > hg > octave-lyh
diff src/pt-fcn-handle.cc @ 5861:2a6cb4ed8f1e
[project @ 2006-06-16 05:09:41 by jwe]
author | jwe |
---|---|
date | Fri, 16 Jun 2006 05:09:42 +0000 |
parents | 4c8a2e4e0717 |
children | c968f4198067 |
line wrap: on
line diff
--- a/src/pt-fcn-handle.cc +++ b/src/pt-fcn-handle.cc @@ -33,6 +33,7 @@ #include "pt-fcn-handle.h" #include "pager.h" #include "pt-walk.h" +#include "variables.h" void tree_fcn_handle::print (std::ostream& os, bool pr_as_read_syntax, @@ -70,12 +71,96 @@ return retval; } +tree_expression * +tree_fcn_handle::dup (symbol_table *sym_tab) +{ + tree_fcn_handle *new_fh = new tree_fcn_handle (nm, line (), column ()); + + new_fh->copy_base (*this); + + return new_fh; +} + void tree_fcn_handle::accept (tree_walker& tw) { tw.visit_fcn_handle (*this); } +tree_anon_fcn_handle::~tree_anon_fcn_handle (void) +{ + delete param_list; + delete cmd_list; + delete ret_list; + delete sym_tab; +} + +octave_value +tree_anon_fcn_handle::rvalue (void) +{ + MAYBE_DO_BREAKPOINT; + + symbol_table *new_sym_tab = sym_tab ? sym_tab->dup () : 0; + + if (new_sym_tab) + new_sym_tab->inherit (curr_sym_tab); + + tree_parameter_list *new_param_list + = param_list ? param_list->dup (new_sym_tab) : 0; + + tree_statement_list *new_cmd_list + = cmd_list ? cmd_list->dup (new_sym_tab) : 0; + + tree_parameter_list *new_ret_list + = ret_list ? ret_list->dup (new_sym_tab) : 0; + + octave_user_function *uf + = new octave_user_function (new_param_list, new_ret_list, + new_cmd_list, new_sym_tab); + + octave_value fcn (uf); + + octave_value fh (new octave_fcn_handle (fcn, "@<anonymous>")); + + return fh; +} + +octave_value_list +tree_anon_fcn_handle::rvalue (int nargout) +{ + octave_value_list retval; + + if (nargout > 1) + error ("invalid number of output arguments for anonymous function handle expression"); + else + retval = rvalue (); + + return retval; +} + +tree_expression * +tree_anon_fcn_handle::dup (symbol_table *st) +{ + tree_anon_fcn_handle *new_afh + = new tree_anon_fcn_handle (param_list ? param_list->dup (st) : 0, + ret_list ? ret_list->dup (st) : 0, + cmd_list ? cmd_list->dup (st) : 0, + sym_tab ? sym_tab->dup () : 0, + line (), column ()); + + new_afh->copy_base (*this); + + return new_afh; +} + +void +tree_anon_fcn_handle::accept (tree_walker& tw) +{ + tw.visit_anon_fcn_handle (*this); +} + + + /* ;;; Local Variables: *** ;;; mode: C++ ***