class DRb::DRbServer::InvokeMethod

:nodoc:

def block_yield(x)

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

def check_insecure_method

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

def init_with_client

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

def initialize(drb_server, client)

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

def perform

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

def perform_with_block

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

def perform_without_block

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

def setup_message

def setup_message
  init_with_client
  check_insecure_method
end