From 1b3c036f79fa39d504b34a33e9fef4497fc68d4f Mon Sep 17 00:00:00 2001 From: bobby-palmer <112954547+bobby-palmer@users.noreply.github.com> Date: Thu, 22 Jun 2023 22:42:18 -0400 Subject: [PATCH 1/3] added int_max_str_digits to settings struct --- Lib/test/test_cmd_line.py | 2 -- src/settings.rs | 9 ++++++++- vm/src/stdlib/sys.rs | 2 +- vm/src/vm/mod.rs | 2 +- vm/src/vm/setting.rs | 4 ++++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 7f6af76d85..7e15bc8f88 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -933,8 +933,6 @@ def test_parsing_error(self): self.assertTrue(proc.stderr.startswith(err_msg), proc.stderr) self.assertNotEqual(proc.returncode, 0) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_int_max_str_digits(self): code = "import sys; print(sys.flags.int_max_str_digits, sys.get_int_max_str_digits())" diff --git a/src/settings.rs b/src/settings.rs index 836bb14012..819ea8062a 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -239,6 +239,7 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) { settings.xopts.extend(xopts.map(|s| { let mut parts = s.splitn(2, '='); let name = parts.next().unwrap().to_owned(); + let value = parts.next().map(ToOwned::to_owned); if name == "dev" { dev_mode = true } @@ -248,7 +249,13 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) { if name == "no_sig_int" { settings.no_sig_int = true; } - let value = parts.next().map(ToOwned::to_owned); + if name == "int_max_str_digits" { + settings.int_max_str_digits = value + .as_ref() + .unwrap() + .parse() + .expect("int_max_str_digits must be a valid number"); + } (name, value) })); } diff --git a/vm/src/stdlib/sys.rs b/vm/src/stdlib/sys.rs index 027a67178c..4e672257bf 100644 --- a/vm/src/stdlib/sys.rs +++ b/vm/src/stdlib/sys.rs @@ -753,7 +753,7 @@ mod sys { isolated: settings.isolated as u8, dev_mode: settings.dev_mode, utf8_mode: settings.utf8_mode, - int_max_str_digits: -1, + int_max_str_digits: settings.int_max_str_digits, safe_path: false, warn_default_encoding: settings.warn_default_encoding as u8, } diff --git a/vm/src/vm/mod.rs b/vm/src/vm/mod.rs index 51fc9b87e5..00a991724f 100644 --- a/vm/src/vm/mod.rs +++ b/vm/src/vm/mod.rs @@ -181,7 +181,7 @@ impl VirtualMachine { before_forkers: PyMutex::default(), after_forkers_child: PyMutex::default(), after_forkers_parent: PyMutex::default(), - int_max_str_digits: AtomicCell::new(4300), + int_max_str_digits: AtomicCell::new(settings.int_max_str_digits.into()), }), initialized: false, recursion_depth: Cell::new(0), diff --git a/vm/src/vm/setting.rs b/vm/src/vm/setting.rs index 3b9c82cafc..985d888ee3 100644 --- a/vm/src/vm/setting.rs +++ b/vm/src/vm/setting.rs @@ -43,6 +43,9 @@ pub struct Settings { /// -Xfoo[=bar] pub xopts: Vec<(String, Option)>, + /// -X int_max_str_digits + pub int_max_str_digits: usize, + /// -I pub isolated: bool, @@ -118,6 +121,7 @@ impl Default for Settings { check_hash_based_pycs: "default".to_owned(), allow_external_library: cfg!(feature = "importlib"), utf8_mode: 1, + int_max_str_digits: 4300, #[cfg(feature = "flame-it")] profile_output: None, #[cfg(feature = "flame-it")] From 37a42c392cf9d66026c96f39d97e444ad65e4bde Mon Sep 17 00:00:00 2001 From: bobby-palmer <112954547+bobby-palmer@users.noreply.github.com> Date: Thu, 22 Jun 2023 23:22:17 -0400 Subject: [PATCH 2/3] changed vm init to use the value from settings --- src/settings.rs | 5 +++++ vm/src/stdlib/sys.rs | 2 +- vm/src/vm/mod.rs | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/settings.rs b/src/settings.rs index 819ea8062a..cae3e270c8 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -227,6 +227,11 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) { { settings.dont_write_bytecode = true; } + if !ignore_environment { + if let Ok(digits) = get_env_var_value("int_max_str_digits") { + settings.int_max_str_digits = digits.into() + } + } settings.check_hash_based_pycs = matches .value_of("check-hash-based-pycs") diff --git a/vm/src/stdlib/sys.rs b/vm/src/stdlib/sys.rs index 4e672257bf..ef3082a65e 100644 --- a/vm/src/stdlib/sys.rs +++ b/vm/src/stdlib/sys.rs @@ -727,7 +727,7 @@ mod sys { /// -X utf8 utf8_mode: u8, /// -X int_max_str_digits=number - int_max_str_digits: i8, + int_max_str_digits: usize, /// -P, `PYTHONSAFEPATH` safe_path: bool, /// -X warn_default_encoding, PYTHONWARNDEFAULTENCODING diff --git a/vm/src/vm/mod.rs b/vm/src/vm/mod.rs index 00a991724f..bf5476139d 100644 --- a/vm/src/vm/mod.rs +++ b/vm/src/vm/mod.rs @@ -151,6 +151,7 @@ impl VirtualMachine { let warnings = WarningsState::init_state(&ctx); + let int_max_str_digits = AtomicCell::new(settings.int_max_str_digits); let mut vm = VirtualMachine { builtins, sys_module, @@ -181,7 +182,7 @@ impl VirtualMachine { before_forkers: PyMutex::default(), after_forkers_child: PyMutex::default(), after_forkers_parent: PyMutex::default(), - int_max_str_digits: AtomicCell::new(settings.int_max_str_digits.into()), + int_max_str_digits, }), initialized: false, recursion_depth: Cell::new(0), From b5ba168de050cf9b9c328a9abafe4c66f7b2a121 Mon Sep 17 00:00:00 2001 From: bobby-palmer <112954547+bobby-palmer@users.noreply.github.com> Date: Fri, 23 Jun 2023 06:51:43 -0400 Subject: [PATCH 3/3] added error handling and set the settings default to -1 which sets the value to 4300 --- src/settings.rs | 25 ++++++++++++++++--------- vm/src/stdlib/sys.rs | 2 +- vm/src/vm/mod.rs | 5 ++++- vm/src/vm/setting.rs | 4 ++-- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/settings.rs b/src/settings.rs index cae3e270c8..6a47233353 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -227,10 +227,14 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) { { settings.dont_write_bytecode = true; } - if !ignore_environment { - if let Ok(digits) = get_env_var_value("int_max_str_digits") { - settings.int_max_str_digits = digits.into() - } + if !ignore_environment && env::var_os("PYTHONINTMAXSTRDIGITS").is_some() { + settings.int_max_str_digits = match env::var("PYTHONINTMAXSTRDIGITS").unwrap().parse() { + Ok(digits) if digits == 0 || digits >= 640 => digits, + _ => { + error!("Fatal Python error: config_init_int_max_str_digits: PYTHONINTMAXSTRDIGITS: invalid limit; must be >= 640 or 0 for unlimited.\nPython runtime state: preinitialized"); + std::process::exit(1); + } + }; } settings.check_hash_based_pycs = matches @@ -255,11 +259,14 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) { settings.no_sig_int = true; } if name == "int_max_str_digits" { - settings.int_max_str_digits = value - .as_ref() - .unwrap() - .parse() - .expect("int_max_str_digits must be a valid number"); + settings.int_max_str_digits = match value.as_ref().unwrap().parse() { + Ok(digits) if digits == 0 || digits >= 640 => digits, + _ => { + + error!("Fatal Python error: config_init_int_max_str_digits: -X int_max_str_digits: invalid limit; must be >= 640 or 0 for unlimited.\nPython runtime state: preinitialized"); + std::process::exit(1); + }, + }; } (name, value) })); diff --git a/vm/src/stdlib/sys.rs b/vm/src/stdlib/sys.rs index ef3082a65e..3a3824b310 100644 --- a/vm/src/stdlib/sys.rs +++ b/vm/src/stdlib/sys.rs @@ -727,7 +727,7 @@ mod sys { /// -X utf8 utf8_mode: u8, /// -X int_max_str_digits=number - int_max_str_digits: usize, + int_max_str_digits: i64, /// -P, `PYTHONSAFEPATH` safe_path: bool, /// -X warn_default_encoding, PYTHONWARNDEFAULTENCODING diff --git a/vm/src/vm/mod.rs b/vm/src/vm/mod.rs index bf5476139d..05ad7ca5a0 100644 --- a/vm/src/vm/mod.rs +++ b/vm/src/vm/mod.rs @@ -151,7 +151,10 @@ impl VirtualMachine { let warnings = WarningsState::init_state(&ctx); - let int_max_str_digits = AtomicCell::new(settings.int_max_str_digits); + let int_max_str_digits = AtomicCell::new(match settings.int_max_str_digits { + -1 => 4300, + other => other, + } as usize); let mut vm = VirtualMachine { builtins, sys_module, diff --git a/vm/src/vm/setting.rs b/vm/src/vm/setting.rs index 985d888ee3..508c50da78 100644 --- a/vm/src/vm/setting.rs +++ b/vm/src/vm/setting.rs @@ -44,7 +44,7 @@ pub struct Settings { pub xopts: Vec<(String, Option)>, /// -X int_max_str_digits - pub int_max_str_digits: usize, + pub int_max_str_digits: i64, /// -I pub isolated: bool, @@ -121,7 +121,7 @@ impl Default for Settings { check_hash_based_pycs: "default".to_owned(), allow_external_library: cfg!(feature = "importlib"), utf8_mode: 1, - int_max_str_digits: 4300, + int_max_str_digits: -1, #[cfg(feature = "flame-it")] profile_output: None, #[cfg(feature = "flame-it")]