Amaury Forgeot d'Arc, 18.02.2012 10:08:
> I made some modifications to pypy, cython and lxml,
> and now I can compile and install cython, lxml, and they seem to work!
>
> For example::
> html = etree.Element("html")
> body = etree.SubElement(html, "body")
> body.text = "TEXT"
> br = etree.SubElement(body, "br")
> br.tail = "TAIL"
> html.xpath("//text()")
>
> Here are the changes I made, some parts are really hacks and should be
> polished:
> lxml: http://paste.pocoo.org/show/552903/
I attached a reworked but untested patch for lxml. Could you try it?
I couldn't find the PyWeakref_LockObject() function anywhere. That's a
PyPy-only thing, right? I aliased it to (NULL) when compiling for CPython.
I'll go through the Cython changes next, so I haven't got a working Cython
version yet.
Stefan
# HG changeset patch
# Parent 9b80192c1ed232ec7f01bd4b4e4b2563e6d1e922
initial patch for PyPy support
diff -r 9b80192c1ed2 -r 4e41ae7d7dc9 src/lxml/etree_defs.h
--- a/src/lxml/etree_defs.h Sat Feb 18 12:43:03 2012 +0100
+++ b/src/lxml/etree_defs.h Sat Feb 18 13:30:55 2012 +0100
@@ -27,6 +27,22 @@
# endif
#endif
+#ifdef PYPY_VERSION
+# define IS_PYPY 1
+#else
+# define IS_PYPY 0
+#endif
+
+#if PY_VERSION_HEX >= 0x03000000
+# define IS_PYTHON3 1
+#else
+# define IS_PYTHON3 0
+#endif
+
+#if !IS_PYPY
+define PyWeakref_LockObject(obj) (NULL)
+#endif
+
/* Python 3 doesn't have PyFile_*(), PyString_*(), ... */
#if PY_VERSION_HEX >= 0x03000000
# define PyFile_AsFile(o) (NULL)
@@ -36,6 +52,9 @@
# define PyString_GET_SIZE(s) PyBytes_GET_SIZE(s)
# define PyString_AS_STRING(s) PyBytes_AS_STRING(s)
#else
+#if IS_PYPY
+# define PyFile_AsFile(o) (NULL)
+#endif
#if PY_VERSION_HEX < 0x02060000
# define PyBytes_CheckExact(o) PyString_CheckExact(o)
# define PyBytes_Check(o) PyString_Check(o)
@@ -48,12 +67,6 @@
#endif
#endif
-#if PY_VERSION_HEX >= 0x03000000
-# define IS_PYTHON3 1
-#else
-# define IS_PYTHON3 0
-#endif
-
#ifdef WITHOUT_THREADING
# define PyEval_SaveThread() (NULL)
# define PyEval_RestoreThread(state)
diff -r 9b80192c1ed2 -r 4e41ae7d7dc9 src/lxml/proxy.pxi
--- a/src/lxml/proxy.pxi Sat Feb 18 12:43:03 2012 +0100
+++ b/src/lxml/proxy.pxi Sat Feb 18 13:30:55 2012 +0100
@@ -9,7 +9,10 @@
"""
#print "getProxy for:", <int>c_node
if c_node is not NULL and c_node._private is not NULL:
- return <_Element>c_node._private
+ if python.IS_PYPY:
+ return <_Element>python.PyWeakref_LockObject(<python.PyObject*>c_node._private)
+ else:
+ return <_Element>c_node._private
else:
return None
@@ -24,7 +27,10 @@
assert c_node._private is NULL, u"double registering proxy!"
proxy._doc = doc
proxy._c_node = c_node
- c_node._private = <void*>proxy
+ if python.IS_PYPY:
+ c_node._private = <void*>python.PyWeakref_NewRef(proxy, NULL)
+ else:
+ c_node._private = <void*>proxy
# additional INCREF to make sure _Document is GC-ed LAST!
proxy._gc_doc = <python.PyObject*>doc
python.Py_INCREF(doc)
@@ -34,7 +40,10 @@
"""
cdef xmlNode* c_node
c_node = proxy._c_node
- assert c_node._private is <void*>proxy, u"Tried to unregister unknown proxy"
+ if python.IS_PYPY:
+ python.Py_XDECREF(<python.PyObject*>c_node._private)
+ else:
+ assert c_node._private is <void*>proxy, u"Tried to unregister unknown proxy"
c_node._private = NULL
return 0
@@ -49,7 +58,11 @@
iff it was replaced (None otherwise).
"""
cdef _Document old_doc
- cdef _Element element = <_Element>c_node._private
+ cdef _Element element
+ if python.IS_PYPY:
+ element = <_Element>python.PyWeakref_LockObject(<python.PyObject*>c_node._private)
+ else:
+ element = <_Element>c_node._private
if element._doc is not doc:
old_doc = element._doc
element._doc = doc
diff -r 9b80192c1ed2 -r 4e41ae7d7dc9 src/lxml/python.pxd
--- a/src/lxml/python.pxd Sat Feb 18 12:43:03 2012 +0100
+++ b/src/lxml/python.pxd Sat Feb 18 13:30:55 2012 +0100
@@ -81,8 +81,8 @@
cdef object PyObject_RichCompare(object o1, object o2, int op)
cdef int PyObject_RichCompareBool(object o1, object o2, int op)
-# object PyWeakref_NewRef(object ob, PyObject* callback)
-# PyObject* PyWeakref_GET_OBJECT(object ref)
+ PyObject* PyWeakref_NewRef(object ob, PyObject* callback) # used for PyPy only
+ object PyWeakref_LockObject(PyObject* ob) # PyPy only
cdef void* PyMem_Malloc(size_t size)
cdef void* PyMem_Realloc(void* p, size_t size)
@@ -129,3 +129,4 @@
cdef char* _fqtypename(object t)
cdef object PY_NEW(object t)
cdef bint IS_PYTHON3
+ cdef bint IS_PYPY
_______________________________________________
pypy-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-dev