https://github.com/python/cpython/commit/7ef49074123511003c8b7f7f3ba2a4e05285e8dc
commit: 7ef49074123511003c8b7f7f3ba2a4e05285e8dc
branch: main
author: Ken Jin <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2024-12-31T12:24:17+08:00
summary:
gh-128262: Allow specialization of calls to classes with __slots__ (GH-128263)
files:
M Include/internal/pycore_uop_metadata.h
M Python/bytecodes.c
M Python/executor_cases.c.h
M Python/generated_cases.c.h
M Python/specialize.c
diff --git a/Include/internal/pycore_uop_metadata.h
b/Include/internal/pycore_uop_metadata.h
index e71194b116e020..73fc29eb78a7a4 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -234,7 +234,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_CALL_TYPE_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
[_CALL_STR_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG |
HAS_ESCAPES_FLAG,
[_CALL_TUPLE_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG |
HAS_ESCAPES_FLAG,
- [_CHECK_AND_ALLOCATE_OBJECT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG |
HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG,
+ [_CHECK_AND_ALLOCATE_OBJECT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG |
HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
[_CREATE_INIT_FRAME] = HAS_ARG_FLAG | HAS_ERROR_FLAG |
HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
[_EXIT_INIT_CHECK] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG |
HAS_ESCAPES_FLAG,
[_CALL_BUILTIN_CLASS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG |
HAS_ESCAPES_FLAG,
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 63cf1978e8abe5..602cf7f47b812b 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 22335021faaa6d..f7374d52705960 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 bed16b60b76a2f..98743c27c38524 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 2148b62c3a1953..c918c77779d20d 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);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]