diff --git a/Cargo.lock b/Cargo.lock index c15eed1a5..c4af6fcd2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,6 +76,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "ascii" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbf56136a5198c7b01a49e3afcbef6cf84597273d298f54432926024107b0109" + [[package]] name = "ascii-canvas" version = "3.0.0" @@ -1894,6 +1900,7 @@ version = "0.1.2" dependencies = [ "adler32", "ahash", + "ascii", "atty", "base64", "bitflags", diff --git a/benches/microbenchmarks.rs b/benches/microbenchmarks.rs index f06f0169b..505e0819f 100644 --- a/benches/microbenchmarks.rs +++ b/benches/microbenchmarks.rs @@ -133,7 +133,7 @@ fn bench_rustpy_code(group: &mut BenchmarkGroup, bench: &MicroBenchmar scope .locals .set_item( - vm.ctx.new_ascii_literal(b"ITERATIONS"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("ITERATIONS")), vm.ctx.new_int(idx), vm, ) diff --git a/vm/Cargo.toml b/vm/Cargo.toml index fa0bf4de7..d1851f1fa 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -113,6 +113,7 @@ flame = { version = "0.2", optional = true } flamer = { version = "0.4", optional = true } rustpython-common = { path = "../common" } +ascii = "1.0.0" [target.'cfg(unix)'.dependencies] exitcode = "1.1.2" diff --git a/vm/src/builtins/dict.rs b/vm/src/builtins/dict.rs index e50e3f22c..05ccc8dec 100644 --- a/vm/src/builtins/dict.rs +++ b/vm/src/builtins/dict.rs @@ -364,7 +364,9 @@ impl PyDict { if let Some((key, value)) = self.entries.pop_back() { Ok(vm.ctx.new_tuple(vec![key, value])) } else { - let err_msg = vm.ctx.new_ascii_literal(b"popitem(): dictionary is empty"); + let err_msg = vm + .ctx + .new_ascii_literal(crate::utils::ascii!("popitem(): dictionary is empty")); Err(vm.new_key_error(err_msg)) } } diff --git a/vm/src/builtins/pystr.rs b/vm/src/builtins/pystr.rs index 4a5fd0c85..90b67a7eb 100644 --- a/vm/src/builtins/pystr.rs +++ b/vm/src/builtins/pystr.rs @@ -212,7 +212,11 @@ impl PyStrIterator { fn reduce(&self, vm: &VirtualMachine) -> PyResult { let iter = vm.get_attribute(vm.builtins.clone(), "iter")?; Ok(vm.ctx.new_tuple(match self.status.load() { - Exhausted => vec![iter, vm.ctx.new_tuple(vec![vm.ctx.new_ascii_literal(b"")])], + Exhausted => vec![ + iter, + vm.ctx + .new_tuple(vec![vm.ctx.new_ascii_literal(crate::utils::ascii!(""))]), + ], Active => vec![ iter, vm.ctx.new_tuple(vec![self.string.clone().into_object()]), @@ -976,7 +980,7 @@ impl PyStr { if has_mid { sep.into_object() } else { - vm.ctx.new_ascii_literal(b"") + vm.ctx.new_ascii_literal(crate::utils::ascii!("")) }, self.new_substr(back), ) @@ -995,7 +999,7 @@ impl PyStr { if has_mid { sep.into_object() } else { - vm.ctx.new_ascii_literal(b"") + vm.ctx.new_ascii_literal(crate::utils::ascii!("")) }, self.new_substr(back), ) @@ -1541,7 +1545,11 @@ mod tests { table.set_item("a", vm.ctx.new_utf8_str("🎅"), &vm).unwrap(); table.set_item("b", vm.ctx.none(), &vm).unwrap(); table - .set_item("c", vm.ctx.new_ascii_literal(b"xda"), &vm) + .set_item( + "c", + vm.ctx.new_ascii_literal(crate::utils::ascii!("xda")), + &vm, + ) .unwrap(); let translated = PyStr::maketrans( table.into_object(), diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index a8d190e7e..e69a4cf6e 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -344,7 +344,7 @@ impl PyType { Some(found) } }) - .unwrap_or_else(|| vm.ctx.new_ascii_literal(b"builtins")) + .unwrap_or_else(|| vm.ctx.new_ascii_literal(crate::utils::ascii!("builtins"))) } #[pyproperty(magic, setter)] diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index c71218f53..16bd37f95 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -232,7 +232,9 @@ impl PySetInner { if let Some((key, _)) = self.content.pop_back() { Ok(key) } else { - let err_msg = vm.ctx.new_ascii_literal(b"pop from an empty set"); + let err_msg = vm + .ctx + .new_ascii_literal(crate::utils::ascii!("pop from an empty set")); Err(vm.new_key_error(err_msg)) } } diff --git a/vm/src/codecs.rs b/vm/src/codecs.rs index e1269f4f3..d8a73eb35 100644 --- a/vm/src/codecs.rs +++ b/vm/src/codecs.rs @@ -367,7 +367,10 @@ fn strict_errors(err: PyObjectRef, vm: &VirtualMachine) -> PyResult { fn ignore_errors(err: PyObjectRef, vm: &VirtualMachine) -> PyResult<(PyObjectRef, usize)> { if is_encode_ish_err(&err, vm) || is_decode_err(&err, vm) { let range = extract_unicode_error_range(&err, vm)?; - Ok((vm.ctx.new_ascii_literal(b""), range.end)) + Ok(( + vm.ctx.new_ascii_literal(crate::utils::ascii!("")), + range.end, + )) } else { Err(bad_err_type(err, vm)) } diff --git a/vm/src/dictdatatype.rs b/vm/src/dictdatatype.rs index e46d12218..511f9bb09 100644 --- a/vm/src/dictdatatype.rs +++ b/vm/src/dictdatatype.rs @@ -775,12 +775,12 @@ mod tests { assert_eq!(0, dict.len()); let key1 = vm.ctx.new_bool(true); - let value1 = vm.ctx.new_ascii_literal(b"abc"); + let value1 = vm.ctx.new_ascii_literal(crate::utils::ascii!("abc")); dict.insert(&vm, key1.clone(), value1.clone()).unwrap(); assert_eq!(1, dict.len()); - let key2 = vm.ctx.new_ascii_literal(b"x"); - let value2 = vm.ctx.new_ascii_literal(b"def"); + let key2 = vm.ctx.new_ascii_literal(crate::utils::ascii!("x")); + let value2 = vm.ctx.new_ascii_literal(crate::utils::ascii!("def")); dict.insert(&vm, key2.clone(), value2.clone()).unwrap(); assert_eq!(2, dict.len()); diff --git a/vm/src/py_io.rs b/vm/src/py_io.rs index 8a3cb8692..007f1e4af 100644 --- a/vm/src/py_io.rs +++ b/vm/src/py_io.rs @@ -65,7 +65,9 @@ pub fn file_readline(obj: &PyObjectRef, size: Option, vm: &VirtualMachine let eof_err = || { vm.new_exception( vm.ctx.exceptions.eof_error.clone(), - vec![vm.ctx.new_ascii_literal(b"EOF when reading a line")], + vec![vm + .ctx + .new_ascii_literal(crate::utils::ascii!("EOF when reading a line"))], ) }; let ret = match_class!(match ret { diff --git a/vm/src/pyobject.rs b/vm/src/pyobject.rs index 39af45e45..dd5190606 100644 --- a/vm/src/pyobject.rs +++ b/vm/src/pyobject.rs @@ -211,11 +211,10 @@ impl PyContext { } #[inline] - pub fn new_ascii_literal(&self, s: &'static [u8]) -> PyObjectRef { + pub fn new_ascii_literal(&self, s: &ascii::AsciiStr) -> PyObjectRef { PyObject::new( unsafe { - assert!(s.is_ascii()); // SAFETY - pystr::PyStr::new_str_unchecked(s.to_owned(), pystr::PyStrKind::Ascii) + pystr::PyStr::new_str_unchecked(s.as_bytes().to_owned(), pystr::PyStrKind::Ascii) }, self.types.str_type.clone(), None, diff --git a/vm/src/stdlib/ast/gen.rs b/vm/src/stdlib/ast/gen.rs index 819fbf3b3..de10d5559 100644 --- a/vm/src/stdlib/ast/gen.rs +++ b/vm/src/stdlib/ast/gen.rs @@ -8,7 +8,7 @@ struct NodeModule; impl NodeModule { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"type_ignores")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("type_ignores"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -18,7 +18,7 @@ struct NodeInteractive; impl NodeInteractive { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"body")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("body"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -28,7 +28,7 @@ struct NodeExpression; impl NodeExpression { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"body")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("body"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -38,7 +38,7 @@ struct NodeFunctionType; impl NodeFunctionType { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"argtypes"),ctx.new_ascii_literal(b"returns")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("argtypes")),ctx.new_ascii_literal(crate::utils::ascii!("returns"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -48,8 +48,8 @@ struct NodeFunctionDef; impl NodeFunctionDef { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"name"),ctx.new_ascii_literal(b"args"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"decorator_list"),ctx.new_ascii_literal(b"returns"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("name")),ctx.new_ascii_literal(crate::utils::ascii!("args")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("decorator_list")),ctx.new_ascii_literal(crate::utils::ascii!("returns")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "AsyncFunctionDef", base = "AstNode")] @@ -58,8 +58,8 @@ struct NodeAsyncFunctionDef; impl NodeAsyncFunctionDef { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"name"),ctx.new_ascii_literal(b"args"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"decorator_list"),ctx.new_ascii_literal(b"returns"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("name")),ctx.new_ascii_literal(crate::utils::ascii!("args")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("decorator_list")),ctx.new_ascii_literal(crate::utils::ascii!("returns")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "ClassDef", base = "AstNode")] @@ -68,8 +68,8 @@ struct NodeClassDef; impl NodeClassDef { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"name"),ctx.new_ascii_literal(b"bases"),ctx.new_ascii_literal(b"keywords"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"decorator_list")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("name")),ctx.new_ascii_literal(crate::utils::ascii!("bases")),ctx.new_ascii_literal(crate::utils::ascii!("keywords")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("decorator_list"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Return", base = "AstNode")] @@ -78,8 +78,8 @@ struct NodeReturn; impl NodeReturn { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Delete", base = "AstNode")] @@ -88,8 +88,8 @@ struct NodeDelete; impl NodeDelete { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"targets")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("targets"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Assign", base = "AstNode")] @@ -98,8 +98,8 @@ struct NodeAssign; impl NodeAssign { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"targets"),ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("targets")),ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "AugAssign", base = "AstNode")] @@ -108,8 +108,8 @@ struct NodeAugAssign; impl NodeAugAssign { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"target"),ctx.new_ascii_literal(b"op"),ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("target")),ctx.new_ascii_literal(crate::utils::ascii!("op")),ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "AnnAssign", base = "AstNode")] @@ -118,8 +118,8 @@ struct NodeAnnAssign; impl NodeAnnAssign { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"target"),ctx.new_ascii_literal(b"annotation"),ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"simple")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("target")),ctx.new_ascii_literal(crate::utils::ascii!("annotation")),ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("simple"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "For", base = "AstNode")] @@ -128,8 +128,8 @@ struct NodeFor; impl NodeFor { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"target"),ctx.new_ascii_literal(b"iter"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"orelse"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("target")),ctx.new_ascii_literal(crate::utils::ascii!("iter")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("orelse")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "AsyncFor", base = "AstNode")] @@ -138,8 +138,8 @@ struct NodeAsyncFor; impl NodeAsyncFor { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"target"),ctx.new_ascii_literal(b"iter"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"orelse"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("target")),ctx.new_ascii_literal(crate::utils::ascii!("iter")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("orelse")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "While", base = "AstNode")] @@ -148,8 +148,8 @@ struct NodeWhile; impl NodeWhile { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"test"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"orelse")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("test")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("orelse"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "If", base = "AstNode")] @@ -158,8 +158,8 @@ struct NodeIf; impl NodeIf { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"test"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"orelse")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("test")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("orelse"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "With", base = "AstNode")] @@ -168,8 +168,8 @@ struct NodeWith; impl NodeWith { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"items"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("items")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "AsyncWith", base = "AstNode")] @@ -178,8 +178,8 @@ struct NodeAsyncWith; impl NodeAsyncWith { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"items"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("items")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Raise", base = "AstNode")] @@ -188,8 +188,8 @@ struct NodeRaise; impl NodeRaise { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"exc"),ctx.new_ascii_literal(b"cause")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("exc")),ctx.new_ascii_literal(crate::utils::ascii!("cause"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Try", base = "AstNode")] @@ -198,8 +198,8 @@ struct NodeTry; impl NodeTry { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"handlers"),ctx.new_ascii_literal(b"orelse"),ctx.new_ascii_literal(b"finalbody")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("handlers")),ctx.new_ascii_literal(crate::utils::ascii!("orelse")),ctx.new_ascii_literal(crate::utils::ascii!("finalbody"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Assert", base = "AstNode")] @@ -208,8 +208,8 @@ struct NodeAssert; impl NodeAssert { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"test"),ctx.new_ascii_literal(b"msg")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("test")),ctx.new_ascii_literal(crate::utils::ascii!("msg"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Import", base = "AstNode")] @@ -218,8 +218,8 @@ struct NodeImport; impl NodeImport { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"names")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("names"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "ImportFrom", base = "AstNode")] @@ -228,8 +228,8 @@ struct NodeImportFrom; impl NodeImportFrom { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"module"),ctx.new_ascii_literal(b"names"),ctx.new_ascii_literal(b"level")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("module")),ctx.new_ascii_literal(crate::utils::ascii!("names")),ctx.new_ascii_literal(crate::utils::ascii!("level"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Global", base = "AstNode")] @@ -238,8 +238,8 @@ struct NodeGlobal; impl NodeGlobal { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"names")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("names"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Nonlocal", base = "AstNode")] @@ -248,8 +248,8 @@ struct NodeNonlocal; impl NodeNonlocal { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"names")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("names"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Expr", base = "AstNode")] @@ -258,8 +258,8 @@ struct NodeExpr; impl NodeExpr { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Pass", base = "AstNode")] @@ -269,7 +269,7 @@ impl NodePass { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { class.set_str_attr("_fields", ctx.new_list(vec![])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Break", base = "AstNode")] @@ -279,7 +279,7 @@ impl NodeBreak { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { class.set_str_attr("_fields", ctx.new_list(vec![])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Continue", base = "AstNode")] @@ -289,7 +289,7 @@ impl NodeContinue { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { class.set_str_attr("_fields", ctx.new_list(vec![])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "BoolOp", base = "AstNode")] @@ -298,8 +298,8 @@ struct NodeBoolOp; impl NodeBoolOp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"op"),ctx.new_ascii_literal(b"values")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("op")),ctx.new_ascii_literal(crate::utils::ascii!("values"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "NamedExpr", base = "AstNode")] @@ -308,8 +308,8 @@ struct NodeNamedExpr; impl NodeNamedExpr { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"target"),ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("target")),ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "BinOp", base = "AstNode")] @@ -318,8 +318,8 @@ struct NodeBinOp; impl NodeBinOp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"left"),ctx.new_ascii_literal(b"op"),ctx.new_ascii_literal(b"right")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("left")),ctx.new_ascii_literal(crate::utils::ascii!("op")),ctx.new_ascii_literal(crate::utils::ascii!("right"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "UnaryOp", base = "AstNode")] @@ -328,8 +328,8 @@ struct NodeUnaryOp; impl NodeUnaryOp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"op"),ctx.new_ascii_literal(b"operand")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("op")),ctx.new_ascii_literal(crate::utils::ascii!("operand"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Lambda", base = "AstNode")] @@ -338,8 +338,8 @@ struct NodeLambda; impl NodeLambda { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"args"),ctx.new_ascii_literal(b"body")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("args")),ctx.new_ascii_literal(crate::utils::ascii!("body"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "IfExp", base = "AstNode")] @@ -348,8 +348,8 @@ struct NodeIfExp; impl NodeIfExp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"test"),ctx.new_ascii_literal(b"body"),ctx.new_ascii_literal(b"orelse")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("test")),ctx.new_ascii_literal(crate::utils::ascii!("body")),ctx.new_ascii_literal(crate::utils::ascii!("orelse"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Dict", base = "AstNode")] @@ -358,8 +358,8 @@ struct NodeDict; impl NodeDict { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"keys"),ctx.new_ascii_literal(b"values")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("keys")),ctx.new_ascii_literal(crate::utils::ascii!("values"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Set", base = "AstNode")] @@ -368,8 +368,8 @@ struct NodeSet; impl NodeSet { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"elts")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("elts"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "ListComp", base = "AstNode")] @@ -378,8 +378,8 @@ struct NodeListComp; impl NodeListComp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"elt"),ctx.new_ascii_literal(b"generators")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("elt")),ctx.new_ascii_literal(crate::utils::ascii!("generators"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "SetComp", base = "AstNode")] @@ -388,8 +388,8 @@ struct NodeSetComp; impl NodeSetComp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"elt"),ctx.new_ascii_literal(b"generators")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("elt")),ctx.new_ascii_literal(crate::utils::ascii!("generators"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "DictComp", base = "AstNode")] @@ -398,8 +398,8 @@ struct NodeDictComp; impl NodeDictComp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"key"),ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"generators")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("key")),ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("generators"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "GeneratorExp", base = "AstNode")] @@ -408,8 +408,8 @@ struct NodeGeneratorExp; impl NodeGeneratorExp { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"elt"),ctx.new_ascii_literal(b"generators")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("elt")),ctx.new_ascii_literal(crate::utils::ascii!("generators"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Await", base = "AstNode")] @@ -418,8 +418,8 @@ struct NodeAwait; impl NodeAwait { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Yield", base = "AstNode")] @@ -428,8 +428,8 @@ struct NodeYield; impl NodeYield { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "YieldFrom", base = "AstNode")] @@ -438,8 +438,8 @@ struct NodeYieldFrom; impl NodeYieldFrom { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Compare", base = "AstNode")] @@ -448,8 +448,8 @@ struct NodeCompare; impl NodeCompare { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"left"),ctx.new_ascii_literal(b"ops"),ctx.new_ascii_literal(b"comparators")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("left")),ctx.new_ascii_literal(crate::utils::ascii!("ops")),ctx.new_ascii_literal(crate::utils::ascii!("comparators"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Call", base = "AstNode")] @@ -458,8 +458,8 @@ struct NodeCall; impl NodeCall { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"func"),ctx.new_ascii_literal(b"args"),ctx.new_ascii_literal(b"keywords")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("func")),ctx.new_ascii_literal(crate::utils::ascii!("args")),ctx.new_ascii_literal(crate::utils::ascii!("keywords"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "FormattedValue", base = "AstNode")] @@ -468,8 +468,8 @@ struct NodeFormattedValue; impl NodeFormattedValue { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"conversion"),ctx.new_ascii_literal(b"format_spec")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("conversion")),ctx.new_ascii_literal(crate::utils::ascii!("format_spec"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "JoinedStr", base = "AstNode")] @@ -478,8 +478,8 @@ struct NodeJoinedStr; impl NodeJoinedStr { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"values")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("values"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Constant", base = "AstNode")] @@ -488,8 +488,8 @@ struct NodeConstant; impl NodeConstant { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"kind")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("kind"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Attribute", base = "AstNode")] @@ -498,8 +498,8 @@ struct NodeAttribute; impl NodeAttribute { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"attr"),ctx.new_ascii_literal(b"ctx")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("attr")),ctx.new_ascii_literal(crate::utils::ascii!("ctx"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Subscript", base = "AstNode")] @@ -508,8 +508,8 @@ struct NodeSubscript; impl NodeSubscript { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"slice"),ctx.new_ascii_literal(b"ctx")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("slice")),ctx.new_ascii_literal(crate::utils::ascii!("ctx"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Starred", base = "AstNode")] @@ -518,8 +518,8 @@ struct NodeStarred; impl NodeStarred { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"value"),ctx.new_ascii_literal(b"ctx")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("value")),ctx.new_ascii_literal(crate::utils::ascii!("ctx"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Name", base = "AstNode")] @@ -528,8 +528,8 @@ struct NodeName; impl NodeName { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"id"),ctx.new_ascii_literal(b"ctx")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("id")),ctx.new_ascii_literal(crate::utils::ascii!("ctx"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "List", base = "AstNode")] @@ -538,8 +538,8 @@ struct NodeList; impl NodeList { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"elts"),ctx.new_ascii_literal(b"ctx")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("elts")),ctx.new_ascii_literal(crate::utils::ascii!("ctx"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Tuple", base = "AstNode")] @@ -548,8 +548,8 @@ struct NodeTuple; impl NodeTuple { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"elts"),ctx.new_ascii_literal(b"ctx")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("elts")),ctx.new_ascii_literal(crate::utils::ascii!("ctx"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Slice", base = "AstNode")] @@ -558,8 +558,8 @@ struct NodeSlice; impl NodeSlice { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"lower"),ctx.new_ascii_literal(b"upper"),ctx.new_ascii_literal(b"step")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lower")),ctx.new_ascii_literal(crate::utils::ascii!("upper")),ctx.new_ascii_literal(crate::utils::ascii!("step"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "Load", base = "AstNode")] @@ -888,7 +888,7 @@ struct Nodecomprehension; impl Nodecomprehension { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"target"),ctx.new_ascii_literal(b"iter"),ctx.new_ascii_literal(b"ifs"),ctx.new_ascii_literal(b"is_async")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("target")),ctx.new_ascii_literal(crate::utils::ascii!("iter")),ctx.new_ascii_literal(crate::utils::ascii!("ifs")),ctx.new_ascii_literal(crate::utils::ascii!("is_async"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -898,8 +898,8 @@ struct NodeExceptHandler; impl NodeExceptHandler { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"type"),ctx.new_ascii_literal(b"name"),ctx.new_ascii_literal(b"body")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("type")),ctx.new_ascii_literal(crate::utils::ascii!("name")),ctx.new_ascii_literal(crate::utils::ascii!("body"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "arguments", base = "AstNode")] @@ -908,7 +908,7 @@ struct Nodearguments; impl Nodearguments { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"posonlyargs"),ctx.new_ascii_literal(b"args"),ctx.new_ascii_literal(b"vararg"),ctx.new_ascii_literal(b"kwonlyargs"),ctx.new_ascii_literal(b"kw_defaults"),ctx.new_ascii_literal(b"kwarg"),ctx.new_ascii_literal(b"defaults")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("posonlyargs")),ctx.new_ascii_literal(crate::utils::ascii!("args")),ctx.new_ascii_literal(crate::utils::ascii!("vararg")),ctx.new_ascii_literal(crate::utils::ascii!("kwonlyargs")),ctx.new_ascii_literal(crate::utils::ascii!("kw_defaults")),ctx.new_ascii_literal(crate::utils::ascii!("kwarg")),ctx.new_ascii_literal(crate::utils::ascii!("defaults"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -918,8 +918,8 @@ struct Nodearg; impl Nodearg { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"arg"),ctx.new_ascii_literal(b"annotation"),ctx.new_ascii_literal(b"type_comment")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("arg")),ctx.new_ascii_literal(crate::utils::ascii!("annotation")),ctx.new_ascii_literal(crate::utils::ascii!("type_comment"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "keyword", base = "AstNode")] @@ -928,8 +928,8 @@ struct Nodekeyword; impl Nodekeyword { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"arg"),ctx.new_ascii_literal(b"value")])); - class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"col_offset"),ctx.new_ascii_literal(b"end_lineno"),ctx.new_ascii_literal(b"end_col_offset")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("arg")),ctx.new_ascii_literal(crate::utils::ascii!("value"))])); + class.set_str_attr("_attributes", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("col_offset")),ctx.new_ascii_literal(crate::utils::ascii!("end_lineno")),ctx.new_ascii_literal(crate::utils::ascii!("end_col_offset"))])); } } #[pyclass(module = "_ast", name = "alias", base = "AstNode")] @@ -938,7 +938,7 @@ struct Nodealias; impl Nodealias { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"name"),ctx.new_ascii_literal(b"asname")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("name")),ctx.new_ascii_literal(crate::utils::ascii!("asname"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -948,7 +948,7 @@ struct Nodewithitem; impl Nodewithitem { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"context_expr"),ctx.new_ascii_literal(b"optional_vars")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("context_expr")),ctx.new_ascii_literal(crate::utils::ascii!("optional_vars"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } @@ -958,7 +958,7 @@ struct NodeTypeIgnore; impl NodeTypeIgnore { #[extend_class] fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) { - class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(b"lineno"),ctx.new_ascii_literal(b"tag")])); + class.set_str_attr("_fields", ctx.new_list(vec![ctx.new_ascii_literal(crate::utils::ascii!("lineno")),ctx.new_ascii_literal(crate::utils::ascii!("tag"))])); class.set_str_attr("_attributes", ctx.new_list(vec![])); } } diff --git a/vm/src/stdlib/sre.rs b/vm/src/stdlib/sre.rs index 8eaf5e8fa..2cd30ac11 100644 --- a/vm/src/stdlib/sre.rs +++ b/vm/src/stdlib/sre.rs @@ -274,8 +274,13 @@ mod _sre { m.get_slice(zelf.groups, state.string, vm) .unwrap_or_else(|| vm.ctx.none()) } else { - m.groups(OptionalArg::Present(vm.ctx.new_ascii_literal(b"")), vm)? - .into_object() + m.groups( + OptionalArg::Present( + vm.ctx.new_ascii_literal(crate::utils::ascii!("")), + ), + vm, + )? + .into_object() }; matchlist.push(item); @@ -510,7 +515,7 @@ mod _sre { let join_type = if zelf.isbytes { vm.ctx.new_bytes(vec![]) } else { - vm.ctx.new_ascii_literal(b"") + vm.ctx.new_ascii_literal(crate::utils::ascii!("")) }; let ret = vm.call_method(&join_type, "join", (list,))?; diff --git a/vm/src/stdlib/ssl.rs b/vm/src/stdlib/ssl.rs index 4e9e484d6..23eab8139 100644 --- a/vm/src/stdlib/ssl.rs +++ b/vm/src/stdlib/ssl.rs @@ -76,8 +76,8 @@ enum ProtoVersion { } // taken from CPython, should probably be kept up to date with their version if it ever changes -const DEFAULT_CIPHER_STRING: &[u8] = - b"DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK"; +const DEFAULT_CIPHER_STRING: &str = + "DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK"; #[derive(num_enum::IntoPrimitive, num_enum::TryFromPrimitive)] #[repr(i32)] @@ -154,8 +154,12 @@ fn _ssl_enum_certificates(store_name: PyStrRef, vm: &VirtualMachine) -> PyResult (*ptr).dwCertEncodingType }; let enc_type = match enc_type { - wincrypt::X509_ASN_ENCODING => vm.ctx.new_ascii_literal(b"x509_asn"), - wincrypt::PKCS_7_ASN_ENCODING => vm.ctx.new_ascii_literal(b"pkcs_7_asn"), + wincrypt::X509_ASN_ENCODING => { + vm.ctx.new_ascii_literal(crate::utils::ascii!("x509_asn")) + } + wincrypt::PKCS_7_ASN_ENCODING => { + vm.ctx.new_ascii_literal(crate::utils::ascii!("pkcs_7_asn")) + } other => vm.ctx.new_int(other), }; let usage = match c.valid_uses()? { @@ -1058,17 +1062,17 @@ fn cert_to_py(vm: &VirtualMachine, cert: &X509Ref, binary: bool) -> PyResult { .filter_map(|gen_name| { if let Some(email) = gen_name.email() { Some(vm.ctx.new_tuple(vec![ - vm.ctx.new_ascii_literal(b"email"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("email")), vm.ctx.new_utf8_str(email), ])) } else if let Some(dnsname) = gen_name.dnsname() { Some(vm.ctx.new_tuple(vec![ - vm.ctx.new_ascii_literal(b"DNS"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("DNS")), vm.ctx.new_utf8_str(dnsname), ])) } else if let Some(ip) = gen_name.ipaddress() { Some(vm.ctx.new_tuple(vec![ - vm.ctx.new_ascii_literal(b"IP Address"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("IP Address")), vm.ctx.new_utf8_str(String::from_utf8_lossy(ip).into_owned()), ])) } else { @@ -1159,7 +1163,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef { "OPENSSL_VERSION_NUMBER" => ctx.new_int(openssl::version::number()), "OPENSSL_VERSION_INFO" => parse_version_info(openssl::version::number()).into_pyobject(vm), "_OPENSSL_API_VERSION" => parse_version_info(openssl_api_version).into_pyobject(vm), - "_DEFAULT_CIPHERS" => ctx.new_ascii_literal(DEFAULT_CIPHER_STRING), + "_DEFAULT_CIPHERS" => ctx.new_utf8_str(DEFAULT_CIPHER_STRING), // "PROTOCOL_SSLv2" => ctx.new_int(SslVersion::Ssl2 as u32), unsupported // "PROTOCOL_SSLv3" => ctx.new_int(SslVersion::Ssl3 as u32), "PROTOCOL_SSLv23" => ctx.new_int(SslVersion::Tls as u32), diff --git a/vm/src/stdlib/string.rs b/vm/src/stdlib/string.rs index 80235151f..2125f17f0 100644 --- a/vm/src/stdlib/string.rs +++ b/vm/src/stdlib/string.rs @@ -77,7 +77,7 @@ mod _string { let field_name = FieldName::parse(text.as_str()).map_err(|e| e.into_pyexception(vm))?; let first = match field_name.field_type { - FieldType::Auto => vm.ctx.new_ascii_literal(b""), + FieldType::Auto => vm.ctx.new_ascii_literal(crate::utils::ascii!("")), FieldType::Index(index) => index.into_pyobject(vm), FieldType::Keyword(attribute) => attribute.into_pyobject(vm), }; diff --git a/vm/src/sysmodule.rs b/vm/src/sysmodule.rs index 776638981..122a90d33 100644 --- a/vm/src/sysmodule.rs +++ b/vm/src/sysmodule.rs @@ -44,7 +44,7 @@ fn executable(ctx: &PyContext) -> PyObjectRef { if let Some(exec_path) = env::args().next() { let path = path::Path::new(&exec_path); if !path.exists() { - return ctx.new_ascii_literal(b""); + return ctx.new_ascii_literal(crate::utils::ascii!("")); } if path.is_absolute() { return ctx.new_utf8_str(exec_path); @@ -237,7 +237,7 @@ fn sys_exc_info(vm: &VirtualMachine) -> (PyObjectRef, PyObjectRef, PyObjectRef) fn sys_git_info(vm: &VirtualMachine) -> PyObjectRef { vm.ctx.new_tuple(vec![ - vm.ctx.new_ascii_literal(b"RustPython"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("RustPython")), vm.ctx.new_utf8_str(version::get_git_identifier()), vm.ctx.new_utf8_str(version::get_git_revision()), ]) @@ -513,8 +513,8 @@ pub(crate) fn make_module(vm: &VirtualMachine, module: PyObjectRef, builtins: Py // TODO Add crate version to this namespace let implementation = py_namespace!(vm, { - "name" => ctx.new_ascii_literal(b"rustpython"), - "cache_tag" => ctx.new_ascii_literal(b"rustpython-01"), + "name" => ctx.new_ascii_literal(crate::utils::ascii!("rustpython")), + "cache_tag" => ctx.new_ascii_literal(crate::utils::ascii!("rustpython-01")), "_multiarch" => ctx.new_utf8_str(MULTIARCH.to_owned()), "version" => version_info.clone(), "hexversion" => ctx.new_int(version::VERSION_HEX), @@ -650,7 +650,7 @@ settrace() -- set the global debug tracing function let base_exec_prefix = option_env!("RUSTPYTHON_BASEEXECPREFIX").unwrap_or(exec_prefix); extend_module!(vm, module, { - "__name__" => ctx.new_ascii_literal(b"sys"), + "__name__" => ctx.new_ascii_literal(crate::utils::ascii!("sys")), "argv" => argv(vm), "builtin_module_names" => builtin_module_names, "byteorder" => ctx.new_utf8_str(bytorder), @@ -672,8 +672,8 @@ settrace() -- set the global debug tracing function "maxunicode" => ctx.new_int(MAXUNICODE), "maxsize" => ctx.new_int(MAXSIZE), "path" => path, - "ps1" => ctx.new_ascii_literal(b">>>>> "), - "ps2" => ctx.new_ascii_literal(b"..... "), + "ps1" => ctx.new_ascii_literal(crate::utils::ascii!(">>>>> ")), + "ps2" => ctx.new_ascii_literal(crate::utils::ascii!("..... ")), "__doc__" => ctx.new_utf8_str(sys_doc), "_getframe" => named_function!(ctx, sys, _getframe), "modules" => modules.clone(), @@ -706,7 +706,7 @@ settrace() -- set the global debug tracing function "api_version" => ctx.new_int(0x0), // what C api? "float_info" => float_info, "int_info" => int_info, - "float_repr_style" => ctx.new_ascii_literal(b"short"), + "float_repr_style" => ctx.new_ascii_literal(crate::utils::ascii!("short")), "_xoptions" => xopts, "warnoptions" => warnopts, "_rustpython_debugbuild" => ctx.new_bool(cfg!(debug_assertions)), diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 5e67c4868..d0f65de27 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -126,3 +126,27 @@ impl ToCString for PyStr { std::ffi::CString::new(self.as_ref()).map_err(|err| err.into_pyexception(vm)) } } + +#[allow(dead_code)] +pub(crate) const fn bytes_is_ascii(x: &str) -> bool { + let x = x.as_bytes(); + let mut i = 0; + while i < x.len() { + if !x[i].is_ascii() { + return false; + } + i += 1; + } + true +} + +macro_rules! ascii { + ($x:literal) => {{ + const _: () = { + ["not ascii"][!crate::utils::bytes_is_ascii($x) as usize]; + }; + unsafe { ascii::AsciiStr::from_ascii_unchecked($x.as_bytes()) } + }}; +} + +pub(crate) use ascii; diff --git a/vm/src/vm.rs b/vm/src/vm.rs index c0831e005..eee232177 100644 --- a/vm/src/vm.rs +++ b/vm/src/vm.rs @@ -308,13 +308,13 @@ impl VirtualMachine { module::init_module_dict( &vm, &builtins_dict, - vm.ctx.new_ascii_literal(b"builtins"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("builtins")), vm.ctx.none(), ); module::init_module_dict( &vm, &sysmod_dict, - vm.ctx.new_ascii_literal(b"sys"), + vm.ctx.new_ascii_literal(crate::utils::ascii!("sys")), vm.ctx.none(), ); vm @@ -2230,7 +2230,7 @@ mod tests { #[test] fn test_multiply_str() { Interpreter::default().enter(|vm| { - let a = vm.ctx.new_ascii_literal(b"Hello "); + let a = vm.ctx.new_ascii_literal(crate::utils::ascii!("Hello ")); let b = vm.ctx.new_int(4_i32); let res = vm._mul(&a, &b).unwrap(); let value = res.payload::().unwrap();