Skip to content

Commit 45d2c42

Browse files
committed
Fix dict.keys behavior
1 parent c35cb89 commit 45d2c42

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

crates/vm/src/builtins/dict.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,21 @@ impl PyDict {
7070
Err(other) => other,
7171
};
7272
let dict = &self.entries;
73-
if let Some(keys) = vm.get_method(other.clone(), vm.ctx.intern_str("keys")) {
74-
let keys = keys?.call((), vm)?.get_iter(vm)?;
75-
while let PyIterReturn::Return(key) = keys.next(vm)? {
76-
let val = other.get_item(&*key, vm)?;
77-
dict.insert(vm, &*key, val)?;
73+
// Use get_attr to properly invoke __getattribute__ for proxy objects
74+
let keys_result = other.get_attr(vm.ctx.intern_str("keys"), vm);
75+
let has_keys = match keys_result {
76+
Ok(keys_method) => {
77+
let keys = keys_method.call((), vm)?.get_iter(vm)?;
78+
while let PyIterReturn::Return(key) = keys.next(vm)? {
79+
let val = other.get_item(&*key, vm)?;
80+
dict.insert(vm, &*key, val)?;
81+
}
82+
true
7883
}
79-
} else {
84+
Err(e) if e.fast_isinstance(vm.ctx.exceptions.attribute_error) => false,
85+
Err(e) => return Err(e),
86+
};
87+
if !has_keys {
8088
let iter = other.get_iter(vm)?;
8189
loop {
8290
fn err(vm: &VirtualMachine) -> PyBaseExceptionRef {

0 commit comments

Comments
 (0)