diff options
author | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-30 14:43:03 +0000 |
---|---|---|
committer | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-30 14:43:03 +0000 |
commit | 6a512ba9a908d5a2ebe6dff79580f056c830031b (patch) | |
tree | 9424132087222ce524fc479d1bb6d60067e6bc5f /lib/drb | |
parent | 7eb52a8cd5ad6c40d86e6ea532114c9236a407a4 (diff) |
add DRbArray, and change yield. [ruby-dev:21773]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/drb')
-rw-r--r-- | lib/drb/drb.rb | 28 | ||||
-rw-r--r-- | lib/drb/invokemethod.rb | 3 | ||||
-rw-r--r-- | lib/drb/unix.rb | 2 |
3 files changed, 33 insertions, 0 deletions
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 |