123456789_123456789_123456789_123456789_123456789_

Class: DRb::DRbServer::InvokeMethod

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/drb/drb.rb

Class Method Summary

Instance Method Summary

Constructor Details

.new(drb_server, client) ⇒ InvokeMethod

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1653

def initialize(drb_server, client)
  @drb_server = drb_server
  @client = client
end

Instance Method Details

#block_yield(x) (private)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1704

def block_yield(x)
  if x.size == 1 && x[0].class == Array
    x[0] = DRbArray.new(x[0])
  end
  @block.call(*x)
end

#check_insecure_method (private)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1695

def check_insecure_method
  @drb_server.check_insecure_method(@obj, @msg_id)
end

#init_with_client (private)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1687

def init_with_client
  obj, msg, argv, block = @client.recv_request
  @obj = obj
  @msg_id = msg.intern
  @argv = argv
  @block = block
end

#perform

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1658

def perform
  begin
    setup_message
  ensure
    @result = nil
    @succ = false
  end

  if @block
    @result = perform_with_block
  else
    @result = perform_without_block
  end
  @succ = true
  case @result
  when Array
    if @msg_id == :to_ary
      @result = DRbArray.new(@result)
    end
  end
  return @succ, @result
rescue NoMemoryError, SystemExit, SystemStackError, SecurityError
  raise
rescue Exception
  @result = $!
  return @succ, @result
end

#perform_with_block (private)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1711

def perform_with_block
  @obj.__send__(@msg_id, *@argv) do |*x|
    jump_error = nil
    begin
      block_value = block_yield(x)
    rescue LocalJumpError
      jump_error = $!
    end
    if jump_error
      case jump_error.reason
      when :break
        break(jump_error.exit_value)
      else
        raise jump_error
      end
    end
    block_value
  end
end

#perform_without_block (private)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1731

def perform_without_block
  if Proc === @obj && @msg_id == :__drb_yield
    if @argv.size == 1
      ary = @argv
    else
      ary = [@argv]
    end
    ary.collect(&@obj)[0]
  else
    @obj.__send__(@msg_id, *@argv)
  end
end

#setup_message (private)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1699

def setup_message
  init_with_client
  check_insecure_method
end