#[repr(C)]pub struct BaoTimeoutObject {
pub event_loop_timer: EventLoopTimer,
pub epoch: u32,
pub callback_key: Option<String>,
pub args: Vec<Value>,
pub interval: Option<Duration>,
pub timer_id: u32,
}Fields§
§event_loop_timer: EventLoopTimerMUST be at offset 0 — dispatch::__bun_fire_timer/__bun_js_timer_epoch
recover *mut BaoTimeoutObject from this field’s address via
from_timer_ptr (container_of via offset_of!).
epoch: u32Monotonic epoch for stable heap ordering of equal-deadline JS timers.
Mirrors Bun’s TimerObjectInternals.flags.epoch (u25 in Zig).
callback_key: Option<String>GC-safe: GcStore key for the JS callback. None = virgin state.
The actual *mut JSObject is stored as a property on the JS global
via gc_store_insert_ns(cx, "timer", &key, ..); this field only
holds the string key. Retrieval via
gc_store_get_ns(cx, "timer", key) is GC-safe (the property is
rooted on the global object, managed by SpiderMonkey’s GC).
(Doc-link residue of the BUG-ENG-360 migration: these lines still
named the un-namespaced pre-migration accessors.)
args: Vec<Value>Marshalled JS arguments preserved across the schedule→fire window.
interval: Option<Duration>P1-A.3c: re-arm interval for setInterval. None = one-shot setTimeout.
Set when scheduled via setInterval; consumed by drain logic which
re-inserts the timer after firing. Mirrors Bun’s
TimerObjectInternals.flags.repeat (Duration in ms).
timer_id: u32P1-A.3c: unique timer id used for clearTimeout/clearInterval lookups.
The JS-visible id (setTimeout return value) — same value as id in
the legacy TimerEntry. Stored on the object so cancel_raw can
identify the right BaoTimeoutObject when clearing.
Implementations§
Source§impl BaoTimeoutObject
impl BaoTimeoutObject
Sourcepub fn new_paused() -> BaoTimeoutObject
pub fn new_paused() -> BaoTimeoutObject
Construct a paused (PENDING state) timeout with epoch 0, no callback.
Sourcepub unsafe fn from_timer_ptr(t: *mut EventLoopTimer) -> *mut BaoTimeoutObject
pub unsafe fn from_timer_ptr(t: *mut EventLoopTimer) -> *mut BaoTimeoutObject
Container-of: recover the parent BaoTimeoutObject from a pointer to
its event_loop_timer field. This is the inverse of
&obj.event_loop_timer as *mut _.
§Safety
t must be a non-null pointer to the event_loop_timer field of a
live BaoTimeoutObject. Caller must not hold a &mut to the parent
across this call (re-entrant JS callbacks can re-derive aliasing
&mut, same as Bun’s TimeoutObject::fire pattern).
Sourcepub fn fire(&mut self, _now: &Timespec)
pub fn fire(&mut self, _now: &Timespec)
Mark this timer as fired and bump epoch for stable re-queue ordering.
Pure state transition — does NOT dispatch the JS callback.
Callers that need JS dispatch must use fire_js after retrieving the
current JSContext*.
Sourcepub unsafe fn fire_js(&mut self, raw_cx: *mut JSContext, now: &Timespec)
pub unsafe fn fire_js(&mut self, raw_cx: *mut JSContext, now: &Timespec)
Mark fired AND dispatch the JS callback via fire_js_callback_raw.
This is the SpiderMonkey equivalent of Bun’s TimeoutObject::fire.
No-op if no callback key is attached (defensive — schedule path always
sets one). Callback throws route through the uncaught-exception
router (handler dispatch or stderr + exit 1) — never silently
swallowed.
§Safety
raw_cxmust be a liveJSContext*on the current thread.- The callback retrieved from GcStore (if Some) must be a live function object rooted on the JS global for the duration of this call.
self.argsslice must point toJSVals rooted by the caller.
Auto Trait Implementations§
impl !Send for BaoTimeoutObject
impl !Sync for BaoTimeoutObject
impl Freeze for BaoTimeoutObject
impl RefUnwindSafe for BaoTimeoutObject
impl Unpin for BaoTimeoutObject
impl UnsafeUnpin for BaoTimeoutObject
impl UnwindSafe for BaoTimeoutObject
Blanket Implementations§
Source§impl<T> AsCtxPtr for Twhere
T: ?Sized,
impl<T> AsCtxPtr for Twhere
T: ?Sized,
Source§fn as_ctx_ptr(&self) -> *mut Selfwhere
Self: Sized,
fn as_ctx_ptr(&self) -> *mut Selfwhere
Self: Sized,
self’s address as *mut Self for deferred-task / scopeguard /
ref_guard ctx slots. The closures/trampolines deref it as shared
(&*p) — every method they reach is &self post-R-2, so no write
provenance is required; the *mut spelling is purely to match the
existing DerefOnDrop / HasAutoFlush / RefCount ABI.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more