Skip to content
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

Remove unnecessary Console.SetOut #17761

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

Conversation

majocha
Copy link
Contributor

@majocha majocha commented Sep 17, 2024

There is some code in fsi and fsc to remember and finally restore the initial Console.Out.

However, the fsc or fsi itself never modifies console streams with Console.SetOut etc.

Modifying a global resource like this can lead to difficult to track errors in hosted multithreaded execution, like parallel testing (#17662).

Maybe there is a reason for this that I don't see?

@majocha majocha requested a review from a team as a code owner September 17, 2024 17:27
Copy link
Contributor

github-actions bot commented Sep 17, 2024

⚠️ Release notes required, but author opted out

Warning

Author opted out of release notes, check is disabled for this pull request.
cc @dotnet/fsharp-team-msft

@T-Gro
Copy link
Member

T-Gro commented Sep 17, 2024

IIRC the HostedCompiler was relying on stdout redirection, should only be used for some of the legacy test suites (FsharpQA I think). But FSharpQA still runs here, so that keeps working after your change.

@KevinRansom KevinRansom added the NO_RELEASE_NOTES Label for pull requests which signals, that user opted-out of providing release notes label Sep 18, 2024
Copy link
Member

@KevinRansom KevinRansom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@majocha , @T-Gro --- I'm afraid the savedOut is necessary.

The scenario is this:

  • The host application is using a non-UTF8 Encoding, E.g UTF-7 or UTF-32
  • The host executes the compilation and passes in the '--utf8output' flag
  • This flag changes the Encoding of the Console.Out to UTF which is not what the host app was set to.
  • The purpose of the savedOut is to ensure that these changes caused by our compiler do not adversely impact the hosts.

if tcConfigB.utf8output then

@KevinRansom
Copy link
Member

It also looks as if unused binding analysis didn't find the unused:
let setOutputStreams execute =

I wonder why.

@edgarfgp
Copy link
Contributor

It also looks as if unused binding analysis didn't find the unused: let setOutputStreams execute =

I wonder why.

Might be related to #13849

@majocha
Copy link
Contributor Author

majocha commented Sep 18, 2024

The scenario is this:

  • The host application is using a non-UTF8 Encoding, E.g UTF-7 or UTF-32
  • The host executes the compilation and passes in the '--utf8output' flag
  • This flag changes the Encoding of the Console.Out to UTF which is not what the host app was set to.
  • The purpose of the savedOut is to ensure that these changes caused by our compiler do not adversely impact the hosts.

Thanks @KevinRansom, this is important because it seems in the course of recent changes the test for this got lost.

Also, I'm wondering, maybe just restoring the encoding (if the Out is still the same during dispose) would be less intrusive.

@majocha
Copy link
Contributor Author

majocha commented Sep 18, 2024

I'm frankly confused about this but I suspect that setting OutputEncoding affects the underlying system level stuff and has no effect when console is redirected?

@psfinaki
Copy link
Member

Anything interesting from the git blame? (I can also take a look later in the day)

@KevinRansom
Copy link
Member

@majocha ---
the redirection is irrelevant, since there is a scenario where someone writes a .net app that does work and calls into the compiler directly. For example fantomas, or fsc.exe for that matter, although neither of those apps mess with Encoding.

@majocha
Copy link
Contributor Author

majocha commented Sep 18, 2024

I'll write a test to see what the situation is right now. I understand that from the consumer's pov it's important that fsc writes using the correct encoding according to the given switch and that console encoding is restored afterwards.

@KevinRansom
Copy link
Member

It works, but yes a test case in the repo would be useful to ensure that it doesn't get inadvertently ripped out in the future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NO_RELEASE_NOTES Label for pull requests which signals, that user opted-out of providing release notes
Projects
Status: In Progress
Development

Successfully merging this pull request may close these issues.

5 participants