From: Petr P. <pa...@us...> - 2003-04-02 14:07:13
|
Update of /cvsroot/perl-xml/XML-LibXML-XPathContext In directory sc8-pr-cvs1:/tmp/cvs-serv10387 Modified Files: XPathContext.xs Log Message: - changed #include "xpathInternals.h" to #include <libxml/xpathInternals.h> - allow XML::LibXML::XPathContext->new() without a node or document Index: XPathContext.xs =================================================================== RCS file: /cvsroot/perl-xml/XML-LibXML-XPathContext/XPathContext.xs,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- XPathContext.xs 29 Mar 2003 15:43:54 -0000 1.26 +++ XPathContext.xs 2 Apr 2003 14:07:08 -0000 1.27 @@ -12,12 +12,12 @@ /* libxml2 stuff */ #include <libxml/xpath.h> +#include <libxml/xpathInternals.h> /* XML::LibXML stuff */ #include "perl-libxml-mm.h" #include "xpath.h" -#include "xpathInternals.h" #ifdef __cplusplus } @@ -418,7 +418,11 @@ LibXML_configure_xpathcontext( xmlXPathContextPtr ctxt ) { xmlNodePtr node = PmmSvNode(XPathContextDATA(ctxt)->node); - ctxt->doc = node->doc; + if (node != NULL) { + ctxt->doc = node->doc; + } else { + ctxt->doc = NULL; + } ctxt->node = node; LibXML_configure_namespaces(ctxt); @@ -429,18 +433,25 @@ PROTOTYPES: DISABLE SV* -new( CLASS, pnode ) +new( CLASS, ... ) const char * CLASS - SV * pnode + PREINIT: + SV * pnode = &PL_sv_undef; INIT: xmlXPathContextPtr ctxt; - CODE: + CODE: + if( items > 1 ) + pnode = ST(1); + ctxt = xmlXPathNewContext( NULL ); New(0, ctxt->user, sizeof(XPathContextData), XPathContextData); if (ctxt->user == NULL) { croak("XPathContext: failed to allocate proxy object"); } - XPathContextDATA(ctxt)->node = SvREFCNT_inc(pnode); + + if (SvOK(pnode)) { + XPathContextDATA(ctxt)->node = SvREFCNT_inc(pnode); + } XPathContextDATA(ctxt)->lock = 0; XPathContextDATA(ctxt)->pool = NULL; @@ -464,10 +475,12 @@ xs_warn( "DESTROY XPATH CONTEXT" ); if (ctxt) { if (XPathContextDATA(ctxt) != NULL) { - if (XPathContextDATA(ctxt)->node != NULL) { + if (XPathContextDATA(ctxt)->node != NULL && + SvOK(XPathContextDATA(ctxt)->node)) { SvREFCNT_dec(XPathContextDATA(ctxt)->node); } - if (XPathContextDATA(ctxt)->pool != NULL) { + if (XPathContextDATA(ctxt)->pool != NULL && + SvOK(XPathContextDATA(ctxt)->pool)) { SvREFCNT_dec((SV *)XPathContextDATA(ctxt)->pool); } Safefree(XPathContextDATA(ctxt)); @@ -503,7 +516,7 @@ PmmOWNERPO( PmmPROXYNODE(ctxt->node))); } else { - croak("XPathContext: lost context node"); + /* croak("XPathContext: lost context node"); */ RETVAL = &PL_sv_undef; } OUTPUT: @@ -519,11 +532,13 @@ croak("XPathContext: missing xpath context"); } PPCODE: - if (XPathContextDATA(ctxt)->node) { + if (XPathContextDATA(ctxt)->node && SvOK(XPathContextDATA(ctxt)->node)) { SvREFCNT_dec(XPathContextDATA(ctxt)->node); } XPathContextDATA(ctxt)->node = pnode; - SvREFCNT_inc(pnode); + if (SvOK(pnode)) { + SvREFCNT_inc(pnode); + } void registerNs( pxpath_context, prefix, ns_uri ) |