1use crate::Function;
4use crate::Isolate;
5use crate::Local;
6use crate::MicrotasksPolicy;
7use crate::UniqueRef;
8use crate::isolate::RealIsolate;
9use crate::support::Opaque;
10use crate::support::int;
11
12unsafe extern "C" {
13 fn v8__MicrotaskQueue__New(
14 isolate: *mut RealIsolate,
15 policy: MicrotasksPolicy,
16 ) -> *mut MicrotaskQueue;
17 fn v8__MicrotaskQueue__DESTRUCT(queue: *mut MicrotaskQueue);
18 fn v8__MicrotaskQueue__PerformCheckpoint(
19 isolate: *mut RealIsolate,
20 queue: *const MicrotaskQueue,
21 );
22 fn v8__MicrotaskQueue__IsRunningMicrotasks(
23 queue: *const MicrotaskQueue,
24 ) -> bool;
25 fn v8__MicrotaskQueue__GetMicrotasksScopeDepth(
26 queue: *const MicrotaskQueue,
27 ) -> int;
28 fn v8__MicrotaskQueue__EnqueueMicrotask(
29 isolate: *mut RealIsolate,
30 queue: *const MicrotaskQueue,
31 microtask: *const Function,
32 );
33}
34
35#[repr(C)]
49#[derive(Debug)]
50pub struct MicrotaskQueue(Opaque);
51
52impl MicrotaskQueue {
53 pub fn new(
54 isolate: &mut Isolate,
55 policy: MicrotasksPolicy,
56 ) -> UniqueRef<Self> {
57 unsafe {
58 UniqueRef::from_raw(v8__MicrotaskQueue__New(
59 isolate.as_real_ptr(),
60 policy,
61 ))
62 }
63 }
64
65 pub fn enqueue_microtask(
66 &self,
67 isolate: &mut Isolate,
68 microtask: Local<Function>,
69 ) {
70 unsafe {
71 v8__MicrotaskQueue__EnqueueMicrotask(
72 isolate.as_real_ptr(),
73 self,
74 &*microtask,
75 )
76 }
77 }
78
79 pub fn perform_checkpoint(&self, isolate: &mut Isolate) {
90 unsafe {
91 v8__MicrotaskQueue__PerformCheckpoint(isolate.as_real_ptr(), self);
92 }
93 }
94
95 pub fn is_running_microtasks(&self) -> bool {
97 unsafe { v8__MicrotaskQueue__IsRunningMicrotasks(self) }
98 }
99
100 pub fn get_microtasks_scope_depth(&self) -> i32 {
102 unsafe { v8__MicrotaskQueue__GetMicrotasksScopeDepth(self) }
103 }
104}
105
106impl Drop for MicrotaskQueue {
107 fn drop(&mut self) {
108 unsafe { v8__MicrotaskQueue__DESTRUCT(self) }
109 }
110}