Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions vm/src/builtins/dict.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down Expand Up @@ -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(", "))
Expand Down
2 changes: 1 addition & 1 deletion vm/src/builtins/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ impl PyBoundMethod {
Ok(format!(
"<bound method {} of {}>",
funcname.as_ref().map_or("?", |s| s.as_str()),
vm.to_repr(&self.object)?.as_str(),
&self.object.repr(vm)?.as_str(),
))
}

Expand Down
4 changes: 2 additions & 2 deletions vm/src/builtins/genericalias.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -91,7 +91,7 @@ impl PyGenericAlias {
vm.get_attribute_opt(obj.clone(), "__module__")?
.and_then(|o| o.downcast_ref::<PyStr>().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 {
Expand Down
4 changes: 2 additions & 2 deletions vm/src/builtins/int.rs
Original file line number Diff line number Diff line change
Expand Up @@ -785,7 +785,7 @@ fn try_int_radix(obj: &PyObject, base: u32, vm: &VirtualMachine) -> PyResult<Big
None => Err(vm.new_value_error(format!(
"invalid literal for int() with base {}: {}",
base,
vm.to_repr(obj)?,
obj.repr(vm)?,
))),
}
}
Expand Down Expand Up @@ -917,7 +917,7 @@ pub(crate) fn try_int(obj: &PyObject, vm: &VirtualMachine) -> PyResult<BigInt> {
None => Err(vm.new_value_error(format!(
"invalid literal for int() with base {}: {}",
base,
vm.to_repr(obj)?,
obj.repr(vm)?,
))),
}
}
Expand Down
2 changes: 1 addition & 1 deletion vm/src/builtins/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(", "))
Expand Down
2 changes: 1 addition & 1 deletion vm/src/builtins/mappingproxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down
4 changes: 2 additions & 2 deletions vm/src/builtins/namespace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion vm/src/builtins/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ impl PyBaseObject {
/// Return str(self).
#[pymethod(magic)]
fn str(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyStrRef> {
vm.to_repr(&zelf)
zelf.repr(vm)
}

/// Return repr(self).
Expand Down
3 changes: 2 additions & 1 deletion vm/src/builtins/range.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())
))),
Expand Down
2 changes: 1 addition & 1 deletion vm/src/builtins/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
6 changes: 3 additions & 3 deletions vm/src/builtins/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ impl PySlice {

#[pymethod(magic)]
fn repr(&self, vm: &VirtualMachine) -> PyResult<String> {
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({}, {}, {})",
Expand Down
2 changes: 1 addition & 1 deletion vm/src/builtins/tuple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

Expand Down
4 changes: 2 additions & 2 deletions vm/src/cformat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
Expand Down Expand Up @@ -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(),
Expand Down
6 changes: 4 additions & 2 deletions vm/src/exceptions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,15 +160,17 @@ impl VirtualMachine {
.str(vm)
.unwrap_or_else(|_| PyStr::from("<element str() failed>").into_ref(vm))
} else {
vm.to_repr(&varargs[0])
varargs[0]
.repr(vm)
.unwrap_or_else(|_| PyStr::from("<element repr() failed>").into_ref(vm))
};
vec![args0_repr]
}
_ => varargs
.iter()
.map(|vararg| {
vm.to_repr(vararg)
vararg
.repr(vm)
.unwrap_or_else(|_| PyStr::from("<element repr() failed>").into_ref(vm))
})
.collect(),
Expand Down
2 changes: 1 addition & 1 deletion vm/src/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -893,7 +893,7 @@ fn call_object_format(
) -> PyResult<PyStrRef> {
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,
Expand Down
4 changes: 2 additions & 2 deletions vm/src/frame.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down Expand Up @@ -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()
Expand Down
7 changes: 5 additions & 2 deletions vm/src/protocol/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,14 @@ impl PyObject {
}

pub fn repr(&self, vm: &VirtualMachine) -> PyResult<PyStrRef> {
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<ascii::AsciiString> {
let repr = vm.to_repr(self)?;
let repr = self.repr(vm)?;
let ascii = to_ascii(repr.as_str());
Ok(ascii)
}
Expand Down
2 changes: 1 addition & 1 deletion vm/src/pyobject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -981,7 +981,7 @@ pub trait PyStructSequence: StaticType + PyClassImpl + Sized + 'static {
#[pymethod(magic)]
fn repr(zelf: PyRef<PyTuple>, vm: &VirtualMachine) -> PyResult<String> {
let format_field = |(value, name): (&PyObjectRef, _)| {
let s = vm.to_repr(value)?;
let s = value.repr(vm)?;
Ok(format!("{}={}", name, s))
};
let (body, suffix) =
Expand Down
4 changes: 2 additions & 2 deletions vm/src/pyobjectrc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
Expand All @@ -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());
}
}
Expand Down
20 changes: 10 additions & 10 deletions vm/src/stdlib/ast/gen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down Expand Up @@ -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)?
)));
})
}
Expand Down
4 changes: 2 additions & 2 deletions vm/src/stdlib/builtins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ mod builtins {

#[pyfunction]
pub fn ascii(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<ascii::AsciiString> {
let repr = vm.to_repr(&obj)?;
let repr = obj.repr(vm)?;
let ascii = to_ascii(repr.as_str());
Ok(ascii)
}
Expand Down Expand Up @@ -679,7 +679,7 @@ mod builtins {

#[pyfunction]
fn repr(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyStrRef> {
vm.to_repr(&obj)
obj.repr(vm)
}

#[pyfunction]
Expand Down
4 changes: 2 additions & 2 deletions vm/src/stdlib/collections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
))
Expand Down Expand Up @@ -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::<Result<Vec<_>, _>>()?;
let maxlen = zelf
.maxlen
Expand Down
Loading