I've committed a new update to Pyd. It does three things of note:
First, it fixes a horrible bug in how Pyd keeps class references. Whenever a class instance is returned to Python, Pyd keeps a reference to that instance in an AA. In fact, Pyd has a number of these AAs: One dedicated to class instances, and one more for each other type which may be passed to Python. (For instance, delegates, which may hold a reference to GC-controlled data.)
There is an internal Pyd function for replacing what D object a wrapping Python object points to. This function also takes care of tracking this reference keeping, adding and removing references when needed. It is a template function, called
void WrapPyObject_SetObj(T)(PyObject* self, T t).
This function is called whenever you instantiate a Python type which wraps a D class, and when that Python type is deallocated. In the deallocation function, it was called like this:
By setting the reference in the Python class to
WrapPyObject_SetObj will clear the old reference to the object from the AA, without setting a new one. Or, at least, it's supposed to. Can you spot the error?
For the answer, see changeset 113. It was a real "oh, shit" moment when I saw what was going on, I tell you what. (Hint: What's the type of
The second thing this update does is improve Pyd's handling of arrays. It can now convert any iterable Python object to a dynamic array, as long as each element of the iterable can be converted to the value type of the array.
Finally, I've added a
Repr struct template, which allows you to specify a member function to use as the Python type's
__repr__ overload. I debated for a while having Pyd automatically wrap a
toString overload, but
toString doesn't have quite the same meaning as
__repr__ does. The
Repr struct allows you to explicitly use
toString if it makes sense.