@@ -182,15 +182,14 @@ _Py_union_type_or(PyObject* self, PyObject* other)
182
182
}
183
183
184
184
static int
185
- union_repr_item (_PyUnicodeWriter * writer , PyObject * p )
185
+ union_repr_item (PyUnicodeWriter * writer , PyObject * p )
186
186
{
187
187
PyObject * qualname = NULL ;
188
188
PyObject * module = NULL ;
189
- PyObject * r = NULL ;
190
189
int rc ;
191
190
192
191
if (p == (PyObject * )& _PyNone_Type ) {
193
- return _PyUnicodeWriter_WriteASCIIString (writer , "None" , 4 );
192
+ return PyUnicodeWriter_WriteUTF8 (writer , "None" , 4 );
194
193
}
195
194
196
195
if ((rc = PyObject_HasAttrWithError (p , & _Py_ID (__origin__ ))) > 0 &&
@@ -200,17 +199,17 @@ union_repr_item(_PyUnicodeWriter *writer, PyObject *p)
200
199
goto use_repr ;
201
200
}
202
201
if (rc < 0 ) {
203
- goto exit ;
202
+ goto error ;
204
203
}
205
204
206
205
if (PyObject_GetOptionalAttr (p , & _Py_ID (__qualname__ ), & qualname ) < 0 ) {
207
- goto exit ;
206
+ goto error ;
208
207
}
209
208
if (qualname == NULL ) {
210
209
goto use_repr ;
211
210
}
212
211
if (PyObject_GetOptionalAttr (p , & _Py_ID (__module__ ), & module ) < 0 ) {
213
- goto exit ;
212
+ goto error ;
214
213
}
215
214
if (module == NULL || module == Py_None ) {
216
215
goto use_repr ;
@@ -221,24 +220,25 @@ union_repr_item(_PyUnicodeWriter *writer, PyObject *p)
221
220
_PyUnicode_EqualToASCIIString (module , "builtins" ))
222
221
{
223
222
// builtins don't need a module name
224
- r = PyObject_Str ( qualname );
225
- goto exit ;
223
+ rc = PyUnicodeWriter_WriteStr ( writer , qualname );
224
+ goto done ;
226
225
}
227
226
else {
228
- r = PyUnicode_FromFormat ( "%S.%S" , module , qualname );
229
- goto exit ;
227
+ rc = PyUnicodeWriter_Format ( writer , "%S.%S" , module , qualname );
228
+ goto done ;
230
229
}
231
230
231
+ error :
232
+ rc = -1 ;
233
+ goto done ;
234
+
232
235
use_repr :
233
- r = PyObject_Repr (p );
234
- exit :
236
+ rc = PyUnicodeWriter_WriteRepr (writer , p );
237
+ goto done ;
238
+
239
+ done :
235
240
Py_XDECREF (qualname );
236
241
Py_XDECREF (module );
237
- if (r == NULL ) {
238
- return -1 ;
239
- }
240
- rc = _PyUnicodeWriter_WriteStr (writer , r );
241
- Py_DECREF (r );
242
242
return rc ;
243
243
}
244
244
@@ -248,20 +248,26 @@ union_repr(PyObject *self)
248
248
unionobject * alias = (unionobject * )self ;
249
249
Py_ssize_t len = PyTuple_GET_SIZE (alias -> args );
250
250
251
- _PyUnicodeWriter writer ;
252
- _PyUnicodeWriter_Init (& writer );
253
- for (Py_ssize_t i = 0 ; i < len ; i ++ ) {
254
- if (i > 0 && _PyUnicodeWriter_WriteASCIIString (& writer , " | " , 3 ) < 0 ) {
251
+ // Shortest type name "int" (3 chars) + " | " (3 chars) separator
252
+ Py_ssize_t estimate = (len <= PY_SSIZE_T_MAX / 6 ) ? len * 6 : len ;
253
+ PyUnicodeWriter * writer = PyUnicodeWriter_Create (estimate );
254
+ if (writer == NULL ) {
255
+ return NULL ;
256
+ }
257
+
258
+ for (Py_ssize_t i = 0 ; i < len ; i ++ ) {
259
+ if (i > 0 && PyUnicodeWriter_WriteUTF8 (writer , " | " , 3 ) < 0 ) {
255
260
goto error ;
256
261
}
257
262
PyObject * p = PyTuple_GET_ITEM (alias -> args , i );
258
- if (union_repr_item (& writer , p ) < 0 ) {
263
+ if (union_repr_item (writer , p ) < 0 ) {
259
264
goto error ;
260
265
}
261
266
}
262
- return _PyUnicodeWriter_Finish (& writer );
267
+ return PyUnicodeWriter_Finish (writer );
268
+
263
269
error :
264
- _PyUnicodeWriter_Dealloc ( & writer );
270
+ PyUnicodeWriter_Discard ( writer );
265
271
return NULL ;
266
272
}
267
273
0 commit comments