Skip to content

Commit 01aaa9b

Browse files
committed
(WIP) poc of formatting ascii hiint
1 parent dd28a6b commit 01aaa9b

File tree

2 files changed

+8
-7
lines changed

2 files changed

+8
-7
lines changed

vm/src/builtins/str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ impl PyStr {
788788
#[pymethod(name = "__format__")]
789789
fn format_str(&self, spec: PyStrRef, vm: &VirtualMachine) -> PyResult<String> {
790790
match FormatSpec::parse(spec.as_str())
791-
.and_then(|format_spec| format_spec.format_string(self.as_str()))
791+
.and_then(|format_spec| format_spec.format_string(self.as_str(), self.is_ascii()))
792792
{
793793
Ok(string) => Ok(string),
794794
Err(err) => Err(vm.new_value_error(err.to_string())),

vm/src/format.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ impl FormatSpec {
438438
}
439439
};
440440

441-
self.format_sign_and_align(&magnitude_string, sign_str, FormatAlign::Right)
441+
self.format_sign_and_align((&magnitude_string, true), sign_str, FormatAlign::Right)
442442
}
443443

444444
#[inline]
@@ -510,13 +510,13 @@ impl FormatSpec {
510510
},
511511
};
512512

513-
self.format_sign_and_align(&magnitude_string, sign_str, FormatAlign::Right)
513+
self.format_sign_and_align((&magnitude_string, true), sign_str, FormatAlign::Right)
514514
}
515515

516-
pub(crate) fn format_string(&self, s: &str) -> Result<String, &'static str> {
516+
pub(crate) fn format_string(&self, s: &str, ascii_only: bool) -> Result<String, &'static str> {
517517
match self.format_type {
518518
Some(FormatType::String) | None => self
519-
.format_sign_and_align(s, "", FormatAlign::Left)
519+
.format_sign_and_align((s, ascii_only), "", FormatAlign::Left)
520520
.map(|mut value| {
521521
if let Some(precision) = self.precision {
522522
value.truncate(precision);
@@ -529,13 +529,14 @@ impl FormatSpec {
529529

530530
fn format_sign_and_align(
531531
&self,
532-
magnitude_string: &str,
532+
(magnitude_string, magnitude_ascii_hint): (&str, bool),
533533
sign_str: &str,
534534
default_align: FormatAlign,
535535
) -> Result<String, &'static str> {
536536
let align = self.align.unwrap_or(default_align);
537537

538-
let num_chars = if magnitude_string.is_ascii() {
538+
let num_chars = if magnitude_ascii_hint {
539+
debug_assert!(magnitude_string.is_ascii());
539540
magnitude_string.len()
540541
} else {
541542
magnitude_string.chars().count()

0 commit comments

Comments
 (0)