mirror of
https://github.com/python/cpython.git
synced 2024-12-03 23:06:43 +08:00
Fix uninitialized variable after #22676.
This commit is contained in:
parent
6f3eb39968
commit
6cd5eda0dd
@ -1636,6 +1636,27 @@ class AbstractPickleTests(unittest.TestCase):
|
||||
unpickled = self.loads(self.dumps(method, proto))
|
||||
self.assertEqual(method(*args), unpickled(*args))
|
||||
|
||||
def test_local_lookup_error(self):
|
||||
# Test that whichmodule() errors out cleanly when looking up
|
||||
# an assumed globally-reachable object fails.
|
||||
def f():
|
||||
pass
|
||||
# Since the function is local, lookup will fail
|
||||
for proto in range(0, pickle.HIGHEST_PROTOCOL + 1):
|
||||
with self.assertRaises((AttributeError, pickle.PicklingError)):
|
||||
pickletools.dis(self.dumps(f, proto))
|
||||
# Same without a __module__ attribute (exercises a different path
|
||||
# in _pickle.c).
|
||||
del f.__module__
|
||||
for proto in range(0, pickle.HIGHEST_PROTOCOL + 1):
|
||||
with self.assertRaises((AttributeError, pickle.PicklingError)):
|
||||
pickletools.dis(self.dumps(f, proto))
|
||||
# Yet a different path.
|
||||
f.__name__ = f.__qualname__
|
||||
for proto in range(0, pickle.HIGHEST_PROTOCOL + 1):
|
||||
with self.assertRaises((AttributeError, pickle.PicklingError)):
|
||||
pickletools.dis(self.dumps(f, proto))
|
||||
|
||||
|
||||
class BigmemPickleTests(unittest.TestCase):
|
||||
|
||||
|
@ -1547,10 +1547,16 @@ get_dotted_path(PyObject *obj, PyObject *name, int allow_qualname) {
|
||||
n = PyList_GET_SIZE(dotted_path);
|
||||
assert(n >= 1);
|
||||
if (!allow_qualname && n > 1) {
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"Can't get qualified attribute %R on %R;"
|
||||
"use protocols >= 4 to enable support",
|
||||
name, obj);
|
||||
if (obj == NULL)
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"Can't pickle qualified object %R; "
|
||||
"use protocols >= 4 to enable support",
|
||||
name);
|
||||
else
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"Can't pickle qualified attribute %R on %R; "
|
||||
"use protocols >= 4 to enable support",
|
||||
name, obj);
|
||||
Py_DECREF(dotted_path);
|
||||
return NULL;
|
||||
}
|
||||
@ -1562,8 +1568,12 @@ get_dotted_path(PyObject *obj, PyObject *name, int allow_qualname) {
|
||||
assert(PyBool_Check(result));
|
||||
Py_DECREF(result);
|
||||
if (is_equal) {
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"Can't get local attribute %R on %R", name, obj);
|
||||
if (obj == NULL)
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"Can't pickle local object %R", name);
|
||||
else
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"Can't pickle local attribute %R on %R", name, obj);
|
||||
Py_DECREF(dotted_path);
|
||||
return NULL;
|
||||
}
|
||||
@ -1653,7 +1663,7 @@ whichmodule(PyObject *global, PyObject *global_name, int allow_qualname)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dotted_path = get_dotted_path(module, global_name, allow_qualname);
|
||||
dotted_path = get_dotted_path(NULL, global_name, allow_qualname);
|
||||
if (dotted_path == NULL)
|
||||
return NULL;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user