mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
add DRbRemoteError. [ruby-list:40348], [ruby-list:40390]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7534 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2807bd47af
commit
a651b0c9cc
4 changed files with 48 additions and 4 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue