class IRB::WorkSpace

def initialize(*main)

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

Creates a new workspace.
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
      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
      @binding = eval("self.class.remove_method(:irb_binding) if defined?(irb_binding); private; def irb_binding; binding; end; irb_binding",
                      TOPLEVEL_BINDING,
                      __FILE__,
                      __LINE__ - 3)
    when 4  # binding is a copy of TOPLEVEL_BINDING (default)
      # Note that this will typically be IRB::TOPLEVEL_BINDING
      # This is to avoid RubyGems' local variables (see issue #17623)
      @binding = TOPLEVEL_BINDING.dup
    end
  end
  if main.empty?
    @main = eval("self", @binding)
  else
    @main = main[0]
  end
  IRB.conf[:__MAIN__] = @main
  unless main.empty?
    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
        fail CantChangeBinding, @main.inspect
      end
    end
  end
  case @main
  when Object
    use_delegator = @main.frozen?
  else
    use_delegator = true
  end
  if use_delegator
    @main = SimpleDelegator.new(@main)
    IRB.conf[:__MAIN__] = @main
    @main.singleton_class.class_eval do
      private
      define_method(:exit) do |*a, &b|
        # Do nothing, will be overridden
      end
      define_method(:binding, Kernel.instance_method(:binding))
      define_method(:local_variables, Kernel.instance_method(:local_variables))
    end
    @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location)
  end
  @binding.local_variable_set(:_, nil)
end