|
From: Petr P. <pa...@us...> - 2003-03-16 18:21:48
|
Update of /cvsroot/perl-xml/XML-LibXML-XPathContext
In directory sc8-pr-cvs1:/tmp/cvs-serv15614
Modified Files:
XPathContext.xs
Log Message:
allow unblessed ARRAY refs as nodelists
Index: XPathContext.xs
===================================================================
RCS file: /cvsroot/perl-xml/XML-LibXML-XPathContext/XPathContext.xs,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- XPathContext.xs 16 Mar 2003 16:21:29 -0000 1.5
+++ XPathContext.xs 16 Mar 2003 18:21:42 -0000 1.6
@@ -116,30 +116,32 @@
goto FINISH;
}
/* convert perl result structures to LibXML structures */
- if (sv_isobject(perl_result) &&
- (SvTYPE(SvRV(perl_result)) == SVt_PVMG ||
- SvTYPE(SvRV(perl_result)) == SVt_PVAV))
+ if (SvROK(perl_result) &&
+ SvTYPE(SvRV(perl_result)) == SVt_PVAV) {
+ /* consider any array ref to be a nodelist */
+ int i = 0;
+ int len;
+ SV * pnode;
+
+ /* warn("result is a node list\n"); */
+ ret = (xmlXPathObjectPtr) xmlXPathNewNodeSet((xmlNodePtr) NULL);
+ array_result = (AV*)SvRV(perl_result);
+ len = av_len(array_result);
+ for( i; i <= len ; i++ ) {
+ pnode = *(av_fetch(array_result,i,0));
+ if (sv_isobject(pnode) &&
+ sv_derived_from(pnode,"XML::LibXML::Node")) {
+ xmlXPathNodeSetAdd(ret->nodesetval,
+ (xmlNodePtr)PmmSvNode(pnode));
+ } else {
+ warn("XPathContext: ignoring non-node member of a nodelist");
+ }
+ }
+ goto FINISH;
+ } else if (sv_isobject(perl_result) &&
+ (SvTYPE(SvRV(perl_result)) == SVt_PVMG))
{
- if (sv_isa(perl_result, "XML::LibXML::NodeList")) {
- int i = 0;
- int len;
- /* warn("result is a node list\n"); */
- ret = (xmlXPathObjectPtr) xmlXPathNewNodeSet((xmlNodePtr) NULL);
- array_result = (AV*)SvRV(perl_result);
- len = av_len(array_result);
- for( i; i <= len ; i++ ) {
- tmp_node = (xmlNodePtr)PmmSvNode(*(av_fetch(array_result,i,0)));
- xmlXPathNodeSetAdd(ret->nodesetval, tmp_node);
- }
- goto FINISH;
- }
- else if (sv_isa(perl_result, "XML::LibXML::Node") ||
- sv_isa(perl_result, "XML::LibXML::Element") ||
- sv_isa(perl_result, "XML::LibXML::Attr") ||
- sv_isa(perl_result, "XML::LibXML::Text") ||
- sv_isa(perl_result, "XML::LibXML::Comment") ||
- sv_isa(perl_result, "XML::LibXML::Document") ||
- sv_isa(perl_result, "XML::LibXML::PI")) {
+ if (sv_derived_from(perl_result, "XML::LibXML::Node")) {
/* warn("result is a node\n"); */
ret = (xmlXPathObjectPtr)xmlXPathNewNodeSet(NULL);
tmp_node = (xmlNodePtr)PmmSvNode(perl_result);
@@ -245,7 +247,7 @@
switch (obj->type) {
case XPATH_XSLT_TREE: /* PP: what's this? */
warn("%d's argument to %s is XPATH_XSLT_TREE",i,function);
- xslt_tree = 1; /* PP: these are destroyed (they have boolval=1) */
+ xslt_tree = 1; /* PP: these get destroyed (they have boolval=1) */
case XPATH_NODESET:
nodelist = obj->nodesetval;
if ( nodelist ) {
@@ -333,29 +335,31 @@
}
/* convert perl result structures to LibXML structures */
- if (sv_isobject(perl_result) &&
- (SvTYPE(SvRV(perl_result)) == SVt_PVMG ||
- SvTYPE(SvRV(perl_result)) == SVt_PVAV))
+ if (SvROK(perl_result) &&
+ SvTYPE(SvRV(perl_result)) == SVt_PVAV) {
+ /* consider any array ref to be a nodelist */
+ i = 0;
+ SV * pnode;
+
+ /* warn("result is a node list\n"); */
+ ret = (xmlXPathObjectPtr) xmlXPathNewNodeSet((xmlNodePtr) NULL);
+ array_result = (AV*)SvRV(perl_result);
+ len = av_len(array_result);
+ for( i; i <= len ; i++ ) {
+ pnode = *(av_fetch(array_result,i,0));
+ if (sv_isobject(pnode) &&
+ sv_derived_from(pnode,"XML::LibXML::Node")) {
+ xmlXPathNodeSetAdd(ret->nodesetval,
+ (xmlNodePtr)PmmSvNode(pnode));
+ } else {
+ warn("XPathContext: ignoring non-node member of a nodelist");
+ }
+ }
+ goto FINISH;
+ } else if (sv_isobject(perl_result) &&
+ (SvTYPE(SvRV(perl_result)) == SVt_PVMG))
{
- if (sv_isa(perl_result, "XML::LibXML::NodeList")) {
- i = 0;
- /* warn("result is a node list\n"); */
- ret = (xmlXPathObjectPtr)xmlXPathNewNodeSet(NULL);
- array_result = (AV*)SvRV(perl_result);
- len = av_len(array_result);
- for( i; i <= len ; i++ ) {
- tmp_node = (xmlNodePtr)PmmSvNode(*(av_fetch(array_result,i,0)));
- xmlXPathNodeSetAdd(ret->nodesetval, tmp_node);
- }
- goto FINISH;
- }
- else if (sv_isa(perl_result, "XML::LibXML::Node") ||
- sv_isa(perl_result, "XML::LibXML::Element") ||
- sv_isa(perl_result, "XML::LibXML::Attr") ||
- sv_isa(perl_result, "XML::LibXML::Text") ||
- sv_isa(perl_result, "XML::LibXML::Comment") ||
- sv_isa(perl_result, "XML::LibXML::Document") ||
- sv_isa(perl_result, "XML::LibXML::PI")) {
+ if (sv_derived_from(perl_result, "XML::LibXML::Node")) {
/* warn("result is a node\n"); */
ret = (xmlXPathObjectPtr)xmlXPathNewNodeSet(NULL);
tmp_node = (xmlNodePtr)PmmSvNode(perl_result);
@@ -410,15 +414,10 @@
}
FINISH:
- fprintf(stderr,"NODE: value push\n");
valuePush(ctxt, ret);
- fprintf(stderr,"NODE: putback\n");
PUTBACK;
- fprintf(stderr,"NODE: freetmps\n");
FREETMPS;
- fprintf(stderr,"NODE: leave\n");
LEAVE;
- fprintf(stderr,"NODE: left\n");
}
MODULE = XML::LibXML::XPathContext PACKAGE = XML::LibXML::XPathContext
|