Skip to content

Commit

Permalink
pythongh-119182: Use public PyUnicodeWriter in contextvar_tp_repr() (p…
Browse files Browse the repository at this point in the history
…ython#120809)

The public PyUnicodeWriter API enables overallocation by default and
so is more efficient. It also makes the code simpler and shorter.
  • Loading branch information
vstinner authored Jun 20, 2024
1 parent 5150795 commit 56657f6
Showing 1 changed file with 15 additions and 32 deletions.
47 changes: 15 additions & 32 deletions Python/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -893,56 +893,39 @@ contextvar_tp_hash(PyContextVar *self)
static PyObject *
contextvar_tp_repr(PyContextVar *self)
{
_PyUnicodeWriter writer;

_PyUnicodeWriter_Init(&writer);

if (_PyUnicodeWriter_WriteASCIIString(
&writer, "<ContextVar name=", 17) < 0)
{
goto error;
// Estimation based on the shortest name and default value,
// but maximize the pointer size.
// "<ContextVar name='a' at 0x1234567812345678>"
// "<ContextVar name='a' default=1 at 0x1234567812345678>"
Py_ssize_t estimate = self->var_default ? 53 : 43;
PyUnicodeWriter *writer = PyUnicodeWriter_Create(estimate);
if (writer == NULL) {
return NULL;
}

PyObject *name = PyObject_Repr(self->var_name);
if (name == NULL) {
if (PyUnicodeWriter_WriteUTF8(writer, "<ContextVar name=", 17) < 0) {
goto error;
}
if (_PyUnicodeWriter_WriteStr(&writer, name) < 0) {
Py_DECREF(name);
if (PyUnicodeWriter_WriteRepr(writer, self->var_name) < 0) {
goto error;
}
Py_DECREF(name);

if (self->var_default != NULL) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, " default=", 9) < 0) {
goto error;
}

PyObject *def = PyObject_Repr(self->var_default);
if (def == NULL) {
if (PyUnicodeWriter_WriteUTF8(writer, " default=", 9) < 0) {
goto error;
}
if (_PyUnicodeWriter_WriteStr(&writer, def) < 0) {
Py_DECREF(def);
if (PyUnicodeWriter_WriteRepr(writer, self->var_default) < 0) {
goto error;
}
Py_DECREF(def);
}

PyObject *addr = PyUnicode_FromFormat(" at %p>", self);
if (addr == NULL) {
goto error;
}
if (_PyUnicodeWriter_WriteStr(&writer, addr) < 0) {
Py_DECREF(addr);
if (PyUnicodeWriter_Format(writer, " at %p>", self) < 0) {
goto error;
}
Py_DECREF(addr);

return _PyUnicodeWriter_Finish(&writer);
return PyUnicodeWriter_Finish(writer);

error:
_PyUnicodeWriter_Dealloc(&writer);
PyUnicodeWriter_Discard(writer);
return NULL;
}

Expand Down

0 comments on commit 56657f6

Please sign in to comment.