|
23 | 23 | (assert(PyModule_Check(op)), _Py_CAST(PyModuleObject*, (op))) |
24 | 24 |
|
25 | 25 |
|
| 26 | +static PyMemberDef module_members[] = { |
| 27 | + {"__dict__", _Py_T_OBJECT, offsetof(PyModuleObject, md_dict), Py_READONLY}, |
| 28 | + {0} |
| 29 | +}; |
| 30 | + |
26 | 31 | PyTypeObject PyModuleDef_Type = { |
27 | 32 | PyVarObject_HEAD_INIT(&PyType_Type, 0) |
28 | 33 | "moduledef", /* tp_name */ |
@@ -1484,52 +1489,9 @@ module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored) |
1484 | 1489 | return ret; |
1485 | 1490 | } |
1486 | 1491 |
|
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 | | - |
1529 | 1492 | static PyGetSetDef module_getsets[] = { |
1530 | 1493 | {"__annotations__", module_get_annotations, module_set_annotations}, |
1531 | 1494 | {"__annotate__", module_get_annotate, module_set_annotate}, |
1532 | | - {"__dict__", (getter)module_get_dict, NULL}, |
1533 | 1495 | {NULL} |
1534 | 1496 | }; |
1535 | 1497 |
|
@@ -1563,7 +1525,7 @@ PyTypeObject PyModule_Type = { |
1563 | 1525 | 0, /* tp_iter */ |
1564 | 1526 | 0, /* tp_iternext */ |
1565 | 1527 | module_methods, /* tp_methods */ |
1566 | | - 0, /* tp_members */ |
| 1528 | + module_members, /* tp_members */ |
1567 | 1529 | module_getsets, /* tp_getset */ |
1568 | 1530 | 0, /* tp_base */ |
1569 | 1531 | 0, /* tp_dict */ |
|
0 commit comments