Class: DRb::DRbObject
- Inherits:
-
Object
- Object
- DRb::DRbObject
- Defined in:
- lib/drb/drb.rb,
lib/drb/gw.rb,
lib/drb/eq.rb
Overview
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.
Class Method Summary collapse
-
._load(s) ⇒ Object
Unmarshall a marshalled DRbObject.
- .new_with(uri, ref) ⇒ Object
-
.new_with_uri(uri) ⇒ Object
Create a new DRbObject from a URI alone.
- .prepare_backtrace(uri, result) ⇒ Object
- .with_friend(uri) ⇒ Object
Instance Method Summary collapse
- #==(other) ⇒ Object (also: #eql?)
-
#__drbref ⇒ Object
Get the reference of the object, if local.
-
#__drburi ⇒ Object
Get the URI of the remote object.
-
#_dump(lv) ⇒ Object
Marshall this object.
- #hash ⇒ Object
-
#initialize(obj, uri = nil) ⇒ DRbObject
constructor
Create a new remote object stub.
-
#method_missing(msg_id, *a, &b) ⇒ Object
Routes method calls to the referenced object.
-
#pretty_print(q) ⇒ Object
:nodoc:.
-
#pretty_print_cycle(q) ⇒ Object
:nodoc:.
- #respond_to?(msg_id, priv = false) ⇒ Boolean
Constructor Details
#initialize(obj, uri = nil) ⇒ DRbObject
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.
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 |
# File 'lib/drb/drb.rb', line 1039 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 |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(msg_id, *a, &b) ⇒ Object
Routes method calls to the referenced object.
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 |
# File 'lib/drb/drb.rb', line 1077 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.(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 |
Class Method Details
._load(s) ⇒ Object
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.
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 |
# File 'lib/drb/drb.rb', line 1001 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_with(uri, ref) ⇒ Object
1015 1016 1017 1018 1019 1020 |
# File 'lib/drb/drb.rb', line 1015 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) ⇒ Object
Create a new DRbObject from a URI alone.
1023 1024 1025 |
# File 'lib/drb/drb.rb', line 1023 def self.new_with_uri(uri) self.new(nil, uri) end |
.prepare_backtrace(uri, result) ⇒ Object
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 |
# File 'lib/drb/drb.rb', line 1112 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) ⇒ Object
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 |
# File 'lib/drb/drb.rb', line 1101 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 |
Instance Method Details
#==(other) ⇒ Object Also known as: eql?
5 6 7 8 |
# File 'lib/drb/eq.rb', line 5 def ==(other) return false unless DRbObject === other (@ref == other.__drbref) && (@uri == other.__drburi) end |
#__drbref ⇒ Object
Get the reference of the object, if local.
1058 1059 1060 |
# File 'lib/drb/drb.rb', line 1058 def __drbref @ref end |
#__drburi ⇒ Object
Get the URI of the remote object.
1053 1054 1055 |
# File 'lib/drb/drb.rb', line 1053 def __drburi @uri end |
#_dump(lv) ⇒ Object
Marshall this object.
The URI and ref of the object are marshalled.
1030 1031 1032 |
# File 'lib/drb/drb.rb', line 1030 def _dump(lv) Marshal.dump([@uri, @ref]) end |
#hash ⇒ Object
10 11 12 |
# File 'lib/drb/eq.rb', line 10 def hash [@uri, @ref].hash end |
#pretty_print(q) ⇒ Object
:nodoc:
1126 1127 1128 |
# File 'lib/drb/drb.rb', line 1126 def pretty_print(q) # :nodoc: q.pp_object(self) end |
#pretty_print_cycle(q) ⇒ Object
:nodoc:
1130 1131 1132 1133 1134 1135 |
# File 'lib/drb/drb.rb', line 1130 def pretty_print_cycle(q) # :nodoc: q.object_address_group(self) { q.breakable q.text '...' } end |
#respond_to?(msg_id, priv = false) ⇒ Boolean
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 |
# File 'lib/drb/drb.rb', line 1065 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 |