from test import list_tests, support
from test.support import cpython_only
from test.support.import_helper import import_module
-from test.support.script_helper import assert_python_failure
+from test.support.script_helper import assert_python_failure, assert_python_ok
import pickle
import unittest
else:
self.assertNotEqual(rc, -int(signal.SIGSEGV))
+ def test_deopt_from_append_list(self):
+ # gh-132011: it used to crash, because
+ # of `CALL_LIST_APPEND` specialization failure.
+ code = textwrap.dedent("""
+ l = []
+ def lappend(l, x, y):
+ l.append((x, y))
+ for x in range(3):
+ lappend(l, None, None)
+ try:
+ lappend(list, None, None)
+ except TypeError:
+ pass
+ else:
+ raise AssertionError
+ """)
+
+ rc, _, _ = assert_python_ok("-c", code)
+ self.assertEqual(rc, 0)
+
if __name__ == "__main__":
unittest.main()
PyInterpreterState *interp = tstate->interp;
DEOPT_IF(callable_o != interp->callable_cache.list_append);
- assert(self_o != NULL);
+ DEOPT_IF(self_o == NULL);
DEOPT_IF(!PyList_Check(self_o));
DEOPT_IF(!LOCK_OBJECT(self_o));
STAT_INC(CALL, hit);
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- assert(self_o != NULL);
+ if (self_o == NULL) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
if (!PyList_Check(self_o)) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
assert(_PyOpcode_Deopt[opcode] == (CALL));
JUMP_TO_PREDICTED(CALL);
}
- assert(self_o != NULL);
+ if (self_o == NULL) {
+ UPDATE_MISS_STATS(CALL);
+ assert(_PyOpcode_Deopt[opcode] == (CALL));
+ JUMP_TO_PREDICTED(CALL);
+ }
if (!PyList_Check(self_o)) {
UPDATE_MISS_STATS(CALL);
assert(_PyOpcode_Deopt[opcode] == (CALL));