diff options
author | Ken Jin <kenjin@python.org> | 2024-12-31 04:24:17 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-31 04:24:17 (GMT) |
commit | 7ef49074123511003c8b7f7f3ba2a4e05285e8dc (patch) | |
tree | 1719d0d2fd187f79bd1398b9f230bb5a65c9502e /Python | |
parent | dafe7a44630aa32bb411cceb45c7b7df725e3fe3 (diff) | |
download | cpython-7ef49074123511003c8b7f7f3ba2a4e05285e8dc.zip cpython-7ef49074123511003c8b7f7f3ba2a4e05285e8dc.tar.gz cpython-7ef49074123511003c8b7f7f3ba2a4e05285e8dc.tar.bz2 |
gh-128262: Allow specialization of calls to classes with __slots__ (GH-128263)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bytecodes.c | 6 | ||||
-rw-r--r-- | Python/executor_cases.c.h | 8 | ||||
-rw-r--r-- | Python/generated_cases.c.h | 8 | ||||
-rw-r--r-- | Python/specialize.c | 4 |
4 files changed, 16 insertions, 10 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 63cf197..602cf7f 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3765,13 +3765,15 @@ dummy_func( DEOPT_IF(!PyType_Check(callable_o)); PyTypeObject *tp = (PyTypeObject *)callable_o; DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(tp->tp_version_tag) != type_version); - assert(tp->tp_flags & Py_TPFLAGS_INLINE_VALUES); + assert(tp->tp_new == PyBaseObject_Type.tp_new); + assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE); + assert(tp->tp_alloc == PyType_GenericAlloc); PyHeapTypeObject *cls = (PyHeapTypeObject *)callable_o; PyFunctionObject *init_func = (PyFunctionObject *)FT_ATOMIC_LOAD_PTR_ACQUIRE(cls->_spec_cache.init); PyCodeObject *code = (PyCodeObject *)init_func->func_code; DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize + _Py_InitCleanup.co_framesize)); STAT_INC(CALL, hit); - PyObject *self_o = _PyType_NewManagedObject(tp); + PyObject *self_o = PyType_GenericAlloc(tp, 0); if (self_o == NULL) { ERROR_NO_POP(); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 2233502..f7374d5 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -4572,7 +4572,9 @@ UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); } - assert(tp->tp_flags & Py_TPFLAGS_INLINE_VALUES); + assert(tp->tp_new == PyBaseObject_Type.tp_new); + assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE); + assert(tp->tp_alloc == PyType_GenericAlloc); PyHeapTypeObject *cls = (PyHeapTypeObject *)callable_o; PyFunctionObject *init_func = (PyFunctionObject *)FT_ATOMIC_LOAD_PTR_ACQUIRE(cls->_spec_cache.init); PyCodeObject *code = (PyCodeObject *)init_func->func_code; @@ -4581,7 +4583,9 @@ JUMP_TO_JUMP_TARGET(); } STAT_INC(CALL, hit); - PyObject *self_o = _PyType_NewManagedObject(tp); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyObject *self_o = PyType_GenericAlloc(tp, 0); + stack_pointer = _PyFrame_GetStackPointer(frame); if (self_o == NULL) { JUMP_TO_ERROR(); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index bed16b6..98743c2 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -1048,13 +1048,17 @@ DEOPT_IF(!PyType_Check(callable_o), CALL); PyTypeObject *tp = (PyTypeObject *)callable_o; DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(tp->tp_version_tag) != type_version, CALL); - assert(tp->tp_flags & Py_TPFLAGS_INLINE_VALUES); + assert(tp->tp_new == PyBaseObject_Type.tp_new); + assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE); + assert(tp->tp_alloc == PyType_GenericAlloc); PyHeapTypeObject *cls = (PyHeapTypeObject *)callable_o; PyFunctionObject *init_func = (PyFunctionObject *)FT_ATOMIC_LOAD_PTR_ACQUIRE(cls->_spec_cache.init); PyCodeObject *code = (PyCodeObject *)init_func->func_code; DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize + _Py_InitCleanup.co_framesize), CALL); STAT_INC(CALL, hit); - PyObject *self_o = _PyType_NewManagedObject(tp); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyObject *self_o = PyType_GenericAlloc(tp, 0); + stack_pointer = _PyFrame_GetStackPointer(frame); if (self_o == NULL) { goto error; } diff --git a/Python/specialize.c b/Python/specialize.c index 2148b62..c918c77 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -2002,10 +2002,6 @@ get_init_for_simple_managed_python_class(PyTypeObject *tp, unsigned int *tp_vers return NULL; } unsigned long tp_flags = PyType_GetFlags(tp); - if ((tp_flags & Py_TPFLAGS_INLINE_VALUES) == 0) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_INIT_NOT_INLINE_VALUES); - return NULL; - } if (!(tp_flags & Py_TPFLAGS_HEAPTYPE)) { /* Is this possible? */ SPECIALIZATION_FAIL(CALL, SPEC_FAIL_EXPECTED_ERROR); |