[Python-Dev] Sharing expat instances
Fredrik Lundh
fredrik at pythonware.com
Tue Dec 13 17:22:18 CET 2005
Martin v. Löwis wrote:
> > - sort out expat bundling issues, and include cElementTree as well
> > (using the same approach as above).
...
> > (one way to do this would be to add an "function pointer table" to pyexpat
> > that contains pointers to selected portions of the expat API, and then add
> > an indirection level to cElementTree)
>
> Ok, this sounds like a larger piece of work.
here's a plan:
1. add an Include/pyexpat.h header file which contains a structure
similar to the following:
#define PyExpat_DISPATCH_MAGIC "... some magic string ..."
struct PyExpat_Dispatch {
int size; /* size of this structure */
int MAJOR_VERSION;
int MINOR_VERSION;
int MICRO_VERSION;
... (*ErrorString)(...)
... (*GetErrorColumnNumber)(...)
... (*GetErrorLineNumber)(...)
... (*Parse)(...)
... (*ParserCreate_MM)(...)
... (*ParserFree)(...)
... (*SetCharacterDataHandler)(...)
... (*SetCommentHandler)(...)
... (*SetDefaultHandlerExpand)(...)
... (*SetElementHandler)(...)
... (*SetNamespaceDeclHandler)(...)
... (*SetProcessingInstructionHandler)(...)
... (*SetUserData)(...)
/* add new stuff to the end */
}
(this is the minimal stuff used by today's cElementTree; it can of course
be extended to cover a larger part of the current expat API)
2. during pyexpat initialization, initialize all members of this structure, and
make it available as a PyCObject:
static PyExpat_Dispatch dispatch;
dispatch.size = sizeof(dispatch):
dispatch.MAJOR_VERSION = XML_MAJOR_VERSION;
...
obj = PyCObject_FromVoidPtrAndDesc(
&dispatch, PyExpat_DISPATCH_MAGIC, NULL
);
... stuff object into module dictionary ...
3. in cElementTree (or _elementtree, or whatever the python version will
be named), import pyexpat, fetch the object, and verify
- that the PyExpat_DISPATCH_MAGIC matches
- that the size field is at least as large as sizeof(struct PyExpat_Dispatch)
- that the version number matches (at least MAJOR and MINOR; I'm not
sure under what circumstances they change the MICRO number)
4. in cElementTree (...), do all expat calls via the dispatch table.
comments ?
</F>
More information about the Python-Dev
mailing list