mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
GH-105840: Fix assertion failures when specializing calls with too many __defaults__ (GH-105847)
This commit is contained in:
parent
b356a4749a
commit
2beab5bdef
3 changed files with 33 additions and 2 deletions
|
@ -452,6 +452,35 @@ class TestLoadMethodCache(unittest.TestCase):
|
||||||
self.assertFalse(f())
|
self.assertFalse(f())
|
||||||
|
|
||||||
|
|
||||||
|
class TestCallCache(unittest.TestCase):
|
||||||
|
def test_too_many_defaults_0(self):
|
||||||
|
def f():
|
||||||
|
pass
|
||||||
|
|
||||||
|
f.__defaults__ = (None,)
|
||||||
|
for _ in range(1025):
|
||||||
|
f()
|
||||||
|
|
||||||
|
def test_too_many_defaults_1(self):
|
||||||
|
def f(x):
|
||||||
|
pass
|
||||||
|
|
||||||
|
f.__defaults__ = (None, None)
|
||||||
|
for _ in range(1025):
|
||||||
|
f(None)
|
||||||
|
f()
|
||||||
|
|
||||||
|
def test_too_many_defaults_2(self):
|
||||||
|
def f(x, y):
|
||||||
|
pass
|
||||||
|
|
||||||
|
f.__defaults__ = (None, None, None)
|
||||||
|
for _ in range(1025):
|
||||||
|
f(None, None)
|
||||||
|
f(None)
|
||||||
|
f()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import unittest
|
import unittest
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix possible crashes when specializing function calls with too many
|
||||||
|
``__defaults__``.
|
|
@ -1647,9 +1647,9 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs,
|
||||||
}
|
}
|
||||||
int argcount = code->co_argcount;
|
int argcount = code->co_argcount;
|
||||||
int defcount = func->func_defaults == NULL ? 0 : (int)PyTuple_GET_SIZE(func->func_defaults);
|
int defcount = func->func_defaults == NULL ? 0 : (int)PyTuple_GET_SIZE(func->func_defaults);
|
||||||
assert(defcount <= argcount);
|
|
||||||
int min_args = argcount-defcount;
|
int min_args = argcount-defcount;
|
||||||
if (nargs > argcount || nargs < min_args) {
|
// GH-105840: min_args is negative when somebody sets too many __defaults__!
|
||||||
|
if (min_args < 0 || nargs > argcount || nargs < min_args) {
|
||||||
SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS);
|
SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue