Skip to content

Commit

Permalink
gh-125196: Use PyUnicodeWriter for repr(contextvars.Token) (#125220)
Browse files Browse the repository at this point in the history
Replace the private _PyUnicodeWriter with the public PyUnicodeWriter.
  • Loading branch information
vstinner authored Oct 9, 2024
1 parent 1b2a548 commit 9429163
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 28 deletions.
8 changes: 8 additions & 0 deletions Lib/test/test_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ def test_context_var_repr_1(self):
c.reset(t)
self.assertIn(' used ', repr(t))

@isolated_context
def test_token_repr_1(self):
c = contextvars.ContextVar('a')
tok = c.set(1)
self.assertRegex(repr(tok),
r"^<Token var=<ContextVar name='a' "
r"at 0x[0-9a-fA-F]+> at 0x[0-9a-fA-F]+>$")

def test_context_subclassing_1(self):
with self.assertRaisesRegex(TypeError, 'not an acceptable base type'):
class MyContextVar(contextvars.ContextVar):
Expand Down
39 changes: 11 additions & 28 deletions Python/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -1154,48 +1154,31 @@ token_tp_dealloc(PyContextToken *self)
static PyObject *
token_tp_repr(PyContextToken *self)
{
_PyUnicodeWriter writer;

_PyUnicodeWriter_Init(&writer);

if (_PyUnicodeWriter_WriteASCIIString(&writer, "<Token", 6) < 0) {
PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
if (writer == NULL) {
return NULL;
}
if (PyUnicodeWriter_WriteUTF8(writer, "<Token", 6) < 0) {
goto error;
}

if (self->tok_used) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, " used", 5) < 0) {
if (PyUnicodeWriter_WriteUTF8(writer, " used", 5) < 0) {
goto error;
}
}

if (_PyUnicodeWriter_WriteASCIIString(&writer, " var=", 5) < 0) {
if (PyUnicodeWriter_WriteUTF8(writer, " var=", 5) < 0) {
goto error;
}

PyObject *var = PyObject_Repr((PyObject *)self->tok_var);
if (var == NULL) {
if (PyUnicodeWriter_WriteRepr(writer, (PyObject *)self->tok_var) < 0) {
goto error;
}
if (_PyUnicodeWriter_WriteStr(&writer, var) < 0) {
Py_DECREF(var);
goto error;
}
Py_DECREF(var);

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 9429163

Please sign in to comment.