[Python-Dev] 2.4.4: backport classobject.c HAVE_WEAKREFS? (original) (raw)

Larry Hastings larry at hastings.org
Fri Oct 20 08:45:31 CEST 2006


Fredrik Lundh wrote:

a dynamic registration approach would be even better, with a single entry point used to register all methods and hooks your C extension has implemented, and code on the other side that builds a properly initialized type descriptor from that set, using fallback functions and error stubs where needed.

I knocked out a prototype of this last week, emailed Mr. Lundh about it, then forgot about it. Would anyone be interested in taking a peek at it?

I only changed one file to use this new-style initialization, sha256module.c. The resulting init_sha256() looks like this:

PyMODINIT_FUNC init_sha256(void) { PyObject *m;

SHA224type = PyType_New("_sha256.sha224", sizeof(SHAobject), NULL);
if (SHA224type == NULL)
    return;

PyType_SetPointer(SHA224type, pte_dealloc, &SHA_dealloc);
PyType_SetPointer(SHA224type, pte_methods, &SHA_methods);
PyType_SetPointer(SHA224type, pte_members, &SHA_members);
PyType_SetPointer(SHA224type, pte_getset, &SHA_getseters);

if (PyType_Ready(SHA224type) < 0)
    return;

SHA256type = PyType_New("_sha256.sha256", sizeof(SHAobject), NULL);
if (SHA256type == NULL)
    return;

PyType_SetPointer(SHA256type, pte_dealloc, &SHA_dealloc);
PyType_SetPointer(SHA256type, pte_methods, &SHA_methods);
PyType_SetPointer(SHA256type, pte_members, &SHA_members);
PyType_SetPointer(SHA256type, pte_getset, &SHA_getseters);

if (PyType_Ready(SHA256type) < 0)
    return;

m = Py_InitModule("_sha256", SHA_functions);
if (m == NULL)
    return;

}

In a way this wasn't really a good showpiece for my code. The "methods", "members", and "getseters" structs still need to be passed in. However, I did change all four "as_" structures so you can set those directly. For instance, the "concat" as_sequence method for a PyString object would be set using PyType_SetPointer(PyString_Type, pte_sequence_concat, string_concat); (I actually converted the PyString object to my new code, but had chicken-and-egg initialization problems as a result and backed out of it. The code is still in the branch, just commented out.)

Patch available for interested parties,

/larry/ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://mail.python.org/pipermail/python-dev/attachments/20061019/531206b1/attachment.htm



More information about the Python-Dev mailing list