Index: libxml.py =================================================================== RCS file: /cvs/gnome/libxml2/python/libxml.py,v retrieving revision 1.39 diff -u -r1.39 libxml.py --- libxml.py 26 Jun 2006 18:25:39 -0000 1.39 +++ libxml.py 29 Sep 2006 22:31:21 -0000 @@ -552,10 +552,17 @@ return xmlNode(_obj=o) def xpathObjectRet(o): - if type(o) == type([]) or type(o) == type(()): - ret = map(lambda x: nodeWrap(x), o) + otype = type(o) + if otype == type([]): + ret = map(xpathObjectRet, o) return ret - return o + elif otype == type(()): + ret = map(xpathObjectRet, o) + return tuple(ret) + elif otype == type('') or otype == type(0) or otype == type(0.0): + return o + else: + return nodeWrap(o) # # register an XPath function Index: types.c =================================================================== RCS file: /cvs/gnome/libxml2/python/types.c,v retrieving revision 1.21 diff -u -r1.21 types.c --- types.c 18 Jun 2006 17:40:53 -0000 1.21 +++ types.c 29 Sep 2006 22:31:21 -0000 @@ -395,8 +395,106 @@ ret = PyString_FromString((char *) obj->stringval); break; case XPATH_POINT: + { + PyObject *node; + PyObject *indexIntoNode; + PyObject *tuple; + + node = libxml_xmlNodePtrWrap(obj->user); + indexIntoNode = PyInt_FromLong((long) obj->index); + + tuple = PyTuple_New(2); + PyTuple_SetItem(tuple, 0, node); + PyTuple_SetItem(tuple, 1, indexIntoNode); + + ret = tuple; + break; + } case XPATH_RANGE: + { + unsigned short bCollapsedRange; + + bCollapsedRange = ( (obj->user2 == NULL) || + ((obj->user2 == obj->user) && (obj->index == obj->index2)) ); + if ( bCollapsedRange ) { + PyObject *node; + PyObject *indexIntoNode; + PyObject *tuple; + PyObject *list; + + list = PyList_New(1); + + node = libxml_xmlNodePtrWrap(obj->user); + indexIntoNode = PyInt_FromLong((long) obj->index); + + tuple = PyTuple_New(2); + PyTuple_SetItem(tuple, 0, node); + PyTuple_SetItem(tuple, 1, indexIntoNode); + + PyList_SetItem(list, 0, tuple); + + ret = list; + } else { + PyObject *node; + PyObject *indexIntoNode; + PyObject *tuple; + PyObject *list; + + list = PyList_New(2); + + node = libxml_xmlNodePtrWrap(obj->user); + indexIntoNode = PyInt_FromLong((long) obj->index); + + tuple = PyTuple_New(2); + PyTuple_SetItem(tuple, 0, node); + PyTuple_SetItem(tuple, 1, indexIntoNode); + + PyList_SetItem(list, 0, tuple); + + node = libxml_xmlNodePtrWrap(obj->user2); + indexIntoNode = PyInt_FromLong((long) obj->index2); + + tuple = PyTuple_New(2); + PyTuple_SetItem(tuple, 0, node); + PyTuple_SetItem(tuple, 1, indexIntoNode); + + PyList_SetItem(list, 1, tuple); + + ret = list; + } + break; + } case XPATH_LOCATIONSET: + { + xmlLocationSetPtr set; + + set = obj->user; + if ( set && set->locNr > 0 ) { + int i; + PyObject *list; + + list = PyList_New(set->locNr); + + for (i=0; ilocNr; i++) { + xmlXPathObjectPtr setobj; + PyObject *pyobj; + + setobj = set->locTab[i]; /*xmlXPathObjectPtr setobj*/ + + pyobj = libxml_xmlXPathObjectPtrWrap(setobj); + /* xmlXPathFreeObject(setobj) is called */ + set->locTab[i] = NULL; + + PyList_SetItem(list, i, pyobj); + } + set->locNr = 0; + ret = list; + } else { + Py_INCREF(Py_None); + ret = Py_None; + } + break; + } default: #ifdef DEBUG printf("Unable to convert XPath object type %d\n", obj->type); Index: tests/Makefile.am =================================================================== RCS file: /cvs/gnome/libxml2/python/tests/Makefile.am,v retrieving revision 1.43 diff -u -r1.43 Makefile.am --- tests/Makefile.am 26 Jun 2006 18:25:40 -0000 1.43 +++ tests/Makefile.am 29 Sep 2006 22:31:21 -0000 @@ -5,6 +5,7 @@ attribs.py \ tst.py \ tstxpath.py \ + tstxpointer.py \ xpathext.py \ push.py \ pushSAX.py \