-
-
Notifications
You must be signed in to change notification settings - Fork 8.6k
unix/main: Use standard pyexec/repl for unix port. #12802
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Thanks for this, it's a good clean up. I actually attempted it before, see #6008. The approach here is much simpler, so maybe it's a good first step to make. |
|
Ah interesting, I did see some of the return handling and kind of assumed it shouldn't matter - if someone is dealing with the repl (live coding) they're unlikely to care about the exit code? I didn't consider the SystemExit interrupt at all, haven't looked at how that behaves but probably should! If running a python file directly then certainly the exit code is important but that shouldn't be impacted by this. |
e4cc4f5 to
2c1c7d8
Compare
|
Ah, I might need to read through the other PR discussion a bit more... but in the mean time this is a little off: Edit: |
2c1c7d8 to
55032e9
Compare
|
See also #12807 |
12f5770 to
7a0825f
Compare
|
I ran into a tricky issue when trying to fix the unit tests; the banner on Unix port has changed a little with this MR (now consistent with other ports) so unit test exp needed to be updated to match. I initially tried just copying the results/*.out files to replace the original .exp ones, but the tests still failed! There were inconsistent newlines in the files that tripped up the test.
|
ports/windows/micropython.vcxproj
Outdated
| <ClCompile Include="@(PyCoreSource)" /> | ||
| <ClCompile Include="@(PyExtModSource)" /> | ||
| <ClCompile Include="$(PyBaseDir)shared\readline\*.c" /> | ||
| <ClCompile Include="$(PyBaseDir)shared\runtime\pyexec.c" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Super minor but can you move this one line down so it's aplhabetically?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah whoops, I honestly thought I was alreadyt putting it in order, eyes blurred readline/runtime and completely missed runtime\gchelper_generic below!
tests/run-tests.py
Outdated
| # instead of: output_mupy = subprocess.check_output(args, stdin=f) | ||
| master, slave = pty.openpty() | ||
| # disable auto newline conversion on the pty terminal. | ||
| attrs = termios.tcgetattr(slave) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're probably aware but this doesn't exist on windows. Isn't there a way to just do a replace("\r\n", "\n") before comparing results, or something like that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I thought pty itself wasn't avaialble either so it would be a moot point?
I initially thought of just adding another newline replace, but thought fixing the problem at the source was cleaner than further fiddling with test results.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah it looks like these repl_* tests are already skipped on windows master builds https://ci.appveyor.com/project/dpgeorge/micropython/builds/48536058/job/4o16bx3lnvsu7nbn

There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I thought pty itself wasn't avaialble either so it would be a moot point?
Yes, but
I initially thought of just adding another newline replace, but thought fixing the problem at the source was cleaner than further fiddling with test results.
Cleaner perhaps, but: reaonsing that suppose we do get cmdline tests working for the windows port, like with some other code, then that would also need a similar fix. Whereas the more general case of the tests being written like 'whatever you throw at me I'm going to make newlines consistent first because I know that can be an issue' seems the more robust way plus keeps everything nicely in one place?
7a0825f to
ad27be1
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #12802 +/- ##
=======================================
Coverage 98.38% 98.38%
=======================================
Files 171 171
Lines 22299 22299
=======================================
Hits 21938 21938
Misses 361 361 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
ad27be1 to
02fb334
Compare
d08fe6e to
554ba06
Compare
|
Regarding the comment above about We need to retain the existing behaviour, so we don't break existing usage, and because that's how CPython works. Then it's a separate question how to handle this on bare-metal targets. But for now we shouldn't change the unix behaviour on this. |
|
Code size report: |
Thanks, yes I hadn't realised this behavior had been changed inadvertantly. I've now fixed it in the latest push. ... which matches cpython correctly:
Well it looks to me like this should be treated as a soft reset. micropython/extmod/modmachine.c Line 66 in 358e501
The current push also works this way: |
Right, it would be a nice clean up to get rid of that variable, and also change the behaviour of Because this is a change in user-facing behaviour, I've split that change out in #15486. |
03e992d to
95bce29
Compare
|
This has been rebased to master, taking into account the SystemExit stuff already merged. |
|
I found that ctrl-C didn't work on the unix port 😬 I fixed that and pushed the commit to this branch. @andrewleech see what you think, it was a little tricky to get right. |
|
It looks like my fix for ctrl-C handling has slightly changed the output for using paste mode, probably due to switch in/out of raw mode. @andrewleech do you think we can just change the tests .exp file to match the new behaviour? Or try to make it go back to the previous behaviour? |
3b220d7 to
9dde82b
Compare
|
Thanks @dpgeorge I looked into the mode switching and agree it's required, I couldn't find any other way to make paste mode and keyboard interrupt both work. I've consolidated that in a function with comments, see if you think that helps? I also added some new tests, one of which is sitting in the unix tests folder but needs to be run directly with cpython as a standalone script to test interactive ctrl-c handling on the unix port. It failed without your mode switch patch and passes now, it's a bit messy but validates the behaviour. It's not automatically run as part of the test suite though. Does this look useful and should it be integrated better? I've found and included the other consolidation of do_file and do_str results handling. I thought I had the unit test results cleaned up too but it appears not |
1be306a to
43ac816
Compare
cd45b9b to
8a0ca06
Compare
938d7f2 to
3d67b2a
Compare
3d67b2a to
5a984bc
Compare
|
The unix ctrl-c tests have been split out from this PR again into #18435 |
This improves REPL usage consistency across ports, by utilizing the pyexec code for the unix REPL. Only enabled when MICROPY_USE_READLINE == 1 (the default). Signed-off-by: Andrew Leech <[email protected]>
When `MICROPY_MODULE___FILE__` is enabled and parsing file input, set the global `__file__` variable to the source filename. This matches the behavior of the unix port and provides the current filename to the executing script. Signed-off-by: Andrew Leech <[email protected]>
When `MICROPY_PYEXEC_COMPILE_ONLY` is enabled and the global `mp_compile_only` is True, code is compiled but not executed. Also add comprehensive tests for compile-only functionality covering both successful compilation and syntax error detection. Signed-off-by: Andrew Leech <[email protected]>
Provides support for command line `-X compile-only` option on unix port. Signed-off-by: Andrew Leech <[email protected]>
Add a general normalize_newlines() function that handles newline variations (\\r\\r\\n, \\r\\n) to \\n while preserving literal \\r characters that are part of test content. This provides a robust solution for cross-platform test compatibility, particularly addressing PTY double-newline issues that can occur with some terminal implementations. The function is applied to all test output before comparison, eliminating platform-specific newline issues. Includes a unit test to verify the normalization behavior. Signed-off-by: Andrew Leech <[email protected]>
Consolidates file and string execution to use the standard pyexec interface for consistency with other ports. Simplify execute_from_lexer for remaining usage: Remove unused LEX_SRC_VSTR and LEX_SRC_FILENAME cases, keeping only LEX_SRC_STR for REPL and LEX_SRC_STDIN for stdin execution. Signed-off-by: Andrew Leech <[email protected]>
This ensures that ctrl-C works on the unix port when executing code at the REPL. Signed-off-by: Damien George <[email protected]>
Enable `MICROPY_PYEXEC_ENABLE_EXIT_CODE_HANDLING` to propagate `sys.exit()` exit codes properly. Update `convert_pyexec_result()` to handle return values where pyexec returns the exit code with `PYEXEC_FORCED_EXIT` flag set for `SystemExit`. Extract the exit code from the lower 8 bits when the flag is set, otherwise return as-is (0 for success, 1 for exception). Signed-off-by: Andrew Leech <[email protected]>
When `MICROPY_PYEXEC_ENABLE_EXIT_CODE_HANDLING` is enabled, `SystemExit` now sets the `PYEXEC_FORCED_EXIT` flag in addition to the exit code. This allows the REPL to properly detect and exit when SystemExit is raised, while still preserving the exit code in the lower bits. Fixes `repl_lock.py` test which expects REPL to exit on `SystemExit`. Signed-off-by: Andrew Leech <[email protected]>
5a984bc to
a686410
Compare
dpgeorge
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tested this thoroughly and fixed a minor issue: ctrl-C was not properly handled when executing a string via micropython -c "import time; time.sleep(10)".
|
Thanks for your assistance and detailed testing! |
This improves repl usage consistency across ports.
Only enabled when MICROPY_USE_READLINE == 1 (default).
In particular I noticed that
aiorepldidn't work properly on the unix port currently, it would echo the "just entered line" on a newline each time you hit enter, eg.I feel there were also a few other inconsistencies with how I'm used to the repl working on the stm port / via mpremote which are alsos hopefully resolved now.
I've got an optional couple of lines to restore/reset stdio_raw mode when running code - however if raw mode is disabled the aiorepl issue above remains. I think for consistency with other ports it's better to keep stdio in raw mode, but not sure if this is likely to have other side effects?
This PR consilidates the repl functionality and fixes the above aiorepl glitch.