Class: IRB::Irb
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/irb.rb, lib/irb/ext/multi-irb.rb |
Class Method Summary
-
.new(workspace = nil, input_method = nil, output_method = nil) ⇒ Irb
constructor
Creates a new irb session.
Instance Attribute Summary
Instance Method Summary
-
#eval_input
Evaluates input for this session.
-
#inspect
Outputs the local variables to this current session, including #signal_status and #context, using Locale.
-
#signal_handle
Handler for the signal SIGINT, see
Kernel.trap
for more information. -
#signal_status(status)
Evaluates the given block using the given
status
. - #suspend_context(context)
-
#suspend_input_method(input_method)
Evaluates the given block using the given
input_method
as the Context#io. -
#suspend_name(path = nil, name = nil)
Evaluates the given block using the given
path
as the Context#irb_path andname
as the Context#irb_name. -
#suspend_workspace(workspace)
Evaluates the given block using the given
workspace
as the Context#workspace.
Constructor Details
.new(workspace = nil, input_method = nil, output_method = nil) ⇒ Irb
Creates a new irb session
# 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 (readonly)
Returns the current context of this irb session
# File 'lib/irb.rb', line 434
attr_reader :context
#scanner (rw)
The lexer used by this irb session
# File 'lib/irb.rb', line 436
attr_accessor :scanner
Instance Method Details
#eval_input
Evaluates input for this session.
# 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"), "\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
Outputs the local variables to this current session, including #signal_status and #context, using Locale.
# 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
#signal_handle
Handler for the signal SIGINT, see Kernel.trap
for more information.
See additional method definition at file lib/irb.rb line 595.
# File 'lib/irb/ext/multi-irb.rb', line 239
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)
Evaluates the given block using the given status
.
# 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)
[ GitHub ]#suspend_input_method(input_method)
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.
# 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)
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.
# 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)
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.
# 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