From b1152be2def8d4073cbb0ac3c05aed88d5e8360f Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 27 Oct 2016 19:26:50 +0900 Subject: [PATCH] Issue #28509: dict.update() no longer allocate unnecessary large memory --- Misc/NEWS | 2 ++ Objects/dictobject.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index e47b977e2d4..a6b340f4d59 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.6.0 beta 3 Core and Builtins ----------------- +- Issue #28509: dict.update() no longer allocate unnecessary large memory. + - Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug build. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 03c973be636..9f98f681351 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2406,9 +2406,11 @@ dict_merge(PyObject *a, PyObject *b, int override) * incrementally resizing as we insert new items. Expect * that there will be no (or few) overlapping keys. */ - if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2) - if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0) + if (USABLE_FRACTION(mp->ma_keys->dk_size) < other->ma_used) { + if (dictresize(mp, ESTIMATE_SIZE(mp->ma_used + other->ma_used))) { return -1; + } + } ep0 = DK_ENTRIES(other->ma_keys); for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) { PyObject *key, *value;