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	Fri Jun 16 05:01:39 2006 +0000
+++ b/src/pt-fcn-handle.cc	Fri Jun 16 05:09:42 2006 +0000
@@ -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++ ***