From: Petr P. <pa...@us...> - 2003-03-20 13:25:51
|
Update of /cvsroot/perl-xml/XML-LibXML-XPathContext In directory sc8-pr-cvs1:/tmp/cvs-serv11152 Modified Files: XPathContext.xs Log Message: store context data in a _XPathContextData struct Index: XPathContext.xs =================================================================== RCS file: /cvsroot/perl-xml/XML-LibXML-XPathContext/XPathContext.xs,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- XPathContext.xs 20 Mar 2003 10:15:59 -0000 1.11 +++ XPathContext.xs 20 Mar 2003 13:25:19 -0000 1.12 @@ -33,6 +33,17 @@ croak("%s",SvPV(LibXML_error, len)); \ } +struct _XPathContextData { + SV* node; + int lock; + HV* pool; +}; +typedef struct _XPathContextData XPathContextData; +typedef XPathContextData* XPathContextDataPtr; + +#define XPathContextDATA(ctxt) ((XPathContextDataPtr) ctxt->user) + + /* **************************************************************** * Error handler * **************************************************************** */ @@ -429,7 +440,7 @@ static void LibXML_configure_xpathcontext( xmlXPathContextPtr ctxt ) { - xmlNodePtr node = PmmSvNode(ctxt->user); + xmlNodePtr node = PmmSvNode(XPathContextDATA(ctxt)->node); ctxt->doc = node->doc; ctxt->node = node; @@ -447,8 +458,13 @@ xmlXPathContextPtr ctxt; CODE: ctxt = xmlXPathNewContext( NULL ); - ctxt->user = pnode; - SvREFCNT_inc(pnode); + New(0, ctxt->user, sizeof(XPathContextData), XPathContextData); + if (ctxt->user == NULL) { + croak("XPathContext: failed to allocate proxy object"); + } + XPathContextDATA(ctxt)->node = SvREFCNT_inc(pnode); + XPathContextDATA(ctxt)->lock = 0; + XPathContextDATA(ctxt)->pool = NULL; xmlXPathRegisterFunc(ctxt, (const xmlChar *) "document", @@ -469,8 +485,14 @@ CODE: xs_warn( "DESTROY XPATH CONTEXT" ); if (ctxt) { - if (ctxt->user) { - SvREFCNT_dec(ctxt->user); + if (XPathContextDATA(ctxt) != NULL) { + if (XPathContextDATA(ctxt)->node != NULL) { + SvREFCNT_dec(XPathContextDATA(ctxt)->node); + } + if (XPathContextDATA(ctxt)->pool != NULL) { + SvREFCNT_dec(XPathContextDATA(ctxt)->pool); + } + Safefree(XPathContextDATA(ctxt)); } if (ctxt->namespaces != NULL) { @@ -519,10 +541,10 @@ croak( "missing xpath context" ); } PPCODE: - if (ctxt->user) { - SvREFCNT_dec(ctxt->user); + if (XPathContextDATA(ctxt)->node) { + SvREFCNT_dec(XPathContextDATA(ctxt)->node); } - ctxt->user = pnode; + XPathContextDATA(ctxt)->node = pnode; SvREFCNT_inc(pnode); void |