@@ -21,28 +21,25 @@ using v8::Value;
2121void HandleWrap::Ref (const FunctionCallbackInfo<Value>& args) {
2222 HandleWrap* wrap = Unwrap<HandleWrap>(args.Holder ());
2323
24- if (IsAlive (wrap)) {
25- uv_ref (wrap->handle__ );
26- wrap->flags_ &= ~kUnref ;
27- }
24+ if (IsAlive (wrap))
25+ uv_ref (wrap->GetHandle ());
2826}
2927
3028
3129void HandleWrap::Unref (const FunctionCallbackInfo<Value>& args) {
3230 HandleWrap* wrap = Unwrap<HandleWrap>(args.Holder ());
3331
34- if (IsAlive (wrap)) {
35- uv_unref (wrap->handle__ );
36- wrap->flags_ |= kUnref ;
37- }
32+ if (IsAlive (wrap))
33+ uv_unref (wrap->GetHandle ());
3834}
3935
4036
4137void HandleWrap::Unrefed (const FunctionCallbackInfo<Value>& args) {
4238 HandleWrap* wrap = Unwrap<HandleWrap>(args.Holder ());
43-
44- bool unrefed = wrap->flags_ & kUnref == 1 ;
45- args.GetReturnValue ().Set (unrefed);
39+ // XXX(bnoordhuis) It's debatable whether a nullptr wrap should count
40+ // as having a reference count but it's compatible with the logic that
41+ // it replaces.
42+ args.GetReturnValue ().Set (wrap == nullptr || !HasRef (wrap));
4643}
4744
4845
@@ -51,17 +48,17 @@ void HandleWrap::Close(const FunctionCallbackInfo<Value>& args) {
5148
5249 HandleWrap* wrap = Unwrap<HandleWrap>(args.Holder ());
5350
54- // guard against uninitialized handle or double close
51+ // Guard against uninitialized handle or double close.
5552 if (!IsAlive (wrap))
5653 return ;
5754
5855 CHECK_EQ (false , wrap->persistent ().IsEmpty ());
5956 uv_close (wrap->handle__ , OnClose);
60- wrap->handle__ = nullptr ;
57+ wrap->state_ = kClosing ;
6158
6259 if (args[0 ]->IsFunction ()) {
6360 wrap->object ()->Set (env->onclose_string (), args[0 ]);
64- wrap->flags_ |= kCloseCallback ;
61+ wrap->state_ = kClosingWithCallback ;
6562 }
6663}
6764
@@ -72,7 +69,7 @@ HandleWrap::HandleWrap(Environment* env,
7269 AsyncWrap::ProviderType provider,
7370 AsyncWrap* parent)
7471 : AsyncWrap(env, object, provider, parent),
75- flags_ ( 0 ),
72+ state_ ( kInitialized ),
7673 handle__(handle) {
7774 handle__->data = this ;
7875 HandleScope scope (env->isolate ());
@@ -90,22 +87,19 @@ void HandleWrap::OnClose(uv_handle_t* handle) {
9087 HandleWrap* wrap = static_cast <HandleWrap*>(handle->data );
9188 Environment* env = wrap->env ();
9289 HandleScope scope (env->isolate ());
90+ Context::Scope context_scope (env->context ());
9391
9492 // The wrap object should still be there.
9593 CHECK_EQ (wrap->persistent ().IsEmpty (), false );
94+ CHECK (wrap->state_ >= kClosing && wrap->state_ <= kClosingWithCallback );
9695
97- // But the handle pointer should be gone.
98- CHECK_EQ ( wrap->handle__ , nullptr ) ;
96+ const bool have_close_callback = (wrap-> state_ == kClosingWithCallback );
97+ wrap->state_ = kClosed ;
9998
100- HandleScope handle_scope (env->isolate ());
101- Context::Scope context_scope (env->context ());
102- Local<Object> object = wrap->object ();
103-
104- if (wrap->flags_ & kCloseCallback ) {
99+ if (have_close_callback)
105100 wrap->MakeCallback (env->onclose_string (), 0 , nullptr );
106- }
107101
108- object->SetAlignedPointerInInternalField (0 , nullptr );
102+ wrap-> object () ->SetAlignedPointerInInternalField (0 , nullptr );
109103 wrap->persistent ().Reset ();
110104 delete wrap;
111105}
0 commit comments