SF bug 433228: repr(list) woes when len(list) big. · python/cpython@bce15a3 (original) (raw)

`@@ -809,42 +809,80 @@ dict_print(register dictobject *mp, register FILE *fp, register int flags)

`

809

809

`static PyObject *

`

810

810

`dict_repr(dictobject *mp)

`

811

811

`{

`

812

``

`-

auto PyObject *v;

`

813

``

`-

PyObject *sepa, *colon;

`

814

``

`-

register int i;

`

815

``

`-

register int any;

`

``

812

`+

int i, pos;

`

``

813

`+

PyObject *s, *temp, *colon = NULL;

`

``

814

`+

PyObject *pieces = NULL, *result = NULL;

`

``

815

`+

PyObject *key, *value;

`

816

816

``

817

``

`-

i = Py_ReprEnter((PyObject*)mp);

`

``

817

`+

i = Py_ReprEnter((PyObject *)mp);

`

818

818

`if (i != 0) {

`

819

``

`-

if (i > 0)

`

820

``

`-

return PyString_FromString("{...}");

`

821

``

`-

return NULL;

`

``

819

`+

return i > 0 ? PyString_FromString("{...}") : NULL;

`

822

820

` }

`

823

821

``

824

``

`-

v = PyString_FromString("{");

`

825

``

`-

sepa = PyString_FromString(", ");

`

826

``

`-

colon = PyString_FromString(": ");

`

827

``

`-

any = 0;

`

828

``

`-

for (i = 0; i <= mp->ma_mask && v; i++) {

`

829

``

`-

dictentry *ep = mp->ma_table + i;

`

830

``

`-

PyObject *pvalue = ep->me_value;

`

831

``

`-

if (pvalue != NULL) {

`

832

``

`-

/* Prevent PyObject_Repr from deleting value during

`

833

``

`-

key format */

`

834

``

`-

Py_INCREF(pvalue);

`

835

``

`-

if (any++)

`

836

``

`-

PyString_Concat(&v, sepa);

`

837

``

`-

PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));

`

838

``

`-

PyString_Concat(&v, colon);

`

839

``

`-

PyString_ConcatAndDel(&v, PyObject_Repr(pvalue));

`

840

``

`-

Py_DECREF(pvalue);

`

841

``

`-

}

`

``

822

`+

if (mp->ma_used == 0) {

`

``

823

`+

result = PyString_FromString("{}");

`

``

824

`+

goto Done;

`

842

825

` }

`

843

``

`-

PyString_ConcatAndDel(&v, PyString_FromString("}"));

`

844

``

`-

Py_ReprLeave((PyObject*)mp);

`

845

``

`-

Py_XDECREF(sepa);

`

``

826

+

``

827

`+

pieces = PyList_New(0);

`

``

828

`+

if (pieces == NULL)

`

``

829

`+

goto Done;

`

``

830

+

``

831

`+

colon = PyString_FromString(": ");

`

``

832

`+

if (colon == NULL)

`

``

833

`+

goto Done;

`

``

834

+

``

835

`+

/* Do repr() on each key+value pair, and insert ": " between them.

`

``

836

`+

Note that repr may mutate the dict. */

`

``

837

`+

pos = 0;

`

``

838

`+

while (PyDict_Next((PyObject *)mp, &pos, &key, &value)) {

`

``

839

`+

int status;

`

``

840

`+

/* Prevent repr from deleting value during key format. */

`

``

841

`+

Py_INCREF(value);

`

``

842

`+

s = PyObject_Repr(key);

`

``

843

`+

PyString_Concat(&s, colon);

`

``

844

`+

PyString_ConcatAndDel(&s, PyObject_Repr(value));

`

``

845

`+

Py_DECREF(value);

`

``

846

`+

if (s == NULL)

`

``

847

`+

goto Done;

`

``

848

`+

status = PyList_Append(pieces, s);

`

``

849

`+

Py_DECREF(s); /* append created a new ref */

`

``

850

`+

if (status < 0)

`

``

851

`+

goto Done;

`

``

852

`+

}

`

``

853

+

``

854

`+

/* Add "{}" decorations to the first and last items. */

`

``

855

`+

assert(PyList_GET_SIZE(pieces) > 0);

`

``

856

`+

s = PyString_FromString("{");

`

``

857

`+

if (s == NULL)

`

``

858

`+

goto Done;

`

``

859

`+

temp = PyList_GET_ITEM(pieces, 0);

`

``

860

`+

PyString_ConcatAndDel(&s, temp);

`

``

861

`+

PyList_SET_ITEM(pieces, 0, s);

`

``

862

`+

if (s == NULL)

`

``

863

`+

goto Done;

`

``

864

+

``

865

`+

s = PyString_FromString("}");

`

``

866

`+

if (s == NULL)

`

``

867

`+

goto Done;

`

``

868

`+

temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);

`

``

869

`+

PyString_ConcatAndDel(&temp, s);

`

``

870

`+

PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);

`

``

871

`+

if (temp == NULL)

`

``

872

`+

goto Done;

`

``

873

+

``

874

`+

/* Paste them all together with ", " between. */

`

``

875

`+

s = PyString_FromString(", ");

`

``

876

`+

if (s == NULL)

`

``

877

`+

goto Done;

`

``

878

`+

result = _PyString_Join(s, pieces);

`

``

879

`+

Py_DECREF(s);

`

``

880

+

``

881

`+

Done:

`

``

882

`+

Py_XDECREF(pieces);

`

846

883

`Py_XDECREF(colon);

`

847

``

`-

return v;

`

``

884

`+

Py_ReprLeave((PyObject *)mp);

`

``

885

`+

return result;

`

848

886

`}

`

849

887

``

850

888

`static int

`