WeakRef implementation

Hakan Aras hakan.aras at live.at
Sat Jul 13 15:20:40 UTC 2019


Is this implementation of WeakRef correct? Is it portable? I 
tested it and it seems to work, but I'm not real familiar with 
the runtime or the GC. Also is there any way to convert this into 
a struct instead of class? (Not possible this way due to frame 
pointer for onDispose)



extern (C) void rt_attachDisposeEvent(Object, void 
delegate(Object));
extern (C) void rt_detachDisposeEvent(Object, void 
delegate(Object));

class WeakRef(T) if (is(T == class)) {
	this(T element) {
		address = *cast(size_t*)&element - offset;
		rt_attachDisposeEvent(element, &onDispose);
	}

	private extern (C) void onDispose(Object _) {
		assert(_ is element);
		address = 0 - offset;
	}

	alias element this;

	inout(T) element() inout {
		size_t result = address + offset;
		return *cast(typeof(return)*)&result;
	}

	private static immutable size_t offset = 16_785_407;
	private size_t address;
}

auto weakRef(T)(T element) {
	return new WeakRef!T(element);
}



More information about the Digitalmars-d-learn mailing list