@@ -1067,95 +1067,20 @@ bytearray___init___impl(PyByteArrayObject *self, PyObject *arg,
10671067 return -1 ;
10681068}
10691069
1070- /* Mostly copied from string_repr, but without the
1071- "smart quote" functionality. */
10721070static PyObject *
10731071bytearray_repr_lock_held (PyObject * op )
10741072{
10751073 _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (op );
1076- PyByteArrayObject * self = _PyByteArray_CAST (op );
1077- const char * className = _PyType_Name (Py_TYPE (self ));
1078- const char * quote_prefix = "(b" ;
1079- const char * quote_postfix = ")" ;
1080- Py_ssize_t length = Py_SIZE (self );
1081- /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
1082- Py_ssize_t newsize ;
1083- PyObject * v ;
1084- Py_ssize_t i ;
1085- char * bytes ;
1086- char c ;
1087- char * p ;
1088- int quote ;
1089- char * test , * start ;
1090- char * buffer ;
1091-
1092- newsize = strlen (className );
1093- if (length > (PY_SSIZE_T_MAX - 6 - newsize ) / 4 ) {
1094- PyErr_SetString (PyExc_OverflowError ,
1095- "bytearray object is too large to make repr" );
1096- return NULL ;
1097- }
1098-
1099- newsize += 6 + length * 4 ;
1100- buffer = PyMem_Malloc (newsize );
1101- if (buffer == NULL ) {
1102- PyErr_NoMemory ();
1074+ const char * className = _PyType_Name (Py_TYPE (op ));
1075+ PyObject * bytes_repr = _Py_bytes_repr (PyByteArray_AS_STRING (op ),
1076+ PyByteArray_GET_SIZE (op ), 1 ,
1077+ "bytearray" );
1078+ if (bytes_repr == NULL ) {
11031079 return NULL ;
11041080 }
1105-
1106- /* Figure out which quote to use; single is preferred */
1107- quote = '\'' ;
1108- start = PyByteArray_AS_STRING (self );
1109- for (test = start ; test < start + length ; ++ test ) {
1110- if (* test == '"' ) {
1111- quote = '\'' ; /* back to single */
1112- break ;
1113- }
1114- else if (* test == '\'' )
1115- quote = '"' ;
1116- }
1117-
1118- p = buffer ;
1119- while (* className )
1120- * p ++ = * className ++ ;
1121- while (* quote_prefix )
1122- * p ++ = * quote_prefix ++ ;
1123- * p ++ = quote ;
1124-
1125- bytes = PyByteArray_AS_STRING (self );
1126- for (i = 0 ; i < length ; i ++ ) {
1127- /* There's at least enough room for a hex escape
1128- and a closing quote. */
1129- assert (newsize - (p - buffer ) >= 5 );
1130- c = bytes [i ];
1131- if (c == '\'' || c == '\\' )
1132- * p ++ = '\\' , * p ++ = c ;
1133- else if (c == '\t' )
1134- * p ++ = '\\' , * p ++ = 't' ;
1135- else if (c == '\n' )
1136- * p ++ = '\\' , * p ++ = 'n' ;
1137- else if (c == '\r' )
1138- * p ++ = '\\' , * p ++ = 'r' ;
1139- else if (c == 0 )
1140- * p ++ = '\\' , * p ++ = 'x' , * p ++ = '0' , * p ++ = '0' ;
1141- else if (c < ' ' || c >= 0x7f ) {
1142- * p ++ = '\\' ;
1143- * p ++ = 'x' ;
1144- * p ++ = Py_hexdigits [(c & 0xf0 ) >> 4 ];
1145- * p ++ = Py_hexdigits [c & 0xf ];
1146- }
1147- else
1148- * p ++ = c ;
1149- }
1150- assert (newsize - (p - buffer ) >= 1 );
1151- * p ++ = quote ;
1152- while (* quote_postfix ) {
1153- * p ++ = * quote_postfix ++ ;
1154- }
1155-
1156- v = PyUnicode_FromStringAndSize (buffer , p - buffer );
1157- PyMem_Free (buffer );
1158- return v ;
1081+ PyObject * res = PyUnicode_FromFormat ("%s(%U)" , className , bytes_repr );
1082+ Py_DECREF (bytes_repr );
1083+ return res ;
11591084}
11601085
11611086static PyObject *
0 commit comments