(&self, vm: &VirtualMachine, key: &K, default: F)
| 512 | } |
| 513 | |
| 514 | pub fn setdefault<K, F>(&self, vm: &VirtualMachine, key: &K, default: F) -> PyResult<T> |
| 515 | where |
| 516 | K: DictKey + ?Sized, |
| 517 | F: FnOnce() -> T, |
| 518 | { |
| 519 | let hash = key.key_hash(vm)?; |
| 520 | let mut default = Some(default); |
| 521 | loop { |
| 522 | let (index_entry, index_index) = self.lookup(vm, key, hash, None)?; |
| 523 | if let Some(index) = index_entry.index() { |
| 524 | let inner = self.read(); |
| 525 | if let Some(entry) = inner.get_entry_checked(index, index_index) { |
| 526 | return Ok(entry.value.clone()); |
| 527 | } |
| 528 | continue; |
| 529 | } |
| 530 | let mut inner = self.write(); |
| 531 | if inner.indices.get(index_index) != Some(&index_entry) { |
| 532 | continue; |
| 533 | } |
| 534 | let value = default |
| 535 | .take() |
| 536 | .expect("default must only be computed on insertion")(); |
| 537 | inner.unchecked_push( |
| 538 | index_index, |
| 539 | hash, |
| 540 | key.to_pyobject(vm), |
| 541 | value.clone(), |
| 542 | index_entry, |
| 543 | ); |
| 544 | self.bump_version(); |
| 545 | return Ok(value); |
| 546 | } |
| 547 | } |
| 548 | |
| 549 | #[allow(dead_code)] |
| 550 | pub fn setdefault_entry<K, F>( |
nothing calls this directly
no test coverage detected