mirror of https://github.com/python/cpython
GH-115775: Use `__static_attributes__` to initialize shared keys (GH-118468)
This commit is contained in:
parent
fe85a8291d
commit
89328f7b12
|
@ -83,7 +83,7 @@ typedef struct {
|
||||||
PyObject *me_value; /* This field is only meaningful for combined tables */
|
PyObject *me_value; /* This field is only meaningful for combined tables */
|
||||||
} PyDictUnicodeEntry;
|
} PyDictUnicodeEntry;
|
||||||
|
|
||||||
extern PyDictKeysObject *_PyDict_NewKeysForClass(void);
|
extern PyDictKeysObject *_PyDict_NewKeysForClass(PyHeapTypeObject *);
|
||||||
extern PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *);
|
extern PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *);
|
||||||
|
|
||||||
/* Gets a version number unique to the current state of the keys of dict, if possible.
|
/* Gets a version number unique to the current state of the keys of dict, if possible.
|
||||||
|
|
|
@ -6559,9 +6559,10 @@ dictvalues_reversed(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
/* Returns NULL if cannot allocate a new PyDictKeysObject,
|
/* Returns NULL if cannot allocate a new PyDictKeysObject,
|
||||||
but does not set an error */
|
but does not set an error */
|
||||||
PyDictKeysObject *
|
PyDictKeysObject *
|
||||||
_PyDict_NewKeysForClass(void)
|
_PyDict_NewKeysForClass(PyHeapTypeObject *cls)
|
||||||
{
|
{
|
||||||
PyInterpreterState *interp = _PyInterpreterState_GET();
|
PyInterpreterState *interp = _PyInterpreterState_GET();
|
||||||
|
|
||||||
PyDictKeysObject *keys = new_keys_object(
|
PyDictKeysObject *keys = new_keys_object(
|
||||||
interp, NEXT_LOG2_SHARED_KEYS_MAX_SIZE, 1);
|
interp, NEXT_LOG2_SHARED_KEYS_MAX_SIZE, 1);
|
||||||
if (keys == NULL) {
|
if (keys == NULL) {
|
||||||
|
@ -6573,6 +6574,20 @@ _PyDict_NewKeysForClass(void)
|
||||||
keys->dk_usable = SHARED_KEYS_MAX_SIZE;
|
keys->dk_usable = SHARED_KEYS_MAX_SIZE;
|
||||||
keys->dk_kind = DICT_KEYS_SPLIT;
|
keys->dk_kind = DICT_KEYS_SPLIT;
|
||||||
}
|
}
|
||||||
|
if (cls->ht_type.tp_dict) {
|
||||||
|
PyObject *attrs = PyDict_GetItem(cls->ht_type.tp_dict, &_Py_ID(__static_attributes__));
|
||||||
|
if (attrs != NULL && PyTuple_Check(attrs)) {
|
||||||
|
for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(attrs); i++) {
|
||||||
|
PyObject *key = PyTuple_GET_ITEM(attrs, i);
|
||||||
|
Py_hash_t hash;
|
||||||
|
if (PyUnicode_CheckExact(key) && (hash = unicode_get_hash(key)) != -1) {
|
||||||
|
if (insert_split_key(keys, key, hash) == DKIX_EMPTY) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8334,7 +8334,7 @@ type_ready_managed_dict(PyTypeObject *type)
|
||||||
}
|
}
|
||||||
PyHeapTypeObject* et = (PyHeapTypeObject*)type;
|
PyHeapTypeObject* et = (PyHeapTypeObject*)type;
|
||||||
if (et->ht_cached_keys == NULL) {
|
if (et->ht_cached_keys == NULL) {
|
||||||
et->ht_cached_keys = _PyDict_NewKeysForClass();
|
et->ht_cached_keys = _PyDict_NewKeysForClass(et);
|
||||||
if (et->ht_cached_keys == NULL) {
|
if (et->ht_cached_keys == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue