hi,
excuse me for the sourcelistings in this mail - i found it hard to explain
without 'em.
I have found a strange thing with Object#send in a little application I am
writing. I can't really figure out what is wrong. Could be drb related. Here
are the files:
-- the drb server (rbobjgw.rb --
require 'drb'
class RbObjGw
undef :to_s
undef :to_a
undef :respond_to?
undef :gets
undef :getc
attr_accessor :key
def createObj(type, *args)
obj = nil
if args.empty?
p type+".new"
obj = eval(type+".new")
else
cmd = type+".new(*args)"
obj = eval(cmd)
end
@key = type
8.times {|i|
@key = @key + rand(9).to_s
}
$rbGwObjects[@key] = obj
@key
end
def destroyObj
$rbGwObjects.delete(@key)
end
def method_missing(methId, *args, &block)
obj = $rbGwObjects[@key]
if args.empty?
if block.nil?
obj.send(methId)
else
obj.send(methId, &block)
end
else
if block.nil?
obj.send(methId, *args)
else
obj.send(methId, *args, &block)
end
end
end
end
$rbGwObjects = Hash.new
DRb.start_service('druby://localhost:9000', RbObjGw.new)
DRb.thread.join
-- the local client handle object (rbobjhandle.rb) --
class RbObjGwHandle
undef :to_s
undef :to_a
undef :respond_to?
undef :gets
undef :getc
attr_reader :key, :gw
def initialize(key, gw)
@key = key
@gw = gw
end
def method_missing(methId, *args, &block)
print "key: #{@key} - gw: #{@gw} - id: #{methId}\n"
@gw.key = @key
if args.empty?
if block.nil?
@gw.send(methId) # see comments below listings
else
@gw.send(methId, &block)
end
else
if block.nil?
@gw.send(methId, *args)
else
@gw.send(methId, *args, &block)
end
end
end
end
-- a small test --
require 'drb'
require 'rbobjgwhandle'
DRb.start_service
factory = DRbObject.new(nil, 'druby://localhost:9000')
io = RbObjGwHandle.new(factory.createObj("File", "/etc/passwd", "r"), factory)
s = io.gets
print "io: #{s}\n"
io.close
io.destroyObj
--------------------
some methods defined in Kernel seems to not correctly propagate via
method_missing. With the File class i have found that gets is such a method.
If i undef it in the drb object i am fine though which seems correct. But when
gets is sent to the drb object it isn't propagated via method_missing for some
reason.
in the RbObjGwHandle#method_missing method where I placed the comment gets
just hangs. that is @gw.send(:gets) hangs, but if i change this to @gw.gets i
am alright. anyone have an explanation for this?
(please CC me since I am not on this list)
--
-----------------------------------------------------------.
Patrik Sundberg email: ps / raditex.se || ps / radiac.mine.nu |
Phone: +46 13 178567 || +46 707 602240 |
.---> UNIX consultant |
|-----> Applied Physics and Electrical Engineering student |
`----------------------------------------------------------'