1
1
/*
2
- * Copyright (c) 2015, 2022 , Oracle and/or its affiliates.
2
+ * Copyright (c) 2015, 2023 , Oracle and/or its affiliates.
3
3
*
4
4
* This program is free software; you can redistribute it and/or modify
5
5
* it under the terms of the GNU General Public License, version 2.0,
@@ -1651,6 +1651,7 @@ PyObject *size_of(dict::Object *self) {
1651
1651
*/
1652
1652
PyObject *clear (dict::Object *self) {
1653
1653
self->dict ->get ()->clear ();
1654
+ self->base .ma_used = 0 ;
1654
1655
Py_RETURN_NONE;
1655
1656
}
1656
1657
@@ -1712,6 +1713,11 @@ PyObject *from_keys(PyTypeObject *type, PyObject *args) {
1712
1713
}
1713
1714
}
1714
1715
1716
+ if (is_shell_dict) {
1717
+ const auto shdict = reinterpret_cast <dict::Object *>(dict.get ());
1718
+ shdict->base .ma_used = length (shdict);
1719
+ }
1720
+
1715
1721
return dict.release ();
1716
1722
}
1717
1723
@@ -1799,6 +1805,7 @@ PyObject *pop(dict::Object *self, PyObject *args) {
1799
1805
auto ret = py::convert (result->second );
1800
1806
1801
1807
self->dict ->get ()->erase (result);
1808
+ --self->base .ma_used ;
1802
1809
1803
1810
return ret.release ();
1804
1811
}
@@ -1840,6 +1847,7 @@ PyObject *pop_item(dict::Object *self) {
1840
1847
}
1841
1848
1842
1849
self->dict ->get ()->erase (item);
1850
+ --self->base .ma_used ;
1843
1851
1844
1852
return result.release ();
1845
1853
}
@@ -1866,6 +1874,7 @@ PyObject *set_default(dict::Object *self, PyObject *args) {
1866
1874
return py::convert (result->second ).release ();
1867
1875
} else {
1868
1876
self->dict ->get ()->set (key_to_find, py::convert (default_value));
1877
+ ++self->base .ma_used ;
1869
1878
1870
1879
Py_INCREF (default_value);
1871
1880
return default_value;
@@ -1893,6 +1902,7 @@ PyObject *set_default(dict::Object *self, PyObject *args) {
1893
1902
PyObject *update (dict::Object *self, PyObject *args, PyObject *kwds) {
1894
1903
try {
1895
1904
if (update (self, args, kwds, " update" )) {
1905
+ self->base .ma_used = length (self);
1896
1906
Py_RETURN_NONE;
1897
1907
}
1898
1908
} catch (const std::exception &exc) {
@@ -2023,6 +2033,7 @@ int init(dict::Object *self, PyObject *args, PyObject *kwds) {
2023
2033
2024
2034
try {
2025
2035
if (update (self, args, kwds, " Dict" )) {
2036
+ self->base .ma_used = length (self);
2026
2037
return 0 ;
2027
2038
}
2028
2039
} catch (const std::exception &exc) {
@@ -2594,6 +2605,7 @@ py::Release wrap(const Dictionary_t &map) {
2594
2605
2595
2606
assert (!wrapper->dict );
2596
2607
wrapper->dict = new Dictionary_t (map);
2608
+ wrapper->base .ma_used = length (wrapper);
2597
2609
2598
2610
return py::Release{reinterpret_cast <PyObject *>(wrapper)};
2599
2611
}
0 commit comments