From bc05b98ca6ea0f4a87bac55e9d425e064e24e2ac Mon Sep 17 00:00:00 2001 From: Moreal Date: Sat, 23 Oct 2021 21:16:28 +0900 Subject: [PATCH] Relocate `vm.to_repr` to `object.repr` --- src/lib.rs | 2 +- vm/src/builtins/dict.rs | 6 +++--- vm/src/builtins/function.rs | 2 +- vm/src/builtins/genericalias.rs | 4 ++-- vm/src/builtins/int.rs | 4 ++-- vm/src/builtins/list.rs | 2 +- vm/src/builtins/mappingproxy.rs | 2 +- vm/src/builtins/namespace.rs | 4 ++-- vm/src/builtins/object.rs | 2 +- vm/src/builtins/range.rs | 3 ++- vm/src/builtins/set.rs | 2 +- vm/src/builtins/slice.rs | 6 +++--- vm/src/builtins/tuple.rs | 2 +- vm/src/cformat.rs | 4 ++-- vm/src/exceptions.rs | 6 ++++-- vm/src/format.rs | 2 +- vm/src/frame.rs | 4 ++-- vm/src/protocol/object.rs | 7 +++++-- vm/src/pyobject.rs | 2 +- vm/src/pyobjectrc.rs | 4 ++-- vm/src/stdlib/ast/gen.rs | 20 ++++++++++---------- vm/src/stdlib/builtins.rs | 4 ++-- vm/src/stdlib/collections.rs | 4 ++-- vm/src/stdlib/io.rs | 4 ++-- vm/src/stdlib/itertools.rs | 2 +- vm/src/stdlib/operator.rs | 10 +++++----- vm/src/stdlib/os.rs | 2 +- vm/src/stdlib/posix.rs | 2 +- vm/src/stdlib/pwd.rs | 2 +- vm/src/stdlib/sre.rs | 4 ++-- vm/src/stdlib/sys.rs | 2 +- vm/src/stdlib/thread.rs | 2 +- vm/src/vm.rs | 7 ------- 33 files changed, 67 insertions(+), 68 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5bb6d7b1e..ec8e11f18 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -128,7 +128,7 @@ where } }), _ => { - if let Ok(r) = vm.to_repr(args.as_object()) { + if let Ok(r) = args.as_object().repr(vm) { eprintln!("{}", r); } 1 diff --git a/vm/src/builtins/dict.rs b/vm/src/builtins/dict.rs index d760bc83b..ea3195425 100644 --- a/vm/src/builtins/dict.rs +++ b/vm/src/builtins/dict.rs @@ -213,8 +213,8 @@ impl PyDict { let s = if let Some(_guard) = ReprGuard::enter(vm, zelf.as_object()) { let mut str_parts = Vec::with_capacity(zelf.len()); for (key, value) in zelf { - let key_repr = vm.to_repr(&key)?; - let value_repr = vm.to_repr(&value)?; + let key_repr = &key.repr(vm)?; + let value_repr = value.repr(vm)?; str_parts.push(format!("{}: {}", key_repr, value_repr)); } @@ -696,7 +696,7 @@ where let s = if let Some(_guard) = ReprGuard::enter(vm, zelf.as_object()) { let mut str_parts = Vec::with_capacity(zelf.len()); for (key, value) in zelf.dict().clone() { - let s = vm.to_repr(&Self::item(vm, key, value))?; + let s = &Self::item(vm, key, value).repr(vm)?; str_parts.push(s.as_str().to_owned()); } format!("{}([{}])", Self::NAME, str_parts.join(", ")) diff --git a/vm/src/builtins/function.rs b/vm/src/builtins/function.rs index c39999306..f6dcff49b 100644 --- a/vm/src/builtins/function.rs +++ b/vm/src/builtins/function.rs @@ -516,7 +516,7 @@ impl PyBoundMethod { Ok(format!( "", funcname.as_ref().map_or("?", |s| s.as_str()), - vm.to_repr(&self.object)?.as_str(), + &self.object.repr(vm)?.as_str(), )) } diff --git a/vm/src/builtins/genericalias.rs b/vm/src/builtins/genericalias.rs index a65b8bede..2039392c4 100644 --- a/vm/src/builtins/genericalias.rs +++ b/vm/src/builtins/genericalias.rs @@ -82,7 +82,7 @@ impl PyGenericAlias { if vm.get_attribute_opt(obj.clone(), "__origin__")?.is_some() && vm.get_attribute_opt(obj.clone(), "__args__")?.is_some() { - return Ok(vm.to_repr(&obj)?.as_str().to_string()); + return Ok(obj.repr(vm)?.as_str().to_string()); } match ( @@ -91,7 +91,7 @@ impl PyGenericAlias { vm.get_attribute_opt(obj.clone(), "__module__")? .and_then(|o| o.downcast_ref::().map(|m| m.as_str().to_string())), ) { - (None, _) | (_, None) => Ok(vm.to_repr(&obj)?.as_str().to_string()), + (None, _) | (_, None) => Ok(obj.repr(vm)?.as_str().to_string()), (Some(qualname), Some(module)) => Ok(if module == "builtins" { qualname } else { diff --git a/vm/src/builtins/int.rs b/vm/src/builtins/int.rs index ee248e5ff..b51820a75 100644 --- a/vm/src/builtins/int.rs +++ b/vm/src/builtins/int.rs @@ -785,7 +785,7 @@ fn try_int_radix(obj: &PyObject, base: u32, vm: &VirtualMachine) -> PyResult Err(vm.new_value_error(format!( "invalid literal for int() with base {}: {}", base, - vm.to_repr(obj)?, + obj.repr(vm)?, ))), } } @@ -917,7 +917,7 @@ pub(crate) fn try_int(obj: &PyObject, vm: &VirtualMachine) -> PyResult { None => Err(vm.new_value_error(format!( "invalid literal for int() with base {}: {}", base, - vm.to_repr(obj)?, + obj.repr(vm)?, ))), } } diff --git a/vm/src/builtins/list.rs b/vm/src/builtins/list.rs index 142346b2b..b67de42de 100644 --- a/vm/src/builtins/list.rs +++ b/vm/src/builtins/list.rs @@ -228,7 +228,7 @@ impl PyList { let elements = zelf.borrow_vec().to_vec(); let mut str_parts = Vec::with_capacity(elements.len()); for elem in elements.iter() { - let s = vm.to_repr(elem)?; + let s = elem.repr(vm)?; str_parts.push(s.as_str().to_owned()); } format!("[{}]", str_parts.join(", ")) diff --git a/vm/src/builtins/mappingproxy.rs b/vm/src/builtins/mappingproxy.rs index dded8320a..ab6a147fe 100644 --- a/vm/src/builtins/mappingproxy.rs +++ b/vm/src/builtins/mappingproxy.rs @@ -146,7 +146,7 @@ impl PyMappingProxy { PyDict::from_attributes(c.attributes.read().clone(), vm)?.into_pyobject(vm) } }; - Ok(format!("mappingproxy({})", vm.to_repr(&obj)?)) + Ok(format!("mappingproxy({})", obj.repr(vm)?)) } #[pyclassmethod(magic)] diff --git a/vm/src/builtins/namespace.rs b/vm/src/builtins/namespace.rs index 77039dddb..77a5e4c07 100644 --- a/vm/src/builtins/namespace.rs +++ b/vm/src/builtins/namespace.rs @@ -61,9 +61,9 @@ impl PyNamespace { let parts = if let Some(dict) = zelf.as_object().dict() { let mut parts = Vec::with_capacity(dict.len()); for (key, value) in dict { - let k = vm.to_repr(&key)?; + let k = &key.repr(vm)?; let key_str = k.as_str(); - let value_repr = vm.to_repr(&value)?; + let value_repr = value.repr(vm)?; parts.push(format!("{}={}", &key_str[1..key_str.len() - 1], value_repr)); } parts diff --git a/vm/src/builtins/object.rs b/vm/src/builtins/object.rs index 33b069613..260e40c89 100644 --- a/vm/src/builtins/object.rs +++ b/vm/src/builtins/object.rs @@ -170,7 +170,7 @@ impl PyBaseObject { /// Return str(self). #[pymethod(magic)] fn str(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { - vm.to_repr(&zelf) + zelf.repr(vm) } /// Return repr(self). diff --git a/vm/src/builtins/range.rs b/vm/src/builtins/range.rs index 171a95b2d..4bfa8f9a3 100644 --- a/vm/src/builtins/range.rs +++ b/vm/src/builtins/range.rs @@ -49,7 +49,8 @@ fn iter_search( SearchType::Contains => Ok(0), SearchType::Index => Err(vm.new_value_error(format!( "{} not in range", - vm.to_repr(&item) + &item + .repr(vm) .map(|v| v.as_str().to_owned()) .unwrap_or_else(|_| "value".to_owned()) ))), diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index c47578e88..9432e036a 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -219,7 +219,7 @@ impl PySetInner { } repr.push('{'); { - let mut parts_iter = self.elements().into_iter().map(|o| vm.to_repr(&o)); + let mut parts_iter = self.elements().into_iter().map(|o| o.repr(vm)); repr.push_str( parts_iter .next() diff --git a/vm/src/builtins/slice.rs b/vm/src/builtins/slice.rs index 6b05681cb..e1b135035 100644 --- a/vm/src/builtins/slice.rs +++ b/vm/src/builtins/slice.rs @@ -57,9 +57,9 @@ impl PySlice { #[pymethod(magic)] fn repr(&self, vm: &VirtualMachine) -> PyResult { - let start_repr = vm.to_repr(self.start_ref(vm))?; - let stop_repr = vm.to_repr(&self.stop)?; - let step_repr = vm.to_repr(self.step_ref(vm))?; + let start_repr = self.start_ref(vm).repr(vm)?; + let stop_repr = &self.stop.repr(vm)?; + let step_repr = self.step_ref(vm).repr(vm)?; Ok(format!( "slice({}, {}, {})", diff --git a/vm/src/builtins/tuple.rs b/vm/src/builtins/tuple.rs index 497a26245..e75fcf9bf 100644 --- a/vm/src/builtins/tuple.rs +++ b/vm/src/builtins/tuple.rs @@ -201,7 +201,7 @@ impl PyTuple { let s = if let Some(_guard) = ReprGuard::enter(vm, zelf.as_object()) { let mut str_parts = Vec::with_capacity(zelf.elements.len()); for elem in zelf.elements.iter() { - let s = vm.to_repr(elem)?; + let s = elem.repr(vm)?; str_parts.push(s.as_str().to_owned()); } diff --git a/vm/src/cformat.rs b/vm/src/cformat.rs index 50528aede..473d3c65c 100644 --- a/vm/src/cformat.rs +++ b/vm/src/cformat.rs @@ -360,7 +360,7 @@ impl CFormatSpec { match &self.format_type { CFormatType::String(preconversor) => match preconversor { CFormatPreconversor::Repr | CFormatPreconversor::Ascii => { - let s = vm.to_repr(&obj)?; + let s = obj.repr(vm)?; let s = self.format_string(s.as_str().to_owned()); Ok(s.into_bytes()) } @@ -461,7 +461,7 @@ impl CFormatSpec { CFormatType::String(preconversor) => { let result = match preconversor { CFormatPreconversor::Str => obj.str(vm)?, - CFormatPreconversor::Repr | CFormatPreconversor::Ascii => vm.to_repr(&obj)?, + CFormatPreconversor::Repr | CFormatPreconversor::Ascii => obj.repr(vm)?, CFormatPreconversor::Bytes => { return Err(vm.new_value_error( "unsupported format character 'b' (0x62)".to_owned(), diff --git a/vm/src/exceptions.rs b/vm/src/exceptions.rs index fd458f263..3307eb63b 100644 --- a/vm/src/exceptions.rs +++ b/vm/src/exceptions.rs @@ -160,7 +160,8 @@ impl VirtualMachine { .str(vm) .unwrap_or_else(|_| PyStr::from("").into_ref(vm)) } else { - vm.to_repr(&varargs[0]) + varargs[0] + .repr(vm) .unwrap_or_else(|_| PyStr::from("").into_ref(vm)) }; vec![args0_repr] @@ -168,7 +169,8 @@ impl VirtualMachine { _ => varargs .iter() .map(|vararg| { - vm.to_repr(vararg) + vararg + .repr(vm) .unwrap_or_else(|_| PyStr::from("").into_ref(vm)) }) .collect(), diff --git a/vm/src/format.rs b/vm/src/format.rs index 9a5707506..a34e273f9 100644 --- a/vm/src/format.rs +++ b/vm/src/format.rs @@ -893,7 +893,7 @@ fn call_object_format( ) -> PyResult { let argument = match preconversion_spec.and_then(FormatPreconversor::from_char) { Some(FormatPreconversor::Str) => argument.str(vm)?.into(), - Some(FormatPreconversor::Repr) => vm.to_repr(&argument)?.into(), + Some(FormatPreconversor::Repr) => argument.repr(vm)?.into(), Some(FormatPreconversor::Ascii) => vm.ctx.new_str(builtins::ascii(argument, vm)?).into(), Some(FormatPreconversor::Bytes) => vm.call_method(&argument, "decode", ())?, None => argument, diff --git a/vm/src/frame.rs b/vm/src/frame.rs index 763aa7f2f..0ce21d557 100644 --- a/vm/src/frame.rs +++ b/vm/src/frame.rs @@ -1101,7 +1101,7 @@ impl ExecutingFrame<'_> { let value = self.pop_value(); let value = match conversion { ConversionFlag::Str => value.str(vm)?.into(), - ConversionFlag::Repr => vm.to_repr(&value)?.into(), + ConversionFlag::Repr => value.repr(vm)?.into(), ConversionFlag::Ascii => vm.ctx.new_str(builtins::ascii(value, vm)?).into(), ConversionFlag::None => value, }; @@ -1354,7 +1354,7 @@ impl ExecutingFrame<'_> { #[allow(clippy::collapsible_if)] if for_call { if map_obj.contains_key(key.clone(), vm) { - let key_repr = vm.to_repr(&key)?; + let key_repr = &key.repr(vm)?; let msg = format!( "got multiple values for keyword argument {}", key_repr.as_str() diff --git a/vm/src/protocol/object.rs b/vm/src/protocol/object.rs index 37086576a..85476abdc 100644 --- a/vm/src/protocol/object.rs +++ b/vm/src/protocol/object.rs @@ -208,11 +208,14 @@ impl PyObject { } pub fn repr(&self, vm: &VirtualMachine) -> PyResult { - vm.to_repr(self) + vm.with_recursion("while getting the repr of an object", || { + let repr = vm.call_special_method(self.to_owned(), "__repr__", ())?; + repr.try_into_value(vm) + }) } pub fn ascii(&self, vm: &VirtualMachine) -> PyResult { - let repr = vm.to_repr(self)?; + let repr = self.repr(vm)?; let ascii = to_ascii(repr.as_str()); Ok(ascii) } diff --git a/vm/src/pyobject.rs b/vm/src/pyobject.rs index 713f204a2..6a27be85f 100644 --- a/vm/src/pyobject.rs +++ b/vm/src/pyobject.rs @@ -981,7 +981,7 @@ pub trait PyStructSequence: StaticType + PyClassImpl + Sized + 'static { #[pymethod(magic)] fn repr(zelf: PyRef, vm: &VirtualMachine) -> PyResult { let format_field = |(value, name): (&PyObjectRef, _)| { - let s = vm.to_repr(value)?; + let s = value.repr(vm)?; Ok(format!("{}={}", name, s)) }; let (body, suffix) = diff --git a/vm/src/pyobjectrc.rs b/vm/src/pyobjectrc.rs index d0c167ca0..0e7832983 100644 --- a/vm/src/pyobjectrc.rs +++ b/vm/src/pyobjectrc.rs @@ -438,7 +438,7 @@ fn print_del_error(e: PyBaseExceptionRef, zelf: &PyObject, vm: &VirtualMachine) // exception in del will be ignored but printed print!("Exception ignored in: ",); let del_method = zelf.get_class_attr("__del__").unwrap(); - let repr = vm.to_repr(&del_method); + let repr = &del_method.repr(vm); match repr { Ok(v) => println!("{}", v.to_string()), Err(_) => println!("{}", del_method.class().name()), @@ -448,7 +448,7 @@ fn print_del_error(e: PyBaseExceptionRef, zelf: &PyObject, vm: &VirtualMachine) let print_stack = tb_module.get_attr("print_stack", vm).unwrap(); vm.invoke(&print_stack, ()).unwrap(); - if let Ok(repr) = vm.to_repr(e.as_object()) { + if let Ok(repr) = e.as_object().repr(vm) { println!("{}", repr.as_str()); } } diff --git a/vm/src/stdlib/ast/gen.rs b/vm/src/stdlib/ast/gen.rs index fbb3f2b72..f7149e178 100644 --- a/vm/src/stdlib/ast/gen.rs +++ b/vm/src/stdlib/ast/gen.rs @@ -1907,7 +1907,7 @@ impl Node for ast::Mod { } else { return Err(_vm.new_type_error(format!( "expected some sort of mod, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -2576,7 +2576,7 @@ impl Node for ast::StmtKind { } else { return Err(_vm.new_type_error(format!( "expected some sort of stmt, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3136,7 +3136,7 @@ impl Node for ast::ExprKind { } else { return Err(_vm.new_type_error(format!( "expected some sort of expr, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3178,7 +3178,7 @@ impl Node for ast::ExprContext { } else { return Err(_vm.new_type_error(format!( "expected some sort of expr_context, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3212,7 +3212,7 @@ impl Node for ast::Boolop { } else { return Err(_vm.new_type_error(format!( "expected some sort of boolop, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3334,7 +3334,7 @@ impl Node for ast::Operator { } else { return Err(_vm.new_type_error(format!( "expected some sort of operator, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3384,7 +3384,7 @@ impl Node for ast::Unaryop { } else { return Err(_vm.new_type_error(format!( "expected some sort of unaryop, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3482,7 +3482,7 @@ impl Node for ast::Cmpop { } else { return Err(_vm.new_type_error(format!( "expected some sort of cmpop, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3587,7 +3587,7 @@ impl Node for ast::ExcepthandlerKind { } else { return Err(_vm.new_type_error(format!( "expected some sort of excepthandler, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } @@ -3824,7 +3824,7 @@ impl Node for ast::TypeIgnore { } else { return Err(_vm.new_type_error(format!( "expected some sort of type_ignore, but got {}", - _vm.to_repr(&_object)? + _object.repr(_vm)? ))); }) } diff --git a/vm/src/stdlib/builtins.rs b/vm/src/stdlib/builtins.rs index 607ef4226..3102631bf 100644 --- a/vm/src/stdlib/builtins.rs +++ b/vm/src/stdlib/builtins.rs @@ -64,7 +64,7 @@ mod builtins { #[pyfunction] pub fn ascii(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult { - let repr = vm.to_repr(&obj)?; + let repr = obj.repr(vm)?; let ascii = to_ascii(repr.as_str()); Ok(ascii) } @@ -679,7 +679,7 @@ mod builtins { #[pyfunction] fn repr(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult { - vm.to_repr(&obj) + obj.repr(vm) } #[pyfunction] diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 2e47a71cf..df6e351f8 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -276,7 +276,7 @@ mod _collections { } } Err(vm.new_value_error( - vm.to_repr(&obj) + obj.repr(vm) .map(|repr| format!("{} is not in deque", repr)) .unwrap_or_else(|_| String::new()), )) @@ -410,7 +410,7 @@ mod _collections { let deque = zelf.borrow_deque().clone(); let elements = deque .iter() - .map(|obj| vm.to_repr(obj)) + .map(|obj| obj.repr(vm)) .collect::, _>>()?; let maxlen = zelf .maxlen diff --git a/vm/src/stdlib/io.rs b/vm/src/stdlib/io.rs index 313eba06f..b2ab2eb11 100644 --- a/vm/src/stdlib/io.rs +++ b/vm/src/stdlib/io.rs @@ -1366,7 +1366,7 @@ mod _io { match name { Some(name) => { if let Some(_guard) = ReprGuard::enter(vm, obj) { - vm.to_repr(&name).map(Some) + name.repr(vm).map(Some) } else { Err(vm.new_runtime_error(format!( "reentrant call inside {}.__repr__", @@ -2385,7 +2385,7 @@ mod _io { use crate::types::PyComparisonOp; if cookie.rich_compare_bool(vm.ctx.new_int(0).as_ref(), PyComparisonOp::Lt, vm)? { return Err( - vm.new_value_error(format!("negative seek position {}", vm.to_repr(&cookie)?)) + vm.new_value_error(format!("negative seek position {}", &cookie.repr(vm)?)) ); } drop(textio); diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 5b6be730f..e58112743 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -307,7 +307,7 @@ mod decl { #[pymethod(magic)] fn repr(&self, vm: &VirtualMachine) -> PyResult { - let mut fmt = format!("{}", vm.to_repr(&self.object)?); + let mut fmt = format!("{}", &self.object.repr(vm)?); if let Some(ref times) = self.times { fmt.push_str(&format!(", {}", times.read())); } diff --git a/vm/src/stdlib/operator.rs b/vm/src/stdlib/operator.rs index 01e134e7b..500a7b0ae 100644 --- a/vm/src/stdlib/operator.rs +++ b/vm/src/stdlib/operator.rs @@ -457,7 +457,7 @@ mod _operator { let fmt = if let Some(_guard) = ReprGuard::enter(vm, zelf.as_object()) { let mut parts = Vec::with_capacity(zelf.attrs.len()); for part in zelf.attrs.iter() { - parts.push(vm.to_repr(part.as_object())?.as_str().to_owned()); + parts.push(part.as_object().repr(vm)?.as_str().to_owned()); } parts.join(", ") } else { @@ -546,7 +546,7 @@ mod _operator { let fmt = if let Some(_guard) = ReprGuard::enter(vm, zelf.as_object()) { let mut items = Vec::with_capacity(zelf.items.len()); for item in zelf.items.iter() { - items.push(vm.to_repr(item)?.as_str().to_owned()); + items.push(item.repr(vm)?.as_str().to_owned()); } items.join(", ") } else { @@ -615,11 +615,11 @@ mod _operator { let fmt = if let Some(_guard) = ReprGuard::enter(vm, zelf.as_object()) { let args = &zelf.args.args; let kwargs = &zelf.args.kwargs; - let mut fmt = vec![vm.to_repr(zelf.name.as_object())?.as_str().to_owned()]; + let mut fmt = vec![zelf.name.as_object().repr(vm)?.as_str().to_owned()]; if !args.is_empty() { let mut parts = Vec::with_capacity(args.len()); for v in args { - parts.push(vm.to_repr(v)?.as_str().to_owned()); + parts.push(v.repr(vm)?.as_str().to_owned()); } fmt.push(parts.join(", ")); } @@ -627,7 +627,7 @@ mod _operator { if !kwargs.is_empty() { let mut parts = Vec::with_capacity(kwargs.len()); for (key, value) in kwargs { - let value_repr = vm.to_repr(value)?; + let value_repr = value.repr(vm)?; parts.push(format!("{}={}", key, value_repr)); } fmt.push(parts.join(", ")); diff --git a/vm/src/stdlib/os.rs b/vm/src/stdlib/os.rs index 2815184cf..fa3b4c764 100644 --- a/vm/src/stdlib/os.rs +++ b/vm/src/stdlib/os.rs @@ -880,7 +880,7 @@ pub(super) mod _os { }; if let Some(name) = name { if let Some(_guard) = ReprGuard::enter(vm, &zelf) { - let repr = vm.to_repr(&name)?; + let repr = name.repr(vm)?; Ok(format!("<{} {}>", zelf.class(), repr)) } else { Err(vm.new_runtime_error(format!( diff --git a/vm/src/stdlib/posix.rs b/vm/src/stdlib/posix.rs index be28774fe..0a45711cb 100644 --- a/vm/src/stdlib/posix.rs +++ b/vm/src/stdlib/posix.rs @@ -475,7 +475,7 @@ pub mod module { #[pymethod(magic)] fn repr(&self, vm: &VirtualMachine) -> PyResult { - let sched_priority_repr = vm.to_repr(&self.sched_priority)?; + let sched_priority_repr = self.sched_priority.repr(vm)?; Ok(format!( "posix.sched_param(sched_priority = {})", sched_priority_repr.as_str() diff --git a/vm/src/stdlib/pwd.rs b/vm/src/stdlib/pwd.rs index 79c7d00a9..0ac569ef0 100644 --- a/vm/src/stdlib/pwd.rs +++ b/vm/src/stdlib/pwd.rs @@ -54,7 +54,7 @@ mod pwd { match User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))? { Some(user) => Ok(Passwd::from(user)), None => { - let name_repr = vm.to_repr(name.as_object())?; + let name_repr = name.as_object().repr(vm)?; let message = vm .ctx .new_str(format!("getpwnam(): name not found: {}", name_repr)) diff --git a/vm/src/stdlib/sre.rs b/vm/src/stdlib/sre.rs index 03078ff24..7c216b2bf 100644 --- a/vm/src/stdlib/sre.rs +++ b/vm/src/stdlib/sre.rs @@ -400,7 +400,7 @@ mod _sre { .map(|(name, _)| name) .join("|"); - let pattern = vm.to_repr(&self.pattern)?; + let pattern = self.pattern.repr(vm)?; let truncated: String; let s = if pattern.char_len() > 200 { truncated = pattern.as_str().chars().take(200).collect(); @@ -757,7 +757,7 @@ mod _sre { "", self.regs[0].0, self.regs[0].1, - vm.to_repr(&self.get_slice(0, str_drive, vm).unwrap())? + self.get_slice(0, str_drive, vm).unwrap().repr(vm)? )) }) } diff --git a/vm/src/stdlib/sys.rs b/vm/src/stdlib/sys.rs index 4a4b3c439..699829b76 100644 --- a/vm/src/stdlib/sys.rs +++ b/vm/src/stdlib/sys.rs @@ -291,7 +291,7 @@ mod sys { // set to none to avoid recursion while printing vm.builtins.set_attr("_", vm.ctx.none(), vm)?; // TODO: catch encoding errors - let repr = vm.to_repr(&obj)?.into(); + let repr = obj.repr(vm)?.into(); builtins::print(PosArgs::new(vec![repr]), Default::default(), vm)?; vm.builtins.set_attr("_", obj, vm)?; Ok(()) diff --git a/vm/src/stdlib/thread.rs b/vm/src/stdlib/thread.rs index 383299369..e07ffefbd 100644 --- a/vm/src/stdlib/thread.rs +++ b/vm/src/stdlib/thread.rs @@ -260,7 +260,7 @@ pub(crate) mod _thread { // TODO: sys.unraisablehook let stderr = std::io::stderr(); let mut stderr = py_io::IoWriter(stderr.lock()); - let repr = vm.to_repr(func.as_ref()).ok(); + let repr = func.as_ref().repr(vm).ok(); let repr = repr .as_ref() .map_or("", |s| s.as_str()); diff --git a/vm/src/vm.rs b/vm/src/vm.rs index 2539078c0..8e7ede636 100644 --- a/vm/src/vm.rs +++ b/vm/src/vm.rs @@ -898,13 +898,6 @@ impl VirtualMachine { obj.unwrap_or_else(|| self.ctx.none()) } - pub fn to_repr(&self, obj: &PyObject) -> PyResult { - self.with_recursion("while getting the repr of an object", || { - let repr = self.call_special_method(obj.to_owned(), "__repr__", ())?; - repr.try_into_value(self) - }) - } - pub fn to_index_opt(&self, obj: PyObjectRef) -> Option> { match obj.downcast() { Ok(val) => Some(Ok(val)),