Skip to content

Commit 44f7bc4

Browse files
committed
vm::utils::ascii! -> common::ascii!
1 parent c6edbc4 commit 44f7bc4

18 files changed

+204
-201
lines changed

benches/microbenchmarks.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ use criterion::{
33
criterion_group, criterion_main, BatchSize, BenchmarkGroup, BenchmarkId, Criterion, Throughput,
44
};
55
use rustpython_compiler::Mode;
6-
use rustpython_vm::{utils::ascii, InitParameter, Interpreter, ItemProtocol, PyResult, PySettings};
6+
use rustpython_vm::{
7+
common::ascii, InitParameter, Interpreter, ItemProtocol, PyResult, PySettings,
8+
};
79
use std::path::{Path, PathBuf};
810
use std::{ffi, fs, io};
911

common/src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ pub mod lock;
1111
pub mod rc;
1212
pub mod static_cell;
1313
pub mod str;
14+
15+
pub mod vendored {
16+
pub use ascii;
17+
}

common/src/str.rs

+23
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,29 @@ pub fn to_ascii(value: &str) -> String {
8282
ascii
8383
}
8484

85+
#[doc(hidden)]
86+
pub const fn bytes_is_ascii(x: &str) -> bool {
87+
let x = x.as_bytes();
88+
let mut i = 0;
89+
while i < x.len() {
90+
if !x[i].is_ascii() {
91+
return false;
92+
}
93+
i += 1;
94+
}
95+
true
96+
}
97+
98+
#[macro_export]
99+
macro_rules! ascii {
100+
($x:literal) => {{
101+
const _: () = {
102+
["not ascii"][!$crate::str::bytes_is_ascii($x) as usize];
103+
};
104+
unsafe { $crate::vendored::ascii::AsciiStr::from_ascii_unchecked($x.as_bytes()) }
105+
}};
106+
}
107+
85108
#[cfg(test)]
86109
mod tests {
87110
use super::*;

vm/src/builtins/dict.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::{IterStatus, PySet, PyStrRef, PyTypeRef};
22
use crate::{
3+
common::ascii,
34
dictdatatype::{self, DictKey},
45
exceptions::PyBaseExceptionRef,
56
function::{ArgIterable, FuncArgs, KwArgs, OptionalArg},
@@ -363,7 +364,7 @@ impl PyDict {
363364
} else {
364365
let err_msg = vm
365366
.ctx
366-
.new_ascii_literal(crate::utils::ascii!("popitem(): dictionary is empty"));
367+
.new_ascii_literal(ascii!("popitem(): dictionary is empty"));
367368
Err(vm.new_key_error(err_msg))
368369
}
369370
}

vm/src/builtins/pystr.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ use bstr::ByteSlice;
2020
use crossbeam_utils::atomic::AtomicCell;
2121
use itertools::Itertools;
2222
use num_traits::ToPrimitive;
23-
use rustpython_common::atomic::{self, PyAtomic, Radium};
24-
use rustpython_common::hash;
23+
use rustpython_common::{
24+
ascii,
25+
atomic::{self, PyAtomic, Radium},
26+
hash,
27+
};
2528
use std::mem::size_of;
2629
use std::ops::Range;
2730
use std::string::ToString;
@@ -212,8 +215,7 @@ impl PyStrIterator {
212215
Ok(vm.ctx.new_tuple(match self.status.load() {
213216
Exhausted => vec![
214217
iter,
215-
vm.ctx
216-
.new_tuple(vec![vm.ctx.new_ascii_literal(crate::utils::ascii!(""))]),
218+
vm.ctx.new_tuple(vec![vm.ctx.new_ascii_literal(ascii!(""))]),
217219
],
218220
Active => vec![
219221
iter,
@@ -979,7 +981,7 @@ impl PyStr {
979981
if has_mid {
980982
sep.into_object()
981983
} else {
982-
vm.ctx.new_ascii_literal(crate::utils::ascii!(""))
984+
vm.ctx.new_ascii_literal(ascii!(""))
983985
},
984986
self.new_substr(back),
985987
)
@@ -998,7 +1000,7 @@ impl PyStr {
9981000
if has_mid {
9991001
sep.into_object()
10001002
} else {
1001-
vm.ctx.new_ascii_literal(crate::utils::ascii!(""))
1003+
vm.ctx.new_ascii_literal(ascii!(""))
10021004
},
10031005
self.new_substr(back),
10041006
)
@@ -1544,11 +1546,7 @@ mod tests {
15441546
table.set_item("a", vm.ctx.new_utf8_str("🎅"), &vm).unwrap();
15451547
table.set_item("b", vm.ctx.none(), &vm).unwrap();
15461548
table
1547-
.set_item(
1548-
"c",
1549-
vm.ctx.new_ascii_literal(crate::utils::ascii!("xda")),
1550-
&vm,
1551-
)
1549+
.set_item("c", vm.ctx.new_ascii_literal(ascii!("xda")), &vm)
15521550
.unwrap();
15531551
let translated = PyStr::maketrans(
15541552
table.into_object(),

vm/src/builtins/pytype.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::{
22
mappingproxy::PyMappingProxy, object, PyClassMethod, PyDictRef, PyInt, PyList, PyStaticMethod,
33
PyStr, PyStrRef, PyTuple, PyTupleRef, PyWeak,
44
};
5-
use crate::common::lock::PyRwLock;
5+
use crate::common::{ascii, lock::PyRwLock};
66
use crate::{
77
function::{FuncArgs, KwArgs, OptionalArg},
88
slots::{self, Callable, PyTpFlags, PyTypeSlots, SlotGetattro, SlotSetattro},
@@ -404,7 +404,7 @@ impl PyType {
404404
Some(found)
405405
}
406406
})
407-
.unwrap_or_else(|| vm.ctx.new_ascii_literal(crate::utils::ascii!("builtins")))
407+
.unwrap_or_else(|| vm.ctx.new_ascii_literal(ascii!("builtins")))
408408
}
409409

410410
#[pyproperty(magic, setter)]

vm/src/builtins/set.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Builtin set type with a sequence of unique items.
33
*/
44
use super::{IterStatus, PyDictRef, PyTypeRef};
5-
use crate::common::{hash::PyHash, rc::PyRc};
5+
use crate::common::{ascii, hash::PyHash, rc::PyRc};
66
use crate::{
77
dictdatatype::{self, DictSize},
88
function::{ArgIterable, FuncArgs, OptionalArg, PosArgs},
@@ -235,9 +235,7 @@ impl PySetInner {
235235
if let Some((key, _)) = self.content.pop_back() {
236236
Ok(key)
237237
} else {
238-
let err_msg = vm
239-
.ctx
240-
.new_ascii_literal(crate::utils::ascii!("pop from an empty set"));
238+
let err_msg = vm.ctx.new_ascii_literal(ascii!("pop from an empty set"));
241239
Err(vm.new_key_error(err_msg))
242240
}
243241
}

vm/src/codecs.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::HashMap;
33
use std::ops::Range;
44

55
use crate::builtins::{PyBytesRef, PyStr, PyStrRef, PyTuple, PyTupleRef};
6-
use crate::common::lock::PyRwLock;
6+
use crate::common::{ascii, lock::PyRwLock};
77
use crate::exceptions::PyBaseExceptionRef;
88
use crate::VirtualMachine;
99
use crate::{IntoPyObject, PyContext, PyObjectRef, PyResult, PyValue, TryFromObject, TypeProtocol};
@@ -367,10 +367,7 @@ 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((
371-
vm.ctx.new_ascii_literal(crate::utils::ascii!("")),
372-
range.end,
373-
))
370+
Ok((vm.ctx.new_ascii_literal(ascii!("")), range.end))
374371
} else {
375372
Err(bad_err_type(err, vm))
376373
}

vm/src/dictdatatype.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ use crate::builtins::{PyStr, PyStrRef};
33
/// Inspired by: https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
44
/// And: https://www.youtube.com/watch?v=p33CVV29OG8
55
/// And: http://code.activestate.com/recipes/578375/
6-
use crate::common::lock::{PyRwLock, PyRwLockReadGuard, PyRwLockWriteGuard};
6+
use crate::common::{
7+
hash,
8+
lock::{PyRwLock, PyRwLockReadGuard, PyRwLockWriteGuard},
9+
};
710
use crate::vm::VirtualMachine;
811
use crate::{IdProtocol, IntoPyObject, PyObjectRef, PyRefExact, PyResult, TypeProtocol};
912
use crossbeam_utils::atomic::AtomicCell;
10-
use rustpython_common::hash;
1113
use std::fmt;
1214
use std::mem::size_of;
1315

@@ -766,6 +768,7 @@ fn extract_dict_entry<T>(option_entry: &Option<DictEntry<T>>) -> &DictEntry<T> {
766768
#[cfg(test)]
767769
mod tests {
768770
use super::{Dict, DictKey};
771+
use crate::common::ascii;
769772
use crate::Interpreter;
770773

771774
#[test]
@@ -775,12 +778,12 @@ mod tests {
775778
assert_eq!(0, dict.len());
776779

777780
let key1 = vm.ctx.new_bool(true);
778-
let value1 = vm.ctx.new_ascii_literal(crate::utils::ascii!("abc"));
781+
let value1 = vm.ctx.new_ascii_literal(ascii!("abc"));
779782
dict.insert(&vm, key1.clone(), value1.clone()).unwrap();
780783
assert_eq!(1, dict.len());
781784

782-
let key2 = vm.ctx.new_ascii_literal(crate::utils::ascii!("x"));
783-
let value2 = vm.ctx.new_ascii_literal(crate::utils::ascii!("def"));
785+
let key2 = vm.ctx.new_ascii_literal(ascii!("x"));
786+
let value2 = vm.ctx.new_ascii_literal(ascii!("def"));
784787
dict.insert(&vm, key2.clone(), value2.clone()).unwrap();
785788
assert_eq!(2, dict.len());
786789

vm/src/macros.rs

-10
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,3 @@ cfg_if::cfg_if! {
249249
}
250250
}
251251
}
252-
253-
macro_rules! ascii {
254-
($x:literal) => {{
255-
const _: () = {
256-
["not ascii"][!rustpython_vm::utils::bytes_is_ascii($x) as usize];
257-
};
258-
unsafe { ascii::AsciiStr::from_ascii_unchecked($x.as_bytes()) }
259-
}};
260-
}
261-
pub use ascii;

vm/src/py_io.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::builtins::bytes::PyBytes;
22
use crate::builtins::pystr::PyStr;
3+
use crate::common::ascii;
34
use crate::exceptions::PyBaseExceptionRef;
45
use crate::VirtualMachine;
56
use crate::{PyObjectRef, PyResult};
@@ -65,9 +66,7 @@ pub fn file_readline(obj: &PyObjectRef, size: Option<usize>, vm: &VirtualMachine
6566
let eof_err = || {
6667
vm.new_exception(
6768
vm.ctx.exceptions.eof_error.clone(),
68-
vec![vm
69-
.ctx
70-
.new_ascii_literal(crate::utils::ascii!("EOF when reading a line"))],
69+
vec![vm.ctx.new_ascii_literal(ascii!("EOF when reading a line"))],
7170
)
7271
};
7372
let ret = match_class!(match ret {

0 commit comments

Comments
 (0)