123456789_123456789_123456789_123456789_123456789_

Class: IRB::WorkSpace

Relationships & Source Files
Inherits: Object
Defined in: lib/irb/workspace.rb,
lib/irb/ext/tracer.rb

Class Method Summary

Instance Attribute Summary

  • #binding readonly Internal use only

    The Binding of this workspace.

  • #main readonly Internal use only

    The top-level workspace of this context, also available as IRB.conf[:__MAIN__].

Instance Method Summary

Constructor Details

.new(*main) ⇒ WorkSpace

This method is for internal use only.

Creates a new workspace.

set self to main if specified, otherwise inherit main from TOPLEVEL_BINDING.

[ GitHub ]

  
# File 'lib/irb/workspace.rb', line 18

def initialize(*main)
  if main[0].kind_of?(Binding)
    @binding = main.shift
  elsif IRB.conf[:SINGLE_IRB]
    @binding = TOPLEVEL_BINDING
  else
    case IRB.conf[:CONTEXT_MODE]
    when 0	# binding in proc on TOPLEVEL_BINDING
      @binding = eval("proc{binding}.call",
                      TOPLEVEL_BINDING,
                      __FILE__,
                      __LINE__)
    when 1	# binding in loaded file
      require "tempfile"
      f = Tempfile.open("irb-binding")
      f.print <<EOF
  $binding = binding
EOF
      f.close
      load f.path
      @binding = $binding

    when 2	# binding in loaded file(thread use)
      unless defined? BINDING_QUEUE
        IRB.const_set(:BINDING_QUEUE, Thread::SizedQueue.new(1))
        Thread.abort_on_exception = true
        Thread.start do
          eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
        end
        Thread.pass
      end
      @binding = BINDING_QUEUE.pop

    when 3	# binding in function on TOPLEVEL_BINDING(default)
      @binding = eval("def irb_binding; private; binding; end; irb_binding",
                      TOPLEVEL_BINDING,
                      __FILE__,
                      __LINE__ - 3)
    end
  end
  if main.empty?
    @main = eval("self", @binding)
  else
    @main = main[0]
    IRB.conf[:__MAIN__] = @main
    case @main
    when Module
      @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
    else
      begin
        @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
      rescue TypeError
        IRB.fail CantChangeBinding, @main.inspect
      end
    end
  end
  eval("_=nil", @binding)
end

Instance Attribute Details

#binding (readonly)

This method is for internal use only.

The Binding of this workspace

[ GitHub ]

  
# File 'lib/irb/workspace.rb', line 78

attr_reader :binding

#main (readonly)

This method is for internal use only.

The top-level workspace of this context, also available as IRB.conf[:__MAIN__]

[ GitHub ]

  
# File 'lib/irb/workspace.rb', line 81

attr_reader :main

Instance Method Details

#__evaluate__(context, statements, file = __FILE__, line = __LINE__)

Alias for #evaluate.

[ GitHub ]

  
# File 'lib/irb/ext/tracer.rb', line 51

alias __evaluate__ evaluate

#code_around_binding

This method is for internal use only.
[ GitHub ]

  
# File 'lib/irb/workspace.rb', line 110

def code_around_binding
  file, pos = @binding.eval('[__FILE__, __LINE__]')

  unless defined?(::SCRIPT_LINES__[file]) && lines = ::SCRIPT_LINES__[file]
    begin
      lines = File.readlines(file)
    rescue SystemCallError
      return
    end
  end
  pos -= 1

  start_pos = [pos - 5, 0].max
  end_pos   = [pos + 5, lines.size - 1].min

  fmt = " %2s %#{end_pos.to_s.length}d: %s"
  body = (start_pos..end_pos).map do |current_pos|
    sprintf(fmt, pos == current_pos ? '=>' : '', current_pos + 1, lines[current_pos])
  end.join("")
  "\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}\n"
end

#evaluate(context, statements, file = nil, line = nil) Also known as: #__evaluate__

This method is for internal use only.

Evaluate the context of this workspace and use the Tracer library to output the exact lines of code are being executed in chronological order.

See lib/tracer.rb for more information.

See additional method definition at file lib/irb/workspace.rb line 84.

[ GitHub ]

  
# File 'lib/irb/ext/tracer.rb', line 56

def evaluate(context, statements, file = __FILE__, line = __LINE__)
  eval(statements, @binding, file, line)
end

#filter_backtrace(bt)

This method is for internal use only.

error message manipulator

[ GitHub ]

  
# File 'lib/irb/workspace.rb', line 89

def filter_backtrace(bt)
  case IRB.conf[:CONTEXT_MODE]
  when 0
    return nil if bt =~ /\(irb_local_binding\)/
  when 1
    if(bt =~ %r!/tmp/irb-binding! or
        bt =~ %r!irb/.*\.rb! or
        bt =~ /irb\.rb/)
      return nil
    end
  when 2
    return nil if bt =~ /irb\/.*\.rb/
    return nil if bt =~ /irb\.rb/
  when 3
    return nil if bt =~ /irb\/.*\.rb/
    return nil if bt =~ /irb\.rb/
    bt = bt.sub(/:\s*in `irb_binding'/, '')
  end
  bt
end