From e48ca2892bc41e56df6e190f99630e42b641287d Mon Sep 17 00:00:00 2001 From: MegasKomnenos Date: Sun, 26 Mar 2023 14:12:02 +0900 Subject: [PATCH 1/2] Add utf8_mode field to Settings and make Flags to reference it for init I also changed the type from u8 to bool. No difference functionality-wise. --- vm/src/stdlib/sys.rs | 2 +- vm/src/vm/setting.rs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/vm/src/stdlib/sys.rs b/vm/src/stdlib/sys.rs index 414271d8240..d4e33d99bfb 100644 --- a/vm/src/stdlib/sys.rs +++ b/vm/src/stdlib/sys.rs @@ -728,7 +728,7 @@ mod sys { hash_randomization: settings.hash_seed.is_none() as u8, isolated: settings.isolated as u8, dev_mode: settings.dev_mode, - utf8_mode: 1, + utf8_mode: settings.utf8_mode, int_max_str_digits: -1, safe_path: false, warn_default_encoding: settings.warn_default_encoding as u8, diff --git a/vm/src/vm/setting.rs b/vm/src/vm/setting.rs index 362b47a5cd6..6158a30a689 100644 --- a/vm/src/vm/setting.rs +++ b/vm/src/vm/setting.rs @@ -74,6 +74,8 @@ pub struct Settings { /// false for wasm. Not a command-line option pub allow_external_library: bool, + pub utf8_mode: u8, + #[cfg(feature = "flame-it")] pub profile_output: Option, #[cfg(feature = "flame-it")] @@ -107,6 +109,7 @@ impl Default for Settings { stdio_unbuffered: false, check_hash_based_pycs: "default".to_owned(), allow_external_library: cfg!(feature = "importlib"), + utf8_mode: 1, #[cfg(feature = "flame-it")] profile_output: None, #[cfg(feature = "flame-it")] From 7e6c33152e77371a4c62fd2eb5cfd1eb5689d279 Mon Sep 17 00:00:00 2001 From: MegasKomnenos Date: Sun, 26 Mar 2023 18:45:36 +0900 Subject: [PATCH 2/2] Add encoding='locale' support for TextIOWrapper --- Lib/test/test_fileinput.py | 4 ---- vm/src/stdlib/io.rs | 12 ++++++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py index a988185ec52..270e109eb80 100644 --- a/Lib/test/test_fileinput.py +++ b/Lib/test/test_fileinput.py @@ -391,8 +391,6 @@ def test__getitem__(self): retval2 = fi[1] self.assertEqual(retval2, "line2\n") - # TODO: RUSTPYTHON - @unittest.expectedFailure def test__getitem___deprecation(self): t = self.writeTmp("line1\nline2\n") with self.assertWarnsRegex(DeprecationWarning, @@ -914,8 +912,6 @@ def test_empty_string(self): def test_no_ext(self): self.do_test_use_builtin_open("abcd", 2) - # TODO: RUSTPYTHON - @unittest.expectedFailure @unittest.skipUnless(gzip, "Requires gzip and zlib") def test_gz_ext_fake(self): original_open = gzip.open diff --git a/vm/src/stdlib/io.rs b/vm/src/stdlib/io.rs index 9826c2b1b5c..bfb7c7bd547 100644 --- a/vm/src/stdlib/io.rs +++ b/vm/src/stdlib/io.rs @@ -2193,10 +2193,14 @@ mod _io { *data = None; let encoding = match args.encoding { - Some(enc) => enc, - None => { - // TODO: try os.device_encoding(fileno) and then locale.getpreferredencoding() - PyStr::from(crate::codecs::DEFAULT_ENCODING).into_ref(&vm.ctx) + None if vm.state.settings.utf8_mode > 0 => PyStr::from("utf-8").into_ref(&vm.ctx), + Some(enc) if enc.as_str() != "locale" => enc, + _ => { + // None without utf8_mode or "locale" encoding + vm.import("locale", None, 0)? + .get_attr("getencoding", vm)? + .call((), vm)? + .try_into_value(vm)? } };