diff --git a/vm/src/stdlib/warnings.rs b/vm/src/stdlib/warnings.rs index cb97ead48..da3c0339c 100644 --- a/vm/src/stdlib/warnings.rs +++ b/vm/src/stdlib/warnings.rs @@ -1,6 +1,7 @@ use crate::function::OptionalArg; use crate::obj::objstr::PyStringRef; -use crate::pyobject::PyObjectRef; +use crate::obj::objtype::{self, PyClassRef}; +use crate::pyobject::{PyObjectRef, PyResult, TypeProtocol}; use crate::vm::VirtualMachine; #[derive(FromArgs)] @@ -8,23 +9,27 @@ struct WarnArgs { #[pyarg(positional_only, optional = false)] message: PyStringRef, #[pyarg(positional_or_keyword, optional = true)] - category: OptionalArg, + category: OptionalArg, #[pyarg(positional_or_keyword, optional = true)] stacklevel: OptionalArg, } -fn warnings_warn(args: WarnArgs, _vm: &VirtualMachine) { +fn warnings_warn(args: WarnArgs, vm: &VirtualMachine) -> PyResult<()> { // TODO: Implement correctly - let level = match args.stacklevel { - OptionalArg::Present(l) => l, - OptionalArg::Missing => 1, + let level = args.stacklevel.unwrap_or(1); + let category = if let OptionalArg::Present(category) = args.category { + if !objtype::issubclass(&category, &vm.ctx.exceptions.warning) { + return Err(vm.new_type_error(format!( + "category must be a Warning subclass, not '{}'", + category.class().name + ))); + } + category + } else { + vm.ctx.exceptions.user_warning.clone() }; - eprintln!( - "Warning: {} , category: {:?}, level: {}", - args.message.as_str(), - args.category, - level - ) + eprintln!("level:{}: {}: {}", level, category.name, args.message); + Ok(()) } pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {