Author: Matti Picus <matti.pi...@gmail.com>
Branch: unicode-utf8
Changeset: r95546:8704e00eb624
Date: 2019-01-01 08:44 +0200
http://bitbucket.org/pypy/pypy/changeset/8704e00eb624/

Log:    'abc'.encode(...) in cpython calls 'abc'.decode('ascii',
        'strict').encode(...)

diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py
--- a/pypy/objspace/std/bytesobject.py
+++ b/pypy/objspace/std/bytesobject.py
@@ -465,6 +465,10 @@
         raise oefmt(space.w_TypeError,
                     "Cannot use string as modifiable buffer")
 
+    def descr_encode(self, space, w_encoding=None, w_errors=None):
+        w_uni = self.descr_decode(space, space.newtext('ascii'), 
space.newtext('strict'))
+        return space.call_method(w_uni, 'encode', w_encoding, w_errors)
+
     def descr_getbuffer(self, space, w_flags):
         #from pypy.objspace.std.bufferobject import W_Buffer
         #return W_Buffer(StringBuffer(self._value))
@@ -869,7 +873,7 @@
     center = interpindirect2app(W_AbstractBytesObject.descr_center),
     count = interpindirect2app(W_AbstractBytesObject.descr_count),
     decode = interpindirect2app(W_AbstractBytesObject.descr_decode),
-    encode = interpindirect2app(W_AbstractBytesObject.descr_encode),
+    encode = interpindirect2app(W_BytesObject.descr_encode),
     expandtabs = interpindirect2app(W_AbstractBytesObject.descr_expandtabs),
     find = interpindirect2app(W_AbstractBytesObject.descr_find),
     rfind = interpindirect2app(W_AbstractBytesObject.descr_rfind),
diff --git a/pypy/objspace/std/test/test_bytesobject.py 
b/pypy/objspace/std/test/test_bytesobject.py
--- a/pypy/objspace/std/test/test_bytesobject.py
+++ b/pypy/objspace/std/test/test_bytesobject.py
@@ -812,6 +812,11 @@
     def test_encode(self):
         assert 'hello'.encode() == 'hello'
         assert type('hello'.encode()) is str
+        s = 'hello \xf8 world'
+        # CPython first decodes the bytes, then encodes
+        exc = raises(UnicodeDecodeError, s.encode, 'ascii')
+        assert str(exc.value) == ("'ascii' codec can't decode byte 0xf8"
+                        " in position 6: ordinal not in range(128)")
 
     def test_hash(self):
         # check that we have the same hash as CPython for at least 31 bits
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to