From: serge-sans-paille Date: Tue, 20 Sep 2022 10:00:34 +0000 (+0000) Subject: gh-96711: Enhance SystemError message upon Invalid opcode (#96712) X-Git-Tag: v3.12.0a1~380 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc05107af9f20b9d926dedc5bf12d75b0eaa45a3;p=thirdparty%2FPython%2Fcpython.git gh-96711: Enhance SystemError message upon Invalid opcode (#96712) Raise verbose SystemError instead of printing debug information upon Invalid opcode. Fix #96711 --- diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 2386cf6b59f3..2fdfdd0d309c 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 a07fb4964b48..83c1e1cbeeaf 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 */