self.assertNotIn("_LOAD_ATTR_METHOD_NO_DICT", uops)
self.assertNotIn("_LOAD_ATTR_METHOD_LAZY_DICT", uops)
+ def test_cached_attributes_fixed_version_tag(self):
+ def f(n):
+ c = 1
+ x = 0
+ for _ in range(n):
+ x += c.bit_length()
+ return x
+
+ res, ex = self._run_with_optimizer(f, TIER2_THRESHOLD)
+ self.assertIsNotNone(ex)
+ self.assertEqual(res, TIER2_THRESHOLD)
+ uops = get_opnames(ex)
+ self.assertNotIn("_LOAD_ATTR_METHOD_NO_DICT", uops)
+
def test_store_fast_refcount_elimination(self):
def foo(x):
# Since x is known to be
#ifdef Py_GIL_DISABLED
return NULL;
#else
+ switch (version) {
+ case _Py_TYPE_VERSION_INT:
+ return &PyLong_Type;
+ case _Py_TYPE_VERSION_FLOAT:
+ return &PyFloat_Type;
+ case _Py_TYPE_VERSION_LIST:
+ return &PyList_Type;
+ case _Py_TYPE_VERSION_TUPLE:
+ return &PyTuple_Type;
+ case _Py_TYPE_VERSION_STR:
+ return &PyUnicode_Type;
+ case _Py_TYPE_VERSION_SET:
+ return &PySet_Type;
+ case _Py_TYPE_VERSION_FROZEN_SET:
+ return &PyFrozenSet_Type;
+ case _Py_TYPE_VERSION_DICT:
+ return &PyDict_Type;
+ case _Py_TYPE_VERSION_BYTEARRAY:
+ return &PyByteArray_Type;
+ case _Py_TYPE_VERSION_BYTES:
+ return &PyBytes_Type;
+ case _Py_TYPE_VERSION_COMPLEX:
+ return &PyComplex_Type;
+ case _Py_TYPE_VERSION_FROZENDICT:
+ return &PyFrozenDict_Type;
+ default:
+ break;
+ }
+
PyInterpreterState *interp = _PyInterpreterState_GET();
PyTypeObject **slot =
interp->types.type_version_cache