Skip to content

Commit

Permalink
bpo-46131: add fastpath for PyFloat_Check() (#30200)
Browse files Browse the repository at this point in the history
  • Loading branch information
mattip committed Dec 19, 2021
1 parent aeb9ef4 commit 2ef06d4
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 0 deletions.
1 change: 1 addition & 0 deletions Doc/c-api/typeobj.rst
Expand Up @@ -1145,6 +1145,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
.. XXX Document more flags here?
.. data:: Py_TPFLAGS_FLOAT_SUBCLASS
.. data:: Py_TPFLAGS_LONG_SUBCLASS
.. data:: Py_TPFLAGS_LIST_SUBCLASS
.. data:: Py_TPFLAGS_TUPLE_SUBCLASS
Expand Down
2 changes: 2 additions & 0 deletions Include/floatobject.h
Expand Up @@ -14,6 +14,8 @@ extern "C" {
PyAPI_DATA(PyTypeObject) 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)

#ifdef Py_NAN
Expand Down
1 change: 1 addition & 0 deletions Include/object.h
Expand Up @@ -397,6 +397,7 @@ given type object has a specified feature.
#define _Py_TPFLAGS_MATCH_SELF (1UL << 22)

/* 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_LIST_SUBCLASS (1UL << 25)
#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26)
Expand Down
@@ -0,0 +1,2 @@
Add a fast path for ``PyFloat_Check`` via a ``Py_TPFLAGS_FLOAT_SUBCLASS``
flag.
1 change: 1 addition & 0 deletions Objects/floatobject.c
Expand Up @@ -1959,6 +1959,7 @@ PyTypeObject PyFloat_Type = {
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_FLOAT_SUBCLASS |
_Py_TPFLAGS_MATCH_SELF, /* tp_flags */
float_new__doc__, /* tp_doc */
0, /* tp_traverse */
Expand Down
3 changes: 3 additions & 0 deletions Objects/typeobject.c
Expand Up @@ -5783,6 +5783,9 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
else if (PyType_IsSubtype(base, &PyDict_Type)) {
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)) {
type->tp_flags |= _Py_TPFLAGS_MATCH_SELF;
}
Expand Down
13 changes: 13 additions & 0 deletions Tools/gdb/libpython.py
Expand Up @@ -85,6 +85,7 @@ def _sizeof_void_p():

Py_TPFLAGS_MANAGED_DICT = (1 << 4)
Py_TPFLAGS_HEAPTYPE = (1 << 9)
Py_TPFLAGS_FLOAT_SUBCLASS = (1 << 23)
Py_TPFLAGS_LONG_SUBCLASS = (1 << 24)
Py_TPFLAGS_LIST_SUBCLASS = (1 << 25)
Py_TPFLAGS_TUPLE_SUBCLASS = (1 << 26)
Expand Down Expand Up @@ -379,6 +380,8 @@ def subclass_from_type(cls, t):
if tp_flags & Py_TPFLAGS_HEAPTYPE:
return HeapTypeObjectPtr

if tp_flags & Py_TPFLAGS_FLOAT_SUBCLASS:
return PyFloatObjectPtr
if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
return PyLongObjectPtr
if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
Expand Down Expand Up @@ -910,6 +913,16 @@ class PyNoneStructPtr(PyObjectPtr):
def proxyval(self, visited):
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):
_typename = 'PyFrameObject'

Expand Down

0 comments on commit 2ef06d4

Please sign in to comment.