mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Apply copilot review
This commit is contained in:
1 parent
3f1d39e5db
commit
d973e6da10
1 file changed
+28
-18
+28
-18
@@ -1541,19 +1541,11 @@ impl ExecutingFrame<'_> {
|
||||
let map_obj = vm.ctx.new_dict();
|
||||
for obj in self.pop_multiple(size) {
|
||||
// Use keys() method for all mapping objects to preserve order
|
||||
let Some(keys_method) = vm.get_method(obj.clone(), vm.ctx.intern_str("keys")) else {
|
||||
return Err(
|
||||
vm.new_type_error(format!("'{}' object is not a mapping", obj.class().name()))
|
||||
);
|
||||
};
|
||||
|
||||
let keys = keys_method?.call((), vm)?.get_iter(vm)?;
|
||||
while let PyIterReturn::Return(key) = keys.next(vm)? {
|
||||
Self::iterate_mapping_keys(vm, &obj, "keyword argument", |key| {
|
||||
// Check for keyword argument restrictions
|
||||
if key.downcast_ref::<PyStr>().is_none() {
|
||||
return Err(vm.new_type_error("keywords must be strings".to_owned()));
|
||||
}
|
||||
|
||||
if map_obj.contains_key(&*key, vm) {
|
||||
let key_repr = &key.repr(vm)?;
|
||||
let msg = format!(
|
||||
@@ -1565,7 +1557,8 @@ impl ExecutingFrame<'_> {
|
||||
|
||||
let value = obj.get_item(&*key, vm)?;
|
||||
map_obj.set_item(&*key, value, vm)?;
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
}
|
||||
|
||||
self.push_value(map_obj.into());
|
||||
@@ -1614,19 +1607,14 @@ impl ExecutingFrame<'_> {
|
||||
let mut kwargs = IndexMap::new();
|
||||
|
||||
// Use keys() method for all mapping objects to preserve order
|
||||
let Some(keys_method) = vm.get_method(kw_obj.clone(), vm.ctx.intern_str("keys")) else {
|
||||
return Err(vm.new_type_error("argument after ** must be a mapping".to_owned()));
|
||||
};
|
||||
|
||||
// Handle custom mapping objects like OrderedDict using keys() method
|
||||
let keys = keys_method?.call((), vm)?.get_iter(vm)?;
|
||||
while let PyIterReturn::Return(key) = keys.next(vm)? {
|
||||
Self::iterate_mapping_keys(vm, &kw_obj, "argument after **", |key| {
|
||||
let key_str = key
|
||||
.payload_if_subclass::<PyStr>(vm)
|
||||
.ok_or_else(|| vm.new_type_error("keywords must be strings".to_owned()))?;
|
||||
let value = kw_obj.get_item(&*key, vm)?;
|
||||
kwargs.insert(key_str.as_str().to_owned(), value);
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
kwargs
|
||||
} else {
|
||||
IndexMap::new()
|
||||
@@ -1638,6 +1626,28 @@ impl ExecutingFrame<'_> {
|
||||
Ok(FuncArgs { args, kwargs })
|
||||
}
|
||||
|
||||
/// Helper function to iterate over mapping keys using the keys() method.
|
||||
/// This ensures proper order preservation for OrderedDict and other custom mappings.
|
||||
fn iterate_mapping_keys<F>(
|
||||
vm: &VirtualMachine,
|
||||
mapping: &PyObjectRef,
|
||||
error_prefix: &str,
|
||||
mut key_handler: F,
|
||||
) -> PyResult<()>
|
||||
where
|
||||
F: FnMut(PyObjectRef) -> PyResult<()>,
|
||||
{
|
||||
let Some(keys_method) = vm.get_method(mapping.clone(), vm.ctx.intern_str("keys")) else {
|
||||
return Err(vm.new_type_error(format!("{} must be a mapping", error_prefix)));
|
||||
};
|
||||
|
||||
let keys = keys_method?.call((), vm)?.get_iter(vm)?;
|
||||
while let PyIterReturn::Return(key) = keys.next(vm)? {
|
||||
key_handler(key)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn execute_call(&mut self, args: FuncArgs, vm: &VirtualMachine) -> FrameResult {
|
||||
let func_ref = self.pop_value();
|
||||
|
||||
Reference in new issue
Block a user