Skip to content

Commit 795738d

Browse files
committed
ascii! macro
1 parent 7395959 commit 795738d

18 files changed

+212
-155
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

benches/microbenchmarks.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ fn bench_rustpy_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchmar
133133
scope
134134
.locals
135135
.set_item(
136-
vm.ctx.new_ascii_literal(b"ITERATIONS"),
136+
vm.ctx.new_ascii_literal(crate::utils::ascii!("ITERATIONS")),
137137
vm.ctx.new_int(idx),
138138
vm,
139139
)

vm/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ flame = { version = "0.2", optional = true }
113113
flamer = { version = "0.4", optional = true }
114114

115115
rustpython-common = { path = "../common" }
116+
ascii = "1.0.0"
116117

117118
[target.'cfg(unix)'.dependencies]
118119
exitcode = "1.1.2"

vm/src/builtins/dict.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,9 @@ impl PyDict {
364364
if let Some((key, value)) = self.entries.pop_back() {
365365
Ok(vm.ctx.new_tuple(vec![key, value]))
366366
} else {
367-
let err_msg = vm.ctx.new_ascii_literal(b"popitem(): dictionary is empty");
367+
let err_msg = vm
368+
.ctx
369+
.new_ascii_literal(crate::utils::ascii!("popitem(): dictionary is empty"));
368370
Err(vm.new_key_error(err_msg))
369371
}
370372
}

vm/src/builtins/pystr.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,11 @@ impl PyStrIterator {
212212
fn reduce(&self, vm: &VirtualMachine) -> PyResult {
213213
let iter = vm.get_attribute(vm.builtins.clone(), "iter")?;
214214
Ok(vm.ctx.new_tuple(match self.status.load() {
215-
Exhausted => vec![iter, vm.ctx.new_tuple(vec![vm.ctx.new_ascii_literal(b"")])],
215+
Exhausted => vec![
216+
iter,
217+
vm.ctx
218+
.new_tuple(vec![vm.ctx.new_ascii_literal(crate::utils::ascii!(""))]),
219+
],
216220
Active => vec![
217221
iter,
218222
vm.ctx.new_tuple(vec![self.string.clone().into_object()]),
@@ -976,7 +980,7 @@ impl PyStr {
976980
if has_mid {
977981
sep.into_object()
978982
} else {
979-
vm.ctx.new_ascii_literal(b"")
983+
vm.ctx.new_ascii_literal(crate::utils::ascii!(""))
980984
},
981985
self.new_substr(back),
982986
)
@@ -995,7 +999,7 @@ impl PyStr {
995999
if has_mid {
9961000
sep.into_object()
9971001
} else {
998-
vm.ctx.new_ascii_literal(b"")
1002+
vm.ctx.new_ascii_literal(crate::utils::ascii!(""))
9991003
},
10001004
self.new_substr(back),
10011005
)
@@ -1541,7 +1545,11 @@ mod tests {
15411545
table.set_item("a", vm.ctx.new_utf8_str("🎅"), &vm).unwrap();
15421546
table.set_item("b", vm.ctx.none(), &vm).unwrap();
15431547
table
1544-
.set_item("c", vm.ctx.new_ascii_literal(b"xda"), &vm)
1548+
.set_item(
1549+
"c",
1550+
vm.ctx.new_ascii_literal(crate::utils::ascii!("xda")),
1551+
&vm,
1552+
)
15451553
.unwrap();
15461554
let translated = PyStr::maketrans(
15471555
table.into_object(),

vm/src/builtins/pytype.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ impl PyType {
344344
Some(found)
345345
}
346346
})
347-
.unwrap_or_else(|| vm.ctx.new_ascii_literal(b"builtins"))
347+
.unwrap_or_else(|| vm.ctx.new_ascii_literal(crate::utils::ascii!("builtins")))
348348
}
349349

350350
#[pyproperty(magic, setter)]

vm/src/builtins/set.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ impl PySetInner {
232232
if let Some((key, _)) = self.content.pop_back() {
233233
Ok(key)
234234
} else {
235-
let err_msg = vm.ctx.new_ascii_literal(b"pop from an empty set");
235+
let err_msg = vm
236+
.ctx
237+
.new_ascii_literal(crate::utils::ascii!("pop from an empty set"));
236238
Err(vm.new_key_error(err_msg))
237239
}
238240
}

vm/src/codecs.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,10 @@ fn strict_errors(err: PyObjectRef, vm: &VirtualMachine) -> PyResult {
367367
fn ignore_errors(err: PyObjectRef, vm: &VirtualMachine) -> PyResult<(PyObjectRef, usize)> {
368368
if is_encode_ish_err(&err, vm) || is_decode_err(&err, vm) {
369369
let range = extract_unicode_error_range(&err, vm)?;
370-
Ok((vm.ctx.new_ascii_literal(b""), range.end))
370+
Ok((
371+
vm.ctx.new_ascii_literal(crate::utils::ascii!("")),
372+
range.end,
373+
))
371374
} else {
372375
Err(bad_err_type(err, vm))
373376
}

vm/src/dictdatatype.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -775,12 +775,12 @@ mod tests {
775775
assert_eq!(0, dict.len());
776776

777777
let key1 = vm.ctx.new_bool(true);
778-
let value1 = vm.ctx.new_ascii_literal(b"abc");
778+
let value1 = vm.ctx.new_ascii_literal(crate::utils::ascii!("abc"));
779779
dict.insert(&vm, key1.clone(), value1.clone()).unwrap();
780780
assert_eq!(1, dict.len());
781781

782-
let key2 = vm.ctx.new_ascii_literal(b"x");
783-
let value2 = vm.ctx.new_ascii_literal(b"def");
782+
let key2 = vm.ctx.new_ascii_literal(crate::utils::ascii!("x"));
783+
let value2 = vm.ctx.new_ascii_literal(crate::utils::ascii!("def"));
784784
dict.insert(&vm, key2.clone(), value2.clone()).unwrap();
785785
assert_eq!(2, dict.len());
786786

vm/src/py_io.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ pub fn file_readline(obj: &PyObjectRef, size: Option<usize>, vm: &VirtualMachine
6565
let eof_err = || {
6666
vm.new_exception(
6767
vm.ctx.exceptions.eof_error.clone(),
68-
vec![vm.ctx.new_ascii_literal(b"EOF when reading a line")],
68+
vec![vm
69+
.ctx
70+
.new_ascii_literal(crate::utils::ascii!("EOF when reading a line"))],
6971
)
7072
};
7173
let ret = match_class!(match ret {

vm/src/pyobject.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,10 @@ impl PyContext {
211211
}
212212

213213
#[inline]
214-
pub fn new_ascii_literal(&self, s: &'static [u8]) -> PyObjectRef {
214+
pub fn new_ascii_literal(&self, s: &ascii::AsciiStr) -> PyObjectRef {
215215
PyObject::new(
216216
unsafe {
217-
assert!(s.is_ascii()); // SAFETY
218-
pystr::PyStr::new_str_unchecked(s.to_owned(), pystr::PyStrKind::Ascii)
217+
pystr::PyStr::new_str_unchecked(s.as_bytes().to_owned(), pystr::PyStrKind::Ascii)
219218
},
220219
self.types.str_type.clone(),
221220
None,

0 commit comments

Comments
 (0)