| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 9acc7f3 commit 2b77327
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -541,8 +541,15 @@ Environment::scheduled_immediate_count() { | |||
| 541 | 541 | return scheduled_immediate_count_; | |
| 542 | 542 | } | |
| 543 | 543 | ||
| 544 | - void Environment::SetImmediate(native_immediate_callback cb, void* data) { | ||
| 545 | - native_immediate_callbacks_.push_back({ cb, data }); | ||
| 544 | + void Environment::SetImmediate(native_immediate_callback cb, | ||
| 545 | + void* data, | ||
| 546 | + v8::Local<v8::Object> obj) { | ||
| 547 | + native_immediate_callbacks_.push_back({ | ||
| 548 | + cb, | ||
| 549 | + data, | ||
| 550 | + std::unique_ptr<v8::Persistent<v8::Object>>( | ||
| 551 | + obj.IsEmpty() ? nullptr : new v8::Persistent<v8::Object>(isolate_, obj)) | ||
| 552 | + }); | ||
| 546 | 553 | if (scheduled_immediate_count_[0] == 0) | |
| 547 | 554 | ActivateImmediateCheck(); | |
| 548 | 555 | scheduled_immediate_count_[0] = scheduled_immediate_count_[0] + 1; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -224,6 +224,8 @@ void Environment::RunAndClearNativeImmediates() { | |||
| 224 | 224 | native_immediate_callbacks_.swap(list); | |
| 225 | 225 | for (const auto& cb : list) { | |
| 226 | 226 | cb.cb_(this, cb.data_); | |
| 227 | + if (cb.keep_alive_) | ||
| 228 | + cb.keep_alive_->Reset(); | ||
| 227 | 229 | } | |
| 228 | 230 | ||
| 229 | 231 | #ifdef DEBUG | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -688,7 +688,11 @@ class Environment { | |||
| 688 | 688 | bool EmitNapiWarning(); | |
| 689 | 689 | ||
| 690 | 690 | typedef void (*native_immediate_callback)(Environment* env, void* data); | |
| 691 | - inline void SetImmediate(native_immediate_callback cb, void* data); | ||
| 691 | + // cb will be called as cb(env, data) on the next event loop iteration. | ||
| 692 | + // obj will be kept alive between now and after the callback has run. | ||
| 693 | + inline void SetImmediate(native_immediate_callback cb, | ||
| 694 | + void* data, | ||
| 695 | + v8::Local<v8::Object> obj = v8::Local<v8::Object>()); | ||
| 692 | 696 | // This needs to be available for the JS-land setImmediate(). | |
| 693 | 697 | void ActivateImmediateCheck(); | |
| 694 | 698 | ||
@@ -756,6 +760,7 @@ class Environment { | |||
| 756 | 760 | struct NativeImmediateCallback { | |
| 757 | 761 | native_immediate_callback cb_; | |
| 758 | 762 | void* data_; | |
| 763 | + std::unique_ptr<v8::Persistent<v8::Object>> keep_alive_; | ||
| 759 | 764 | }; | |
| 760 | 765 | std::vector<NativeImmediateCallback> native_immediate_callbacks_; | |
| 761 | 766 | void RunAndClearNativeImmediates(); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments