[Python-checkins] bpo-34100: Partially revert merge_consts_recursive() (GH-10743)

Victor Stinner webhook-mailer at python.org
Tue Nov 27 09:12:52 EST 2018


https://github.com/python/cpython/commit/1005c84535191a72ebb7587d8c5636a065b7ed79
commit: 1005c84535191a72ebb7587d8c5636a065b7ed79
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-11-27T15:12:47+01:00
summary:

bpo-34100: Partially revert merge_consts_recursive() (GH-10743)

Partically revert commit c2e1607a51d7a17f143b5a34e8cff7c6fc58a091 to
fix a reference leak.

files:
M Lib/test/test_compile.py
M Python/compile.c

diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 58bd9b5e4c7a..a086ef65b44a 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -615,16 +615,6 @@ def check_same_constant(const):
         self.check_constant(f1, Ellipsis)
         self.assertEqual(repr(f1()), repr(Ellipsis))
 
-        # Merge constants in tuple or frozenset
-        # NOTE: frozenset can't reuse previous const, but frozenset
-        # item can be reused later.
-        f3 = lambda x: x in {("not a name",)}
-        f1, f2 = lambda: "not a name", lambda: ("not a name",)
-        self.assertIs(next(iter(f3.__code__.co_consts[1])),
-                      f2.__code__.co_consts[1])
-        self.assertIs(f1.__code__.co_consts[1],
-                      f2.__code__.co_consts[1][0])
-
         # {0} is converted to a constant frozenset({0}) by the peephole
         # optimizer
         f1, f2 = lambda x: x in {0}, lambda x: x in {0}
diff --git a/Python/compile.c b/Python/compile.c
index acb5cfe29b42..7d51819e00f0 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1240,56 +1240,6 @@ merge_consts_recursive(struct compiler *c, PyObject *o)
             Py_DECREF(u);
         }
     }
-    else if (PyFrozenSet_CheckExact(o)) {
-        // We register items in the frozenset, but don't rewrite
-        // the frozenset when the item is already registered
-        // because frozenset is rare and difficult.
-
-        // *key* is tuple. And it's first item is frozenset of
-        // constant keys.
-        // See _PyCode_ConstantKey() for detail.
-        assert(PyTuple_CheckExact(key));
-        assert(PyTuple_GET_SIZE(key) == 2);
-
-        Py_ssize_t len = PySet_GET_SIZE(o);
-        if (len == 0) {
-            return key;
-        }
-        PyObject *tuple = PyTuple_New(len);
-        if (tuple == NULL) {
-            Py_DECREF(key);
-            return NULL;
-        }
-        Py_ssize_t i = 0, pos = 0;
-        PyObject *item;
-        Py_hash_t hash;
-        while (_PySet_NextEntry(o, &pos, &item, &hash)) {
-            PyObject *k = merge_consts_recursive(c, item);
-            if (k == NULL) {
-                Py_DECREF(tuple);
-                Py_DECREF(key);
-                return NULL;
-            }
-            PyObject *u;
-            if (PyTuple_CheckExact(k)) {
-                u = PyTuple_GET_ITEM(k, 1);
-            }
-            else {
-                u = k;
-            }
-            Py_INCREF(u);
-            PyTuple_SET_ITEM(tuple, i, u);
-            i++;
-        }
-
-        PyObject *new = PyFrozenSet_New(tuple);
-        Py_DECREF(tuple);
-        if (new == NULL) {
-            Py_DECREF(key);
-            return NULL;
-        }
-        PyTuple_SET_ITEM(key, 1, new);
-    }
 
     return key;
 }



More information about the Python-checkins mailing list