Feature #4764 ยป 0001-Fix-whitespace-for-lib-irb.rb.patch
| lib/irb.rb | ||
|---|---|---|
|
#
|
||
|
# irb.rb - irb main module
|
||
|
# $Release Version: 0.9.6 $
|
||
|
# $Revision$
|
||
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
||
|
# $Release Version: 0.9.6 $
|
||
|
# $Revision$
|
||
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
||
|
#
|
||
|
# --
|
||
|
#
|
||
| ... | ... | |
|
begin
|
||
|
catch(:IRB_EXIT) do
|
||
|
irb.eval_input
|
||
|
irb.eval_input
|
||
|
end
|
||
|
ensure
|
||
|
irb_at_exit
|
||
| ... | ... | |
|
attr_accessor :scanner
|
||
|
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
|
||
|
@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
|
||
|
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_atfer_eof?
|
||
|
l = "\n"
|
||
|
if @context.verbose?
|
||
|
printf "Use \"exit\" to leave %s\n", @context.ap_name
|
||
|
end
|
||
|
else
|
||
|
print "\n"
|
||
|
end
|
||
|
end
|
||
|
l
|
||
|
end
|
||
|
signal_status(:IN_INPUT) do
|
||
|
if l = @context.io.gets
|
||
|
print l if @context.verbose?
|
||
|
else
|
||
|
if @context.ignore_eof? and @context.io.readable_atfer_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
|
||
|
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[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
|
||
|
@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[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
|
||
|
!(SyntaxError === exc)
|
||
|
irb_bug = true
|
||
|
else
|
||
|
irb_bug = false
|
||
|
end
|
||
|
messages = []
|
||
|
lasts = []
|
||
|
levels = 0
|
||
|
for m in exc.backtrace
|
||
|
m = @context.workspace.filter_backtrace(m) unless irb_bug
|
||
|
if m
|
||
|
if messages.size < @context.back_trace_limit
|
||
|
messages.push "\tfrom "+m
|
||
|
else
|
||
|
lasts.push "\tfrom "+m
|
||
|
if lasts.size > @context.back_trace_limit
|
||
|
lasts.shift
|
||
|
levels += 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
print messages.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
|
||
|
irb_bug = true
|
||
|
else
|
||
|
irb_bug = false
|
||
|
end
|
||
|
messages = []
|
||
|
lasts = []
|
||
|
levels = 0
|
||
|
for m in exc.backtrace
|
||
|
m = @context.workspace.filter_backtrace(m) unless irb_bug
|
||
|
if m
|
||
|
if messages.size < @context.back_trace_limit
|
||
|
messages.push "\tfrom "+m
|
||
|
else
|
||
|
lasts.push "\tfrom "+m
|
||
|
if lasts.size > @context.back_trace_limit
|
||
|
lasts.shift
|
||
|
levels += 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
print messages.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
|
||
|
end
|
||
| ... | ... | |
|
@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
|
||
|
yield back_path, back_name
|
||
|
ensure
|
||
|
@context.irb_path = back_path if path
|
||
|
@context.irb_name = back_name if name
|
||
|
@context.irb_path = back_path if path
|
||
|
@context.irb_name = back_name if name
|
||
|
end
|
||
|
end
|
||
|
def suspend_workspace(workspace)
|
||
|
@context.workspace, back_workspace = workspace, @context.workspace
|
||
|
begin
|
||
|
yield back_workspace
|
||
|
yield back_workspace
|
||
|
ensure
|
||
|
@context.workspace = back_workspace
|
||
|
@context.workspace = back_workspace
|
||
|
end
|
||
|
end
|
||
| ... | ... | |
|
back_io = @context.io
|
||
|
@context.instance_eval{@io = input_method}
|
||
|
begin
|
||
|
yield back_io
|
||
|
yield back_io
|
||
|
ensure
|
||
|
@context.instance_eval{@io = back_io}
|
||
|
@context.instance_eval{@io = back_io}
|
||
|
end
|
||
|
end
|
||
|
def suspend_context(context)
|
||
|
@context, back_context = context, @context
|
||
|
begin
|
||
|
yield back_context
|
||
|
yield back_context
|
||
|
ensure
|
||
|
@context = back_context
|
||
|
@context = back_context
|
||
|
end
|
||
|
end
|
||
|
def signal_handle
|
||
|
unless @context.ignore_sigint?
|
||
|
print "\nabort!\n" if @context.verbose?
|
||
|
exit
|
||
|
print "\nabort!\n" if @context.verbose?
|
||
|
exit
|
||
|
end
|
||
|
case @signal_status
|
||
|
when :IN_INPUT
|
||
|
print "^C\n"
|
||
|
raise RubyLex::TerminateLineInput
|
||
|
print "^C\n"
|
||
|
raise RubyLex::TerminateLineInput
|
||
|
when :IN_EVAL
|
||
|
IRB.irb_abort(self)
|
||
|
IRB.irb_abort(self)
|
||
|
when :IN_LOAD
|
||
|
IRB.irb_abort(self, LoadAbort)
|
||
|
IRB.irb_abort(self, LoadAbort)
|
||
|
when :IN_IRB
|
||
|
# ignore
|
||
|
# ignore
|
||
|
else
|
||
|
# ignore other cases as well
|
||
|
# ignore other cases as well
|
||
|
end
|
||
|
end
|
||
| ... | ... | |
|
signal_status_back = @signal_status
|
||
|
@signal_status = status
|
||
|
begin
|
||
|
yield
|
||
|
yield
|
||
|
ensure
|
||
|
@signal_status = signal_status_back
|
||
|
@signal_status = signal_status_back
|
||
|
end
|
||
|
end
|
||
|
def prompt(prompt, ltype, indent, line_no)
|
||
|
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
|
||
|
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
|
||
| ... | ... | |
|
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
|
||
|
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
|
||
| ... | ... | |
|
for k, v in sort{|a1, a2| a1[0].id2name <=> a2[0].id2name}
|
||
|
case k
|
||
|
when :MAIN_CONTEXT, :__TMP__EHV__
|
||
|
array.push format("CONF[:%s]=...myself...", k.id2name)
|
||
|
array.push format("CONF[:%s]=...myself...", k.id2name)
|
||
|
when :PROMPT
|
||
|
s = v.collect{
|
||
|
|kk, vv|
|
||
|
ss = vv.collect{|kkk, vvv| ":#{kkk.id2name}=>#{vvv.inspect}"}
|
||
|
format(":%s=>{%s}", kk.id2name, ss.join(", "))
|
||
|
}
|
||
|
array.push format("CONF[:%s]={%s}", k.id2name, s.join(", "))
|
||
|
s = v.collect{
|
||
|
|kk, vv|
|
||
|
ss = vv.collect{|kkk, vvv| ":#{kkk.id2name}=>#{vvv.inspect}"}
|
||
|
format(":%s=>{%s}", kk.id2name, ss.join(", "))
|
||
|
}
|
||
|
array.push format("CONF[:%s]={%s}", k.id2name, s.join(", "))
|
||
|
else
|
||
|
array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
|
||
|
array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
|
||
|
end
|
||
|
end
|
||
|
array.join("\n")
|
||