Class DRb::DRbObject
In: drb/gw.rb
drb/eq.rb
drb/drb.rb
Parent: Object

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.

Methods

Public Class methods

[Source]

# File drb/gw.rb, line 35
    def self._load(s)
      uri, ref = Marshal.load(s)
      if DRb.uri == uri
        return ref ? DRb.to_obj(ref) : DRb.front
      end

      self.new_with(DRb.uri, [:DRbObject, uri, ref])
    end

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.

[Source]

# File drb/drb.rb, line 998
    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.

[Source]

# File drb/drb.rb, line 1036
    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

[Source]

# File drb/drb.rb, line 1012
    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.

[Source]

# File drb/drb.rb, line 1020
    def self.new_with_uri(uri)
      self.new(nil, uri)
    end

[Source]

# File drb/drb.rb, line 1109
    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

[Source]

# File drb/drb.rb, line 1098
    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

[Source]

# File drb/eq.rb, line 5
    def ==(other)
      return false unless DRbObject === other
     (@ref == other.__drbref) && (@uri == other.__drburi)
    end

Get the reference of the object, if local.

[Source]

# File drb/drb.rb, line 1055
    def __drbref
      @ref
    end

Get the URI of the remote object.

[Source]

# File drb/drb.rb, line 1050
    def __drburi 
      @uri
    end

[Source]

# File drb/gw.rb, line 44
    def _dump(lv)
      if DRb.uri == @uri
        if Array === @ref && @ref[0] == :DRbObject
          Marshal.dump([@ref[1], @ref[2]])
        else
          Marshal.dump([@uri, @ref]) # ??
        end
      else
        Marshal.dump([DRb.uri, [:DRbObject, @uri, @ref]])
      end
    end

Marshall this object.

The URI and ref of the object are marshalled.

[Source]

# File drb/drb.rb, line 1027
    def _dump(lv)
      Marshal.dump([@uri, @ref])
    end
eql?(other)

Alias for #==

[Source]

# File drb/eq.rb, line 10
    def hash
      [@uri, @ref].hash
    end

Routes method calls to the referenced object.

[Source]

# File drb/drb.rb, line 1074
    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

[Source]

# File drb/drb.rb, line 1062
    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

[Validate]