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 |