summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-10-30 14:43:03 +0000
committerseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-10-30 14:43:03 +0000
commit6a512ba9a908d5a2ebe6dff79580f056c830031b (patch)
tree9424132087222ce524fc479d1bb6d60067e6bc5f
parent7eb52a8cd5ad6c40d86e6ea532114c9236a407a4 (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
-rw-r--r--lib/drb/drb.rb28
-rw-r--r--lib/drb/invokemethod.rb3
-rw-r--r--lib/drb/unix.rb2
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