|
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
|