Skip to content

Commit a58ede9

Browse files
authored
add int_max_str_digits input from command line (RustPython#5021)
* added int_max_str_digits to settings struct * changed vm init to use the value from settings * added error handling and set the settings default to -1 which sets the value to 4300
1 parent 7e66db0 commit a58ede9

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

Lib/test/test_cmd_line.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -933,8 +933,6 @@ def test_parsing_error(self):
933933
self.assertTrue(proc.stderr.startswith(err_msg), proc.stderr)
934934
self.assertNotEqual(proc.returncode, 0)
935935

936-
# TODO: RUSTPYTHON
937-
@unittest.expectedFailure
938936
def test_int_max_str_digits(self):
939937
code = "import sys; print(sys.flags.int_max_str_digits, sys.get_int_max_str_digits())"
940938

src/settings.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,15 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) {
227227
{
228228
settings.dont_write_bytecode = true;
229229
}
230+
if !ignore_environment && env::var_os("PYTHONINTMAXSTRDIGITS").is_some() {
231+
settings.int_max_str_digits = match env::var("PYTHONINTMAXSTRDIGITS").unwrap().parse() {
232+
Ok(digits) if digits == 0 || digits >= 640 => digits,
233+
_ => {
234+
error!("Fatal Python error: config_init_int_max_str_digits: PYTHONINTMAXSTRDIGITS: invalid limit; must be >= 640 or 0 for unlimited.\nPython runtime state: preinitialized");
235+
std::process::exit(1);
236+
}
237+
};
238+
}
230239

231240
settings.check_hash_based_pycs = matches
232241
.value_of("check-hash-based-pycs")
@@ -239,6 +248,7 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) {
239248
settings.xopts.extend(xopts.map(|s| {
240249
let mut parts = s.splitn(2, '=');
241250
let name = parts.next().unwrap().to_owned();
251+
let value = parts.next().map(ToOwned::to_owned);
242252
if name == "dev" {
243253
dev_mode = true
244254
}
@@ -248,7 +258,16 @@ fn settings_from(matches: &ArgMatches) -> (Settings, RunMode) {
248258
if name == "no_sig_int" {
249259
settings.no_sig_int = true;
250260
}
251-
let value = parts.next().map(ToOwned::to_owned);
261+
if name == "int_max_str_digits" {
262+
settings.int_max_str_digits = match value.as_ref().unwrap().parse() {
263+
Ok(digits) if digits == 0 || digits >= 640 => digits,
264+
_ => {
265+
266+
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");
267+
std::process::exit(1);
268+
},
269+
};
270+
}
252271
(name, value)
253272
}));
254273
}

vm/src/stdlib/sys.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ mod sys {
727727
/// -X utf8
728728
utf8_mode: u8,
729729
/// -X int_max_str_digits=number
730-
int_max_str_digits: i8,
730+
int_max_str_digits: i64,
731731
/// -P, `PYTHONSAFEPATH`
732732
safe_path: bool,
733733
/// -X warn_default_encoding, PYTHONWARNDEFAULTENCODING
@@ -753,7 +753,7 @@ mod sys {
753753
isolated: settings.isolated as u8,
754754
dev_mode: settings.dev_mode,
755755
utf8_mode: settings.utf8_mode,
756-
int_max_str_digits: -1,
756+
int_max_str_digits: settings.int_max_str_digits,
757757
safe_path: false,
758758
warn_default_encoding: settings.warn_default_encoding as u8,
759759
}

vm/src/vm/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ impl VirtualMachine {
151151

152152
let warnings = WarningsState::init_state(&ctx);
153153

154+
let int_max_str_digits = AtomicCell::new(match settings.int_max_str_digits {
155+
-1 => 4300,
156+
other => other,
157+
} as usize);
154158
let mut vm = VirtualMachine {
155159
builtins,
156160
sys_module,
@@ -181,7 +185,7 @@ impl VirtualMachine {
181185
before_forkers: PyMutex::default(),
182186
after_forkers_child: PyMutex::default(),
183187
after_forkers_parent: PyMutex::default(),
184-
int_max_str_digits: AtomicCell::new(4300),
188+
int_max_str_digits,
185189
}),
186190
initialized: false,
187191
recursion_depth: Cell::new(0),

vm/src/vm/setting.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ pub struct Settings {
4343
/// -Xfoo[=bar]
4444
pub xopts: Vec<(String, Option<String>)>,
4545

46+
/// -X int_max_str_digits
47+
pub int_max_str_digits: i64,
48+
4649
/// -I
4750
pub isolated: bool,
4851

@@ -118,6 +121,7 @@ impl Default for Settings {
118121
check_hash_based_pycs: "default".to_owned(),
119122
allow_external_library: cfg!(feature = "importlib"),
120123
utf8_mode: 1,
124+
int_max_str_digits: -1,
121125
#[cfg(feature = "flame-it")]
122126
profile_output: None,
123127
#[cfg(feature = "flame-it")]

0 commit comments

Comments
 (0)