[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