changeset 11986:66a639bfc523 release-3-2-x

tree_anon_fcn_handle::dup: don't convert to tree_constant
author John W. Eaton <jwe@octave.org>
date Thu, 11 Jun 2009 07:13:19 +0200
parents bdc383a457fb
children ad7a2f55c8b4
files src/ChangeLog src/pt-fcn-handle.cc
diffstat 2 files changed, 15 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
 2009-06-10  John W. Eaton  <jwe@octave.org>
 
+	* pt-fcn-handle.cc (tree_anon_fcn_handle::dup): Don't convert to
+	tree_constant object here.  Do inherit from current symbol table
+	scope and context.  New test.
+
 	* lex.l	(handle_identifier): Set lexer_flags.looking_for_object_index
 	false if identifier is a keyword.
 	({IDENT}{S}*): Don't set lexer_flags.looking_for_object_index here.
--- a/src/pt-fcn-handle.cc
+++ b/src/pt-fcn-handle.cc
@@ -139,6 +139,10 @@
 %!test
 %! assert ((f1 (3)) (10) == 7)
 %!
+%!shared g
+%! g = @(t) feval (@(x) t*x, 2);
+%!assert (g(0.5) == 1)
+%!
 %!shared f, g, h
 %! h = @(x) sin (x);
 %! g = @(f, x) h (x);
@@ -159,42 +163,10 @@
   return retval;
 }
 
-#if 0
-tree_expression *
-tree_anon_fcn_handle::dup (symbol_table::scope_id parent_scope,
-			   symbol_table::context_id parent_context) const
-{
-  tree_parameter_list *param_list = parameter_list ();
-  tree_parameter_list *ret_list = return_list ();
-  tree_statement_list *cmd_list = body ();
-  symbol_table::scope_id this_scope = scope ();
-
-  symbol_table::scope_id new_scope = symbol_table::dup_scope (this_scope);
-
-  if (new_scope > 0)
-    symbol_table::inherit (new_scope, parent_scope, parent_context);
-
-  tree_anon_fcn_handle *new_afh = new
-    tree_anon_fcn_handle (param_list ? param_list->dup (new_scope, 0) : 0,
-			  ret_list ? ret_list->dup (new_scope, 0) : 0,
-			  cmd_list ? cmd_list->dup (new_scope, 0) : 0,
-			  new_scope, line (), column ());
-
-  new_afh->copy_base (*this);
-
-  return new_afh;
-}
-#endif
-
 tree_expression *
 tree_anon_fcn_handle::dup (symbol_table::scope_id,
 			   symbol_table::context_id) const
 {
-  // Instead of simply duplicating, transform to a tree_constant
-  // object that contains an octave_fcn_handle object with the symbol
-  // table of the referenced function primed with values from the
-  // current scope and context.
-
   tree_parameter_list *param_list = parameter_list ();
   tree_parameter_list *ret_list = return_list ();
   tree_statement_list *cmd_list = body ();
@@ -206,33 +178,15 @@
     symbol_table::inherit (new_scope, symbol_table::current_scope (),
 			   symbol_table::current_context ());
 
-  octave_user_function *uf
-    = new octave_user_function (new_scope,
-				param_list ? param_list->dup (new_scope, 0) : 0,
-				ret_list ? ret_list->dup (new_scope, 0) : 0,
-				cmd_list ? cmd_list->dup (new_scope, 0) : 0);
-
-  octave_function *curr_fcn = octave_call_stack::current ();
-
-  if (curr_fcn)
-    {
-      uf->stash_parent_fcn_name (curr_fcn->name ());
-
-      symbol_table::scope_id parent_scope = curr_fcn->parent_fcn_scope ();
+  tree_anon_fcn_handle *new_afh = new
+    tree_anon_fcn_handle (param_list ? param_list->dup (new_scope, 0) : 0,
+			  ret_list ? ret_list->dup (new_scope, 0) : 0,
+			  cmd_list ? cmd_list->dup (new_scope, 0) : 0,
+			  new_scope, line (), column ());
 
-      if (parent_scope < 0)
-	parent_scope = curr_fcn->scope ();
-	
-      uf->stash_parent_fcn_scope (parent_scope);
-    }
+  new_afh->copy_base (*this);
 
-  uf->mark_as_inline_function ();
-
-  octave_value ov_fcn (uf);
-
-  octave_value fh (new octave_fcn_handle (ov_fcn, "@<anonymous>"));
-
-  return new tree_constant (fh, line (), column ());
+  return new_afh;
 }
 
 void