[pypy-svn] pypy default: (kleptog) Implement PyString_AsEncodedObject
amauryfa
commits-noreply at bitbucket.org
Sun Feb 27 23:39:06 CET 2011
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r42327:f8db2ce04d45
Date: 2011-02-27 23:38 +0100
http://bitbucket.org/pypy/pypy/changeset/f8db2ce04d45/
Log: (kleptog) Implement PyString_AsEncodedObject
diff --git a/pypy/module/cpyext/stringobject.py b/pypy/module/cpyext/stringobject.py
--- a/pypy/module/cpyext/stringobject.py
+++ b/pypy/module/cpyext/stringobject.py
@@ -244,3 +244,22 @@
object with the same value."""
s = rffi.charp2str(string)
return space.new_interned_str(s)
+
+ at cpython_api([PyObject, rffi.CCHARP, rffi.CCHARP], PyObject)
+def PyString_AsEncodedObject(space, w_str, encoding, errors):
+ """Encode a string object using the codec registered for encoding and return
+ the result as Python object. encoding and errors have the same meaning as
+ the parameters of the same name in the string encode() method. The codec to
+ be used is looked up using the Python codec registry. Return NULL if an
+ exception was raised by the codec.
+
+ This function is not available in 3.x and does not have a PyBytes alias."""
+ if not PyString_Check(space, w_str):
+ PyErr_BadArgument(space)
+
+ w_encoding = w_errors = space.w_None
+ if encoding:
+ w_encoding = space.wrap(rffi.charp2str(encoding))
+ if errors:
+ w_errors = space.wrap(rffi.charp2str(errors))
+ return space.call_method(w_str, 'encode', w_encoding, w_errors)
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -2287,17 +2287,6 @@
changes in your code for properly supporting 64-bit systems."""
raise NotImplementedError
- at cpython_api([PyObject, rffi.CCHARP, rffi.CCHARP], PyObject)
-def PyString_AsEncodedObject(space, str, encoding, errors):
- """Encode a string object using the codec registered for encoding and return the
- result as Python object. encoding and errors have the same meaning as the
- parameters of the same name in the string encode() method. The codec to be
- used is looked up using the Python codec registry. Return NULL if an exception
- was raised by the codec.
-
- This function is not available in 3.x and does not have a PyBytes alias."""
- raise NotImplementedError
-
@cpython_api([FILE, rffi.CCHARP], rffi.INT_real, error=CANNOT_FAIL)
def Py_FdIsInteractive(space, fp, filename):
"""Return true (nonzero) if the standard I/O file fp with name filename is
diff --git a/pypy/module/cpyext/test/test_stringobject.py b/pypy/module/cpyext/test/test_stringobject.py
--- a/pypy/module/cpyext/test/test_stringobject.py
+++ b/pypy/module/cpyext/test/test_stringobject.py
@@ -253,3 +253,29 @@
w_s2 = api.PyString_InternFromString(buf)
rffi.free_charp(buf)
assert w_s1 is w_s2
+
+ def test_AsEncodedObject(self, space, api):
+ ptr = space.wrap('abc')
+
+ errors = rffi.str2charp("strict")
+
+ encoding = rffi.str2charp("hex")
+ res = api.PyString_AsEncodedObject(
+ ptr, encoding, errors)
+ assert space.unwrap(res) == "616263"
+
+ res = api.PyString_AsEncodedObject(
+ ptr, encoding, lltype.nullptr(rffi.CCHARP.TO))
+ assert space.unwrap(res) == "616263"
+ rffi.free_charp(encoding)
+
+ encoding = rffi.str2charp("unknown_encoding")
+ self.raises(space, api, LookupError, api.PyString_AsEncodedObject,
+ ptr, encoding, errors)
+ rffi.free_charp(encoding)
+
+ rffi.free_charp(errors)
+
+ res = api.PyString_AsEncodedObject(
+ ptr, lltype.nullptr(rffi.CCHARP.TO), lltype.nullptr(rffi.CCHARP.TO))
+ assert space.unwrap(res) == "abc"
More information about the Pypy-commit
mailing list