class DRb::DRbObject
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.
Public Class Methods
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 lib/drb/drb.rb, line 1051 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 lib/drb/drb.rb, line 1092 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 lib/drb/drb.rb, line 1068 def self.new_with(uri, ref) it = self.allocate it.instance_variable_set(:@uri, uri) it.instance_variable_set(:@ref, ref) it end
Public Instance Methods
Get the reference of the object, if local.
# File lib/drb/drb.rb, line 1111 def __drbref @ref end
Get the URI
of the remote object.
# File lib/drb/drb.rb, line 1106 def __drburi @uri end
Marshall this object.
The URI
and ref of the object are marshalled.
# File lib/drb/drb.rb, line 1083 def _dump(lv) Marshal.dump([@uri, @ref]) end
Routes method calls to the referenced remote object.
# File lib/drb/drb.rb, line 1131 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
Routes respond_to? to the referenced remote object.
# File lib/drb/drb.rb, line 1119 def respond_to?(msg_id, priv=false) case msg_id when :_dump true when :marshal_dump false else method_missing(:respond_to?, msg_id, priv) end end