summaryrefslogtreecommitdiff
path: root/src/env-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/env-inl.h')
-rw-r--r--src/env-inl.h67
1 files changed, 50 insertions, 17 deletions
diff --git a/src/env-inl.h b/src/env-inl.h
index f970e414f1..3d1aca994f 100644
--- a/src/env-inl.h
+++ b/src/env-inl.h
@@ -753,33 +753,66 @@ inline void IsolateData::set_options(
options_ = std::move(options);
}
-void Environment::CreateImmediate(native_immediate_callback cb,
- void* data,
- v8::Local<v8::Object> obj,
+template <typename Fn>
+void Environment::CreateImmediate(Fn&& cb,
+ v8::Local<v8::Object> keep_alive,
bool ref) {
- native_immediate_callbacks_.push_back({
- cb,
- data,
- v8::Global<v8::Object>(isolate_, obj),
- ref
- });
+ auto callback = std::make_unique<NativeImmediateCallbackImpl<Fn>>(
+ std::move(cb),
+ v8::Global<v8::Object>(isolate(), keep_alive),
+ ref);
+ NativeImmediateCallback* prev_tail = native_immediate_callbacks_tail_;
+
+ native_immediate_callbacks_tail_ = callback.get();
+ if (prev_tail != nullptr)
+ prev_tail->set_next(std::move(callback));
+ else
+ native_immediate_callbacks_head_ = std::move(callback);
+
immediate_info()->count_inc(1);
}
-void Environment::SetImmediate(native_immediate_callback cb,
- void* data,
- v8::Local<v8::Object> obj) {
- CreateImmediate(cb, data, obj, true);
+template <typename Fn>
+void Environment::SetImmediate(Fn&& cb, v8::Local<v8::Object> keep_alive) {
+ CreateImmediate(std::move(cb), keep_alive, true);
if (immediate_info()->ref_count() == 0)
ToggleImmediateRef(true);
immediate_info()->ref_count_inc(1);
}
-void Environment::SetUnrefImmediate(native_immediate_callback cb,
- void* data,
- v8::Local<v8::Object> obj) {
- CreateImmediate(cb, data, obj, false);
+template <typename Fn>
+void Environment::SetUnrefImmediate(Fn&& cb, v8::Local<v8::Object> keep_alive) {
+ CreateImmediate(std::move(cb), keep_alive, false);
+}
+
+Environment::NativeImmediateCallback::NativeImmediateCallback(bool refed)
+ : refed_(refed) {}
+
+bool Environment::NativeImmediateCallback::is_refed() const {
+ return refed_;
+}
+
+std::unique_ptr<Environment::NativeImmediateCallback>
+Environment::NativeImmediateCallback::get_next() {
+ return std::move(next_);
+}
+
+void Environment::NativeImmediateCallback::set_next(
+ std::unique_ptr<NativeImmediateCallback> next) {
+ next_ = std::move(next);
+}
+
+template <typename Fn>
+Environment::NativeImmediateCallbackImpl<Fn>::NativeImmediateCallbackImpl(
+ Fn&& callback, v8::Global<v8::Object>&& keep_alive, bool refed)
+ : NativeImmediateCallback(refed),
+ callback_(std::move(callback)),
+ keep_alive_(std::move(keep_alive)) {}
+
+template <typename Fn>
+void Environment::NativeImmediateCallbackImpl<Fn>::Call(Environment* env) {
+ callback_(env);
}
inline bool Environment::can_call_into_js() const {