summaryrefslogtreecommitdiffstats
path: root/Modules/_bz2module.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_bz2module.c')
-rw-r--r--Modules/_bz2module.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
index d329c14..b407df9 100644
--- a/Modules/_bz2module.c
+++ b/Modules/_bz2module.c
@@ -116,22 +116,14 @@ catch_bz2_error(int bzerror)
#define SMALLCHUNK BUFSIZ
#endif
-#if SIZEOF_INT < 4
-#define BIGCHUNK (512 * 32)
-#else
-#define BIGCHUNK (512 * 1024)
-#endif
-
static int
grow_buffer(PyObject **buf)
{
+ /* Expand the buffer by an amount proportional to the current size,
+ giving us amortized linear-time behavior. Use a less-than-double
+ growth factor to avoid excessive allocation. */
size_t size = PyBytes_GET_SIZE(*buf);
- if (size <= SMALLCHUNK)
- return _PyBytes_Resize(buf, size + SMALLCHUNK);
- else if (size <= BIGCHUNK)
- return _PyBytes_Resize(buf, size * 2);
- else
- return _PyBytes_Resize(buf, size + BIGCHUNK);
+ return _PyBytes_Resize(buf, size + (size >> 3) + 6);
}