From fc05107af9f20b9d926dedc5bf12d75b0eaa45a3 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Tue, 20 Sep 2022 10:00:34 +0000 Subject: gh-96711: Enhance SystemError message upon Invalid opcode (#96712) Raise verbose SystemError instead of printing debug information upon Invalid opcode. Fix #96711 --- Lib/test/test_code.py | 11 +++++++++++ Python/ceval.c | 8 +++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 2386cf6..2fdfdd0 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -337,6 +337,17 @@ class CodeTest(unittest.TestCase): new_code = code = func.__code__.replace(co_linetable=b'') self.assertEqual(list(new_code.co_lines()), []) + def test_invalid_bytecode(self): + def foo(): pass + foo.__code__ = co = foo.__code__.replace(co_code=b'\xee\x00d\x00S\x00') + + with self.assertRaises(SystemError) as se: + foo() + self.assertEqual( + f"{co.co_filename}:{co.co_firstlineno}: unknown opcode 238", + str(se.exception)) + + @requires_debug_ranges() def test_co_positions_artificial_instructions(self): import dis diff --git a/Python/ceval.c b/Python/ceval.c index a07fb49..83c1e1c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5051,9 +5051,11 @@ handle_eval_breaker: /* Tell C compilers not to hold the opcode variable in the loop. next_instr points the current instruction without TARGET(). */ opcode = _Py_OPCODE(*next_instr); - fprintf(stderr, "XXX lineno: %d, opcode: %d\n", - _PyInterpreterFrame_GetLine(frame), opcode); - _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode"); + _PyErr_Format(tstate, PyExc_SystemError, + "%U:%d: unknown opcode %d", + frame->f_code->co_filename, + _PyInterpreterFrame_GetLine(frame), + opcode); goto error; } /* End instructions */ -- cgit v0.12