>> The difference is that the PySet_Next returns pointers to the table keys and >> that the mutation occurs AFTER the call to PySet_Next, leaving pointers to >> invalid addresses. IOW, the function cannot detect the mutation. > > I'm coming late to the discussion: where did anybody ever suggest that > PySet_Next should return a pointer into the set? Looking over the entire > discussion, I could not find any mentioning of a specific API.
Pardon, I bungled the terminology. PySet_Next returns a borrowed reference. That is problematic is arbitrary Python code can be run afterwards (such as PyObject_Hash in the example). We could make a version that returns a new reference or immediately Py_INCREF the reference but then PySet_Next() loses its charm and you might as well be using PyIter_Next(). Aside from bad pointers, the issue of mid-stream table mutation has other reliability issues stemming from the contents of the table potentially changing in the an arbitrary way as the iteration proceeds. That means you can make very few guarantees about the meaningfulness of the results even if you don't crash due to a bad pointer. We have a perfectly good way to iterate with PyIter_Next(). It may take a couple of extra lines, but it is easy to get correct and has no surprises. It seems that the only issue is that Barry says that he refuses to use the iterator protocol. Heck, just turn it into a list and index directly. There is no need to muck-up the set api for this. Raymond _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com