[pypy-svn] pypy fast-forward: Fix ExternalEntityRefHandler in pyexpat

amauryfa commits-noreply at bitbucket.org
Thu Jan 13 19:48:39 CET 2011


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: fast-forward
Changeset: r40649:e808f67d6fca
Date: 2011-01-13 19:02 +0100
http://bitbucket.org/pypy/pypy/changeset/e808f67d6fca/

Log:	Fix ExternalEntityRefHandler in pyexpat

diff --git a/pypy/module/pyexpat/interp_pyexpat.py b/pypy/module/pyexpat/interp_pyexpat.py
--- a/pypy/module/pyexpat/interp_pyexpat.py
+++ b/pypy/module/pyexpat/interp_pyexpat.py
@@ -194,13 +194,19 @@
         pre_code = 'parser.flush_character_buffer(space)'
 
     if name == 'ExternalEntityRefHandler':
+        first_arg = 'll_parser'
+        first_lltype = XML_Parser
+        ll_id = 'XML_GetUserData(ll_parser)'
         post_code = 'if space.is_w(w_result, space.w_None): return 0'
     else:
+        first_arg = 'll_userdata'
+        first_lltype = rffi.VOIDP
+        ll_id = 'll_userdata'
         post_code = ''
 
     src = py.code.Source("""
-    def %(name)s_callback(ll_userdata, %(args)s):
-        id = rffi.cast(lltype.Signed, ll_userdata)
+    def %(name)s_callback(%(first_arg)s, %(args)s):
+        id = rffi.cast(lltype.Signed, %(ll_id)s)
         userdata = global_storage.get_object(id)
         space = userdata.space
         parser = userdata.parser
@@ -226,7 +232,7 @@
 
     c_name = 'XML_Set' + name
     callback_type = lltype.Ptr(lltype.FuncType(
-        [rffi.VOIDP] + real_params, result_type))
+        [first_lltype] + real_params, result_type))
     func = expat_external(c_name,
                           [XML_Parser, callback_type], lltype.Void)
     SETTERS[name] = (index, func, callback)
@@ -267,6 +273,9 @@
     'XML_ParserFree', [XML_Parser], lltype.Void)
 XML_SetUserData = expat_external(
     'XML_SetUserData', [XML_Parser, rffi.VOIDP], lltype.Void)
+def XML_GetUserData(parser):
+    # XXX is this always true?
+    return rffi.cast(rffi.VOIDPP, parser)[0]
 XML_Parse = expat_external(
     'XML_Parse', [XML_Parser, rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT)
 XML_StopParser = expat_external(

diff --git a/pypy/module/pyexpat/test/test_parser.py b/pypy/module/pyexpat/test/test_parser.py
--- a/pypy/module/pyexpat/test/test_parser.py
+++ b/pypy/module/pyexpat/test/test_parser.py
@@ -84,3 +84,17 @@
         p.StartElementHandler = f
         exc = raises(UnicodeDecodeError, p.Parse, xml)
         assert exc.value.start == 4
+
+    def test_external_entity(self):
+        xml = ('<!DOCTYPE doc [\n'
+               '  <!ENTITY test SYSTEM "whatever">\n'
+               ']>\n'
+               '<doc>&test;</doc>')
+        import pyexpat
+        p = pyexpat.ParserCreate()
+        def handler(*args):
+            # context, base, systemId, publicId
+            assert args == ('test', None, 'whatever', None)
+            return True
+        p.ExternalEntityRefHandler = handler
+        p.Parse(xml)


More information about the Pypy-commit mailing list