Skip to content

Commit 9fd4f7b

Browse files
authored
Merge pull request RustPython#3708 from youknowone/dictkey
Refactor dictkey
2 parents 3bc8895 + c6b33aa commit 9fd4f7b

30 files changed

+223
-227
lines changed

stdlib/src/bisect.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ mod _bisect {
7474
while lo < hi {
7575
// Handles issue 13496.
7676
let mid = (lo + hi) / 2;
77-
if a.get_item(mid, vm)?
77+
if a.get_item(&mid, vm)?
7878
.rich_compare_bool(&x, PyComparisonOp::Lt, vm)?
7979
{
8080
lo = mid + 1;
@@ -104,7 +104,7 @@ mod _bisect {
104104
while lo < hi {
105105
// Handles issue 13496.
106106
let mid = (lo + hi) / 2;
107-
if x.rich_compare_bool(&*a.get_item(mid, vm)?, PyComparisonOp::Lt, vm)? {
107+
if x.rich_compare_bool(&*a.get_item(&mid, vm)?, PyComparisonOp::Lt, vm)? {
108108
hi = mid;
109109
} else {
110110
lo = mid + 1;

stdlib/src/dis.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ mod decl {
3333
fn compiler_flag_names(vm: &VirtualMachine) -> PyDictRef {
3434
let dict = vm.ctx.new_dict();
3535
for (name, flag) in CodeFlags::NAME_MAPPING {
36-
dict.set_item(vm.new_pyobj(flag.bits()), vm.ctx.new_str(*name).into(), vm)
37-
.unwrap();
36+
dict.set_item(
37+
&*vm.new_pyobj(flag.bits()),
38+
vm.ctx.new_str(*name).into(),
39+
vm,
40+
)
41+
.unwrap();
3842
}
3943
dict
4044
}

vm/src/builtins/dict.rs

Lines changed: 41 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ impl PyDict {
8686
if let Some(keys) = vm.get_method(other.clone(), "keys") {
8787
let keys = vm.invoke(&keys?, ())?.get_iter(vm)?;
8888
while let PyIterReturn::Return(key) = keys.next(vm)? {
89-
let val = other.get_item(key.clone(), vm)?;
90-
dict.insert(vm, key, val)?;
89+
let val = other.get_item(&*key, vm)?;
90+
dict.insert(vm, &*key, val)?;
9191
}
9292
} else {
9393
let iter = other.get_iter(vm)?;
@@ -105,7 +105,7 @@ impl PyDict {
105105
if matches!(elem_iter.next(vm)?, PyIterReturn::Return(_)) {
106106
return Err(err(vm));
107107
}
108-
dict.insert(vm, key, value)?;
108+
dict.insert(vm, &*key, value)?;
109109
}
110110
}
111111
Ok(())
@@ -118,7 +118,7 @@ impl PyDict {
118118
) -> PyResult<()> {
119119
let dict_size = &dict_other.size();
120120
for (key, value) in &dict_other {
121-
dict.insert(vm, key, value)?;
121+
dict.insert(vm, &*key, value)?;
122122
}
123123
if dict_other.entries.has_changed_size(dict_size) {
124124
return Err(vm.new_runtime_error("dict mutated during update".to_owned()));
@@ -146,7 +146,7 @@ impl PyDict {
146146
(zelf, other)
147147
};
148148
for (k, v1) in subset {
149-
match superset.get_item_opt(k, vm)? {
149+
match superset.get_item_opt(&*k, vm)? {
150150
Some(v2) => {
151151
if v1.is(&v2) {
152152
continue;
@@ -169,18 +169,18 @@ impl PyDict {
169169

170170
/// Set item variant which can be called with multiple
171171
/// key types, such as str to name a notable one.
172-
pub(crate) fn inner_setitem<K: DictKey + ToPyObject>(
172+
pub(crate) fn inner_setitem<K: DictKey + ?Sized>(
173173
&self,
174-
key: K,
174+
key: &K,
175175
value: PyObjectRef,
176176
vm: &VirtualMachine,
177177
) -> PyResult<()> {
178178
self.entries.insert(vm, key, value)
179179
}
180180

181-
pub(crate) fn inner_delitem<K: DictKey + ToPyObject>(
181+
pub(crate) fn inner_delitem<K: DictKey + ?Sized>(
182182
&self,
183-
key: K,
183+
key: &K,
184184
vm: &VirtualMachine,
185185
) -> PyResult<()> {
186186
self.entries.delete(vm, key)
@@ -192,22 +192,21 @@ impl PyDict {
192192
key: PyObjectRef,
193193
default: impl FnOnce() -> PyObjectRef,
194194
) -> PyResult {
195-
self.entries.setdefault(vm, key, default)
195+
self.entries.setdefault(vm, &*key, default)
196196
}
197197

198198
pub fn from_attributes(attrs: PyAttributes, vm: &VirtualMachine) -> PyResult<Self> {
199199
let dict = DictContentType::default();
200200

201201
for (key, value) in attrs {
202-
dict.insert(vm, vm.new_pyobj(key), value)?;
202+
dict.insert(vm, key.as_str(), value)?;
203203
}
204204

205205
Ok(PyDict { entries: dict })
206206
}
207207

208-
pub fn contains_key<K: ToPyObject>(&self, key: K, vm: &VirtualMachine) -> bool {
209-
let key = key.to_pyobject(vm);
210-
self.entries.contains(vm, &key).unwrap()
208+
pub fn contains_key<K: DictKey + ?Sized>(&self, key: &K, vm: &VirtualMachine) -> bool {
209+
self.entries.contains(vm, key).unwrap()
211210
}
212211

213212
pub fn size(&self) -> dictdatatype::DictSize {
@@ -263,7 +262,7 @@ impl PyDict {
263262
}
264263
Err(pyobj) => {
265264
for key in iterable.iter(vm)? {
266-
pyobj.set_item(key?, value.clone(), vm)?;
265+
pyobj.set_item(&*key?, value.clone(), vm)?;
267266
}
268267
Ok(pyobj)
269268
}
@@ -304,12 +303,12 @@ impl PyDict {
304303

305304
#[pymethod(magic)]
306305
fn contains(&self, key: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
307-
self.entries.contains(vm, &key)
306+
self.entries.contains(vm, &*key)
308307
}
309308

310309
#[pymethod(magic)]
311310
fn delitem(&self, key: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
312-
self.inner_delitem(key, vm)
311+
self.inner_delitem(&*key, vm)
313312
}
314313

315314
#[pymethod]
@@ -334,13 +333,13 @@ impl PyDict {
334333

335334
#[pymethod(magic)]
336335
fn setitem(&self, key: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
337-
self.inner_setitem(key, value, vm)
336+
self.inner_setitem(&*key, value, vm)
338337
}
339338

340339
#[pymethod(magic)]
341340
#[cfg_attr(feature = "flame-it", flame("PyDictRef"))]
342341
fn getitem(zelf: PyRef<Self>, key: PyObjectRef, vm: &VirtualMachine) -> PyResult {
343-
zelf.inner_getitem(key, vm)
342+
zelf.inner_getitem(&*key, vm)
344343
}
345344

346345
#[pymethod]
@@ -350,7 +349,7 @@ impl PyDict {
350349
default: OptionalArg<PyObjectRef>,
351350
vm: &VirtualMachine,
352351
) -> PyResult {
353-
match self.entries.get(vm, &key)? {
352+
match self.entries.get(vm, &*key)? {
354353
Some(value) => Ok(value),
355354
None => Ok(default.unwrap_or_none(vm)),
356355
}
@@ -364,7 +363,7 @@ impl PyDict {
364363
vm: &VirtualMachine,
365364
) -> PyResult {
366365
self.entries
367-
.setdefault(vm, key, || default.unwrap_or_none(vm))
366+
.setdefault(vm, &*key, || default.unwrap_or_none(vm))
368367
}
369368

370369
#[pymethod]
@@ -385,7 +384,7 @@ impl PyDict {
385384
Self::merge_object(&self.entries, dict_obj, vm)?;
386385
}
387386
for (key, value) in kwargs.into_iter() {
388-
self.entries.insert(vm, vm.new_pyobj(key), value)?;
387+
self.entries.insert(vm, &key, value)?;
389388
}
390389
Ok(())
391390
}
@@ -425,7 +424,7 @@ impl PyDict {
425424
default: OptionalArg<PyObjectRef>,
426425
vm: &VirtualMachine,
427426
) -> PyResult {
428-
match self.entries.pop(vm, &key)? {
427+
match self.entries.pop(vm, &*key)? {
429428
Some(value) => Ok(value),
430429
None => default.ok_or_else(|| vm.new_key_error(key)),
431430
}
@@ -523,25 +522,25 @@ impl Py<PyDict> {
523522
self.class().is(&vm.ctx.types.dict_type)
524523
}
525524

526-
fn missing_opt<K: DictKey + ToPyObject>(
525+
fn missing_opt<K: DictKey + ?Sized>(
527526
&self,
528-
key: K,
527+
key: &K,
529528
vm: &VirtualMachine,
530529
) -> PyResult<Option<PyObjectRef>> {
531530
vm.get_method(self.to_owned().into(), "__missing__")
532-
.map(|methods| vm.invoke(&methods?, (key,)))
531+
.map(|methods| vm.invoke(&methods?, (key.to_pyobject(vm),)))
533532
.transpose()
534533
}
535534

536535
#[inline]
537-
fn inner_getitem<K: DictKey + ToPyObject + Clone>(
536+
fn inner_getitem<K: DictKey + ?Sized>(
538537
&self,
539-
key: K,
538+
key: &K,
540539
vm: &VirtualMachine,
541540
) -> PyResult<PyObjectRef> {
542-
if let Some(value) = self.entries.get(vm, &key)? {
541+
if let Some(value) = self.entries.get(vm, key)? {
543542
Ok(value)
544-
} else if let Some(value) = self.missing_opt(key.clone(), vm)? {
543+
} else if let Some(value) = self.missing_opt(key, vm)? {
545544
Ok(value)
546545
} else {
547546
Err(vm.new_key_error(key.to_pyobject(vm)))
@@ -558,16 +557,16 @@ impl Py<PyDict> {
558557
attrs
559558
}
560559

561-
pub fn get_item_opt<K: DictKey + ToPyObject + Clone>(
560+
pub fn get_item_opt<K: DictKey + ?Sized>(
562561
&self,
563-
key: K,
562+
key: &K,
564563
vm: &VirtualMachine,
565564
) -> PyResult<Option<PyObjectRef>> {
566565
if self.exact_dict(vm) {
567-
self.entries.get(vm, &key)
566+
self.entries.get(vm, key)
568567
// FIXME: check __missing__?
569568
} else {
570-
match self.as_object().get_item(key.clone(), vm) {
569+
match self.as_object().get_item(key, vm) {
571570
Ok(value) => Ok(Some(value)),
572571
Err(e) if e.fast_isinstance(&vm.ctx.exceptions.key_error) => {
573572
self.missing_opt(key, vm)
@@ -577,21 +576,17 @@ impl Py<PyDict> {
577576
}
578577
}
579578

580-
pub fn get_item<K: DictKey + ToPyObject + Clone>(
581-
&self,
582-
key: K,
583-
vm: &VirtualMachine,
584-
) -> PyResult {
579+
pub fn get_item<K: DictKey + ?Sized>(&self, key: &K, vm: &VirtualMachine) -> PyResult {
585580
if self.exact_dict(vm) {
586581
self.inner_getitem(key, vm)
587582
} else {
588583
self.as_object().get_item(key, vm)
589584
}
590585
}
591586

592-
pub fn set_item<K: DictKey + ToPyObject>(
587+
pub fn set_item<K: DictKey + ?Sized>(
593588
&self,
594-
key: K,
589+
key: &K,
595590
value: PyObjectRef,
596591
vm: &VirtualMachine,
597592
) -> PyResult<()> {
@@ -602,25 +597,25 @@ impl Py<PyDict> {
602597
}
603598
}
604599

605-
pub fn del_item<K: DictKey + ToPyObject>(&self, key: K, vm: &VirtualMachine) -> PyResult<()> {
600+
pub fn del_item<K: DictKey + ?Sized>(&self, key: &K, vm: &VirtualMachine) -> PyResult<()> {
606601
if self.exact_dict(vm) {
607602
self.inner_delitem(key, vm)
608603
} else {
609604
self.as_object().del_item(key, vm)
610605
}
611606
}
612607

613-
pub fn get_chain<K: ToPyObject + DictKey + Clone>(
608+
pub fn get_chain<K: DictKey + ?Sized>(
614609
&self,
615610
other: &Self,
616-
key: K,
611+
key: &K,
617612
vm: &VirtualMachine,
618613
) -> PyResult<Option<PyObjectRef>> {
619614
let self_exact = self.exact_dict(vm);
620615
let other_exact = other.exact_dict(vm);
621616
if self_exact && other_exact {
622-
self.entries.get_chain(&other.entries, vm, &key)
623-
} else if let Some(value) = self.get_item_opt(key.clone(), vm)? {
617+
self.entries.get_chain(&other.entries, vm, key)
618+
} else if let Some(value) = self.get_item_opt(key, vm)? {
624619
Ok(Some(value))
625620
} else {
626621
other.get_item_opt(key, vm)

vm/src/builtins/enumerate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl IterNext for PyReverseSequenceIterator {
128128
fn next(zelf: &crate::Py<Self>, vm: &VirtualMachine) -> PyResult<PyIterReturn> {
129129
zelf.internal
130130
.lock()
131-
.rev_next(|obj, pos| PyIterReturn::from_getitem_result(obj.get_item(pos, vm), vm))
131+
.rev_next(|obj, pos| PyIterReturn::from_getitem_result(obj.get_item(&pos, vm), vm))
132132
}
133133
}
134134

vm/src/builtins/function.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ impl PyFunction {
137137
}
138138
*slot = Some(value);
139139
} else if let Some(kwargs) = kwargs.as_ref() {
140-
kwargs.set_item(name, value, vm)?;
140+
kwargs.set_item(&name, value, vm)?;
141141
} else if argpos(0..code.posonlyarg_count, &name).is_some() {
142142
posonly_passed_as_kwarg.push(name);
143143
} else {
@@ -242,7 +242,7 @@ impl PyFunction {
242242
.filter(|(slot, _)| slot.is_none())
243243
{
244244
if let Some(defaults) = &get_defaults!().1 {
245-
if let Some(default) = defaults.get_item_opt(kwarg.clone(), vm)? {
245+
if let Some(default) = defaults.get_item_opt(&**kwarg, vm)? {
246246
*slot = Some(default);
247247
continue;
248248
}

vm/src/builtins/function/jitfunc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ pub(crate) fn get_jit_args<'a>(
188188
let arg_idx = i + func.code.arg_count;
189189
if !jit_args.is_set(arg_idx) {
190190
let default = kw_only_defaults
191-
.get_item(name.clone(), vm)
191+
.get_item(&**name, vm)
192192
.map_err(|_| ArgsError::NotAllArgsPassed)
193193
.and_then(|obj| get_jit_value(vm, &obj))?;
194194
jit_args.set(arg_idx, default)?;

vm/src/builtins/genericalias.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ fn subs_tvars(
249249
})
250250
.collect::<Vec<_>>();
251251
let sub_args: PyObjectRef = PyTuple::new_ref(sub_args, &vm.ctx).into();
252-
Some(obj.get_item(sub_args, vm))
252+
Some(obj.get_item(&*sub_args, vm))
253253
} else {
254254
None
255255
}

vm/src/builtins/mappingproxy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl PyMappingProxy {
6767
let key = PyStrRef::try_from_object(vm, key)?;
6868
class.attributes.read().get(key.as_str()).cloned()
6969
}
70-
MappingProxyInner::Dict(obj) => obj.get_item(key, vm).ok(),
70+
MappingProxyInner::Dict(obj) => obj.get_item(&*key, vm).ok(),
7171
};
7272
Ok(opt)
7373
}

vm/src/builtins/set.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ impl PySetInner {
174174
) -> PyResult<PySetInner> {
175175
let set = self.copy();
176176
for item in other.iter(vm)? {
177-
set.content.delete_if_exists(vm, &item?)?;
177+
set.content.delete_if_exists(vm, &*item?)?;
178178
}
179179
Ok(set)
180180
}
@@ -231,13 +231,11 @@ impl PySetInner {
231231
}
232232

233233
fn add(&self, item: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
234-
self.content.insert(vm, item, ())
234+
self.content.insert(vm, &*item, ())
235235
}
236236

237237
fn remove(&self, item: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
238-
self.retry_op_with_frozenset(&item, vm, |item, vm| {
239-
self.content.delete(vm, item.to_owned())
240-
})
238+
self.retry_op_with_frozenset(&item, vm, |item, vm| self.content.delete(vm, item))
241239
}
242240

243241
fn discard(&self, item: &PyObject, vm: &VirtualMachine) -> PyResult<bool> {
@@ -293,7 +291,7 @@ impl PySetInner {
293291
fn difference_update(&self, others: PosArgs<ArgIterable>, vm: &VirtualMachine) -> PyResult<()> {
294292
for iterable in others {
295293
for item in iterable.iter(vm)? {
296-
self.content.delete_if_exists(vm, &item?)?;
294+
self.content.delete_if_exists(vm, &*item?)?;
297295
}
298296
}
299297
Ok(())

0 commit comments

Comments
 (0)