Skip to content

Commit 8fb4ebd

Browse files
committed
refactor: use let-else in more places
1 parent b50dd67 commit 8fb4ebd

File tree

21 files changed

+165
-189
lines changed

21 files changed

+165
-189
lines changed

src/r3_core/src/utils/alloc.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,12 +402,9 @@ where
402402
unsafe impl const Allocator for ConstAllocator {
403403
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
404404
let ptr = unsafe { core::intrinsics::const_allocate(layout.size(), layout.align()) };
405-
if let Some(ptr) = NonNull::new(ptr) {
406-
unsafe { *self.ref_count += 1 };
407-
Ok(NonNull::slice_from_raw_parts(ptr, layout.size()))
408-
} else {
409-
Err(AllocError)
410-
}
405+
let Some(ptr) = NonNull::new(ptr) else { return Err(AllocError) };
406+
unsafe { *self.ref_count += 1 };
407+
Ok(NonNull::slice_from_raw_parts(ptr, layout.size()))
411408
}
412409

413410
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {

src/r3_core/src/utils/binary_heap/mod.rs

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,30 +67,32 @@ where
6767
return None;
6868
}
6969

70-
if let Some(mut item) = self.pop() {
71-
let slice = &mut **self;
72-
if i < slice.len() {
73-
// Swap the last item with the item at `i`
74-
core::mem::swap(&mut slice[i], &mut item);
75-
ctx.on_move(&mut slice[i], i);
76-
77-
let should_sift_up = i > 0 && ctx.lt(&slice[i], &slice[(i - 1) / 2]);
78-
79-
// Sift down or up the item at `i`, restoring the invariant
80-
// Safety: `i` points to an element within `slice`.
81-
unsafe {
82-
if should_sift_up {
83-
sift_up(slice, 0, i, ctx);
84-
} else {
85-
sift_down(slice, i, ctx);
86-
}
70+
let Some(mut item) = self.pop()
71+
else {
72+
debug_assert!(false);
73+
return None;
74+
};
75+
76+
let slice = &mut **self;
77+
if i < slice.len() {
78+
// Swap the last item with the item at `i`
79+
core::mem::swap(&mut slice[i], &mut item);
80+
ctx.on_move(&mut slice[i], i);
81+
82+
let should_sift_up = i > 0 && ctx.lt(&slice[i], &slice[(i - 1) / 2]);
83+
84+
// Sift down or up the item at `i`, restoring the invariant
85+
// Safety: `i` points to an element within `slice`.
86+
unsafe {
87+
if should_sift_up {
88+
sift_up(slice, 0, i, ctx);
89+
} else {
90+
sift_down(slice, i, ctx);
8791
}
8892
}
89-
Some(item)
90-
} else {
91-
debug_assert!(false);
92-
None
9393
}
94+
95+
Some(item)
9496
}
9597

9698
fn heap_push<Ctx>(&mut self, item: Self::Element, ctx: Ctx) -> usize

src/r3_core/src/utils/vec.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,11 @@ impl<T: ~const Destruct> ComptimeVec<T> {
7979

8080
pub const fn pop(&mut self) -> Option<T> {
8181
unsafe {
82-
if let Some(i) = self.len.checked_sub(1) {
83-
self.len = i;
84-
// Safety: The `i`-th element was present, but since `len <= i`
85-
// now, we can remove it
86-
Some(self.ptr.as_ptr().wrapping_add(i).read())
87-
} else {
88-
None
89-
}
82+
let Some(i) = self.len.checked_sub(1) else { return None };
83+
self.len = i;
84+
// Safety: The `i`-th element was present, but since `len <= i`
85+
// now, we can remove it
86+
Some(self.ptr.as_ptr().wrapping_add(i).read())
9087
}
9188
}
9289

src/r3_kernel/src/wait.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -477,11 +477,7 @@ impl<Traits: KernelTraits> WaitQueue<Traits> {
477477
let mut accessor = wait_queue_accessor!(&self.waits, lock.borrow_mut());
478478
let wait_ref = unsafe { accessor.pop_front().unwrap_unchecked() };
479479

480-
let wait_ref = if let Some(wait_ref) = wait_ref {
481-
wait_ref
482-
} else {
483-
return false;
484-
};
480+
let Some(wait_ref) = wait_ref else { return false; };
485481

486482
// Safety: `wait_ref` points to a valid `Wait` because `wait_ref` was
487483
// in `self.waits` at the beginning of this function call.
@@ -587,15 +583,16 @@ impl<Traits: KernelTraits> fmt::Debug for WaitQueue<Traits> {
587583

588584
impl<Traits: KernelTraits> fmt::Debug for WaitQueuePrinter<'_, Traits> {
589585
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
590-
if let Ok(mut lock) = super::klock::lock_cpu() {
591-
let accessor = wait_queue_accessor!(&self.waits, lock.borrow_mut());
592-
593-
f.debug_list()
594-
.entries(accessor.iter().map(|x| x.unwrap().1))
595-
.finish()
596-
} else {
597-
f.write_str("< locked >")
598-
}
586+
let Ok(mut lock) = super::klock::lock_cpu()
587+
else {
588+
return f.write_str("< locked >")
589+
};
590+
591+
let accessor = wait_queue_accessor!(&self.waits, lock.borrow_mut());
592+
593+
f.debug_list()
594+
.entries(accessor.iter().map(|x| x.unwrap().1))
595+
.finish()
599596
}
600597
}
601598

@@ -652,13 +649,13 @@ pub(super) fn reorder_wait_of_task<Traits: KernelTraits>(
652649
lock: CpuLockTokenRefMut<'_, Traits>,
653650
task_cb: &TaskCb<Traits>,
654651
) {
655-
if let Some(wait_ref) = task_cb.wait.current_wait.get(&*lock) {
656-
// Safety: `wait_ref` must point to an existing `Wait`
657-
let wait = unsafe { &*wait_ref.0.as_ptr() };
652+
let Some(wait_ref) = task_cb.wait.current_wait.get(&*lock) else { return };
658653

659-
if let Some(wait_queue) = wait.wait_queue {
660-
wait_queue.reorder_wait(lock, wait);
661-
}
654+
// Safety: `wait_ref` must point to an existing `Wait`
655+
let wait = unsafe { &*wait_ref.0.as_ptr() };
656+
657+
if let Some(wait_queue) = wait.wait_queue {
658+
wait_queue.reorder_wait(lock, wait);
662659
}
663660
}
664661

src/r3_port_arm/src/threading/imp.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -618,20 +618,20 @@ impl State {
618618

619619
unsafe fn handle_irq<Traits: PortInstance>() {
620620
// Safety: We are the port, so it's okay to call this
621-
if let Some(line) = unsafe { Traits::acknowledge_interrupt() } {
622-
// Now that we have signaled the acknowledgement of the current
623-
// exception, we can start accepting nested exceptions.
624-
unsafe { asm!("cpsie i") };
625-
626-
if let Some(handler) = Traits::INTERRUPT_HANDLERS.get(line) {
627-
// Safety: The first-level interrupt handler is the only code
628-
// allowed to call this
629-
unsafe { handler() };
630-
}
631-
632-
// Safety: We are the port, so it's okay to call this
633-
unsafe { Traits::end_interrupt(line) };
621+
let Some(line) = (unsafe { Traits::acknowledge_interrupt() }) else { return };
622+
623+
// Now that we have signaled the acknowledgement of the current
624+
// exception, we can start accepting nested exceptions.
625+
unsafe { asm!("cpsie i") };
626+
627+
if let Some(handler) = Traits::INTERRUPT_HANDLERS.get(line) {
628+
// Safety: The first-level interrupt handler is the only code
629+
// allowed to call this
630+
unsafe { handler() };
634631
}
632+
633+
// Safety: We are the port, so it's okay to call this
634+
unsafe { Traits::end_interrupt(line) };
635635
}
636636
}
637637

src/r3_port_arm_m_test_driver/src/logger_rtt.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,15 @@ impl log::Log for Logger {
1414
fn log(&self, record: &log::Record) {
1515
interrupt::free(move |cs| {
1616
let mut log_channel = LOG_CHANNEL.borrow(cs).borrow_mut();
17-
if let Some(channel) = &mut *log_channel {
18-
writeln!(
19-
channel,
20-
"[{level:5} {target}] {args}",
21-
level = record.level(),
22-
target = record.target(),
23-
args = record.args()
24-
)
25-
.unwrap();
26-
}
17+
let Some(channel) = &mut *log_channel else { return; };
18+
writeln!(
19+
channel,
20+
"[{level:5} {target}] {args}",
21+
level = record.level(),
22+
target = record.target(),
23+
args = record.args()
24+
)
25+
.unwrap();
2726
});
2827
}
2928

src/r3_port_std/src/sched.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,14 @@ impl ums::Scheduler for SchedState {
122122
}
123123

124124
fn thread_exited(&mut self, thread_id: ums::ThreadId) {
125-
if let Some(i) = self.zombies.iter().position(|id| *id == thread_id) {
126-
log::trace!("removing the zombie thread {:?}", thread_id);
127-
self.zombies.swap_remove(i);
125+
let Some(i) = self.zombies.iter().position(|id| *id == thread_id)
126+
else {
127+
log::warn!("thread_exited: unexpected thread {:?}", thread_id);
128128
return;
129-
}
129+
};
130130

131-
log::warn!("thread_exited: unexpected thread {:?}", thread_id);
131+
log::trace!("removing the zombie thread {:?}", thread_id);
132+
self.zombies.swap_remove(i);
132133
}
133134
}
134135

@@ -153,9 +154,8 @@ pub fn check_preemption_by_interrupt(
153154
let sched_state = lock.scheduler();
154155

155156
// Find the highest pended priority
156-
let (pri, num) = if let Some(&x) = sched_state.pended_lines.iter().next() {
157-
x
158-
} else {
157+
let Some(&(pri, num)) = sched_state.pended_lines.iter().next()
158+
else {
159159
// No interrupt is pended
160160
break;
161161
};

src/r3_port_std/tests/kernel_tests/external_interrupt.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,8 @@ impl<Traits: SupportedSystemTraits> App<System<Traits>> {
5858
}
5959

6060
fn task_body1<Traits: SupportedSystemTraits, D: Driver<App<System<Traits>>>>() {
61-
let int = if let Some(int) = D::app().int {
62-
int
63-
} else {
61+
let Some(int) = D::app().int
62+
else {
6463
log::warn!("No interrupt lines defined, skipping the test");
6564
D::success();
6665
return;

src/r3_support_rp2040/src/stdout.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,22 @@ impl WrapSerialWrite {
4242

4343
block!(interrupt::free(|cs| -> nb::Result<(), core::fmt::Error> {
4444
let mut stdout = STDOUT.borrow(cs).borrow_mut();
45-
if let Some(stdout) = &mut *stdout {
46-
loop {
47-
match s {
48-
[] => {
49-
break Ok(());
50-
}
51-
[head, tail @ ..] => {
52-
// Output the first byte. If this gets stuck,
53-
// break out of `interrupt::free`.
54-
stdout
55-
.write(*head)
56-
.map_err(|e| e.map(|_| core::fmt::Error))?;
57-
s = tail;
58-
}
45+
let Some(stdout) = &mut *stdout else { return Ok(()) };
46+
47+
loop {
48+
match s {
49+
[] => {
50+
break Ok(());
51+
}
52+
[head, tail @ ..] => {
53+
// Output the first byte. If this gets stuck,
54+
// break out of `interrupt::free`.
55+
stdout
56+
.write(*head)
57+
.map_err(|e| e.map(|_| core::fmt::Error))?;
58+
s = tail;
5959
}
6060
}
61-
} else {
62-
Ok(())
6361
}
6462
}))?;
6563
}

src/r3_test_runner/src/subprocess.rs

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -259,41 +259,39 @@ impl fmt::Display for ShellEscape<'_> {
259259
// These characters need to be quoted or escaped in double-quotes
260260
let special_chars_in_dq = b"*?[#~=%";
261261

262-
if let Some(utf8) = self.0.to_str() {
263-
// All bytes are printable. We might need quoting or escaping some
264-
// bytes.
265-
let bytes = utf8.as_bytes();
266-
if bytes.contains(&b'\'') {
267-
// Enclose in double quotes
268-
write!(f, "\"")?;
269-
let mut utf8 = utf8;
270-
while !utf8.is_empty() {
271-
let i = utf8
272-
.as_bytes()
273-
.iter()
274-
.position(|b| special_chars_in_dq.contains(b));
275-
276-
if let Some(i) = i {
277-
write!(f, "{}", &utf8[..i])?;
278-
279-
// Escape the byte at `i`
280-
write!(f, "\\{}", utf8.as_bytes()[i] as char)?;
281-
282-
utf8 = &utf8[i + 1..];
283-
} else {
284-
break;
285-
}
286-
}
287-
write!(f, "{utf8}\"")
288-
} else if bytes.iter().any(|b| special_chars.contains(b)) {
289-
// Enclose in single quotes
290-
write!(f, "'{utf8}'")
291-
} else {
292-
write!(f, "{utf8}")
262+
let Some(utf8) = self.0.to_str()
263+
else {
264+
// Some bytes are unprintable.
265+
return write!(f, "<unprintable: {:?}>", self.0);
266+
};
267+
268+
// All bytes are printable. We might need quoting or escaping some
269+
// bytes.
270+
let bytes = utf8.as_bytes();
271+
if bytes.contains(&b'\'') {
272+
// Enclose in double quotes
273+
write!(f, "\"")?;
274+
let mut utf8 = utf8;
275+
while !utf8.is_empty() {
276+
let Some(i) = utf8
277+
.as_bytes()
278+
.iter()
279+
.position(|b| special_chars_in_dq.contains(b))
280+
else { break };
281+
282+
write!(f, "{}", &utf8[..i])?;
283+
284+
// Escape the byte at `i`
285+
write!(f, "\\{}", utf8.as_bytes()[i] as char)?;
286+
287+
utf8 = &utf8[i + 1..];
293288
}
289+
write!(f, "{utf8}\"")
290+
} else if bytes.iter().any(|b| special_chars.contains(b)) {
291+
// Enclose in single quotes
292+
write!(f, "'{utf8}'")
294293
} else {
295-
// Some bytes are unprintable.
296-
write!(f, "<unprintable: {:?}>", self.0)
294+
write!(f, "{utf8}")
297295
}
298296
}
299297
}

0 commit comments

Comments
 (0)