Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4355a47

Browse files
committed
Make all of test_bytes pass (except pickling, which is too badly busted).
1 parent 6c1e674 commit 4355a47

3 files changed

Lines changed: 55 additions & 57 deletions

File tree

Lib/test/test_bytes.py

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -102,35 +102,35 @@ def test_compare(self):
102102
self.failIf(b3 <= b2)
103103

104104
def test_compare_to_str(self):
105-
self.assertEqual(b"abc" == "abc", True)
106-
self.assertEqual(b"ab" != "abc", True)
107-
self.assertEqual(b"ab" <= "abc", True)
108-
self.assertEqual(b"ab" < "abc", True)
109-
self.assertEqual(b"abc" >= "ab", True)
110-
self.assertEqual(b"abc" > "ab", True)
111-
112-
self.assertEqual(b"abc" != "abc", False)
113-
self.assertEqual(b"ab" == "abc", False)
114-
self.assertEqual(b"ab" > "abc", False)
115-
self.assertEqual(b"ab" >= "abc", False)
116-
self.assertEqual(b"abc" < "ab", False)
117-
self.assertEqual(b"abc" <= "ab", False)
118-
119-
self.assertEqual("abc" == b"abc", True)
120-
self.assertEqual("ab" != b"abc", True)
121-
self.assertEqual("ab" <= b"abc", True)
122-
self.assertEqual("ab" < b"abc", True)
123-
self.assertEqual("abc" >= b"ab", True)
124-
self.assertEqual("abc" > b"ab", True)
125-
126-
self.assertEqual("abc" != b"abc", False)
127-
self.assertEqual("ab" == b"abc", False)
128-
self.assertEqual("ab" > b"abc", False)
129-
self.assertEqual("ab" >= b"abc", False)
130-
self.assertEqual("abc" < b"ab", False)
131-
self.assertEqual("abc" <= b"ab", False)
132-
133-
# But they should never compare equal to Unicode!
105+
self.assertEqual(b"abc" == str8("abc"), True)
106+
self.assertEqual(b"ab" != str8("abc"), True)
107+
self.assertEqual(b"ab" <= str8("abc"), True)
108+
self.assertEqual(b"ab" < str8("abc"), True)
109+
self.assertEqual(b"abc" >= str8("ab"), True)
110+
self.assertEqual(b"abc" > str8("ab"), True)
111+
112+
self.assertEqual(b"abc" != str8("abc"), False)
113+
self.assertEqual(b"ab" == str8("abc"), False)
114+
self.assertEqual(b"ab" > str8("abc"), False)
115+
self.assertEqual(b"ab" >= str8("abc"), False)
116+
self.assertEqual(b"abc" < str8("ab"), False)
117+
self.assertEqual(b"abc" <= str8("ab"), False)
118+
119+
self.assertEqual(str8("abc") == b"abc", True)
120+
self.assertEqual(str8("ab") != b"abc", True)
121+
self.assertEqual(str8("ab") <= b"abc", True)
122+
self.assertEqual(str8("ab") < b"abc", True)
123+
self.assertEqual(str8("abc") >= b"ab", True)
124+
self.assertEqual(str8("abc") > b"ab", True)
125+
126+
self.assertEqual(str8("abc") != b"abc", False)
127+
self.assertEqual(str8("ab") == b"abc", False)
128+
self.assertEqual(str8("ab") > b"abc", False)
129+
self.assertEqual(str8("ab") >= b"abc", False)
130+
self.assertEqual(str8("abc") < b"ab", False)
131+
self.assertEqual(str8("abc") <= b"ab", False)
132+
133+
# Bytes should never compare equal to Unicode!
134134
# Test this for all expected byte orders and Unicode character sizes
135135
self.assertEqual(b"\0a\0b\0c" == "abc", False)
136136
self.assertEqual(b"\0\0\0a\0\0\0b\0\0\0c" == "abc", False)
@@ -326,7 +326,7 @@ def test_encoding(self):
326326
sample = "Hello world\n\u1234\u5678\u9abc\udef0"
327327
for enc in ("utf8", "utf16"):
328328
b = bytes(sample, enc)
329-
self.assertEqual(b, bytes(map(ord, sample.encode(enc))))
329+
self.assertEqual(b, bytes(sample.encode(enc)))
330330
self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
331331
b = bytes(sample, "latin1", "ignore")
332332
self.assertEqual(b, bytes(sample[:-4]))
@@ -342,7 +342,7 @@ def test_decode(self):
342342
self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
343343

344344
def test_from_buffer(self):
345-
sample = "Hello world\n\x80\x81\xfe\xff"
345+
sample = str8("Hello world\n\x80\x81\xfe\xff")
346346
buf = buffer(sample)
347347
b = bytes(buf)
348348
self.assertEqual(b, bytes(map(ord, sample)))
@@ -364,8 +364,8 @@ def test_concat(self):
364364
b1 = bytes("abc")
365365
b2 = bytes("def")
366366
self.assertEqual(b1 + b2, bytes("abcdef"))
367-
self.assertEqual(b1 + "def", bytes("abcdef"))
368-
self.assertEqual("def" + b1, bytes("defabc"))
367+
self.assertEqual(b1 + str8("def"), bytes("abcdef"))
368+
self.assertEqual(str8("def") + b1, bytes("defabc"))
369369
self.assertRaises(TypeError, lambda: b1 + "def")
370370
self.assertRaises(TypeError, lambda: "abc" + b2)
371371

