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)
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