core/weakref.rb
class WeakRef < BasicObject
class RefError < ::RuntimeError; end
def self.new(obj)
Rubinius.primitive :weakref_new
::Kernel.raise PrimitiveFailure, "WeakRef.new primitive failed"
end
def __setobj__(obj)
Rubinius.primitive :weakref_set_object
::Kernel.raise PrimitiveFailure, "WeakRef#__setobj__ primitive failed"
end
def __object__
Rubinius.primitive :weakref_object
::Kernel.raise PrimitiveFailure, "WeakRef#__object__ primitive failed"
end
def __getobj__
obj = __object__()
::Kernel.raise RefError, "Object has been collected as garbage" unless obj
return obj
end
def weakref_alive?
!!__object__
end
def method_missing(method, *args, &block)
target = __getobj__
if target.respond_to?(method)
target.__send__(method, *args, &block)
else
super(method, *args, &block)
end
end
def respond_to_missing?(method, include_private)
target = __getobj__
target.respond_to?(method, include_private) and
(!include_private || target.respond_to?(method, false))
end
end