summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-10-06 16:57:27 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-10-06 16:57:27 (GMT)
commiteeb7eea1f95793437b3e251f47c98446e15fa680 (patch)
treee83a45f7eddbc424f375a89581a918baf2a42dcd /Include
parentbb2095f1e273d06f7dfaa8303c46ce6f01212c76 (diff)
downloadcpython-eeb7eea1f95793437b3e251f47c98446e15fa680.zip
cpython-eeb7eea1f95793437b3e251f47c98446e15fa680.tar.gz
cpython-eeb7eea1f95793437b3e251f47c98446e15fa680.tar.bz2
Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
This introduces a small private API for this common pattern. The issue has been discovered thanks to Martin's huge-mem buildbot.
Diffstat (limited to 'Include')
-rw-r--r--Include/Python.h4
-rw-r--r--Include/accu.h35
2 files changed, 37 insertions, 2 deletions
diff --git a/Include/Python.h b/Include/Python.h
index db33a76..5972ffa 100644
--- a/Include/Python.h
+++ b/Include/Python.h
@@ -100,7 +100,7 @@
#include "warnings.h"
#include "weakrefobject.h"
#include "structseq.h"
-
+#include "accu.h"
#include "codecs.h"
#include "pyerrors.h"
@@ -141,7 +141,7 @@ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
#endif
/* Argument must be a char or an int in [-128, 127] or [0, 255]. */
-#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
+#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
#include "pyfpe.h"
diff --git a/Include/accu.h b/Include/accu.h
new file mode 100644
index 0000000..9655d37
--- /dev/null
+++ b/Include/accu.h
@@ -0,0 +1,35 @@
+#ifndef Py_LIMITED_API
+#ifndef Py_ACCU_H
+#define Py_ACCU_H
+
+/*** This is a private API for use by the interpreter and the stdlib.
+ *** Its definition may be changed or removed at any moment.
+ ***/
+
+/*
+ * A two-level accumulator of unicode objects that avoids both the overhead
+ * of keeping a huge number of small separate objects, and the quadratic
+ * behaviour of using a naive repeated concatenation scheme.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ PyObject *large; /* A list of previously accumulated large strings */
+ PyObject *small; /* Pending small strings */
+} _PyAccu;
+
+PyAPI_FUNC(int) _PyAccu_Init(_PyAccu *acc);
+PyAPI_FUNC(int) _PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode);
+PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc);
+PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc);
+PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Py_ACCU_H */
+#endif /* Py_LIMITED_API */