summaryrefslogtreecommitdiff
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 5f6d0a6dd3..d772e74c07 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -1131,8 +1131,7 @@ string_richcompare(PyStringObject *a, PyStringObject *b, int op)
much time, since Py_NE is rarely used. */
if (a->ob_size == b->ob_size
&& (a->ob_sval[0] == b->ob_sval[0]
- && memcmp(a->ob_sval, b->ob_sval,
- a->ob_size) == 0)) {
+ && memcmp(a->ob_sval, b->ob_sval, a->ob_size) == 0)) {
result = Py_True;
} else {
result = Py_False;
@@ -1145,7 +1144,7 @@ string_richcompare(PyStringObject *a, PyStringObject *b, int op)
c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
if (c==0)
c = memcmp(a->ob_sval, b->ob_sval, min_len);
- }else
+ } else
c = 0;
if (c == 0)
c = (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0;
@@ -4018,7 +4017,8 @@ PyTypeObject PyString_Type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
&string_as_buffer, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_STRING_SUBCLASS, /* tp_flags */
string_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
@@ -4981,6 +4981,7 @@ void _Py_ReleaseInternedStrings(void)
PyObject *keys;
PyStringObject *s;
Py_ssize_t i, n;
+ Py_ssize_t immortal_size = 0, mortal_size = 0;
if (interned == NULL || !PyDict_Check(interned))
return;
@@ -4995,8 +4996,9 @@ void _Py_ReleaseInternedStrings(void)
give them their stolen references back, and then clear and DECREF
the interned dict. */
- fprintf(stderr, "releasing interned strings\n");
n = PyList_GET_SIZE(keys);
+ fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n",
+ n);
for (i = 0; i < n; i++) {
s = (PyStringObject *) PyList_GET_ITEM(keys, i);
switch (s->ob_sstate) {
@@ -5005,15 +5007,20 @@ void _Py_ReleaseInternedStrings(void)
break;
case SSTATE_INTERNED_IMMORTAL:
s->ob_refcnt += 1;
+ immortal_size += s->ob_size;
break;
case SSTATE_INTERNED_MORTAL:
s->ob_refcnt += 2;
+ mortal_size += s->ob_size;
break;
default:
Py_FatalError("Inconsistent interned string state.");
}
s->ob_sstate = SSTATE_NOT_INTERNED;
}
+ fprintf(stderr, "total size of all interned strings: "
+ "%" PY_FORMAT_SIZE_T "d/%" PY_FORMAT_SIZE_T "d "
+ "mortal/immortal\n", mortal_size, immortal_size);
Py_DECREF(keys);
PyDict_Clear(interned);
Py_DECREF(interned);