Mercurial > hg > octave-avbm
comparison src/toplev.cc @ 9483:25c2e92ee03c
correctly skip frame assigned to keyboard function
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 04 Aug 2009 12:59:16 -0400 |
parents | deb668d53e60 |
children | bbe033dcfe13 |
comparison
equal
deleted
inserted
replaced
9482:fb22dd5d6242 | 9483:25c2e92ee03c |
---|---|
364 bool | 364 bool |
365 octave_call_stack::do_goto_frame_relative (int nskip, bool verbose) | 365 octave_call_stack::do_goto_frame_relative (int nskip, bool verbose) |
366 { | 366 { |
367 bool retval = false; | 367 bool retval = false; |
368 | 368 |
369 if (nskip == 0) | 369 int incr = 0; |
370 retval = true; | 370 |
371 else | 371 if (nskip < 0) |
372 { | 372 incr = -1; |
373 int incr = nskip < 0 ? -1 : 1; | 373 else if (nskip > 0) |
374 | 374 incr = 1; |
375 // Start looking with the caller of dbup/dbdown. | 375 |
376 size_t frame = cs[curr_frame].prev; | 376 // Start looking with the caller of dbup/dbdown/keyboard. |
377 | 377 size_t frame = cs[curr_frame].prev; |
378 while (true) | 378 |
379 { | 379 while (true) |
380 if ((incr < 0 && frame == 0) || (incr > 0 && frame == cs.size () - 1)) | 380 { |
381 break; | 381 if ((incr < 0 && frame == 0) || (incr > 0 && frame == cs.size () - 1)) |
382 | 382 break; |
383 frame += incr; | 383 |
384 | 384 frame += incr; |
385 const call_stack_elt& elt = cs[frame]; | 385 |
386 | 386 const call_stack_elt& elt = cs[frame]; |
387 octave_function *f = elt.fcn; | 387 |
388 | 388 octave_function *f = elt.fcn; |
389 if (f && f->is_user_code ()) | 389 |
390 if (f && f->is_user_code ()) | |
391 { | |
392 if (nskip > 0) | |
393 nskip--; | |
394 else if (nskip < 0) | |
395 nskip++; | |
396 | |
397 if (nskip == 0) | |
390 { | 398 { |
391 if (nskip > 0) | 399 curr_frame = frame; |
392 nskip--; | 400 cs[cs.size () - 1].prev = curr_frame; |
393 else if (nskip < 0) | 401 |
394 nskip++; | 402 symbol_table::set_scope_and_context (elt.scope, elt.context); |
395 | 403 |
396 if (nskip == 0) | 404 if (verbose) |
397 { | 405 { |
398 curr_frame = frame; | 406 tree_statement *s = elt.stmt; |
399 cs[cs.size () - 1].prev = curr_frame; | 407 int l = -1; |
400 | 408 int c = -1; |
401 if (verbose) | 409 if (s) |
402 { | 410 { |
403 tree_statement *s = elt.stmt; | 411 l = s->line (); |
404 int l = -1; | 412 c = s->column (); |
405 int c = -1; | |
406 if (s) | |
407 { | |
408 l = s->line (); | |
409 c = s->column (); | |
410 } | |
411 | |
412 std::ostringstream buf; | |
413 buf << f->name () << ": " << " line " << l | |
414 << ", column " << c << std::endl; | |
415 | |
416 octave_stdout << buf.str (); | |
417 } | 413 } |
418 | 414 |
419 retval = true; | 415 std::ostringstream buf; |
420 break; | 416 buf << f->name () << ": " << " line " << l |
417 << ", column " << c << std::endl; | |
418 | |
419 octave_stdout << buf.str (); | |
421 } | 420 } |
421 | |
422 retval = true; | |
423 break; | |
422 } | 424 } |
423 } | 425 } |
424 | 426 |
425 // There is no need to set scope and context here. That will | 427 // There is no need to set scope and context here. That will |
426 // happen when the dbup/dbdown frame is popped and we jump to | 428 // happen when the dbup/dbdown/keyboard frame is popped and we |
427 // the new "prev" frame set above. | 429 // jump to the new "prev" frame set above. |
428 } | 430 } |
429 | 431 |
430 return retval; | 432 return retval; |
431 } | 433 } |
432 | 434 |