repl: fix freeze if util.inspect throws & clean up error handling a bit #1968
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
If an error is thrown during the readline
keypress
event, the state of the streaming escape sequence decoder (added in #1601) will become corrupted. This will render the REPL (and possibly your whole terminal) completely unusable. This can be triggered by an object with a custominspect
method that throws.Originally I modified the escape sequence decoder to avoid corruption but it proved difficult to test because the synchronous throw in
keypress
would end up corrupting the state of the mock streams I was using to test (although for whatever reason it would work with the real TTY streams). Felt too fragile to commit.Instead, I decided that none of the eval machinery should ever throw. This PR adds an extra try/catch around
self.writer
(which isutil.inspect
by default) and makes some minor cleanups to make error handling more consistent.Note: our test suite currently forbids running any of the REPL machinery in a different tick, which would sidestep most, if not all, of these problems.
cc @rlidwka