diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb index 2ff76e3f7b..fda18401dd 100644 --- a/lib/drb/drb.rb +++ b/lib/drb/drb.rb @@ -498,6 +498,31 @@ module DRb end end + class DRbArray + def initialize(ary) + @ary = ary.collect { |obj| + if obj.kind_of? DRbUndumped + DRbObject.new(obj) + else + begin + Marshal.dump(obj) + obj + rescue + DRbObject.new(obj) + end + end + } + end + + def self._load(s) + Marshal::load(s) + end + + def _dump(lv) + Marshal.dump(@ary) + end + end + # Handler for sending and receiving drb messages. # # This takes care of the low-level marshalling and unmarshalling @@ -1344,6 +1369,9 @@ module DRb @result = perform_without_block end @succ = true + if @msg_id == :to_ary && @result.class == Array + @result = DRbArray.new(@result) + end return @succ, @result rescue StandardError, ScriptError, Interrupt @result = $! diff --git a/lib/drb/invokemethod.rb b/lib/drb/invokemethod.rb index 6d6c9562c3..412b2ab9b5 100644 --- a/lib/drb/invokemethod.rb +++ b/lib/drb/invokemethod.rb @@ -4,6 +4,9 @@ module DRb class DRbServer module InvokeMethod18Mixin def block_yield(x) + if x.size == 1 && x[0].class == Array + x[0] = DRbArray.new(x[0]) + end block_value = @block.call(*x) end diff --git a/lib/drb/unix.rb b/lib/drb/unix.rb index e92a7a88ca..f51e390808 100644 --- a/lib/drb/unix.rb +++ b/lib/drb/unix.rb @@ -2,6 +2,8 @@ require 'socket' require 'drb/drb' require 'tmpdir' +raise(LoadError, "UNIXServer is required") unless defined?(UNIXServer) + module DRb class DRbUNIXSocket < DRbTCPSocket