Class: DRb::DRbUnknown

Inherits:
Object
  • Object
show all
Defined in:
lib/drb/drb.rb

Overview

Class wrapping a marshalled object whose type is unknown locally.

If an object is returned by a method invoked over drb, but the class of the object is unknown in the client namespace, or the object is a constant unknown in the client namespace, then the still-marshalled object is returned wrapped in a DRbUnknown instance.

If this object is passed as an argument to a method invoked over drb, then the wrapped object is passed instead.

The class or constant name of the object can be read from the name attribute. The marshalled object is held in the buf attribute.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(err, buf) ⇒ DRbUnknown

Create a new DRbUnknown object.

buf is a string containing a marshalled object that could not be unmarshalled. err is the error message that was raised when the unmarshalling failed. It is used to determine the name of the unmarshalled object.



493
494
495
496
497
498
499
500
501
502
503
# File 'lib/drb/drb.rb', line 493

def initialize(err, buf)
  case err.to_s
  when /uninitialized constant (\S+)/
    @name = $1
  when /undefined class\/module (\S+)/
    @name = $1
  else
    @name = nil
  end
  @buf = buf
end

Instance Attribute Details

#bufObject (readonly)

Buffer contained the marshalled, unknown object.



512
513
514
# File 'lib/drb/drb.rb', line 512

def buf
  @buf
end

#nameObject (readonly)

The name of the unknown thing.

Class name for unknown objects; variable name for unknown constants.



509
510
511
# File 'lib/drb/drb.rb', line 509

def name
  @name
end

Class Method Details

._load(s) ⇒ Object

:nodoc:



514
515
516
517
518
519
520
# File 'lib/drb/drb.rb', line 514

def self._load(s) # :nodoc:
  begin
    Marshal::load(s)
  rescue NameError, ArgumentError
    DRbUnknown.new($!, s)
  end
end

Instance Method Details

#_dump(lv) ⇒ Object

:nodoc:



522
523
524
# File 'lib/drb/drb.rb', line 522

def _dump(lv) # :nodoc:
  @buf
end

#exceptionObject

Create a DRbUnknownError exception containing this object.



536
537
538
# File 'lib/drb/drb.rb', line 536

def exception
  DRbUnknownError.new(self)
end

#reloadObject

Attempt to load the wrapped marshalled object again.

If the class of the object is now known locally, the object will be unmarshalled and returned. Otherwise, a new but identical DRbUnknown object will be returned.



531
532
533
# File 'lib/drb/drb.rb', line 531

def reload
  self.class._load(@buf)
end