[Christian Tismer] > > I would like to create types with overridable methods. > > This is supported by the new type system. > > > > But I'd also like to make this as fast as possible and > > therefore to avoid extra dictionary lookups for methods, > > especially if they are most likely not overridden. > > > > This would mean to create an extra meta type which creates > > types with a couple of extra slots, for caching overridden > > methods. > > > > My problem is now that type objects are already variable > > sized and cannot support slots in the metatype. > > Is there a workaround on the boilerplate, or is there > > interest in a solution? > > Any suggestion how to implement it? [David Abrahams] > I believe this is roughly the same thing I was bugging Guido about > just before Python-dev. I wanted types which acted like new-style > classes, but with room for an 'C' int to store some extra > information -- namely, whether there were multiple 'C' extension > classes being used as bases. IIRC the verdict was, "you can't do > that today, but there should be a way to do it". Also if I remember > anything about my hasty analysis at the time, the biggest challenge > would be getting code which accesses types to rely on their > tp_basicsize in order to find the beginning of the variable stuff. Yes, we need a solution for this, but I still haven't figured out how to do it. Help (best in the form of a suggested strategy) would be appreciated. >From Christian's post I can't tell if he wants his types to be dynamic or static (i.e. if he's creating an arbitrary number of them at run-time or only a fixed number that's known at compile-time). Here's a hack. For static extensions, you could extend one of the extension structs, e.g. PyMappingMethods (which is the smallest and also least likely to grow new methods), with additional fields. Then you'd have to know whether you can access those extra fields; I suggest checking for the metatype. A few casts and you're done. For dynamic extensions, you might be able to do the same: after type_new() has given you an object, allocate memory for an extended PyMappingMethods struct, copy the existing PyMappingMethods struct into it (if it exists), and replace the pointer. Then in your deallocation function, make sure to free the pointer. Hope this helps in the short run. --Guido van Rossum (home page: http://www.python.org/~guido/)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4