In Files

  • drb/drb.rb
  • drb/eq.rb
  • drb/gw.rb

Object::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

_load(s) click to toggle source

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 1003
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
            
new(obj, uri=nil) click to toggle source

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 1041
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
            
new_with(uri, ref) click to toggle source
 
               # File drb/drb.rb, line 1017
def self.new_with(uri, ref)
  it = self.allocate
  it.instance_variable_set('@uri', uri)
  it.instance_variable_set('@ref', ref)
  it
end
            
new_with_uri(uri) click to toggle source

Create a new DRbObject from a URI alone.

 
               # File drb/drb.rb, line 1025
def self.new_with_uri(uri)
  self.new(nil, uri)
end
            
prepare_backtrace(uri, result) click to toggle source
 
               # File drb/drb.rb, line 1114
def self.prepare_backtrace(uri, result)
  prefix = "(#{uri}) "
  bt = []
  result.backtrace.each do |x|
    break if /`__send__'$/ =~ x 
    if /^\(druby:\/\// =~ x
      bt.push(x)
    else
      bt.push(prefix + x)
    end
  end
  bt
end
            
with_friend(uri) click to toggle source
 
               # File drb/drb.rb, line 1103
def self.with_friend(uri)
  friend = DRb.fetch_server(uri)
  return yield() unless friend
  
  save = Thread.current['DRb']
  Thread.current['DRb'] = { 'server' => friend }
  return yield
ensure
  Thread.current['DRb'] = save if friend
end
            

Public Instance Methods

==(other) click to toggle source
 
               # File drb/eq.rb, line 5
def ==(other)
  return false unless DRbObject === other
 (@ref == other.__drbref) && (@uri == other.__drburi)
end
            
Also aliased as: eql?
__drbref() click to toggle source

Get the reference of the object, if local.

 
               # File drb/drb.rb, line 1060
def __drbref
  @ref
end
            
__drburi() click to toggle source

Get the URI of the remote object.

 
               # File drb/drb.rb, line 1055
def __drburi 
  @uri
end
            
_dump(lv) click to toggle source

Marshall this object.

The URI and ref of the object are marshalled.

 
               # File drb/drb.rb, line 1032
def _dump(lv)
  Marshal.dump([@uri, @ref])
end
            
eql?(other) click to toggle source
Alias for: ==
hash() click to toggle source
 
               # File drb/eq.rb, line 10
def hash
  [@uri, @ref].hash
end
            
method_missing(msg_id, *a, &b) click to toggle source

Routes method calls to the referenced object.

 
               # File drb/drb.rb, line 1079
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
            
respond_to?(msg_id, priv=false) click to toggle source
 
               # File drb/drb.rb, line 1067
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