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.
This commit is contained in:
Antoine Pitrou 2011-10-06 19:04:12 +02:00
commit c61c8d7a5e
13 changed files with 270 additions and 86 deletions

View file

@ -101,7 +101,7 @@
#include "warnings.h"
#include "weakrefobject.h"
#include "structseq.h"
#include "accu.h"
#include "codecs.h"
#include "pyerrors.h"

35
Include/accu.h Normal file
View file

@ -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 */