diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index e5c7ccd..11cd801 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -517,6 +517,8 @@ class BytesTest(BaseBytesTest): b'c:\xff') self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')), b's:cstr') + self.assertEqual(PyBytes_FromFormat(b'y:%y', py_object(b'bytes')), + b'y:bytes') class ByteArrayTest(BaseBytesTest): diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index ba33608..0356e52 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -215,6 +215,13 @@ PyBytes_FromFormatV(const char *format, va_list vargs) */ n += 19; break; + case 'y': + { + PyObject *obj = va_arg(count, PyObject *); + assert(obj && PyBytes_Check(obj)); + n += PyBytes_GET_SIZE(obj); + break; + } default: /* if we stumble upon an unknown formatting code, copy the rest of @@ -323,6 +330,14 @@ PyBytes_FromFormatV(const char *format, va_list vargs) } s += strlen(s); break; + case 'y': + { + PyObject *obj = va_arg(vargs, PyObject *); + Py_ssize_t size = PyBytes_GET_SIZE(obj); + memmove(s, PyBytes_AS_STRING(obj), size); + s += size; + break; + } case '%': *s++ = '%'; break;