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") | ||