|
15 | 15 | #include "pycore_bytesobject.h" // _PyBytes_Find() |
16 | 16 | #include "pycore_compile.h" // _PyCompile_CodeGen, _PyCompile_OptimizeCfg, _PyCompile_Assemble, _PyCompile_CleanDoc |
17 | 17 | #include "pycore_ceval.h" // _PyEval_AddPendingCall |
| 18 | +#include "pycore_dict.h" // _PyDictOrValues_GetValues |
18 | 19 | #include "pycore_fileutils.h" // _Py_normpath |
19 | 20 | #include "pycore_frame.h" // _PyInterpreterFrame |
20 | 21 | #include "pycore_gc.h" // PyGC_Head |
@@ -1530,6 +1531,40 @@ test_pymem_getallocatorsname(PyObject *self, PyObject *args) |
1530 | 1531 | return PyUnicode_FromString(name); |
1531 | 1532 | } |
1532 | 1533 |
|
| 1534 | +static PyObject * |
| 1535 | +get_object_dict_values(PyObject *self, PyObject *obj) |
| 1536 | +{ |
| 1537 | + PyTypeObject *type = Py_TYPE(obj); |
| 1538 | + if (!_PyType_HasFeature(type, Py_TPFLAGS_MANAGED_DICT)) { |
| 1539 | + Py_RETURN_NONE; |
| 1540 | + } |
| 1541 | + PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(obj); |
| 1542 | + if (!_PyDictOrValues_IsValues(dorv)) { |
| 1543 | + Py_RETURN_NONE; |
| 1544 | + } |
| 1545 | + PyDictValues *values = _PyDictOrValues_GetValues(dorv); |
| 1546 | + PyDictKeysObject *keys = ((PyHeapTypeObject *)type)->ht_cached_keys; |
| 1547 | + assert(keys != NULL); |
| 1548 | + int size = (int)keys->dk_nentries; |
| 1549 | + assert(size >= 0); |
| 1550 | + PyObject *res = PyTuple_New(size); |
| 1551 | + if (res == NULL) { |
| 1552 | + return NULL; |
| 1553 | + } |
| 1554 | + _Py_DECLARE_STR(anon_null, "<NULL>"); |
| 1555 | + for(int i = 0; i < size; i++) { |
| 1556 | + PyObject *item = values->values[i]; |
| 1557 | + if (item == NULL) { |
| 1558 | + item = &_Py_STR(anon_null); |
| 1559 | + } |
| 1560 | + else { |
| 1561 | + Py_INCREF(item); |
| 1562 | + } |
| 1563 | + PyTuple_SET_ITEM(res, i, item); |
| 1564 | + } |
| 1565 | + return res; |
| 1566 | +} |
| 1567 | + |
1533 | 1568 |
|
1534 | 1569 | static PyMethodDef module_functions[] = { |
1535 | 1570 | {"get_configs", get_configs, METH_NOARGS}, |
@@ -1594,6 +1629,7 @@ static PyMethodDef module_functions[] = { |
1594 | 1629 | {"check_pyobject_uninitialized_is_freed", |
1595 | 1630 | check_pyobject_uninitialized_is_freed, METH_NOARGS}, |
1596 | 1631 | {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS}, |
| 1632 | + {"get_object_dict_values", get_object_dict_values, METH_O}, |
1597 | 1633 | {NULL, NULL} /* sentinel */ |
1598 | 1634 | }; |
1599 | 1635 |
|
|
0 commit comments