@@ -743,33 +743,66 @@ inline void IsolateData::set_options(
743743 options_ = std::move (options);
744744}
745745
746- void Environment::CreateImmediate (native_immediate_callback cb,
747- void * data ,
748- v8::Local<v8::Object> obj ,
746+ template < typename Fn>
747+ void Environment::CreateImmediate (Fn&& cb ,
748+ v8::Local<v8::Object> keep_alive ,
749749 bool ref) {
750- native_immediate_callbacks_.push_back ({
751- cb,
752- data,
753- v8::Global<v8::Object>(isolate_, obj),
754- ref
755- });
750+ auto callback = std::make_unique<NativeImmediateCallbackImpl<Fn>>(
751+ std::move (cb),
752+ v8::Global<v8::Object>(isolate (), keep_alive),
753+ ref);
754+ NativeImmediateCallback* prev_tail = native_immediate_callbacks_tail_;
755+
756+ native_immediate_callbacks_tail_ = callback.get ();
757+ if (prev_tail != nullptr )
758+ prev_tail->set_next (std::move (callback));
759+ else
760+ native_immediate_callbacks_head_ = std::move (callback);
761+
756762 immediate_info ()->count_inc (1 );
757763}
758764
759- void Environment::SetImmediate (native_immediate_callback cb,
760- void * data,
761- v8::Local<v8::Object> obj) {
762- CreateImmediate (cb, data, obj, true );
765+ template <typename Fn>
766+ void Environment::SetImmediate (Fn&& cb, v8::Local<v8::Object> keep_alive) {
767+ CreateImmediate (std::move (cb), keep_alive, true );
763768
764769 if (immediate_info ()->ref_count () == 0 )
765770 ToggleImmediateRef (true );
766771 immediate_info ()->ref_count_inc (1 );
767772}
768773
769- void Environment::SetUnrefImmediate (native_immediate_callback cb,
770- void * data,
771- v8::Local<v8::Object> obj) {
772- CreateImmediate (cb, data, obj, false );
774+ template <typename Fn>
775+ void Environment::SetUnrefImmediate (Fn&& cb, v8::Local<v8::Object> keep_alive) {
776+ CreateImmediate (std::move (cb), keep_alive, false );
777+ }
778+
779+ Environment::NativeImmediateCallback::NativeImmediateCallback (bool refed)
780+ : refed_(refed) {}
781+
782+ bool Environment::NativeImmediateCallback::is_refed () const {
783+ return refed_;
784+ }
785+
786+ std::unique_ptr<Environment::NativeImmediateCallback>
787+ Environment::NativeImmediateCallback::get_next () {
788+ return std::move (next_);
789+ }
790+
791+ void Environment::NativeImmediateCallback::set_next (
792+ std::unique_ptr<NativeImmediateCallback> next) {
793+ next_ = std::move (next);
794+ }
795+
796+ template <typename Fn>
797+ Environment::NativeImmediateCallbackImpl<Fn>::NativeImmediateCallbackImpl(
798+ Fn&& callback, v8::Global<v8::Object>&& keep_alive, bool refed)
799+ : NativeImmediateCallback(refed),
800+ callback_(std::move(callback)),
801+ keep_alive_(std::move(keep_alive)) {}
802+
803+ template <typename Fn>
804+ void Environment::NativeImmediateCallbackImpl<Fn>::Call(Environment* env) {
805+ callback_ (env);
773806}
774807
775808inline bool Environment::can_call_into_js () const {
0 commit comments