changeset 12109:10dcb8b64e4a release-3-2-x

keyboard: fix stack manipulation
author John W. Eaton <jwe@octave.org>
date Wed, 25 Nov 2009 13:31:55 -0500
parents d82388277620
children 8166d596247e
files src/ChangeLog src/input.cc src/toplev.cc
diffstat 3 files changed, 58 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,15 @@
+2009-08-04  John W. Eaton  <jwe@octave.org>
+
+	* toplev.cc (octave_call_stack::do_goto_frame_relative): Allow
+	NSKIP to be 0.  Set current scope and context.
+	* input.cc (Fkeyboard): Use octave_call_stack::goto_frame_relative
+	to set scope in user code that called the keyboard function.
+
+2009-08-04  Jaroslav Hajek  <highegg@gmail.com>
+
+	* input.cc (Fkeyboard): Only call do_keyboard, don't fiddle with
+	stack.
+
 2009-11-17  Jaroslav Hajek  <highegg@gmail.com>
 
 	* DLD-FUNCTIONS/balance.cc: Fix docs.
--- a/src/input.cc
+++ b/src/input.cc
@@ -956,7 +956,7 @@
       unwind_protect_size_t (saved_frame);
 
       // Skip the frame assigned to the keyboard function.
-      octave_call_stack::goto_frame (1);
+      octave_call_stack::goto_frame_relative (0, true);
 
       do_keyboard (args);
 
--- a/src/toplev.cc
+++ b/src/toplev.cc
@@ -366,65 +366,67 @@
 {
   bool retval = false;
 
-  if (nskip == 0)
-    retval = true;
-  else
+  int incr = 0;
+
+  if (nskip < 0)
+    incr = -1;
+  else if (nskip > 0)
+    incr = 1;
+
+  // Start looking with the caller of dbup/dbdown/keyboard.
+  size_t frame = cs[curr_frame].prev;
+
+  while (true)
     {
-      int incr = nskip < 0 ? -1 : 1;
+      if ((incr < 0 && frame == 0) || (incr > 0 && frame == cs.size () - 1))
+	break;
+
+      frame += incr;
 
-      // Start looking with the caller of dbup/dbdown.
-      size_t frame = cs[curr_frame].prev;
+      const call_stack_elt& elt = cs[frame];
 
-      while (true)
+      octave_function *f = elt.fcn;
+
+      if (f && f->is_user_code ())
 	{
-	  if ((incr < 0 && frame == 0) || (incr > 0 && frame == cs.size () - 1))
-	    break;
-
-	  frame += incr;
+	  if (nskip > 0)
+	    nskip--;
+	  else if (nskip < 0)
+	    nskip++;
 
-	  const call_stack_elt& elt = cs[frame];
-
-	  octave_function *f = elt.fcn;
-
-	  if (f && f->is_user_code ())
+	  if (nskip == 0)
 	    {
-	      if (nskip > 0)
-		nskip--;
-	      else if (nskip < 0)
-		nskip++;
+	      curr_frame = frame;
+	      cs[cs.size () - 1].prev = curr_frame;
+
+	      symbol_table::set_scope_and_context (elt.scope, elt.context);
 
-	      if (nskip == 0)
+	      if (verbose)
 		{
-		  curr_frame = frame;
-		  cs[cs.size () - 1].prev = curr_frame;
-
-		  if (verbose)
+		  tree_statement *s = elt.stmt;
+		  int l = -1;
+		  int c = -1;
+		  if (s)
 		    {
-		      tree_statement *s = elt.stmt;
-		      int l = -1;
-		      int c = -1;
-		      if (s)
-			{
-			  l = s->line ();
-			  c = s->column ();
-			}
-
-		      std::ostringstream buf;
-		      buf << f->name () << ": " << " line " << l
-			  << ", column " << c << std::endl;
-
-		      octave_stdout << buf.str ();
+		      l = s->line ();
+		      c = s->column ();
 		    }
 
-		  retval = true;
-		  break;
+		  std::ostringstream buf;
+		  buf << f->name () << ": " << " line " << l
+		      << ", column " << c << std::endl;
+
+		  octave_stdout << buf.str ();
 		}
+
+	      retval = true;
+	      break;
 	    }
 	}
 
       // There is no need to set scope and context here.  That will
-      // happen when the dbup/dbdown frame is popped and we jump to
-      // the new "prev" frame set above.
+      // happen when the dbup/dbdown/keyboard frame is popped and we
+      // jump to the new "prev" frame set above.
     }
 
   return retval;