From b780df5f76adaf68d041d13820c455d4bf7eed96 Mon Sep 17 00:00:00 2001
From: zjp <jiping_zhou@foxmail.com>
Date: Thu, 13 Jun 2024 07:33:40 +0800
Subject: [PATCH] put cfg code inside task_from_waker function

---
 embassy-executor/src/raw/waker.rs | 62 +++++++++++++------------------
 1 file changed, 26 insertions(+), 36 deletions(-)

diff --git a/embassy-executor/src/raw/waker.rs b/embassy-executor/src/raw/waker.rs
index 421ec301e..75641c257 100644
--- a/embassy-executor/src/raw/waker.rs
+++ b/embassy-executor/src/raw/waker.rs
@@ -31,46 +31,36 @@ pub(crate) unsafe fn from_task(p: TaskRef) -> Waker {
 /// # Panics
 ///
 /// Panics if the waker is not created by the Embassy executor.
-#[cfg(not(feature = "nightly"))]
 pub fn task_from_waker(waker: &Waker) -> TaskRef {
-    // safety: OK because WakerHack has the same layout as Waker.
-    // This is not really guaranteed because the structs are `repr(Rust)`, it is
-    // indeed the case in the current implementation.
-    // TODO use waker_getters when stable. https://github.com/rust-lang/rust/issues/96992
-    let hack: &WakerHack = unsafe { core::mem::transmute(waker) };
-    if hack.vtable != &VTABLE {
-        panic!("Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor.")
+    #[cfg(not(feature = "nightly"))]
+    {
+        struct WakerHack {
+            data: *const (),
+            vtable: &'static RawWakerVTable,
+        }
+
+        // safety: OK because WakerHack has the same layout as Waker.
+        // This is not really guaranteed because the structs are `repr(Rust)`, it is
+        // indeed the case in the current implementation.
+        // TODO use waker_getters when stable. https://github.com/rust-lang/rust/issues/96992
+        let hack: &WakerHack = unsafe { core::mem::transmute(waker) };
+        if hack.vtable != &VTABLE {
+            panic!("Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor.")
+        }
+
+        // safety: our wakers are always created with `TaskRef::as_ptr`
+        unsafe { TaskRef::from_ptr(hack.data as *const TaskHeader) }
     }
 
-    // safety: our wakers are always created with `TaskRef::as_ptr`
-    unsafe { TaskRef::from_ptr(hack.data as *const TaskHeader) }
-}
+    #[cfg(feature = "nightly")]
+    {
+        let raw_waker = waker.as_raw();
 
-#[cfg(not(feature = "nightly"))]
-struct WakerHack {
-    data: *const (),
-    vtable: &'static RawWakerVTable,
-}
+        if raw_waker.vtable() != &VTABLE {
+            panic!("Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor.")
+        }
 
-/// Get a task pointer from a waker.
-///
-/// This can be used as an optimization in wait queues to store task pointers
-/// (1 word) instead of full Wakers (2 words). This saves a bit of RAM and helps
-/// avoid dynamic dispatch.
-///
-/// You can use the returned task pointer to wake the task with [`wake_task`](super::wake_task).
-///
-/// # Panics
-///
-/// Panics if the waker is not created by the Embassy executor.
-#[cfg(feature = "nightly")]
-pub fn task_from_waker(waker: &Waker) -> TaskRef {
-    let raw_waker = waker.as_raw();
-
-    if raw_waker.vtable() != &VTABLE {
-        panic!("Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor.")
+        // safety: our wakers are always created with `TaskRef::as_ptr`
+        unsafe { TaskRef::from_ptr(raw_waker.data() as *const TaskHeader) }
     }
-
-    // safety: our wakers are always created with `TaskRef::as_ptr`
-    unsafe { TaskRef::from_ptr(raw_waker.data() as *const TaskHeader) }
 }