#define LOAD_KEYS_NENTRIES(keys) _Py_atomic_load_ssize_relaxed(&keys->dk_nentries)
#define INCREF_KEYS_FT(dk) dictkeys_incref(dk)
-#define DECREF_KEYS_FT(dk, shared) dictkeys_decref(_PyInterpreterState_GET(), dk, shared)
+#define DECREF_KEYS_FT(dk, shared) dictkeys_decref(dk, shared)
static inline void split_keys_entry_added(PyDictKeysObject *keys)
{
*/
-static int dictresize(PyInterpreterState *interp, PyDictObject *mp,
- uint8_t log_newsize, int unicode);
+static int dictresize(PyDictObject *mp, uint8_t log_newsize, int unicode);
static PyObject* dict_iter(PyObject *dict);
}
static inline void
-dictkeys_decref(PyInterpreterState *interp, PyDictKeysObject *dk, bool use_qsbr)
+dictkeys_decref(PyDictKeysObject *dk, bool use_qsbr)
{
if (FT_ATOMIC_LOAD_SSIZE_RELAXED(dk->dk_refcnt) < 0) {
assert(FT_ATOMIC_LOAD_SSIZE_RELAXED(dk->dk_refcnt) == _Py_DICT_IMMORTAL_INITIAL_REFCNT);
static PyDictKeysObject*
-new_keys_object(PyInterpreterState *interp, uint8_t log2_size, bool unicode)
+new_keys_object(uint8_t log2_size, bool unicode)
{
Py_ssize_t usable;
int log2_bytes;
/* Consumes a reference to the keys object */
static PyObject *
-new_dict(PyInterpreterState *interp,
- PyDictKeysObject *keys, PyDictValues *values,
+new_dict(PyDictKeysObject *keys, PyDictValues *values,
Py_ssize_t used, int free_values_on_failure)
{
assert(keys != NULL);
if (mp == NULL) {
mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
if (mp == NULL) {
- dictkeys_decref(interp, keys, false);
+ dictkeys_decref(keys, false);
if (free_values_on_failure) {
free_values(values, false);
}
}
static PyObject *
-new_dict_with_shared_keys(PyInterpreterState *interp, PyDictKeysObject *keys)
+new_dict_with_shared_keys(PyDictKeysObject *keys)
{
size_t size = shared_keys_usable_size(keys);
PyDictValues *values = new_values(size);
for (size_t i = 0; i < size; i++) {
values->values[i] = NULL;
}
- return new_dict(interp, keys, values, 0, 1);
+ return new_dict(keys, values, 0, 1);
}
PyObject *
PyDict_New(void)
{
- PyInterpreterState *interp = _PyInterpreterState_GET();
/* We don't incref Py_EMPTY_KEYS here because it is immortal. */
- return new_dict(interp, Py_EMPTY_KEYS, NULL, 0, 0);
+ return new_dict(Py_EMPTY_KEYS, NULL, 0, 0);
}
/* Search index of hash table from offset of entry table */
}
static int
-insertion_resize(PyInterpreterState *interp, PyDictObject *mp, int unicode)
+insertion_resize(PyDictObject *mp, int unicode)
{
- return dictresize(interp, mp, calculate_log2_keysize(GROWTH_RATE(mp)), unicode);
+ return dictresize(mp, calculate_log2_keysize(GROWTH_RATE(mp)), unicode);
}
static inline int
{
if (mp->ma_keys->dk_usable <= 0) {
/* Need to resize. */
- if (insertion_resize(interp, mp, 1) < 0) {
+ if (insertion_resize(mp, 1) < 0) {
return -1;
}
}
ASSERT_DICT_LOCKED(mp);
if (DK_IS_UNICODE(mp->ma_keys) && !PyUnicode_CheckExact(key)) {
- if (insertion_resize(interp, mp, 0) < 0)
+ if (insertion_resize(mp, 0) < 0)
goto Fail;
assert(mp->ma_keys->dk_kind == DICT_KEYS_GENERAL);
}
}
/* No space in shared keys. Resize and continue below. */
- if (insertion_resize(interp, mp, 1) < 0) {
+ if (insertion_resize(mp, 1) < 0) {
goto Fail;
}
}
ASSERT_DICT_LOCKED(mp);
int unicode = PyUnicode_CheckExact(key);
- PyDictKeysObject *newkeys = new_keys_object(
- interp, PyDict_LOG_MINSIZE, unicode);
+ PyDictKeysObject *newkeys = new_keys_object(PyDict_LOG_MINSIZE, unicode);
if (newkeys == NULL) {
Py_DECREF(key);
Py_DECREF(value);
- Generic -> Generic
*/
static int
-dictresize(PyInterpreterState *interp, PyDictObject *mp,
+dictresize(PyDictObject *mp,
uint8_t log2_newsize, int unicode)
{
PyDictKeysObject *oldkeys, *newkeys;
*/
/* Allocate a new table. */
- newkeys = new_keys_object(interp, log2_newsize, unicode);
+ newkeys = new_keys_object(log2_newsize, unicode);
if (newkeys == NULL) {
return -1;
}
}
UNLOCK_KEYS(oldkeys);
set_keys(mp, newkeys);
- dictkeys_decref(interp, oldkeys, IS_DICT_SHARED(mp));
+ dictkeys_decref(oldkeys, IS_DICT_SHARED(mp));
set_values(mp, NULL);
if (oldvalues->embedded) {
assert(oldvalues->embedded == 1);
}
static PyObject *
-dict_new_presized(PyInterpreterState *interp, Py_ssize_t minused, bool unicode)
+dict_new_presized(Py_ssize_t minused, bool unicode)
{
const uint8_t log2_max_presize = 17;
const Py_ssize_t max_presize = ((Py_ssize_t)1) << log2_max_presize;
log2_newsize = estimate_log2_keysize(minused);
}
- new_keys = new_keys_object(interp, log2_newsize, unicode);
+ new_keys = new_keys_object(log2_newsize, unicode);
if (new_keys == NULL)
return NULL;
- return new_dict(interp, new_keys, NULL, 0, 0);
+ return new_dict(new_keys, NULL, 0, 0);
}
PyObject *
_PyDict_NewPresized(Py_ssize_t minused)
{
- PyInterpreterState *interp = _PyInterpreterState_GET();
- return dict_new_presized(interp, minused, false);
+ return dict_new_presized(minused, false);
}
PyObject *
{
bool unicode = true;
PyObject *const *ks = keys;
- PyInterpreterState *interp = _PyInterpreterState_GET();
for (Py_ssize_t i = 0; i < length; i++) {
if (!PyUnicode_CheckExact(*ks)) {
ks += keys_offset;
}
- PyObject *dict = dict_new_presized(interp, length, unicode);
+ PyObject *dict = dict_new_presized(length, unicode);
if (dict == NULL) {
return NULL;
}
if (oldvalues == NULL) {
set_keys(mp, Py_EMPTY_KEYS);
assert(oldkeys->dk_refcnt == 1);
- dictkeys_decref(interp, oldkeys, IS_DICT_SHARED(mp));
+ dictkeys_decref(oldkeys, IS_DICT_SHARED(mp));
}
else {
n = oldkeys->dk_nentries;
set_values(mp, NULL);
set_keys(mp, Py_EMPTY_KEYS);
free_values(oldvalues, IS_DICT_SHARED(mp));
- dictkeys_decref(interp, oldkeys, false);
+ dictkeys_decref(oldkeys, false);
}
}
ASSERT_CONSISTENT(mp);
uint8_t new_size = Py_MAX(
estimate_log2_keysize(PyDict_GET_SIZE(iterable)),
DK_LOG_SIZE(mp->ma_keys));
- if (dictresize(interp, mp, new_size, unicode)) {
+ if (dictresize(mp, new_size, unicode)) {
Py_DECREF(mp);
return NULL;
}
uint8_t new_size = Py_MAX(
estimate_log2_keysize(PySet_GET_SIZE(iterable)),
DK_LOG_SIZE(mp->ma_keys));
- if (dictresize(interp, mp, new_size, 0)) {
+ if (dictresize(mp, new_size, 0)) {
Py_DECREF(mp);
return NULL;
}
}
free_values(values, false);
}
- dictkeys_decref(interp, keys, false);
+ dictkeys_decref(keys, false);
}
else if (keys != NULL) {
assert(keys->dk_refcnt == 1 || keys == Py_EMPTY_KEYS);
- dictkeys_decref(interp, keys, false);
+ dictkeys_decref(keys, false);
}
if (Py_IS_TYPE(mp, &PyDict_Type)) {
_Py_FREELIST_FREE(dicts, mp, Py_TYPE(mp)->tp_free);
return -1;
ensure_shared_on_resize(mp);
- dictkeys_decref(interp, mp->ma_keys, IS_DICT_SHARED(mp));
+ dictkeys_decref(mp->ma_keys, IS_DICT_SHARED(mp));
set_keys(mp, keys);
STORE_USED(mp, other->ma_used);
ASSERT_CONSISTENT(mp);
*/
if (USABLE_FRACTION(DK_SIZE(mp->ma_keys)) < other->ma_used) {
int unicode = DK_IS_UNICODE(other->ma_keys);
- if (dictresize(interp, mp,
- estimate_log2_keysize(mp->ma_used + other->ma_used),
+ if (dictresize(mp, estimate_log2_keysize(mp->ma_used + other->ma_used),
unicode)) {
return -1;
}
if (keys == NULL) {
return NULL;
}
- PyDictObject *new = (PyDictObject *)new_dict(interp, keys, NULL, 0, 0);
+ PyDictObject *new = (PyDictObject *)new_dict(keys, NULL, 0, 0);
if (new == NULL) {
/* In case of an error, `new_dict()` takes care of
cleaning up `keys`. */
}
if (!PyUnicode_CheckExact(key) && DK_IS_UNICODE(mp->ma_keys)) {
- if (insertion_resize(interp, mp, 0) < 0) {
+ if (insertion_resize(mp, 0) < 0) {
if (result) {
*result = NULL;
}
}
/* No space in shared keys. Resize and continue below. */
- if (insertion_resize(interp, mp, 1) < 0) {
+ if (insertion_resize(mp, 1) < 0) {
goto error;
}
}
}
/* Convert split table to combined table */
if (_PyDict_HasSplitTable(self)) {
- if (dictresize(interp, self, DK_LOG_SIZE(self->ma_keys), 1) < 0) {
+ if (dictresize(self, DK_LOG_SIZE(self->ma_keys), 1) < 0) {
Py_DECREF(res);
return NULL;
}
PyDictKeysObject *
_PyDict_NewKeysForClass(PyHeapTypeObject *cls)
{
- PyInterpreterState *interp = _PyInterpreterState_GET();
-
- PyDictKeysObject *keys = new_keys_object(
- interp, NEXT_LOG2_SHARED_KEYS_MAX_SIZE, 1);
+ PyDictKeysObject *keys = new_keys_object(NEXT_LOG2_SHARED_KEYS_MAX_SIZE, 1);
if (keys == NULL) {
PyErr_Clear();
}
}
static PyDictObject *
-make_dict_from_instance_attributes(PyInterpreterState *interp,
- PyDictKeysObject *keys, PyDictValues *values)
+make_dict_from_instance_attributes(PyDictKeysObject *keys, PyDictValues *values)
{
dictkeys_incref(keys);
Py_ssize_t used = 0;
used += 1;
}
}
- PyDictObject *res = (PyDictObject *)new_dict(interp, keys, values, used, 0);
+ PyDictObject *res = (PyDictObject *)new_dict(keys, values, used, 0);
return res;
}
PyDictValues *values = _PyObject_InlineValues(obj);
PyDictObject *dict;
if (values->valid) {
- PyInterpreterState *interp = _PyInterpreterState_GET();
PyDictKeysObject *keys = CACHED_KEYS(Py_TYPE(obj));
- dict = make_dict_from_instance_attributes(interp, keys, values);
+ dict = make_dict_from_instance_attributes(keys, values);
}
else {
dict = (PyDictObject *)PyDict_New();
if (dict == NULL) {
// Make the dict but don't publish it in the object
// so that no one else will see it.
- dict = make_dict_from_instance_attributes(PyInterpreterState_Get(), keys, values);
+ dict = make_dict_from_instance_attributes(keys, values);
if (dict == NULL ||
_PyDict_SetItem_LockHeld(dict, name, value) < 0) {
Py_XDECREF(dict);
"clearing an object managed dict");
/* Clear the dict */
Py_BEGIN_CRITICAL_SECTION(dict);
- PyInterpreterState *interp = _PyInterpreterState_GET();
PyDictKeysObject *oldkeys = dict->ma_keys;
set_keys(dict, Py_EMPTY_KEYS);
dict->ma_values = NULL;
- dictkeys_decref(interp, oldkeys, IS_DICT_SHARED(dict));
+ dictkeys_decref(oldkeys, IS_DICT_SHARED(dict));
STORE_USED(dict, 0);
clear_inline_values(_PyObject_InlineValues(obj));
Py_END_CRITICAL_SECTION();
goto done;
}
#endif
- dict = (PyDictObject *)new_dict_with_shared_keys(_PyInterpreterState_GET(),
- CACHED_KEYS(tp));
+ dict = (PyDictObject *)new_dict_with_shared_keys(CACHED_KEYS(tp));
FT_ATOMIC_STORE_PTR_RELEASE(_PyObject_ManagedDictPointer(obj)->dict,
(PyDictObject *)dict);
#endif
PyTypeObject *tp = Py_TYPE(obj);
if (_PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
- PyInterpreterState *interp = _PyInterpreterState_GET();
assert(!_PyType_HasFeature(tp, Py_TPFLAGS_INLINE_VALUES));
- dict = new_dict_with_shared_keys(interp, cached);
+ dict = new_dict_with_shared_keys(cached);
}
else {
dict = PyDict_New();
void
_PyDictKeys_DecRef(PyDictKeysObject *keys)
{
- PyInterpreterState *interp = _PyInterpreterState_GET();
- dictkeys_decref(interp, keys, false);
+ dictkeys_decref(keys, false);
}
static inline uint32_t