# HG changeset patch # User John W. Eaton # Date 1259173915 18000 # Node ID 10dcb8b64e4afa2353e568b9f33eb8e33da254e9 # Parent d82388277620cf3aa3319e35b7ce5e7fec4fdbf0 keyboard: fix stack manipulation diff -r d82388277620 -r 10dcb8b64e4a src/ChangeLog --- a/src/ChangeLog Wed Nov 25 12:05:09 2009 +0100 +++ b/src/ChangeLog Wed Nov 25 13:31:55 2009 -0500 @@ -1,3 +1,15 @@ +2009-08-04 John W. Eaton + + * 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 + + * input.cc (Fkeyboard): Only call do_keyboard, don't fiddle with + stack. + 2009-11-17 Jaroslav Hajek * DLD-FUNCTIONS/balance.cc: Fix docs. diff -r d82388277620 -r 10dcb8b64e4a src/input.cc --- a/src/input.cc Wed Nov 25 12:05:09 2009 +0100 +++ b/src/input.cc Wed Nov 25 13:31:55 2009 -0500 @@ -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); diff -r d82388277620 -r 10dcb8b64e4a src/toplev.cc --- a/src/toplev.cc Wed Nov 25 12:05:09 2009 +0100 +++ b/src/toplev.cc Wed Nov 25 13:31:55 2009 -0500 @@ -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;