mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
merge
This commit is contained in:
commit
c13516b0a0
4 changed files with 20 additions and 5 deletions
|
@ -484,6 +484,7 @@ PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *,
|
|||
PyObject *, PyObject *);
|
||||
#ifndef Py_LIMITED_API
|
||||
PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
|
||||
PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
|
||||
PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *);
|
||||
PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *);
|
||||
#endif
|
||||
|
|
|
@ -58,6 +58,9 @@ Library
|
|||
integer (as in Python 2). Au_read and Au_write now correctly works with file
|
||||
object if start file position is not a zero.
|
||||
|
||||
- Issue #18594: The fast path for collections.Counter() was never taken
|
||||
due to an over-restrictive type check.
|
||||
|
||||
- Issue #19053: ZipExtFile.read1() with non-zero argument no more returns empty
|
||||
bytes until end of data.
|
||||
|
||||
|
|
|
@ -1763,10 +1763,16 @@ Count elements in the iterable, updating the mappping");
|
|||
static PyObject *
|
||||
_count_elements(PyObject *self, PyObject *args)
|
||||
{
|
||||
_Py_IDENTIFIER(__getitem__);
|
||||
_Py_IDENTIFIER(__setitem__);
|
||||
PyObject *it, *iterable, *mapping, *oldval;
|
||||
PyObject *newval = NULL;
|
||||
PyObject *key = NULL;
|
||||
PyObject *one = NULL;
|
||||
PyObject *mapping_getitem;
|
||||
PyObject *mapping_setitem;
|
||||
PyObject *dict_getitem;
|
||||
PyObject *dict_setitem;
|
||||
|
||||
if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
|
||||
return NULL;
|
||||
|
@ -1781,7 +1787,15 @@ _count_elements(PyObject *self, PyObject *args)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (PyDict_CheckExact(mapping)) {
|
||||
mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__);
|
||||
dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__);
|
||||
mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
|
||||
dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
|
||||
|
||||
if (mapping_getitem != NULL &&
|
||||
mapping_getitem == dict_getitem &&
|
||||
mapping_setitem != NULL &&
|
||||
mapping_setitem == dict_setitem) {
|
||||
while (1) {
|
||||
key = PyIter_Next(it);
|
||||
if (key == NULL)
|
||||
|
|
|
@ -49,9 +49,6 @@ _Py_IDENTIFIER(__module__);
|
|||
_Py_IDENTIFIER(__name__);
|
||||
_Py_IDENTIFIER(__new__);
|
||||
|
||||
static PyObject *
|
||||
_PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name);
|
||||
|
||||
static PyObject *
|
||||
slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
|
||||
|
||||
|
@ -2620,7 +2617,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
|
|||
return res;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
PyObject *
|
||||
_PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name)
|
||||
{
|
||||
PyObject *oname;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue