Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,13 @@ unnested_or_patterns = "warn"

# pedantic lints to enforce gradually
cloned_instead_of_copied = "warn"
collapsible_else_if = "warn"
comparison_chain = "warn"
explicit_into_iter_loop = "warn"
explicit_iter_loop = "warn"
filter_map_next = "warn"
flat_map_option = "warn"
inconsistent_struct_constructor = "warn"
manual_is_variant_and = "warn"
map_unwrap_or = "warn"
must_use_candidate = "warn"
6 changes: 3 additions & 3 deletions crates/codegen/src/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,7 @@ impl Compiler {
}
}

for elt in elts.iter() {
for elt in elts {
if let ast::Expr::Starred(ast::ExprStarred { value, .. }) = elt {
// When we hit first star, build sequence with elements so far
if !sequence_built {
Expand Down Expand Up @@ -11509,7 +11509,7 @@ impl Compiler {
let mut current_string = Wtf8Buf::new();
let mut interp_count: u32 = 0;

for tstring in tstring_value.iter() {
for tstring in tstring_value {
self.collect_tstring_strings(
tstring,
&mut all_strings,
Expand All @@ -11534,7 +11534,7 @@ impl Compiler {
}
);

for tstring in tstring_value.iter() {
for tstring in tstring_value {
self.compile_tstring_interpolations(tstring)?;
}

Expand Down
6 changes: 3 additions & 3 deletions crates/codegen/src/ir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ impl CodeInfo {

// Final DCE: truncate instructions after terminal ops in linearized blocks.
// This catches dead code created by normalize_jumps after the initial DCE.
for block in blocks.iter_mut() {
for block in &mut blocks {
if let Some(pos) = block
.instructions
.iter()
Expand All @@ -540,7 +540,7 @@ impl CodeInfo {
}

// Pre-compute cache_entries for real (non-pseudo) instructions
for block in blocks.iter_mut() {
for block in &mut blocks {
for instr in &mut block.instructions {
if let AnyInstruction::Real(op) = instr.instr {
instr.cache_entries = op.cache_entries() as u32;
Expand Down Expand Up @@ -9430,7 +9430,7 @@ impl CodeInfo {

// Fix up handler stack_depth in ExceptHandlerInfo using start_depths
// computed above: depth = start_depth - 1 - preserve_lasti
for block in self.blocks.iter_mut() {
for block in &mut self.blocks {
for ins in &mut block.instructions {
if let Some(ref mut handler) = ins.except_handler {
let h_start = start_depths[handler.handler_block.idx()];
Expand Down
2 changes: 1 addition & 1 deletion crates/compiler-core/src/bytecode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ impl CodeUnits {
/// Disable adaptive specialization by setting all counters to unreachable.
/// Used for CPython-compiled bytecode where specialization may not be safe.
pub fn disable_specialization(&self) {
for counter in self.adaptive_counters.iter() {
for counter in &self.adaptive_counters {
counter.store(UNREACHABLE_BACKOFF, Ordering::Relaxed);
}
}
Expand Down
4 changes: 2 additions & 2 deletions crates/compiler-core/src/marshal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -928,13 +928,13 @@ pub fn serialize_code<W: Write, C: Constant>(buf: &mut W, code: &CodeObject<C>)
let total_lp_count = code.varnames.len() + cell_only_names.len() + code.freevars.len();
buf.write_u8(Type::Tuple as u8);
write_len(buf, total_lp_count);
for n in code.varnames.iter() {
for n in &code.varnames {
write_marshal_str(buf, n.as_ref());
}
for &n in &cell_only_names {
write_marshal_str(buf, n);
}
for n in code.freevars.iter() {
for n in &code.freevars {
write_marshal_str(buf, n.as_ref());
}
// 10: co_localspluskinds — use the stored kinds directly
Expand Down
8 changes: 4 additions & 4 deletions crates/stdlib/src/faulthandler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ mod decl {
// Disable SIGSEGV handler for access violations to avoid double output
if code == 0xC0000005 {
unsafe {
for handler in FAULTHANDLER_HANDLERS.iter_mut() {
for handler in &mut FAULTHANDLER_HANDLERS {
if handler.signum == libc::SIGSEGV {
faulthandler_disable_fatal_handler(handler);
break;
Expand All @@ -632,7 +632,7 @@ mod decl {
}

unsafe {
for handler in FAULTHANDLER_HANDLERS.iter_mut() {
for handler in &mut FAULTHANDLER_HANDLERS {
if handler.enabled {
continue;
}
Expand Down Expand Up @@ -661,7 +661,7 @@ mod decl {
}

unsafe {
for handler in FAULTHANDLER_HANDLERS.iter_mut() {
for handler in &mut FAULTHANDLER_HANDLERS {
if handler.enabled {
continue;
}
Expand Down Expand Up @@ -700,7 +700,7 @@ mod decl {
}

unsafe {
for handler in FAULTHANDLER_HANDLERS.iter_mut() {
for handler in &mut FAULTHANDLER_HANDLERS {
faulthandler_disable_fatal_handler(handler);
}
}
Expand Down
4 changes: 2 additions & 2 deletions crates/stdlib/src/ssl/cert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ pub(super) fn cert_der_to_dict_helper(
if let Some(ext) = ext_map.get(&OID_X509_EXT_CRL_DISTRIBUTION_POINTS)
&& let ParsedExtension::CRLDistributionPoints(cdp) = &ext.parsed_extension()
{
for dp in cdp.points.iter() {
for dp in &cdp.points {
if let Some(dist_point) = &dp.distribution_point {
use x509_parser::extensions::DistributionPointName;
if let DistributionPointName::FullName(names) = dist_point {
Expand Down Expand Up @@ -583,7 +583,7 @@ pub(super) fn build_verified_chain(
let issuer_name = last_cert.issuer();
let mut found_issuer = false;

for ca_der in ca_certs_der.iter() {
for ca_der in ca_certs_der {
let (_, ca_cert) = match X509Certificate::from_der(ca_der) {
Ok(parsed) => parsed,
Err(_) => continue,
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/builtins/namespace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ impl Initializer for PyNamespace {
};

// Validate keys are strings and set attributes
for (key, value) in dict.into_iter() {
for (key, value) in dict {
let key_str = key
.downcast_ref::<crate::builtins::PyStr>()
.ok_or_else(|| {
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/builtins/template.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ impl Constructor for PyTemplate {
let mut interpolations: Vec<PyObjectRef> = Vec::new();
let mut last_was_str = false;

for item in args.args.iter() {
for item in &args.args {
if let Ok(s) = item.clone().downcast::<PyStr>() {
if last_was_str {
// Concatenate adjacent strings
Expand Down
4 changes: 2 additions & 2 deletions crates/vm/src/builtins/type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,7 @@ impl PyType {
pub(crate) fn init_slots(&self, ctx: &Context) {
// Inherit slots from MRO (mro[0] is self, so skip it)
let mro: Vec<_> = self.mro.read()[1..].to_vec();
for base in mro.iter() {
for base in &mro {
self.inherit_slots(base);
}

Expand All @@ -833,7 +833,7 @@ impl PyType {
let mut slot_name_set = std::collections::HashSet::new();

// mro[0] is self, so skip it; self.attributes is checked separately below
for cls in self.mro.read()[1..].iter() {
for cls in &self.mro.read()[1..] {
for &name in cls.attributes.read().keys() {
if name.as_bytes().starts_with(b"__") && name.as_bytes().ends_with(b"__") {
slot_name_set.insert(name);
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use rustpython_common::static_cell;
/// 1. Has a function set in the type's slots
/// 2. Doesn't already have an attribute in the type's dict
pub fn add_operators(class: &'static Py<PyType>, ctx: &Context) {
for def in SLOT_DEFS.iter() {
for def in SLOT_DEFS {
// Skip __new__ - it has special handling
if def.name == "__new__" {
continue;
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/exception_group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ pub(super) mod types {
// If it's a tuple of types
if let Some(tuple) = condition.downcast_ref::<PyTuple>() {
let mut types = Vec::new();
for item in tuple.iter() {
for item in tuple {
let typ: PyTypeRef = item.clone().try_into_value(vm).map_err(|_| {
vm.new_type_error(
"expected a function, exception type or tuple of exception types",
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/frame.rs
Original file line number Diff line number Diff line change
Expand Up @@ -978,7 +978,7 @@ impl Frame {
// Non-merged cell: find the name by skipping merged cellvars
let mut found_name = None;
let mut skip = nonmerged_cell_idx;
for cv in code.cellvars.iter() {
for cv in &code.cellvars {
let is_merged = code.varnames.contains(cv);
if !is_merged {
if skip == 0 {
Expand Down
4 changes: 2 additions & 2 deletions crates/vm/src/gc_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,7 @@ impl GcState {

if debug.contains(GcDebugFlags::SAVEALL) {
let mut garbage_guard = self.garbage.lock();
for obj_ref in truly_dead.iter() {
for obj_ref in &truly_dead {
garbage_guard.push(obj_ref.clone());
}
}
Expand All @@ -708,7 +708,7 @@ impl GcState {
// Break cycles by clearing references (tp_clear)
// Use deferred drop context to prevent stack overflow.
rustpython_common::refcount::with_deferred_drops(|| {
for obj_ref in truly_dead.iter() {
for obj_ref in &truly_dead {
if obj_ref.gc_has_clear() {
let edges = unsafe { obj_ref.gc_clear() };
drop(edges);
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/object/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1828,7 +1828,7 @@ impl PyObject {
if let Some(dict_ref) = ext.dict.as_ref().and_then(|d| d.replace(None)) {
result.push(dict_ref.into());
}
for slot in ext.slots.iter() {
for slot in &ext.slots {
if let Some(val) = slot.write().take() {
result.push(val);
}
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/stdlib/_ctypes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,7 @@ pub(crate) mod _ctypes {
&& let Ok(fields) = fields_attr.try_to_value::<Vec<PyObjectRef>>(vm)
{
let mut max_align = 1usize;
for field in fields.iter() {
for field in &fields {
if let Some(tuple) = field.downcast_ref::<crate::builtins::PyTuple>()
&& let Some(field_type) = tuple.get(1)
{
Expand Down
4 changes: 2 additions & 2 deletions crates/vm/src/stdlib/_ctypes/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2540,7 +2540,7 @@ fn make_fields(
return Err(vm.new_type_error("_fields_ must be a sequence"));
};

for pair in fieldlist.iter() {
for pair in &fieldlist {
let field_tuple = pair
.downcast_ref::<PyTuple>()
.ok_or_else(|| vm.new_type_error("_fields_ must contain tuples"))?;
Expand Down Expand Up @@ -2599,7 +2599,7 @@ pub(super) fn make_anon_fields(cls: &Py<PyType>, vm: &VirtualMachine) -> PyResul
return Err(vm.new_type_error("_anonymous_ must be a sequence"));
};

for fname_obj in anon_names.iter() {
for fname_obj in &anon_names {
let fname = fname_obj
.downcast_ref::<PyStr>()
.ok_or_else(|| vm.new_type_error("_anonymous_ items must be strings"))?;
Expand Down
6 changes: 3 additions & 3 deletions crates/vm/src/stdlib/_ctypes/structure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub(super) fn calculate_struct_size(cls: &Py<PyType>, vm: &VirtualMachine) -> Py
let fields: Vec<PyObjectRef> = fields_attr.try_to_value(vm)?;
let mut total_size = 0usize;

for field in fields.iter() {
for field in &fields {
if let Some(tuple) = field.downcast_ref::<PyTuple>()
&& let Some(field_type) = tuple.get(1)
{
Expand Down Expand Up @@ -738,7 +738,7 @@ impl PyCStructure {
if let Some(fields_attr) = type_obj.get_direct_attr(vm.ctx.intern_str("_fields_")) {
let fields: Vec<PyObjectRef> = fields_attr.try_to_value(vm)?;

for field in fields.iter() {
for field in &fields {
if current_index >= args.len() {
break;
}
Expand Down Expand Up @@ -786,7 +786,7 @@ impl Initializer for PyCStructure {
}

// 2. Process keyword arguments
for (key, value) in args.kwargs.iter() {
for (key, value) in &args.kwargs {
zelf.as_object()
.set_attr(vm.ctx.intern_str(key.as_str()), value.clone(), vm)?;
}
Expand Down
6 changes: 3 additions & 3 deletions crates/vm/src/stdlib/_ctypes/union.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub(super) fn calculate_union_size(cls: &Py<PyType>, vm: &VirtualMachine) -> PyR
let fields: Vec<PyObjectRef> = fields_attr.try_to_value(vm)?;
let mut max_size = 0usize;

for field in fields.iter() {
for field in &fields {
if let Some(tuple) = field.downcast_ref::<PyTuple>()
&& let Some(field_type) = tuple.get(1)
{
Expand Down Expand Up @@ -609,7 +609,7 @@ impl PyCUnion {
if let Some(fields_attr) = type_obj.get_direct_attr(vm.ctx.intern_str("_fields_")) {
let fields: Vec<PyObjectRef> = fields_attr.try_to_value(vm)?;

for field in fields.iter() {
for field in &fields {
if current_index >= args.len() {
break;
}
Expand Down Expand Up @@ -656,7 +656,7 @@ impl Initializer for PyCUnion {
}

// 2. Process keyword arguments
for (key, value) in args.kwargs.iter() {
for (key, value) in &args.kwargs {
zelf.as_object()
.set_attr(vm.ctx.intern_str(key.as_str()), value.clone(), vm)?;
}
Expand Down
4 changes: 2 additions & 2 deletions crates/vm/src/stdlib/_io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4532,7 +4532,7 @@ mod _io {
let dict_ref: PyRef<PyDict> = dict.clone().try_into_value(vm)?;
if let Some(obj_dict) = zelf.as_object().dict() {
obj_dict.clear();
for (key, value) in dict_ref.into_iter() {
for (key, value) in dict_ref {
obj_dict.set_item(&*key, value, vm)?;
}
}
Expand Down Expand Up @@ -4774,7 +4774,7 @@ mod _io {
let dict_ref: PyRef<PyDict> = dict.clone().try_into_value(vm)?;
if let Some(obj_dict) = zelf.as_object().dict() {
obj_dict.clear();
for (key, value) in dict_ref.into_iter() {
for (key, value) in dict_ref {
obj_dict.set_item(&*key, value, vm)?;
}
}
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/stdlib/_typing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ pub(crate) mod decl {
fn typing_type_repr_value(value: &PyObjectRef, vm: &VirtualMachine) -> PyResult {
if let Ok(tuple) = value.try_to_ref::<PyTuple>(vm) {
let mut parts = Vec::with_capacity(tuple.len());
for item in tuple.iter() {
for item in tuple {
parts.push(typing_type_repr(item, vm)?);
}
let inner = if parts.len() == 1 {
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/stdlib/atexit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ mod atexit {
pub fn _run_exitfuncs(vm: &VirtualMachine) {
let funcs: Vec<_> = core::mem::take(&mut *vm.state.atexit_funcs.lock());
// Callbacks stored in LIFO order, iterate forward
for entry in funcs.into_iter() {
for entry in funcs {
let (func, args) = *entry;
if let Err(e) = func.call(args, vm) {
let exit = e.fast_isinstance(vm.ctx.exceptions.system_exit);
Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/stdlib/gc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ mod gc {
let stats = gc_state::gc_state().get_stats();
let mut result = Vec::with_capacity(3);

for stat in stats.iter() {
for stat in &stats {
let dict = vm.ctx.new_dict();
dict.set_item("collections", vm.ctx.new_int(stat.collections).into(), vm)?;
dict.set_item("collected", vm.ctx.new_int(stat.collected).into(), vm)?;
Expand Down
4 changes: 2 additions & 2 deletions crates/vm/src/stdlib/marshal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ mod decl {
}
} else if let Some(d) = obj.downcast_ref::<PyDict>() {
buf.write_u8(b'{');
for (k, v) in d.into_iter() {
for (k, v) in d {
write_object_depth(buf, &k, refs, version, vm, depth - 1)?;
write_object_depth(buf, &v, refs, version, vm, depth - 1)?;
}
Expand Down Expand Up @@ -572,7 +572,7 @@ mod decl {
check_no_code(&elem, vm)?;
}
} else if let Some(dict) = obj.downcast_ref::<PyDict>() {
for (k, v) in dict.into_iter() {
for (k, v) in dict {
check_no_code(&k, vm)?;
check_no_code(&v, vm)?;
}
Expand Down
4 changes: 2 additions & 2 deletions crates/vm/src/stdlib/nt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1074,7 +1074,7 @@ pub(crate) mod module {

// Build environment strings as "KEY=VALUE\0" wide strings
let mut env_strings: Vec<widestring::WideCString> = Vec::new();
for (key, value) in env.into_iter() {
for (key, value) in env {
let key = FsPath::try_from_path_like(key, true, vm)?;
let value = FsPath::try_from_path_like(value, true, vm)?;
let key_str = key.to_string_lossy();
Expand Down Expand Up @@ -1192,7 +1192,7 @@ pub(crate) mod module {
let env = crate::stdlib::os::envobj_to_dict(env, vm)?;
// Build environment strings as "KEY=VALUE\0" wide strings
let mut env_strings: Vec<widestring::WideCString> = Vec::new();
for (key, value) in env.into_iter() {
for (key, value) in env {
let key = PyStrRef::try_from_object(vm, key)?;
let value = PyStrRef::try_from_object(vm, value)?;
let key_str = key.expect_str();
Expand Down
Loading