Object wrapping a reference to a remote drb object.
Method calls on this object are relayed to the remote object that this object is a stub for.
Unmarshall a marshalled DRbObject.
If the referenced object is located within the local server, then the object itself is returned. Otherwise, a new DRbObject is created to act as a stub for the remote referenced object.
# File drb/drb.rb, line 1021
def self._load(s)
uri, ref = Marshal.load(s)
if DRb.here?(uri)
obj = DRb.to_obj(ref)
if ((! obj.tainted?) && Thread.current[:drb_untaint])
Thread.current[:drb_untaint].push(obj)
end
return obj
end
self.new_with(uri, ref)
end
Create a new remote object stub.
obj is the (local) object we want to create a stub for.
Normally this is nil. uri is the URI of the
remote object that this will be a stub for.
# File drb/drb.rb, line 1062
def initialize(obj, uri=nil)
@uri = nil
@ref = nil
if obj.nil?
return if uri.nil?
@uri, option = DRbProtocol.uri_option(uri, DRb.config)
@ref = DRbURIOption.new(option) unless option.nil?
else
@uri = uri ? uri : (DRb.uri rescue nil)
@ref = obj ? DRb.to_id(obj) : nil
end
end
Creates a DRb::DRbObject given the reference
information to the remote host uri and object
ref.
# File drb/drb.rb, line 1038
def self.new_with(uri, ref)
it = self.allocate
it.instance_variable_set(:@uri, uri)
it.instance_variable_set(:@ref, ref)
it
end
Create a new DRbObject from a URI alone.
# File drb/drb.rb, line 1046
def self.new_with_uri(uri)
self.new(nil, uri)
end
Get the reference of the object, if local.
# File drb/drb.rb, line 1081
def __drbref
@ref
end
Get the URI of the remote object.
# File drb/drb.rb, line 1076
def __drburi
@uri
end
Marshall this object.
The URI and ref of the object are marshalled.
# File drb/drb.rb, line 1053
def _dump(lv)
Marshal.dump([@uri, @ref])
end
Routes method calls to the referenced remote object.
# File drb/drb.rb, line 1101
def method_missing(msg_id, *a, &b)
if DRb.here?(@uri)
obj = DRb.to_obj(@ref)
DRb.current_server.check_insecure_method(obj, msg_id)
return obj.__send__(msg_id, *a, &b)
end
succ, result = self.class.with_friend(@uri) do
DRbConn.open(@uri) do |conn|
conn.send_message(self, msg_id, a, b)
end
end
if succ
return result
elsif DRbUnknown === result
raise result
else
bt = self.class.prepare_backtrace(@uri, result)
result.set_backtrace(bt + caller)
raise result
end
end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please see Improve the docs, or visit Documenting-ruby.org.