(&self, options: SortOptions, vm: &VirtualMachine)
| 393 | |
| 394 | #[pymethod] |
| 395 | pub(crate) fn sort(&self, options: SortOptions, vm: &VirtualMachine) -> PyResult<()> { |
| 396 | // replace list contents with [] for duration of sort. |
| 397 | // this prevents keyfunc from messing with the list and makes it easy to |
| 398 | // check if it tries to append elements to it. |
| 399 | let (mut elements, version_before) = { |
| 400 | let mut guard = self.elements.write(); |
| 401 | let version_before = self.mutation_counter.load(Ordering::Relaxed); |
| 402 | (core::mem::take(guard.deref_mut()), version_before) |
| 403 | }; |
| 404 | let res = do_sort(vm, &mut elements, options.key, options.reverse); |
| 405 | let mutated = { |
| 406 | let mut guard = self.elements.write(); |
| 407 | let mutated = self.mutation_counter.load(Ordering::Relaxed) != version_before; |
| 408 | core::mem::swap(guard.deref_mut(), &mut elements); |
| 409 | mutated |
| 410 | }; |
| 411 | res?; |
| 412 | |
| 413 | if mutated { |
| 414 | return Err(vm.new_value_error("list modified during sort")); |
| 415 | } |
| 416 | |
| 417 | Ok(()) |
| 418 | } |
| 419 | |
| 420 | #[pyclassmethod] |
| 421 | fn __class_getitem__(cls: PyTypeRef, args: PyObjectRef, vm: &VirtualMachine) -> PyGenericAlias { |
no test coverage detected