Skip to content

Commit a29e882

Browse files
committed
Store dict key as pyobject into hashmap.
1 parent e657633 commit a29e882

File tree

6 files changed

+30
-34
lines changed

6 files changed

+30
-34
lines changed

vm/src/builtins.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fn get_locals(vm: &mut VirtualMachine) -> PyObjectRef {
2525
let d = vm.new_dict();
2626
// TODO: implement dict_iter_items?
2727
let locals = vm.get_locals();
28-
let key_value_pairs = objdict::get_key_value_pairs(vm, &locals);
28+
let key_value_pairs = objdict::get_key_value_pairs(&locals);
2929
for (key, value) in key_value_pairs {
3030
objdict::set_item(&d, &key, &value);
3131
}

vm/src/frame.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl Frame {
246246
let obj = self.pop_value();
247247
if *unpack {
248248
// Take all key-value pairs from the dict:
249-
let dict_elements = objdict::get_key_value_pairs(vm, &obj);
249+
let dict_elements = objdict::get_key_value_pairs(&obj);
250250
for (key, value) in dict_elements.iter() {
251251
objdict::set_item(&map_obj, key, value);
252252
}
@@ -458,7 +458,10 @@ impl Frame {
458458
let kwargs = if *has_kwargs {
459459
let kw_dict = self.pop_value();
460460
let dict_elements = objdict::get_elements(&kw_dict).clone();
461-
dict_elements.into_iter().collect()
461+
dict_elements
462+
.into_iter()
463+
.map(|elem| (elem.0, (elem.1).1))
464+
.collect()
462465
} else {
463466
vec![]
464467
};
@@ -1089,7 +1092,7 @@ impl fmt::Debug for Frame {
10891092
PyObjectKind::Scope { ref scope } => match scope.locals.borrow().kind {
10901093
PyObjectKind::Dict { ref elements } => elements
10911094
.iter()
1092-
.map(|elem| format!("\n {} = {}", elem.0, elem.1.borrow().str()))
1095+
.map(|elem| format!("\n {} = {}", elem.0, (elem.1).1.borrow().str()))
10931096
.collect::<Vec<_>>()
10941097
.join(""),
10951098
ref unexpected => panic!(

vm/src/obj/objdict.rs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use std::ops::{Deref, DerefMut};
1111

1212
// This typedef abstracts the actual dict type used.
1313
// pub type DictContentType = HashMap<usize, Vec<(PyObjectRef, PyObjectRef)>>;
14-
pub type DictContentType = HashMap<String, PyObjectRef>;
15-
// pub type DictContentType = HashMap<String, (PyObjectRef, PyObjectRef)>;
14+
// pub type DictContentType = HashMap<String, PyObjectRef>;
15+
pub type DictContentType = HashMap<String, (PyObjectRef, PyObjectRef)>;
1616

1717
pub fn new(dict_type: PyObjectRef) -> PyObjectRef {
1818
PyObject::new(
@@ -44,9 +44,6 @@ fn get_mut_elements<'a>(obj: &'a PyObjectRef) -> impl DerefMut<Target = DictCont
4444
}
4545

4646
pub fn set_item(dict: &PyObjectRef, needle: &PyObjectRef, value: &PyObjectRef) {
47-
// XXX: Currently, we only support String keys, so we have to unwrap the
48-
// PyObject (and ensure it is a String).
49-
5047
let mut elements = get_mut_elements(dict);
5148
set_item_in_content(&mut elements, needle, value);
5249
}
@@ -56,21 +53,19 @@ pub fn set_item_in_content(
5653
needle: &PyObjectRef,
5754
value: &PyObjectRef,
5855
) {
56+
// XXX: Currently, we only support String keys, so we have to unwrap the
57+
// PyObject (and ensure it is a String).
58+
5959
let needle_str = objstr::get_value(needle);
60-
// TODO: elements.insert(needle_str, (needle.clone(), value.clone()));
61-
elements.insert(needle_str, value.clone());
60+
elements.insert(needle_str, (needle.clone(), value.clone()));
6261
}
6362

64-
pub fn get_key_value_pairs(
65-
vm: &mut VirtualMachine,
66-
dict: &PyObjectRef,
67-
) -> Vec<(PyObjectRef, PyObjectRef)> {
63+
pub fn get_key_value_pairs(dict: &PyObjectRef) -> Vec<(PyObjectRef, PyObjectRef)> {
6864
let dict_elements = get_elements(dict);
69-
let mut pairs = Vec::new();
70-
for (key, obj) in dict_elements.iter() {
71-
// let (key, obj) = pair;
72-
let key = vm.ctx.new_str(key.to_string());
73-
pairs.push((key, obj.clone()));
65+
let mut pairs: Vec<(PyObjectRef, PyObjectRef)> = Vec::new();
66+
for (_str_key, pair) in dict_elements.iter() {
67+
let (key, obj) = pair;
68+
pairs.push((key.clone(), obj.clone()));
7469
}
7570
pairs
7671
}
@@ -80,15 +75,15 @@ fn dict_new(_vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
8075
}
8176

8277
fn dict_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
83-
arg_check!(vm, args, required = [(o, Some(vm.ctx.dict_type()))]);
84-
let elements = get_elements(o);
78+
arg_check!(vm, args, required = [(dict_obj, Some(vm.ctx.dict_type()))]);
79+
let elements = get_elements(dict_obj);
8580
Ok(vm.ctx.new_int(elements.len().to_bigint().unwrap()))
8681
}
8782

8883
fn dict_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
89-
arg_check!(vm, args, required = [(o, Some(vm.ctx.dict_type()))]);
84+
arg_check!(vm, args, required = [(dict_obj, Some(vm.ctx.dict_type()))]);
9085

91-
let elements = get_key_value_pairs(vm, o);
86+
let elements = get_key_value_pairs(dict_obj);
9287
let mut str_parts = vec![];
9388
for (key, value) in elements {
9489
let s = vm.to_repr(&value)?;
@@ -194,7 +189,7 @@ fn dict_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
194189

195190
let elements = get_elements(dict);
196191
if elements.contains_key(&needle) {
197-
Ok(elements[&needle].clone())
192+
Ok(elements[&needle].1.clone())
198193
} else {
199194
Err(vm.new_value_error(format!("Key not found: {}", needle)))
200195
}

vm/src/obj/objtype.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ pub fn get_attributes(obj: &PyObjectRef) -> HashMap<String, PyObjectRef> {
227227
{
228228
let elements = objdict::get_elements(dict);
229229
for (name, value) in elements.iter() {
230-
attributes.insert(name.to_string(), value.clone());
230+
attributes.insert(name.to_string(), value.1.clone());
231231
}
232232
}
233233
}
@@ -236,7 +236,7 @@ pub fn get_attributes(obj: &PyObjectRef) -> HashMap<String, PyObjectRef> {
236236
if let PyObjectKind::Instance { dict } = &obj.borrow().kind {
237237
let elements = objdict::get_elements(dict);
238238
for (name, value) in elements.iter() {
239-
attributes.insert(name.to_string(), value.clone());
239+
attributes.insert(name.to_string(), value.1.clone());
240240
}
241241
}
242242
attributes

vm/src/pyobject.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -518,11 +518,9 @@ impl PyContext {
518518
// Item set/get:
519519
pub fn set_item(&self, obj: &PyObjectRef, key: &str, v: PyObjectRef) {
520520
match obj.borrow_mut().kind {
521-
PyObjectKind::Dict {
522-
elements: ref mut el,
523-
} => {
524-
// objdict::set_item_in_elements(elements, key, v);
525-
el.insert(key.to_string(), v);
521+
PyObjectKind::Dict { ref mut elements } => {
522+
let key = self.new_str(key.to_string());
523+
objdict::set_item_in_content(elements, &key, &v);
526524
}
527525
PyObjectKind::Module {
528526
name: _,
@@ -698,7 +696,7 @@ impl DictProtocol for PyObjectRef {
698696
fn get_item(&self, k: &str) -> Option<PyObjectRef> {
699697
match self.borrow().kind {
700698
PyObjectKind::Dict { ref elements } => match elements.get(k) {
701-
Some(v) => Some(v.clone()),
699+
Some(v) => Some(v.1.clone()),
702700
None => None,
703701
},
704702
PyObjectKind::Module { name: _, ref dict } => dict.get_item(k),

vm/src/stdlib/json.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl<'s> serde::Serialize for PyObjectSerializer<'s> {
6363
let pairs = objdict::get_elements(self.pyobject);
6464
let mut map = serializer.serialize_map(Some(pairs.len()))?;
6565
for (key, e) in pairs.iter() {
66-
map.serialize_entry(&key, &self.clone_with_object(&e))?;
66+
map.serialize_entry(&key, &self.clone_with_object(&e.1))?;
6767
}
6868
map.end()
6969
} else if let PyObjectKind::None = self.pyobject.borrow().kind {

0 commit comments

Comments
 (0)