mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +00:00
bpo-44525: Specialize for calls to type and other builtin classes with 1 argument. (GH-29942)
This commit is contained in:
parent
f025ae63dc
commit
3a60bfef49
6 changed files with 105 additions and 40 deletions
|
@ -491,8 +491,10 @@ initial_counter_value(void) {
|
|||
#define SPEC_FAIL_PYCFUNCTION_NOARGS 16
|
||||
#define SPEC_FAIL_BAD_CALL_FLAGS 17
|
||||
#define SPEC_FAIL_CLASS 18
|
||||
#define SPEC_FAIL_C_METHOD_CALL 19
|
||||
#define SPEC_FAIL_METHDESCR_NON_METHOD 20
|
||||
#define SPEC_FAIL_PYTHON_CLASS 19
|
||||
#define SPEC_FAIL_C_METHOD_CALL 20
|
||||
#define SPEC_FAIL_METHDESCR_NON_METHOD 21
|
||||
#define SPEC_FAIL_METHOD_CALL_CLASS 22
|
||||
|
||||
/* COMPARE_OP */
|
||||
#define SPEC_FAIL_STRING_COMPARE 13
|
||||
|
@ -1263,6 +1265,27 @@ specialize_class_call(
|
|||
PyObject *callable, _Py_CODEUNIT *instr,
|
||||
int nargs, SpecializedCacheEntry *cache)
|
||||
{
|
||||
assert(PyType_Check(callable));
|
||||
PyTypeObject *tp = (PyTypeObject *)callable;
|
||||
if (_Py_OPCODE(instr[-1]) == PRECALL_METHOD) {
|
||||
SPECIALIZATION_FAIL(CALL_NO_KW, SPEC_FAIL_METHOD_CALL_CLASS);
|
||||
return -1;
|
||||
}
|
||||
if (tp->tp_new == PyBaseObject_Type.tp_new) {
|
||||
SPECIALIZATION_FAIL(CALL_NO_KW, SPEC_FAIL_PYTHON_CLASS);
|
||||
return -1;
|
||||
}
|
||||
if (nargs == 1) {
|
||||
if (tp == &PyType_Type) {
|
||||
*instr = _Py_MAKECODEUNIT(CALL_NO_KW_TYPE_1, _Py_OPARG(*instr));
|
||||
return 0;
|
||||
}
|
||||
if ((tp->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) && tp->tp_vectorcall != NULL) {
|
||||
cache->adaptive.version = tp->tp_version_tag;
|
||||
*instr = _Py_MAKECODEUNIT(CALL_NO_KW_BUILTIN_CLASS_1, _Py_OPARG(*instr));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
SPECIALIZATION_FAIL(CALL_NO_KW, SPEC_FAIL_CLASS);
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue