extern PyObject* _Py_slot_tp_getattro(PyObject *self, PyObject *name);
extern PyObject* _Py_slot_tp_getattr_hook(PyObject *self, PyObject *name);
+extern int _PyType_HasSlotTpIternext(PyTypeObject *type);
+
extern PyTypeObject _PyBufferWrapper_Type;
PyAPI_FUNC(PyObject*) _PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj,
ex = get_first_executor(testfunc)
self.assertIsNotNone(ex)
uops = get_opnames(ex)
- self.assertIn("_ITER_NEXT_INLINE", uops)
+ self.assertIn("_FOR_ITER_TIER_TWO", uops)
+ self.assertNotIn("_ITER_NEXT_INLINE", uops)
@requires_specialization
return vectorcall_method(&_Py_ID(__next__), stack, 1);
}
+int
+_PyType_HasSlotTpIternext(PyTypeObject *type)
+{
+ return type->tp_iternext == slot_tp_iternext;
+}
+
static PyObject *
slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
{
#include "pycore_long.h"
#include "pycore_opcode_utils.h"
#include "pycore_optimizer.h"
+#include "pycore_typeobject.h"
#include "pycore_uops.h"
#include "pycore_uop_ids.h"
#include "internal/pycore_moduleobject.h"
type = sym_get_probable_type(iter);
definite = false;
}
- if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL) {
+ if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL
+ && !_PyType_HasSlotTpIternext(type)) {
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
_Py_BloomFilter_Add(dependencies, type);
if (!definite) {
type = sym_get_probable_type(iter);
definite = false;
}
- if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL) {
+ if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL
+ && !_PyType_HasSlotTpIternext(type)) {
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
_Py_BloomFilter_Add(dependencies, type);
if (!definite) {