Skip to content

Commit 5163499

Browse files
Chore: Address clippy warnings.
1 parent 22d3142 commit 5163499

14 files changed

Lines changed: 117 additions & 126 deletions

File tree

compiler/src/modules/lexer/scan.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -375,14 +375,13 @@ impl<'a> Scanner<'a> {
375375
return self.pending.pop();
376376
}
377377

378-
if is_string_prefix(slice) {
379-
if let Some(&q) = self.src.get(self.pos) {
380-
if q == b'"' || q == b'\'' {
381-
self.pos += 1;
382-
self.scan_string(q);
383-
return Some((TokenType::String, self.line, start, self.pos));
384-
}
385-
}
378+
if is_string_prefix(slice)
379+
&& let Some(&q) = self.src.get(self.pos)
380+
&& (q == b'"' || q == b'\'')
381+
{
382+
self.pos += 1;
383+
self.scan_string(q);
384+
return Some((TokenType::String, self.line, start, self.pos));
386385
}
387386

388387
let kind = keyword(slice).unwrap_or(TokenType::Name);
@@ -403,7 +402,7 @@ impl<'a> Scanner<'a> {
403402
}
404403

405404
// Dot-number (.123)
406-
if b == b'.' && self.at(1).map_or(false, |c| BYTE_CLASS[c as usize] & DIGIT != 0) {
405+
if b == b'.' && self.at(1).is_some_and(|c| BYTE_CLASS[c as usize] & DIGIT != 0) {
407406
self.pos += 1;
408407
let kind = self.scan_dot_number();
409408
return Some((kind, self.line, start, self.pos));

compiler/src/modules/parser/control.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,9 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
204204
self.chunk.emit(OpCode::Jump, loop_start);
205205
self.patch(fi);
206206

207-
if !is_async {
208-
if self.eat_if(TokenType::Else) {
209-
self.eat(TokenType::Colon);
210-
self.compile_block();
211-
}
207+
if !is_async && self.eat_if(TokenType::Else) {
208+
self.eat(TokenType::Colon);
209+
self.compile_block();
212210
}
213211

214212
self.loop_starts.pop();
@@ -318,7 +316,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
318316
}
319317
}
320318

321-
pub(super) fn from_stmt(&mut self) {
319+
pub(super) fn parse_from_stmt(&mut self) {
322320
self.advance();
323321
let module = self.dotted_name();
324322
let mod_idx = self.chunk.push_name(&module);

compiler/src/modules/parser/expr.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
6262
}
6363

6464
pub(super) fn infix_bp(&mut self, min_bp: u8) {
65-
loop {
66-
let Some(tok) = self.peek() else { break };
67-
65+
while let Some(tok) = self.peek() {
6866
// `is` / `is not`
6967
if tok == TokenType::Is {
7068
if 7 < min_bp { break; }
@@ -169,7 +167,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
169167
}
170168
TokenType::Complex => {
171169
let raw = self.lexeme(&t).replace('_', "");
172-
let s = raw.trim_end_matches(|c: char| c == 'j' || c == 'J');
170+
let s = raw.trim_end_matches(['j', 'J']);
173171
self.emit_const(Value::Float(s.parse().unwrap_or(0.0)));
174172
}
175173
TokenType::Int | TokenType::Float => {

compiler/src/modules/parser/literals.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
203203
let colon = self.advance();
204204
let spec_start = colon.end;
205205
loop {
206-
match self.tokens.peek().map(|t| t.kind.clone()) {
206+
match self.tokens.peek().map(|t| t.kind) {
207207
Some(TokenType::Rbrace) | None => break,
208208
_ => { self.tokens.next(); }
209209
}
@@ -389,7 +389,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
389389
let fi = self.chunk.functions.len() as u16;
390390
let cur_ver = self.current_version(&fname);
391391
let mut buf = [0u8; 128];
392-
let name_slot = self.chunk.push_name(Self::ssa_name(&fname, cur_ver + 1, &mut buf)) as u16;
392+
let name_slot = self.chunk.push_name(Self::ssa_name(&fname, cur_ver + 1, &mut buf));
393393
self.chunk.functions.push((params, body, defaults, name_slot));
394394
self.chunk.emit(if is_async { OpCode::MakeCoroutine } else { OpCode::MakeFunction }, fi);
395395

compiler/src/modules/parser/stmt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
115115
false
116116
}
117117
Some(TokenType::From) => {
118-
self.from_stmt();
118+
self.parse_from_stmt();
119119
false
120120
}
121121
Some(TokenType::Global) => {

compiler/src/modules/parser/types.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,13 @@ impl SSAChunk {
136136
pub fn finalize_prev_slots(&mut self) {
137137
let mut ps: Vec<Option<u16>> = vec![None; self.names.len()];
138138
for (i, name) in self.names.iter().enumerate() {
139-
if let Some(pos) = name.rfind('_') {
140-
if let Ok(ver) = name[pos+1..].parse::<u32>() {
141-
if ver > 0 {
142-
let prev = format!("{}_{}", &name[..pos], ver - 1);
143-
if let Some(&j) = self.name_index.get(&prev) {
144-
ps[i] = Some(j);
145-
}
139+
if let Some(pos) = name.rfind('_')
140+
&& let Ok(ver) = name[pos+1..].parse::<u32>()
141+
&& ver > 0 {
142+
let prev = format!("{}_{}", &name[..pos], ver - 1);
143+
if let Some(&j) = self.name_index.get(&prev) {
144+
ps[i] = Some(j);
146145
}
147-
}
148146
}
149147
}
150148
self.prev_slots = ps;

compiler/src/modules/vm/builtins.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,12 @@ impl<'a> VM<'a> {
8383

8484
pub fn call_int(&mut self) -> Result<(), VmErr> {
8585
let o = self.pop()?;
86-
if o.is_heap() {
87-
if let HeapObj::BigInt(b) = self.heap.get(o) {
86+
if o.is_heap()
87+
&& let HeapObj::BigInt(b) = self.heap.get(o) {
8888
let b = b.clone();
8989
let v = self.bigint_to_val(b)?;
9090
self.push(v);
9191
return Ok(());
92-
}
9392
}
9493
let i = if o.is_int() { o.as_int() }
9594
else if o.is_float() { o.as_float() as i64 }
@@ -143,13 +142,12 @@ impl<'a> VM<'a> {
143142

144143
pub fn call_ord(&mut self) -> Result<(), VmErr> {
145144
let o = self.pop()?;
146-
if o.is_heap() {
147-
if let HeapObj::Str(s) = self.heap.get(o) {
145+
if o.is_heap()
146+
&& let HeapObj::Str(s) = self.heap.get(o) {
148147
let mut cs = s.chars();
149148
if let (Some(c), None) = (cs.next(), cs.next()) {
150149
self.push(Val::int(c as i64)); return Ok(());
151150
}
152-
}
153151
}
154152
Err(VmErr::Type("ord() requires string of length 1"))
155153
}
@@ -182,7 +180,7 @@ impl<'a> VM<'a> {
182180

183181
pub fn call_round(&mut self, op: u16) -> Result<(), VmErr> {
184182
let args = self.pop_n(op as usize)?;
185-
let v = match (args.get(0), args.get(1)) {
183+
let v = match (args.first(), args.get(1)) {
186184
(Some(o), Some(n)) if o.is_float() && n.is_int() => {
187185
let factor = fpowi(10.0, n.as_int() as i32);
188186
Val::float(fround(o.as_float() * factor) / factor)
@@ -334,7 +332,7 @@ impl<'a> VM<'a> {
334332

335333
let check = |t: Val, heap: &HeapPool| -> Result<bool, VmErr> {
336334
match heap.get(t) {
337-
HeapObj::Type(name) => Ok(name == &obj_ty),
335+
HeapObj::Type(name) => Ok(name == obj_ty),
338336
_ => Err(VmErr::Type("isinstance() arg 2 must be a type or tuple of types")),
339337
}
340338
};

compiler/src/modules/vm/collections.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,25 +123,23 @@ impl<'a> VM<'a> {
123123
let obj = self.pop()?;
124124

125125
// Slice dispatch
126-
if idx.is_heap() {
127-
if let HeapObj::Slice(start, stop, step) = self.heap.get(idx).clone() {
126+
if idx.is_heap()
127+
&& let HeapObj::Slice(start, stop, step) = self.heap.get(idx).clone() {
128128
let v = self.slice_val(obj, start, stop, step)?;
129129
self.push(v);
130130
return Ok(true);
131-
}
132131
}
133132

134133
// Str[int] needs heap alloc
135-
if obj.is_heap() && idx.is_int() {
136-
if let HeapObj::Str(s) = self.heap.get(obj) {
134+
if obj.is_heap() && idx.is_int()
135+
&& let HeapObj::Str(s) = self.heap.get(obj) {
137136
let i = idx.as_int();
138137
let len = s.chars().count() as i64;
139138
let ui = (if i < 0 { len + i } else { i }) as usize;
140139
let c = s.chars().nth(ui).ok_or(VmErr::Value("string index out of range"))?;
141140
let val = self.heap.alloc(HeapObj::Str(c.to_string()))?;
142141
self.push(val);
143142
return Ok(true);
144-
}
145143
}
146144

147145
let v = self.getitem_val(obj, idx)?;

compiler/src/modules/vm/mod.rs

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ impl<'a> VM<'a> {
125125
Merges two SSA branches into target slot and back-propagates through prev_slots chain.
126126
*/
127127

128-
fn exec_phi(op: u16, rip: usize, phi_map: &[usize], slots: &mut Vec<Option<Val>>, prev_slots: &[Option<u16>], phi_sources: &[(u16, u16)]) {
128+
fn exec_phi(op: u16, rip: usize, phi_map: &[usize], slots: &mut [Option<Val>], prev_slots: &[Option<u16>], phi_sources: &[(u16, u16)]) {
129129
let target = op as usize;
130130
let (ia, ib) = phi_sources[phi_map[rip]];
131131
let val = slots[ia as usize].or(slots[ib as usize]).unwrap_or(Val::none());
@@ -193,14 +193,14 @@ impl<'a> VM<'a> {
193193
#[inline] pub(crate) fn push(&mut self, v: Val) { self.stack.push(v); }
194194

195195
#[inline] pub(crate) fn pop(&mut self) -> Result<Val, VmErr> {
196-
self.stack.pop().ok_or_else(|| VmErr::Runtime("stack underflow"))
196+
self.stack.pop().ok_or(VmErr::Runtime("stack underflow"))
197197
}
198198
#[inline] pub(crate) fn pop2(&mut self) -> Result<(Val, Val), VmErr> {
199199
let b = self.pop()?; let a = self.pop()?; Ok((a, b))
200200
}
201201
#[inline] pub(crate) fn pop_n(&mut self, n: usize) -> Result<Vec<Val>, VmErr> {
202-
let at = self.stack.len().checked_sub(n)
203-
.ok_or_else(|| VmErr::Runtime("stack underflow"))?;
202+
let at = self.stack.len().checked_sub(n)
203+
.ok_or(VmErr::Runtime("stack underflow"))?;
204204
Ok(self.stack.split_off(at))
205205
}
206206

@@ -209,7 +209,7 @@ impl<'a> VM<'a> {
209209
Converts a parser-level Value into a runtime Val, allocating heap for strings.
210210
*/
211211

212-
pub(crate) fn to_val(&mut self, v: &Value) -> Result<Val, VmErr> {
212+
pub(crate) fn val_from(&mut self, v: &Value) -> Result<Val, VmErr> {
213213
Ok(match v {
214214
Value::Int(i) => {
215215
if *i >= Val::INT_MIN && *i <= Val::INT_MAX {
@@ -278,7 +278,7 @@ impl<'a> VM<'a> {
278278
Fetches instructions by IP, routes each opcode to its handler arm.
279279
*/
280280

281-
pub(crate) fn exec(&mut self, chunk: &SSAChunk, slots: &mut Vec<Option<Val>>) -> Result<Val, VmErr> {
281+
pub(crate) fn exec(&mut self, chunk: &SSAChunk, slots: &mut [Option<Val>]) -> Result<Val, VmErr> {
282282
let slots_base = self.live_slots.len();
283283
let n = chunk.instructions.len();
284284

@@ -320,7 +320,7 @@ impl<'a> VM<'a> {
320320
match ins.opcode {
321321

322322
// Loads
323-
OpCode::LoadConst => { let v = self.to_val(&chunk.constants[op as usize])?; self.push(v); }
323+
OpCode::LoadConst => { let v = self.val_from(&chunk.constants[op as usize])?; self.push(v); }
324324
OpCode::LoadName => { let slot = op as usize; self.push(slots[slot].ok_or_else(|| VmErr::Name(chunk.names[slot].clone()))?); }
325325
OpCode::StoreName => {
326326
let v = self.pop()?;
@@ -355,8 +355,8 @@ impl<'a> VM<'a> {
355355
}
356356
OpCode::Pow => {
357357
let (a, b) = self.pop2()?;
358-
if let Some(ba) = self.to_bigint(a) {
359-
if b.is_int() {
358+
if let Some(ba) = self.to_bigint(a)
359+
&& b.is_int() {
360360
let exp = b.as_int();
361361
if exp >= 0 {
362362
let result = ba.pow_u32(exp as u32);
@@ -366,7 +366,6 @@ impl<'a> VM<'a> {
366366
}
367367
self.push(Val::float(fpowi(ba.to_f64(), exp as i32)));
368368
continue;
369-
}
370369
}
371370
let fa = if a.is_int() { a.as_int() as f64 } else if a.is_float() { a.as_float() }
372371
else { return Err(VmErr::Type("** requires numeric operands")); };
@@ -517,7 +516,7 @@ impl<'a> VM<'a> {
517516

518517
OpCode::ListAppend => {
519518
let v = self.pop()?;
520-
let acc = *self.stack.last().ok_or_else(|| VmErr::Runtime("stack underflow"))?;
519+
let acc = *self.stack.last().ok_or(VmErr::Runtime("stack underflow"))?;
521520
if !acc.is_heap() { return Err(VmErr::Runtime("list accumulator corrupted")); }
522521
match self.heap.get(acc) {
523522
HeapObj::List(rc) => rc.borrow_mut().push(v),
@@ -526,20 +525,18 @@ impl<'a> VM<'a> {
526525
}
527526
OpCode::SetAdd => {
528527
let v = self.pop()?;
529-
let acc = *self.stack.last().ok_or_else(|| VmErr::Runtime("stack underflow"))?;
528+
let acc = *self.stack.last().ok_or(VmErr::Runtime("stack underflow"))?;
530529
if !acc.is_heap() { return Err(VmErr::Runtime("set accumulator corrupted")); }
531530
let already = match self.heap.get(acc) {
532531
HeapObj::Set(rc) => rc.borrow().iter().any(|&x| eq_vals_with_heap(x, v, &self.heap)),
533532
_ => return Err(VmErr::Runtime("set accumulator corrupted")),
534533
};
535-
if !already {
536-
if let HeapObj::Set(rc) = self.heap.get(acc) { rc.borrow_mut().push(v); }
537-
}
534+
if !already && let HeapObj::Set(rc) = self.heap.get(acc) { rc.borrow_mut().push(v); }
538535
}
539536
OpCode::MapAdd => {
540537
let value = self.pop()?;
541538
let key = self.pop()?;
542-
let acc = *self.stack.last().ok_or_else(|| VmErr::Runtime("stack underflow"))?;
539+
let acc = *self.stack.last().ok_or(VmErr::Runtime("stack underflow"))?;
543540
if !acc.is_heap() { return Err(VmErr::Runtime("dict accumulator corrupted")); }
544541
match self.heap.get(acc) {
545542
HeapObj::Dict(rc) => { rc.borrow_mut().insert(key, value); }
@@ -580,21 +577,22 @@ impl<'a> VM<'a> {
580577
for (i, n) in body.names.iter().enumerate() { body_map.insert(n.as_str(), i); }
581578
// Bind args to params: detects keyword args (HeapObj::Str matching a param name) and consumes key+value pairs
582579
let mut pi = 0usize;
583-
for (_, p) in params.iter().enumerate() {
584-
if pi >= args.len() { break; }
585-
if args[pi].is_heap() {
586-
if let HeapObj::Str(k) = self.heap.get(args[pi]) {
587-
if params.iter().any(|p| p.trim_start_matches('*') == k.as_str()) && pi + 1 < args.len() {
588-
let pname = format!("{}_0", k);
589-
if let Some(&s) = body_map.get(pname.as_str()) { fn_slots[s] = Some(args[pi + 1]); }
590-
pi += 2;
591-
continue;
592-
}
593-
}
580+
for p in params.iter() {
581+
if pi < args.len()
582+
&& args[pi].is_heap()
583+
&& let HeapObj::Str(k) = self.heap.get(args[pi])
584+
&& params.iter().any(|p| p.trim_start_matches('*') == k.as_str())
585+
&& pi + 1 < args.len() {
586+
let pname = format!("{}_0", k);
587+
if let Some(&s) = body_map.get(pname.as_str()) { fn_slots[s] = Some(args[pi + 1]); }
588+
pi += 2;
589+
continue;
590+
}
591+
if pi < args.len() {
592+
let pname = format!("{}_0", p.trim_start_matches('*'));
593+
if let Some(&s) = body_map.get(pname.as_str()) { fn_slots[s] = Some(args[pi]); }
594+
pi += 1;
594595
}
595-
let pname = format!("{}_0", p.trim_start_matches('*'));
596-
if let Some(&s) = body_map.get(pname.as_str()) { fn_slots[s] = Some(args[pi]); }
597-
pi += 1;
598596
}
599597
if pi < params.len() && !captured_defaults.is_empty() {
600598
let d_start = captured_defaults.len().saturating_sub(params.len() - pi);

0 commit comments

Comments
 (0)