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 | 43d56fe9ce51096a2c40b826f6473a8f5fd9e953 (patch) | |
| tree | 9424132087222ce524fc479d1bb6d60067e6bc5f /lib | |
| parent | d62f675f4991e49c386b6694615512541b312371 (diff) | |
| download | ruby-43d56fe9ce51096a2c40b826f6473a8f5fd9e953.tar.gz ruby-43d56fe9ce51096a2c40b826f6473a8f5fd9e953.tar.xz ruby-43d56fe9ce51096a2c40b826f6473a8f5fd9e953.zip | |
add DRbArray, and change yield. [ruby-dev:21773]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@4872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
| -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 2ff76e3f7..fda18401d 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 6d6c9562c..412b2ab9b 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 e92a7a88c..f51e39080 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 |
