Class: IRB::Irb
- Inherits:
-
Object
- Object
- IRB::Irb
- Defined in:
- lib/irb.rb
Instance Attribute Summary collapse
-
#context ⇒ Object
readonly
Returns the current context of this irb session.
-
#scanner ⇒ Object
The lexer used by this irb session.
Instance Method Summary collapse
-
#eval_input ⇒ Object
Evaluates input for this session.
-
#initialize(workspace = nil, input_method = nil, output_method = nil) ⇒ Irb
constructor
Creates a new irb session.
-
#inspect ⇒ Object
Outputs the local variables to this current session, including #signal_status and #context, using IRB::Locale.
-
#output_value ⇒ Object
:nodoc:.
-
#prompt(prompt, ltype, indent, line_no) ⇒ Object
:nodoc:.
-
#signal_handle ⇒ Object
Handler for the signal SIGINT, see Kernel#trap for more information.
-
#signal_status(status) ⇒ Object
Evaluates the given block using the given
status
. -
#suspend_context(context) ⇒ Object
Evaluates the given block using the given
context
as the Context. -
#suspend_input_method(input_method) ⇒ Object
Evaluates the given block using the given
input_method
as the Context#io. -
#suspend_name(path = nil, name = nil) ⇒ Object
Evaluates the given block using the given
path
as the Context#irb_path andname
as the Context#irb_name. -
#suspend_workspace(workspace) ⇒ Object
Evaluates the given block using the given
workspace
as the Context#workspace.
Constructor Details
#initialize(workspace = nil, input_method = nil, output_method = nil) ⇒ Irb
Creates a new irb session
425 426 427 428 429 430 431 432 |
# File 'lib/irb.rb', line 425 def initialize(workspace = nil, input_method = nil, output_method = nil) @context = Context.new(self, workspace, input_method, output_method) @context.main.extend ExtendCommandBundle @signal_status = :IN_IRB @scanner = RubyLex.new @scanner.exception_on_syntax_error = false end |
Instance Attribute Details
#context ⇒ Object (readonly)
Returns the current context of this irb session
434 435 436 |
# File 'lib/irb.rb', line 434 def context @context end |
#scanner ⇒ Object
The lexer used by this irb session
436 437 438 |
# File 'lib/irb.rb', line 436 def scanner @scanner end |
Instance Method Details
#eval_input ⇒ Object
Evaluates input for this session.
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 |
# File 'lib/irb.rb', line 439 def eval_input @scanner.set_prompt do |ltype, indent, continue, line_no| if ltype f = @context.prompt_s elsif continue f = @context.prompt_c elsif indent > 0 f = @context.prompt_n else f = @context.prompt_i end f = "" unless f if @context.prompting? @context.io.prompt = p = prompt(f, ltype, indent, line_no) else @context.io.prompt = p = "" end if @context.auto_indent_mode unless ltype ind = prompt(@context.prompt_i, ltype, indent, line_no)[/.*\z/].size + indent * 2 - p.size ind += 2 if continue @context.io.prompt = p + " " * ind if ind > 0 end end end @scanner.set_input(@context.io) do signal_status(:IN_INPUT) do if l = @context.io.gets print l if @context.verbose? else if @context.ignore_eof? and @context.io.readable_after_eof? l = "\n" if @context.verbose? printf "Use \"exit\" to leave %s\n", @context.ap_name end else print "\n" end end l end end @scanner.each_top_level_statement do |line, line_no| signal_status(:IN_EVAL) do begin line.untaint @context.evaluate(line, line_no) output_value if @context.echo? exc = nil rescue Interrupt => exc rescue SystemExit, SignalException raise rescue Exception => exc end if exc print exc.class, ": ", exc, "\n" if exc.backtrace && exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ && !(SyntaxError === exc) irb_bug = true else irb_bug = false end = [] lasts = [] levels = 0 if exc.backtrace for m in exc.backtrace m = @context.workspace.filter_backtrace(m) unless irb_bug if m if .size < @context.back_trace_limit .push "\tfrom "+m else lasts.push "\tfrom "+m if lasts.size > @context.back_trace_limit lasts.shift levels += 1 end end end end end print .join("\n"), "\n" unless lasts.empty? printf "... %d levels...\n", levels if levels > 0 print lasts.join("\n") end print "Maybe IRB bug!\n" if irb_bug end if $SAFE > 2 abort "Error: irb does not work for $SAFE level higher than 2" end end end end |
#inspect ⇒ Object
Outputs the local variables to this current session, including #signal_status and #context, using IRB::Locale.
666 667 668 669 670 671 672 673 674 675 676 677 678 679 |
# File 'lib/irb.rb', line 666 def inspect ary = [] for iv in instance_variables case (iv = iv.to_s) when "@signal_status" ary.push format("%s=:%s", iv, @signal_status.id2name) when "@context" ary.push format("%s=%s", iv, eval(iv).__to_s__) else ary.push format("%s=%s", iv, eval(iv)) end end format("#<%s: %s>", self.class, ary.join(", ")) end |
#output_value ⇒ Object
:nodoc:
660 661 662 |
# File 'lib/irb.rb', line 660 def output_value # :nodoc: printf @context.return_format, @context.inspect_last_value end |
#prompt(prompt, ltype, indent, line_no) ⇒ Object
:nodoc:
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 |
# File 'lib/irb.rb', line 629 def prompt(prompt, ltype, indent, line_no) # :nodoc: p = prompt.dup p.gsub!(/%([0-9]+)?([a-zA-Z])/) do case $2 when "N" @context.irb_name when "m" @context.main.to_s when "M" @context.main.inspect when "l" ltype when "i" if $1 format("%" + $1 + "d", indent) else indent.to_s end when "n" if $1 format("%" + $1 + "d", line_no) else line_no.to_s end when "%" "%" end end p end |
#signal_handle ⇒ Object
Handler for the signal SIGINT, see Kernel#trap for more information.
595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 |
# File 'lib/irb.rb', line 595 def signal_handle unless @context.ignore_sigint? print "\nabort!\n" if @context.verbose? exit end case @signal_status when :IN_INPUT print "^C\n" raise RubyLex::TerminateLineInput when :IN_EVAL IRB.irb_abort(self) when :IN_LOAD IRB.irb_abort(self, LoadAbort) when :IN_IRB # ignore else # ignore other cases as well end end |
#signal_status(status) ⇒ Object
Evaluates the given block using the given status
.
617 618 619 620 621 622 623 624 625 626 627 |
# File 'lib/irb.rb', line 617 def signal_status(status) return yield if @signal_status == :IN_LOAD signal_status_back = @signal_status @signal_status = status begin yield ensure @signal_status = signal_status_back end end |
#suspend_context(context) ⇒ Object
Evaluates the given block using the given context
as the Context.
585 586 587 588 589 590 591 592 |
# File 'lib/irb.rb', line 585 def suspend_context(context) @context, back_context = context, @context begin yield back_context ensure @context = back_context end end |
#suspend_input_method(input_method) ⇒ Object
Evaluates the given block using the given input_method
as the Context#io.
Used by the irb commands source
and irb_load
, see IRB@IRB+Sessions for more information.
574 575 576 577 578 579 580 581 582 |
# File 'lib/irb.rb', line 574 def suspend_input_method(input_method) back_io = @context.io @context.instance_eval{@io = input_method} begin yield back_io ensure @context.instance_eval{@io = back_io} end end |
#suspend_name(path = nil, name = nil) ⇒ Object
Evaluates the given block using the given path
as the Context#irb_path and name
as the Context#irb_name.
Used by the irb command source
, see IRB@IRB+Sessions for more information.
544 545 546 547 548 549 550 551 552 553 |
# File 'lib/irb.rb', line 544 def suspend_name(path = nil, name = nil) @context.irb_path, back_path = path, @context.irb_path if path @context.irb_name, back_name = name, @context.irb_name if name begin yield back_path, back_name ensure @context.irb_path = back_path if path @context.irb_name = back_name if name end end |
#suspend_workspace(workspace) ⇒ Object
Evaluates the given block using the given workspace
as the Context#workspace.
Used by the irb command irb_load
, see IRB@IRB+Sessions for more information.
560 561 562 563 564 565 566 567 |
# File 'lib/irb.rb', line 560 def suspend_workspace(workspace) @context.workspace, back_workspace = workspace, @context.workspace begin yield back_workspace ensure @context.workspace = back_workspace end end |