mirror of
https://github.com/mistergibson/gxg-web-client.git
synced 2026-08-15 03:26:00 -07:00
43 lines
1 KiB
Ruby
43 lines
1 KiB
Ruby
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
|