summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-12-11 12:12:17 +0000
committerseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-12-11 12:12:17 +0000
commita402acbbb6e366a21554e8e9f74b05c4a4116621 (patch)
treefb4ea8ee097a0d71329508ecee93ea28f524d879 /lib
parentd4b0bf031d38e6af65f3055601f7a10ce150d5b6 (diff)
add DRbRemoteError. [ruby-list:40348], [ruby-list:40390]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7535 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/drb/drb.rb26
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb
index eb2d0d1459..ace46b29aa 100644
--- a/lib/drb/drb.rb
+++ b/lib/drb/drb.rb
@@ -430,6 +430,15 @@ module DRb
end
end
+ class DRbRemoteError < DRbError
+ def initialize(error)
+ @reason = error.class.to_s
+ super("#{error.message} (#{error.class})")
+ set_backtrace(error.backtrace)
+ end
+ attr_reader :reason
+ end
+
# Class wrapping a marshalled object whose type is unknown locally.
#
# If an object is returned by a method invoked over drb, but the
@@ -539,12 +548,12 @@ module DRb
@argc_limit = config[:argc_limit]
end
- def dump(obj) # :nodoc:
- obj = DRbObject.new(obj) if obj.kind_of? DRbUndumped
+ def dump(obj, error=false) # :nodoc:
+ obj = make_proxy(obj, error) if obj.kind_of? DRbUndumped
begin
str = Marshal::dump(obj)
rescue
- str = Marshal::dump(DRbObject.new(obj))
+ str = Marshal::dump(make_proxy(obj, error))
end
[str.size].pack('N') + str
end
@@ -602,7 +611,7 @@ module DRb
end
def send_reply(stream, succ, result) # :nodoc:
- stream.write(dump(succ) + dump(result))
+ stream.write(dump(succ) + dump(result, !succ))
rescue
raise(DRbConnError, $!.message, $!.backtrace)
end
@@ -612,6 +621,15 @@ module DRb
result = load(stream)
[succ, result]
end
+
+ private
+ def make_proxy(obj, error=false)
+ if error
+ DRbRemoteError.new(obj)
+ else
+ DRbObject.new(obj)
+ end
+ end
end
# Module managing the underlying network protocol(s) used by drb.