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