On 9/29/07, Joseph Maurer email@example.com wrote:
I'm glad to hear it isn't a matter of whether it was useful or not.
The way I implemented this feature in Slick-C is with indirection. In Python terms, this means that a separate data structure that isn't reference counted holds the method/function object data. The method/function object is changed to just contain a pointer to it. The data structure which holds all method/function data should probably be a non-reference counted dictionary. When a function is deleted, it's name remains in the dictionary but the entry needs to be changed to indicate that it is "null/invalid". When a deleted function is called, an exception should be raised. Adding a function/method means replacing the data in the dictionary. This type of implementation is simple. There's an insignificant amount of overhead on a function/method call (i.e. instead of "func->data" you have "func=*pfunc;if ( func->isInvalid() ) throw exception; else func->data" ).
Technically this algorithm leaks memory since deleted functions/methods are never removed. My response is who cares. When the interpreter cleanup everything function is called, you simple deallocate everything in the hash table.
Does anyone know what level of effort would be needed for something like this? Is my proposed implementation a good one for Python?
You may want to take a look at a relevant Cookbook recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/160164