use crate::{
ExcType,
args::ArgValues,
bytecode::VM,
defer_drop,
exception_private::{RunResult, SimpleException},
resource::ResourceTracker,
value::Value,
};
pub fn builtin_setattr(vm: &mut VM<'_, impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
let positional = args.into_pos_only("setattr", vm.heap)?;
defer_drop!(positional, vm);
let (object, name, value) = match positional.as_slice() {
[object, name, value] => (object, name, value),
other => return Err(ExcType::type_error_arg_count("setattr", 3, other.len())),
};
let Some(name) = name.as_either_str(vm.heap) else {
return Err(SimpleException::new_msg(
ExcType::TypeError,
format!("attribute name must be string, not '{}'", name.py_type_name(vm)),
)
.into());
};
object.py_set_attr(&name, value.clone_with_heap(vm), vm)?;
Ok(Value::None)
}