diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-11-27 14:12:47 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-27 14:12:47 (GMT) |
commit | 1005c84535191a72ebb7587d8c5636a065b7ed79 (patch) | |
tree | a5c6672e5a207440935066aff09accd8cfa24615 | |
parent | 480833808e918a1dcebbbcfd07d5a8de3c5c2a66 (diff) | |
download | cpython-1005c84535191a72ebb7587d8c5636a065b7ed79.zip cpython-1005c84535191a72ebb7587d8c5636a065b7ed79.tar.gz cpython-1005c84535191a72ebb7587d8c5636a065b7ed79.tar.bz2 |
bpo-34100: Partially revert merge_consts_recursive() (GH-10743)
Partically revert commit c2e1607a51d7a17f143b5a34e8cff7c6fc58a091 to
fix a reference leak.
-rw-r--r-- | Lib/test/test_compile.py | 10 | ||||
-rw-r--r-- | Python/compile.c | 50 |
2 files changed, 0 insertions, 60 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 58bd9b5..a086ef6 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -615,16 +615,6 @@ if 1: 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 acb5cfe..7d51819 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; } |