(
&self,
vm: &VirtualMachine,
key: &K,
default: F,
)
| 548 | |
| 549 | #[allow(dead_code)] |
| 550 | pub fn setdefault_entry<K, F>( |
| 551 | &self, |
| 552 | vm: &VirtualMachine, |
| 553 | key: &K, |
| 554 | default: F, |
| 555 | ) -> PyResult<(PyObjectRef, T)> |
| 556 | where |
| 557 | K: DictKey + ?Sized, |
| 558 | F: FnOnce() -> T, |
| 559 | { |
| 560 | let hash = key.key_hash(vm)?; |
| 561 | let mut default = Some(default); |
| 562 | loop { |
| 563 | let (index_entry, index_index) = self.lookup(vm, key, hash, None)?; |
| 564 | if let Some(index) = index_entry.index() { |
| 565 | let inner = self.read(); |
| 566 | if let Some(entry) = inner.get_entry_checked(index, index_index) { |
| 567 | return Ok((entry.key.clone(), entry.value.clone())); |
| 568 | } |
| 569 | continue; |
| 570 | } |
| 571 | let mut inner = self.write(); |
| 572 | if inner.indices.get(index_index) != Some(&index_entry) { |
| 573 | continue; |
| 574 | } |
| 575 | let value = default |
| 576 | .take() |
| 577 | .expect("default must only be computed on insertion")(); |
| 578 | let key_obj = key.to_pyobject(vm); |
| 579 | let ret = (key_obj.clone(), value.clone()); |
| 580 | inner.unchecked_push(index_index, hash, key_obj, value, index_entry); |
| 581 | self.bump_version(); |
| 582 | return Ok(ret); |
| 583 | } |
| 584 | } |
| 585 | |
| 586 | pub fn len(&self) -> usize { |
| 587 | self.read().used |
nothing calls this directly
no test coverage detected