44
55#include < assert.h>
66#include < vector>
7+ #include < memory>
78
89namespace {
910
@@ -31,16 +32,14 @@ void RunInCallbackScope(const v8::FunctionCallbackInfo<v8::Value>& args) {
3132 args.GetReturnValue ().Set (ret.ToLocalChecked ());
3233}
3334
34- static v8::Persistent<v8::Promise::Resolver> persistent;
35-
3635static void Callback (uv_work_t * req, int ignored) {
3736 v8::Isolate* isolate = v8::Isolate::GetCurrent ();
3837 v8::HandleScope scope (isolate);
3938 node::CallbackScope callback_scope (isolate, v8::Object::New (isolate),
4039 node::async_context{0 , 0 });
41-
42- v8::Local <v8::Promise::Resolver> local =
43- v8::Local<v8::Promise::Resolver>:: New (isolate, persistent);
40+ std::unique_ptr<v8::Global<v8::Promise::Resolver>> persistent {
41+ static_cast < v8::Global <v8::Promise::Resolver>*>(req-> data ) };
42+ v8::Local<v8::Promise::Resolver> local = persistent-> Get (isolate );
4443 local->Resolve (isolate->GetCurrentContext (),
4544 v8::Undefined (isolate)).ToChecked ();
4645 delete req;
@@ -49,20 +48,21 @@ static void Callback(uv_work_t* req, int ignored) {
4948static void TestResolveAsync (const v8::FunctionCallbackInfo<v8::Value>& args) {
5049 v8::Isolate* isolate = args.GetIsolate ();
5150
52- if (persistent.IsEmpty ()) {
53- persistent.Reset (isolate, v8::Promise::Resolver::New (
54- isolate->GetCurrentContext ()).ToLocalChecked ());
51+ v8::Global<v8::Promise::Resolver>* persistent =
52+ new v8::Global<v8::Promise::Resolver>(
53+ isolate,
54+ v8::Promise::Resolver::New (
55+ isolate->GetCurrentContext ()).ToLocalChecked ());
5556
56- uv_work_t * req = new uv_work_t ;
57+ uv_work_t * req = new uv_work_t ;
58+ req->data = static_cast <void *>(persistent);
5759
58- uv_queue_work (node::GetCurrentEventLoop (isolate),
59- req,
60- [](uv_work_t *) {},
61- Callback);
62- }
60+ uv_queue_work (node::GetCurrentEventLoop (isolate),
61+ req,
62+ [](uv_work_t *) {},
63+ Callback);
6364
64- v8::Local<v8::Promise::Resolver> local =
65- v8::Local<v8::Promise::Resolver>::New (isolate, persistent);
65+ v8::Local<v8::Promise::Resolver> local = persistent->Get (isolate);
6666
6767 args.GetReturnValue ().Set (local->GetPromise ());
6868}
0 commit comments