Skip to content

Commit 34ea0a5

Browse files
committed
Make __dict__ not reify to match the PEP
1 parent 2af21a1 commit 34ea0a5

File tree

2 files changed

+7
-45
lines changed

2 files changed

+7
-45
lines changed

Lib/test/test_import/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2700,7 +2700,7 @@ def test_modules_dict(self):
27002700
except ImportError as e:
27012701
self.fail('lazy import failed')
27022702

2703-
self.assertTrue("test.test_import.data.lazy_imports.basic2" in sys.modules)
2703+
self.assertFalse("test.test_import.data.lazy_imports.basic2" in sys.modules)
27042704

27052705
def test_modules_geatattr(self):
27062706
try:

Objects/moduleobject.c

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
(assert(PyModule_Check(op)), _Py_CAST(PyModuleObject*, (op)))
2424

2525

26+
static PyMemberDef module_members[] = {
27+
{"__dict__", _Py_T_OBJECT, offsetof(PyModuleObject, md_dict), Py_READONLY},
28+
{0}
29+
};
30+
2631
PyTypeObject PyModuleDef_Type = {
2732
PyVarObject_HEAD_INIT(&PyType_Type, 0)
2833
"moduledef", /* tp_name */
@@ -1484,52 +1489,9 @@ module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored)
14841489
return ret;
14851490
}
14861491

1487-
static PyObject *
1488-
module_get_dict(PyObject *mod, void *Py_UNUSED(ignored))
1489-
{
1490-
PyModuleObject *self = (PyModuleObject *)mod;
1491-
PyThreadState *tstate = PyThreadState_GET();
1492-
Py_BEGIN_CRITICAL_SECTION(self->md_dict);
1493-
uint32_t version = _PyDict_GetKeysVersionForCurrentState(tstate->interp,
1494-
(PyDictObject *)self->md_dict);
1495-
// Check if the dict has been updated since we last checked to see if
1496-
// it has lazy values.
1497-
if (self->m_dict_version != version || version == 0) {
1498-
// Scan for lazy values...
1499-
bool retry;
1500-
do {
1501-
retry = false;
1502-
Py_ssize_t pos = 0;
1503-
PyObject *key, *value;
1504-
while (PyDict_Next(self->md_dict, &pos, &key, &value)) {
1505-
if (PyLazyImport_CheckExact(value)) {
1506-
PyObject *new_value = _PyImport_LoadLazyImportTstate(tstate, value);
1507-
if (new_value == NULL) {
1508-
return NULL;
1509-
}
1510-
if (_PyModule_ReplaceLazyValue(self->md_dict, key, new_value) < 0) {
1511-
Py_DECREF(new_value);
1512-
return NULL;
1513-
}
1514-
if (!PyLazyImport_CheckExact(value)) {
1515-
// Only force a retry if we actually made forward progress
1516-
retry = true;
1517-
}
1518-
Py_DECREF(new_value);
1519-
}
1520-
}
1521-
} while(retry);
1522-
self->m_dict_version = _PyDict_GetKeysVersionForCurrentState(tstate->interp,
1523-
(PyDictObject *)self->md_dict);
1524-
}
1525-
Py_END_CRITICAL_SECTION();
1526-
return Py_NewRef(self->md_dict);
1527-
}
1528-
15291492
static PyGetSetDef module_getsets[] = {
15301493
{"__annotations__", module_get_annotations, module_set_annotations},
15311494
{"__annotate__", module_get_annotate, module_set_annotate},
1532-
{"__dict__", (getter)module_get_dict, NULL},
15331495
{NULL}
15341496
};
15351497

@@ -1563,7 +1525,7 @@ PyTypeObject PyModule_Type = {
15631525
0, /* tp_iter */
15641526
0, /* tp_iternext */
15651527
module_methods, /* tp_methods */
1566-
0, /* tp_members */
1528+
module_members, /* tp_members */
15671529
module_getsets, /* tp_getset */
15681530
0, /* tp_base */
15691531
0, /* tp_dict */

0 commit comments

Comments
 (0)