Vectorcall for wrapper_descriptor: calls wrapped slot function
(
zelf_obj: &PyObject,
mut args: Vec<PyObjectRef>,
nargs: usize,
kwnames: Option<&[PyObjectRef]>,
vm: &VirtualMachine,
)
| 443 | |
| 444 | /// Vectorcall for wrapper_descriptor: calls wrapped slot function |
| 445 | fn vectorcall_wrapper( |
| 446 | zelf_obj: &PyObject, |
| 447 | mut args: Vec<PyObjectRef>, |
| 448 | nargs: usize, |
| 449 | kwnames: Option<&[PyObjectRef]>, |
| 450 | vm: &VirtualMachine, |
| 451 | ) -> PyResult { |
| 452 | let zelf: &Py<PyWrapper> = zelf_obj.downcast_ref().unwrap(); |
| 453 | // First positional arg is self |
| 454 | if nargs == 0 { |
| 455 | return Err(vm.new_type_error(format!( |
| 456 | "descriptor '{}' of '{}' object needs an argument", |
| 457 | zelf.name.as_str(), |
| 458 | zelf.typ.name() |
| 459 | ))); |
| 460 | } |
| 461 | let obj = args.remove(0); |
| 462 | if !obj.fast_isinstance(zelf.typ) { |
| 463 | return Err(vm.new_type_error(format!( |
| 464 | "descriptor '{}' requires a '{}' object but received a '{}'", |
| 465 | zelf.name.as_str(), |
| 466 | zelf.typ.name(), |
| 467 | obj.class().name() |
| 468 | ))); |
| 469 | } |
| 470 | let rest = FuncArgs::from_vectorcall_owned(args, nargs - 1, kwnames); |
| 471 | zelf.wrapped.call(obj, rest, vm) |
| 472 | } |
| 473 | |
| 474 | pub fn init(ctx: &'static Context) { |
| 475 | PyMemberDescriptor::extend_class(ctx, ctx.types.member_descriptor_type); |
nothing calls this directly
no test coverage detected