PHP 8.2.31
Preview: irb.rb Size: 8.34 KB
/proc/thread-self/root/opt/alt/ruby19/lib64/ruby/1.9.1/irb.rb

#
#   irb.rb - irb main module
#       $Release Version: 0.9.6 $
#       $Revision: 31641 $
#       by Keiju ISHITSUKA(keiju@ruby-lang.org)
#
# --
#
#
#
require "e2mmap"

require "irb/init"
require "irb/context"
require "irb/extend-command"
#require "irb/workspace"

require "irb/ruby-lex"
require "irb/input-method"
require "irb/locale"

STDOUT.sync = true

module IRB
  @RCS_ID='-$Id: irb.rb 31641 2011-05-19 00:07:25Z nobu $-'

  class Abort < Exception;end

  #
  @CONF = {}

  def IRB.conf
    @CONF
  end

  # IRB version method
  def IRB.version
    if v = @CONF[:VERSION] then return v end

    require "irb/version"
    rv = @RELEASE_VERSION.sub(/\.0/, "")
    @CONF[:VERSION] = format("irb %s(%s)", rv, @LAST_UPDATE_DATE)
  end

  def IRB.CurrentContext
    IRB.conf[:MAIN_CONTEXT]
  end

  # initialize IRB and start TOP_LEVEL irb
  def IRB.start(ap_path = nil)
    $0 = File::basename(ap_path, ".rb") if ap_path

    IRB.setup(ap_path)

    if @CONF[:SCRIPT]
      irb = Irb.new(nil, @CONF[:SCRIPT])
    else
      irb = Irb.new
    end

    @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
    @CONF[:MAIN_CONTEXT] = irb.context

    trap("SIGINT") do
      irb.signal_handle
    end

    begin
      catch(:IRB_EXIT) do
        irb.eval_input
      end
    ensure
      irb_at_exit
    end
#    print "\n"
  end

  def IRB.irb_at_exit
    @CONF[:AT_EXIT].each{|hook| hook.call}
  end

  def IRB.irb_exit(irb, ret)
    throw :IRB_EXIT, ret
  end

  def IRB.irb_abort(irb, exception = Abort)
    if defined? Thread
      irb.context.thread.raise exception, "abort then interrupt!"
    else
      raise exception, "abort then interrupt!"
    end
  end

  #
  # irb interpreter main routine
  #
  class Irb
    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
    attr_reader :context
    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
            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_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
            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/ &&
                !(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
          if $SAFE > 2
            abort "Error: irb does not work for $SAFE level higher than 2"
          end
        end
      end
    end

    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

    def suspend_workspace(workspace)
      @context.workspace, back_workspace = workspace, @context.workspace
      begin
        yield back_workspace
      ensure
        @context.workspace = back_workspace
      end
    end

    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

    def suspend_context(context)
      @context, back_context = context, @context
      begin
        yield back_context
      ensure
        @context = back_context
      end
    end

    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

    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

    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
      end
      p
    end

    def output_value
      printf @context.return_format, @context.inspect_last_value
    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
      end
      format("#<%s: %s>", self.class, ary.join(", "))
    end
  end

  # Singleton method
  def @CONF.inspect
    IRB.version unless self[:VERSION]

    array = []
    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)
      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(", "))
      else
        array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
      end
    end
    array.join("\n")
  end
end

Directory Contents

Dirs: 30 × Files: 78

Name Size Perms Modified Actions
cgi DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
date DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
digest DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
dl DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
drb DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
fiddle DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
irb DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
json DIR
- drwxr-xr-x 2024-03-03 22:48:09
Edit Download
matrix DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
net DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
openssl DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
optparse DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
psych DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
racc DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
rake DIR
- drwxr-xr-x 2024-03-03 22:50:37
Edit Download
rbconfig DIR
- drwxr-xr-x 2024-03-03 22:48:12
Edit Download
rdoc DIR
- drwxr-xr-x 2024-03-03 22:48:11
Edit Download
rexml DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
rinda DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
ripper DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
rss DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
rubygems DIR
- drwxr-xr-x 2024-03-03 22:48:12
Edit Download
shell DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
syck DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
test DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
uri DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
webrick DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
- drwxr-xr-x 2024-03-03 22:48:09
Edit Download
xmlrpc DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
yaml DIR
- drwxr-xr-x 2024-03-03 22:48:05
Edit Download
2.57 KB lrw-r--r-- 2011-05-18 21:19:18
Edit Download
2.63 KB lrw-r--r-- 2009-10-02 10:45:39
Edit Download
18.00 KB lrw-r--r-- 2011-06-28 06:09:46
Edit Download
9.30 KB lrw-r--r-- 2011-05-16 21:21:35
Edit Download
7.22 KB lrw-r--r-- 2011-07-30 14:53:14
Edit Download
380 B lrw-r--r-- 2009-08-16 15:34:35
Edit Download
82.66 KB lrw-r--r-- 2011-07-21 21:40:21
Edit Download
946 B lrw-r--r-- 2011-05-21 12:25:03
Edit Download
23.23 KB lrw-r--r-- 2011-06-28 11:45:50
Edit Download
9.74 KB lrw-r--r-- 2011-07-27 19:56:28
Edit Download
2.24 KB lrw-r--r-- 2011-05-16 20:52:55
Edit Download
176 B lrw-r--r-- 2010-06-12 15:28:47
Edit Download
19 B lrw-r--r-- 2009-10-02 10:45:39
Edit Download
3.80 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
5.59 KB lrw-r--r-- 2009-10-02 10:45:39
Edit Download
25.72 KB lrw-r--r-- 2012-12-13 05:24:26
Edit Download
1.33 KB lrw-r--r-- 2011-08-26 23:54:49
Edit Download
928 B lrw-r--r-- 2011-08-16 00:51:58
Edit Download
45.32 KB lrw-r--r-- 2012-02-25 08:11:07
Edit Download
2.03 KB lrw-r--r-- 2011-05-18 21:19:18
Edit Download
7.64 KB lrw-r--r-- 2011-05-22 02:14:57
Edit Download
15.38 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
8.83 KB lrw-r--r-- 2013-10-31 14:40:55
Edit Download
24.92 KB lrw-r--r-- 2013-04-11 02:31:05
Edit Download
8.34 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
1.74 KB lrw-r--r-- 2011-08-30 02:25:32
Edit Download
5.74 KB lrw-r--r-- 2010-12-07 11:47:39
Edit Download
20.85 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
6.52 KB lrw-r--r-- 2011-08-26 23:54:49
Edit Download
47.65 KB lrw-r--r-- 2011-07-09 19:11:06
Edit Download
68.90 KB lrw-r--r-- 2014-02-06 05:20:52
Edit Download
6.94 KB lrw-r--r-- 2011-06-17 22:33:54
Edit Download
1.61 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
5.69 KB lrw-r--r-- 2011-05-16 21:53:12
Edit Download
25.84 KB lrw-r--r-- 2014-02-24 03:43:27
Edit Download
20.64 KB lrw-r--r-- 2011-05-18 21:19:18
Edit Download
547 B lrw-r--r-- 2011-07-25 06:38:44
Edit Download
51.13 KB lrw-r--r-- 2014-02-14 04:52:03
Edit Download
6.49 KB lrw-r--r-- 2012-02-24 14:49:51
Edit Download
14.21 KB lrw-r--r-- 2011-08-26 23:54:49
Edit Download
13.31 KB lrw-r--r-- 2010-08-01 14:09:40
Edit Download
9.63 KB lrw-r--r-- 2011-08-02 15:25:59
Edit Download
13.98 KB lrw-r--r-- 2011-06-01 00:21:46
Edit Download
205 B lrw-r--r-- 2009-10-02 10:45:39
Edit Download
1.59 KB lrw-r--r-- 2009-10-02 10:45:39
Edit Download
15.81 KB lrw-r--r-- 2011-10-10 23:14:17
Edit Download
9.82 KB lrw-r--r-- 2012-08-07 20:50:05
Edit Download
2.02 KB lrw-r--r-- 2011-06-29 03:09:34
Edit Download
308 B lrw-r--r-- 2009-09-24 00:42:23
Edit Download
4.29 KB lrw-r--r-- 2013-02-06 08:00:49
Edit Download
1.74 KB lrw-r--r-- 2010-10-29 22:02:39
Edit Download
59.91 KB lrw-r--r-- 2014-02-14 06:56:54
Edit Download
91 B lrw-r--r-- 2009-10-02 10:45:39
Edit Download
2.84 KB lrw-r--r-- 2011-05-11 10:22:16
Edit Download
34.13 KB lrw-r--r-- 2013-12-22 04:38:28
Edit Download
23.53 KB lrw-r--r-- 2011-05-20 12:22:26
Edit Download
8.46 KB lrw-r--r-- 2012-05-07 11:25:45
Edit Download
29.91 KB lrw-r--r-- 2012-02-10 08:28:48
Edit Download
5.90 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
3.88 KB lrw-r--r-- 2012-02-12 07:51:05
Edit Download
4.02 KB lrw-r--r-- 2011-05-18 14:09:38
Edit Download
23.22 KB lrw-r--r-- 2014-01-30 12:04:22
Edit Download
13.91 KB lrw-r--r-- 2010-07-19 04:54:06
Edit Download
6.87 KB lrw-r--r-- 2011-06-29 03:09:34
Edit Download
10.42 KB lrw-r--r-- 2013-10-31 14:44:40
Edit Download
6.59 KB lrw-r--r-- 2014-02-14 03:48:42
Edit Download
3.38 KB lrw-r--r-- 2011-06-29 03:09:34
Edit Download
17.03 KB lrw-r--r-- 2013-10-31 14:06:50
Edit Download
3.26 KB lrw-r--r-- 2013-04-02 04:09:07
Edit Download
3.72 KB lrw-r--r-- 2011-05-18 21:19:18
Edit Download
6.63 KB lrw-r--r-- 2011-06-29 13:19:59
Edit Download
6.79 KB lrw-r--r-- 2009-03-06 04:23:05
Edit Download
268 B lrw-r--r-- 2009-10-02 10:45:39
Edit Download
8.32 KB lrw-r--r-- 2011-05-19 00:07:25
Edit Download
3.07 KB lrw-r--r-- 2011-05-13 20:03:21
Edit Download
2.29 KB lrw-r--r-- 2011-08-26 23:54:49
Edit Download
6.80 KB lrw-r--r-- 2011-05-10 23:37:43
Edit Download
2.58 KB lrw-r--r-- 2013-05-29 12:00:57
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).