@@ -388,7 +388,7 @@ def test_iconcat(self):
388388
self.assertEqual(b, bytes("abcdef"))
389389
self.assertEqual(b, b1)
390390
self.failUnless(b is b1)
391-
b += "xyz"
391+
b += str8("xyz")
392392
self.assertEqual(b, b"abcdefxyz")
393393
try:
394394
b += ""
@@ -456,8 +456,8 @@ def test_fromhex(self):
456456
b = bytes([0x1a, 0x2b, 0x30])
457457
self.assertEquals(bytes.fromhex('1a2B30'), b)
458458
self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
459-
self.assertEquals(bytes.fromhex(buffer('')), bytes())
460-
self.assertEquals(bytes.fromhex(buffer('0000')), bytes([0, 0]))
459+
self.assertEquals(bytes.fromhex(buffer(b'')), bytes())
460+
self.assertEquals(bytes.fromhex(buffer(b'0000')), bytes([0, 0]))
461461
self.assertRaises(ValueError, bytes.fromhex, 'a')
462462
self.assertRaises(ValueError, bytes.fromhex, 'rt')
463463
self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
@@ -717,5 +717,5 @@ def test_main():
717717

718718

719719
if __name__ == "__main__":
720-
test_main()
721-
##unittest.main()
720+
##test_main()
721+
unittest.main()

Objects/bytesobject.c

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ bytes_iconcat(PyBytesObject *self, PyObject *other)
218218
Py_ssize_t mysize;
219219
Py_ssize_t size;
220220

221+
/* XXX What if other == self? */
221222
osize = _getbuffer(other, &optr);
222223
if (osize < 0) {
223224
PyErr_Format(PyExc_TypeError,
@@ -698,34 +699,25 @@ bytes_init(PyBytesObject *self, PyObject *args, PyObject *kwds)
698699

699700
if (PyUnicode_Check(arg)) {
700701
/* Encode via the codec registry */
701-
PyObject *encoded;
702-
char *bytes;
703-
Py_ssize_t size;
702+
PyObject *encoded, *new;
704703
if (encoding == NULL)
705704
encoding = PyUnicode_GetDefaultEncoding();
706705
encoded = PyCodec_Encode(arg, encoding, errors);
707706
if (encoded == NULL)
708707
return -1;
709-
if (!PyString_Check(encoded)) {
708+
if (!PyBytes_Check(encoded) && !PyString_Check(encoded)) {
710709
PyErr_Format(PyExc_TypeError,
711-
"encoder did not return a string object (type=%.400s)",
710+
"encoder did not return a str8 or bytes object (type=%.400s)",
712711
encoded->ob_type->tp_name);
713712
Py_DECREF(encoded);
714713
return -1;
715714
}
716-
bytes = PyString_AS_STRING(encoded);
717-
size = PyString_GET_SIZE(encoded);
718-
if (size < self->ob_alloc) {
719-
self->ob_size = size;
720-
self->ob_bytes[self->ob_size] = '\0'; /* Trailing null byte */
721-
}
722-
else if (PyBytes_Resize((PyObject *)self, size) < 0) {
723-
Py_DECREF(encoded);
724-
return -1;
725-
}
726-
memcpy(self->ob_bytes, bytes, size);
727-
Py_DECREF(encoded);
728-
return 0;
715+
new = bytes_iconcat(self, encoded);
716+
Py_DECREF(encoded);
717+
if (new == NULL)
718+
return -1;
719+
Py_DECREF(new);
720+
return 0;
729721
}
730722

731723
/* If it's not unicode, there can't be encoding or errors */
@@ -2689,7 +2681,7 @@ bytes_fromhex(PyObject *cls, PyObject *args)
26892681
return NULL;
26902682
buf = PyBytes_AS_STRING(newbytes);
26912683

2692-
for (i = j = 0; ; i += 2) {
2684+
for (i = j = 0; i < len; i += 2) {
26932685
/* skip over spaces in the input */
26942686
while (Py_CHARMASK(hex[i]) == ' ')
26952687
i++;

Objects/unicodeobject.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5634,6 +5634,12 @@ unicode_encode(PyUnicodeObject *self, PyObject *args)
56345634
if (v == NULL)
56355635
goto onError;
56365636
if (!PyBytes_Check(v)) {
5637+
if (PyString_Check(v)) {
5638+
/* Old codec, turn it into bytes */
5639+
PyObject *b = PyBytes_FromObject(v);
5640+
Py_DECREF(v);
5641+
return b;
5642+
}
56375643
PyErr_Format(PyExc_TypeError,
56385644
"encoder did not return a bytes object "
56395645
"(type=%.400s)",

0 commit comments

Comments
 (0)