mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
bpo-46131: add fastpath for PyFloat_Check() (#30200)
This commit is contained in:
parent
aeb9ef4c72
commit
2ef06d4125
7 changed files with 23 additions and 0 deletions
|
@ -1145,6 +1145,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
|
||||||
.. XXX Document more flags here?
|
.. XXX Document more flags here?
|
||||||
|
|
||||||
|
|
||||||
|
.. data:: Py_TPFLAGS_FLOAT_SUBCLASS
|
||||||
.. data:: Py_TPFLAGS_LONG_SUBCLASS
|
.. data:: Py_TPFLAGS_LONG_SUBCLASS
|
||||||
.. data:: Py_TPFLAGS_LIST_SUBCLASS
|
.. data:: Py_TPFLAGS_LIST_SUBCLASS
|
||||||
.. data:: Py_TPFLAGS_TUPLE_SUBCLASS
|
.. data:: Py_TPFLAGS_TUPLE_SUBCLASS
|
||||||
|
|
|
@ -14,6 +14,8 @@ extern "C" {
|
||||||
PyAPI_DATA(PyTypeObject) PyFloat_Type;
|
PyAPI_DATA(PyTypeObject) PyFloat_Type;
|
||||||
|
|
||||||
#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
|
#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
|
||||||
|
#define PyFloat_Check(op) \
|
||||||
|
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_FLOAT_SUBCLASS)
|
||||||
#define PyFloat_CheckExact(op) Py_IS_TYPE(op, &PyFloat_Type)
|
#define PyFloat_CheckExact(op) Py_IS_TYPE(op, &PyFloat_Type)
|
||||||
|
|
||||||
#ifdef Py_NAN
|
#ifdef Py_NAN
|
||||||
|
|
|
@ -397,6 +397,7 @@ given type object has a specified feature.
|
||||||
#define _Py_TPFLAGS_MATCH_SELF (1UL << 22)
|
#define _Py_TPFLAGS_MATCH_SELF (1UL << 22)
|
||||||
|
|
||||||
/* These flags are used to determine if a type is a subclass. */
|
/* These flags are used to determine if a type is a subclass. */
|
||||||
|
#define Py_TPFLAGS_FLOAT_SUBCLASS (1UL << 23)
|
||||||
#define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24)
|
#define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24)
|
||||||
#define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25)
|
#define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25)
|
||||||
#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26)
|
#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add a fast path for ``PyFloat_Check`` via a ``Py_TPFLAGS_FLOAT_SUBCLASS``
|
||||||
|
flag.
|
|
@ -1959,6 +1959,7 @@ PyTypeObject PyFloat_Type = {
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
|
||||||
|
Py_TPFLAGS_FLOAT_SUBCLASS |
|
||||||
_Py_TPFLAGS_MATCH_SELF, /* tp_flags */
|
_Py_TPFLAGS_MATCH_SELF, /* tp_flags */
|
||||||
float_new__doc__, /* tp_doc */
|
float_new__doc__, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
0, /* tp_traverse */
|
||||||
|
|
|
@ -5783,6 +5783,9 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
|
||||||
else if (PyType_IsSubtype(base, &PyDict_Type)) {
|
else if (PyType_IsSubtype(base, &PyDict_Type)) {
|
||||||
type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
|
type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
|
||||||
}
|
}
|
||||||
|
else if (PyType_IsSubtype(base, &PyFloat_Type)) {
|
||||||
|
type->tp_flags |= Py_TPFLAGS_FLOAT_SUBCLASS;
|
||||||
|
}
|
||||||
if (PyType_HasFeature(base, _Py_TPFLAGS_MATCH_SELF)) {
|
if (PyType_HasFeature(base, _Py_TPFLAGS_MATCH_SELF)) {
|
||||||
type->tp_flags |= _Py_TPFLAGS_MATCH_SELF;
|
type->tp_flags |= _Py_TPFLAGS_MATCH_SELF;
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ _is_pep393 = None
|
||||||
|
|
||||||
Py_TPFLAGS_MANAGED_DICT = (1 << 4)
|
Py_TPFLAGS_MANAGED_DICT = (1 << 4)
|
||||||
Py_TPFLAGS_HEAPTYPE = (1 << 9)
|
Py_TPFLAGS_HEAPTYPE = (1 << 9)
|
||||||
|
Py_TPFLAGS_FLOAT_SUBCLASS = (1 << 23)
|
||||||
Py_TPFLAGS_LONG_SUBCLASS = (1 << 24)
|
Py_TPFLAGS_LONG_SUBCLASS = (1 << 24)
|
||||||
Py_TPFLAGS_LIST_SUBCLASS = (1 << 25)
|
Py_TPFLAGS_LIST_SUBCLASS = (1 << 25)
|
||||||
Py_TPFLAGS_TUPLE_SUBCLASS = (1 << 26)
|
Py_TPFLAGS_TUPLE_SUBCLASS = (1 << 26)
|
||||||
|
@ -379,6 +380,8 @@ class PyObjectPtr(object):
|
||||||
if tp_flags & Py_TPFLAGS_HEAPTYPE:
|
if tp_flags & Py_TPFLAGS_HEAPTYPE:
|
||||||
return HeapTypeObjectPtr
|
return HeapTypeObjectPtr
|
||||||
|
|
||||||
|
if tp_flags & Py_TPFLAGS_FLOAT_SUBCLASS:
|
||||||
|
return PyFloatObjectPtr
|
||||||
if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
|
if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
|
||||||
return PyLongObjectPtr
|
return PyLongObjectPtr
|
||||||
if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
|
if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
|
||||||
|
@ -910,6 +913,16 @@ class PyNoneStructPtr(PyObjectPtr):
|
||||||
def proxyval(self, visited):
|
def proxyval(self, visited):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
class PyFloatObjectPtr(PyObjectPtr):
|
||||||
|
_typename = 'PyFloatObject'
|
||||||
|
|
||||||
|
def proxyval(self, visited):
|
||||||
|
return self.field('ob_fval')
|
||||||
|
|
||||||
|
def write_repr(self, out, visited):
|
||||||
|
proxy = self.proxyval(visited)
|
||||||
|
out.write("%s" % proxy)
|
||||||
|
|
||||||
class PyFrameObjectPtr(PyObjectPtr):
|
class PyFrameObjectPtr(PyObjectPtr):
|
||||||
_typename = 'PyFrameObject'
|
_typename = 'PyFrameObject'
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue