gh-96711: Enhance SystemError message upon Invalid opcode (#96712)
Raise verbose SystemError instead of printing debug information upon Invalid opcode. Fix #96711
This commit is contained in:
parent
6ad47b41a6
commit
fc05107af9
@ -337,6 +337,17 @@ class CodeTest(unittest.TestCase):
|
|||||||
new_code = code = func.__code__.replace(co_linetable=b'')
|
new_code = code = func.__code__.replace(co_linetable=b'')
|
||||||
self.assertEqual(list(new_code.co_lines()), [])
|
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()
|
@requires_debug_ranges()
|
||||||
def test_co_positions_artificial_instructions(self):
|
def test_co_positions_artificial_instructions(self):
|
||||||
import dis
|
import dis
|
||||||
|
@ -5051,9 +5051,11 @@ handle_eval_breaker:
|
|||||||
/* Tell C compilers not to hold the opcode variable in the loop.
|
/* Tell C compilers not to hold the opcode variable in the loop.
|
||||||
next_instr points the current instruction without TARGET(). */
|
next_instr points the current instruction without TARGET(). */
|
||||||
opcode = _Py_OPCODE(*next_instr);
|
opcode = _Py_OPCODE(*next_instr);
|
||||||
fprintf(stderr, "XXX lineno: %d, opcode: %d\n",
|
_PyErr_Format(tstate, PyExc_SystemError,
|
||||||
_PyInterpreterFrame_GetLine(frame), opcode);
|
"%U:%d: unknown opcode %d",
|
||||||
_PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
|
frame->f_code->co_filename,
|
||||||
|
_PyInterpreterFrame_GetLine(frame),
|
||||||
|
opcode);
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
} /* End instructions */
|
} /* End instructions */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user