}
static inline PyDictValues*
-new_values(Py_ssize_t size)
+new_values(size_t size)
{
- assert(size > 0);
+ assert(size >= 1);
size_t prefix_size = _Py_SIZE_ROUND_UP(size+2, sizeof(PyObject *));
assert(prefix_size < 256);
size_t n = prefix_size + size * sizeof(PyObject *);
return (PyObject *)mp;
}
-static inline Py_ssize_t
+static inline size_t
shared_keys_usable_size(PyDictKeysObject *keys)
{
- return keys->dk_nentries + keys->dk_usable;
+ return (size_t)keys->dk_nentries + (size_t)keys->dk_usable;
}
/* Consumes a reference to the keys object */
static PyObject *
new_dict_with_shared_keys(PyDictKeysObject *keys)
{
- PyDictValues *values;
- Py_ssize_t i, size;
-
- size = shared_keys_usable_size(keys);
- values = new_values(size);
+ size_t size = shared_keys_usable_size(keys);
+ PyDictValues *values = new_values(size);
if (values == NULL) {
dictkeys_decref(keys);
return PyErr_NoMemory();
}
((char *)values)[-2] = 0;
- for (i = 0; i < size; i++) {
+ for (size_t i = 0; i < size; i++) {
values->values[i] = NULL;
}
return new_dict(keys, values, 0, 1);
assert(orig->ma_values == NULL);
assert(orig->ma_keys->dk_refcnt == 1);
- Py_ssize_t keys_size = _PyDict_KeysSize(orig->ma_keys);
+ size_t keys_size = _PyDict_KeysSize(orig->ma_keys);
PyDictKeysObject *keys = PyObject_Malloc(keys_size);
if (keys == NULL) {
PyErr_NoMemory();
{
PyObject *copy;
PyDictObject *mp;
- Py_ssize_t i, n;
if (o == NULL || !PyDict_Check(o)) {
PyErr_BadInternalCall();
if (_PyDict_HasSplitTable(mp)) {
PyDictObject *split_copy;
- Py_ssize_t size = shared_keys_usable_size(mp->ma_keys);
- PyDictValues *newvalues;
- newvalues = new_values(size);
+ size_t size = shared_keys_usable_size(mp->ma_keys);
+ PyDictValues *newvalues = new_values(size);
if (newvalues == NULL)
return PyErr_NoMemory();
split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
split_copy->ma_used = mp->ma_used;
split_copy->ma_version_tag = DICT_NEXT_VERSION();
dictkeys_incref(mp->ma_keys);
- for (i = 0, n = size; i < n; i++) {
+ for (size_t i = 0; i < size; i++) {
PyObject *value = mp->ma_values->values[i];
split_copy->ma_values->values[i] = Py_XNewRef(value);
}
Py_ssize_t
_PyDict_SizeOf(PyDictObject *mp)
{
- Py_ssize_t res;
-
- res = _PyObject_SIZE(Py_TYPE(mp));
+ size_t res = _PyObject_SIZE(Py_TYPE(mp));
if (mp->ma_values) {
res += shared_keys_usable_size(mp->ma_keys) * sizeof(PyObject*);
}
if (mp->ma_keys->dk_refcnt == 1) {
res += _PyDict_KeysSize(mp->ma_keys);
}
- return res;
+ assert(res <= (size_t)PY_SSIZE_T_MAX);
+ return (Py_ssize_t)res;
}
-Py_ssize_t
+size_t
_PyDict_KeysSize(PyDictKeysObject *keys)
{
- size_t es = keys->dk_kind == DICT_KEYS_GENERAL
- ? sizeof(PyDictKeyEntry) : sizeof(PyDictUnicodeEntry);
- return (sizeof(PyDictKeysObject)
- + ((size_t)1 << keys->dk_log2_index_bytes)
- + USABLE_FRACTION(DK_SIZE(keys)) * es);
+ size_t es = (keys->dk_kind == DICT_KEYS_GENERAL
+ ? sizeof(PyDictKeyEntry) : sizeof(PyDictUnicodeEntry));
+ size_t size = sizeof(PyDictKeysObject);
+ size += (size_t)1 << keys->dk_log2_index_bytes;
+ size += USABLE_FRACTION((size_t)DK_SIZE(keys)) * es;
+ return size;
}
static PyObject *
if (keys->dk_usable > 1) {
keys->dk_usable--;
}
- Py_ssize_t size = shared_keys_usable_size(keys);
- assert(size > 0);
+ size_t size = shared_keys_usable_size(keys);
PyDictValues *values = new_values(size);
if (values == NULL) {
PyErr_NoMemory();
return -1;
}
- assert(((uint8_t *)values)[-1] >= size+2);
+ assert(((uint8_t *)values)[-1] >= (size + 2));
((uint8_t *)values)[-2] = 0;
- for (int i = 0; i < size; i++) {
+ for (size_t i = 0; i < size; i++) {
values->values[i] = NULL;
}
_PyDictOrValues_SetValues(_PyObject_DictOrValuesPointer(obj), values);
dictkeys_incref(keys);
Py_ssize_t used = 0;
Py_ssize_t track = 0;
- for (Py_ssize_t i = 0; i < shared_keys_usable_size(keys); i++) {
+ size_t size = shared_keys_usable_size(keys);
+ for (size_t i = 0; i < size; i++) {
PyObject *val = values->values[i];
if (val != NULL) {
used += 1;