@@ -53,6 +53,7 @@ using v8::Context;
53
53
using v8::EscapableHandleScope;
54
54
using v8::FunctionCallbackInfo;
55
55
using v8::Global;
56
+ using v8::HandleScope;
56
57
using v8::Int32;
57
58
using v8::Integer;
58
59
using v8::Isolate;
@@ -73,8 +74,10 @@ namespace {
73
74
74
75
class CallbackInfo {
75
76
public:
77
+ ~CallbackInfo ();
78
+
76
79
static inline void Free (char * data, void * hint);
77
- static inline CallbackInfo* New (Isolate* isolate ,
80
+ static inline CallbackInfo* New (Environment* env ,
78
81
Local<ArrayBuffer> object,
79
82
FreeCallback callback,
80
83
char * data,
@@ -84,9 +87,10 @@ class CallbackInfo {
84
87
CallbackInfo& operator =(const CallbackInfo&) = delete ;
85
88
86
89
private:
90
+ static void CleanupHook (void * data);
87
91
static void WeakCallback (const WeakCallbackInfo<CallbackInfo>&);
88
92
inline void WeakCallback (Isolate* isolate);
89
- inline CallbackInfo (Isolate* isolate ,
93
+ inline CallbackInfo (Environment* env ,
90
94
Local<ArrayBuffer> object,
91
95
FreeCallback callback,
92
96
char * data,
@@ -95,6 +99,7 @@ class CallbackInfo {
95
99
FreeCallback const callback_;
96
100
char * const data_;
97
101
void * const hint_;
102
+ Environment* const env_;
98
103
};
99
104
100
105
@@ -103,31 +108,53 @@ void CallbackInfo::Free(char* data, void*) {
103
108
}
104
109
105
110
106
- CallbackInfo* CallbackInfo::New (Isolate* isolate ,
111
+ CallbackInfo* CallbackInfo::New (Environment* env ,
107
112
Local<ArrayBuffer> object,
108
113
FreeCallback callback,
109
114
char * data,
110
115
void * hint) {
111
- return new CallbackInfo (isolate , object, callback, data, hint);
116
+ return new CallbackInfo (env , object, callback, data, hint);
112
117
}
113
118
114
119
115
- CallbackInfo::CallbackInfo (Isolate* isolate ,
120
+ CallbackInfo::CallbackInfo (Environment* env ,
116
121
Local<ArrayBuffer> object,
117
122
FreeCallback callback,
118
123
char * data,
119
124
void * hint)
120
- : persistent_(isolate, object),
125
+ : persistent_(env-> isolate () , object),
121
126
callback_(callback),
122
127
data_(data),
123
- hint_(hint) {
128
+ hint_(hint),
129
+ env_(env) {
124
130
ArrayBuffer::Contents obj_c = object->GetContents ();
125
131
CHECK_EQ (data_, static_cast <char *>(obj_c.Data ()));
126
132
if (object->ByteLength () != 0 )
127
133
CHECK_NOT_NULL (data_);
128
134
129
135
persistent_.SetWeak (this , WeakCallback, v8::WeakCallbackType::kParameter );
130
- isolate->AdjustAmountOfExternalAllocatedMemory (sizeof (*this ));
136
+ env->AddCleanupHook (CleanupHook, this );
137
+ env->isolate ()->AdjustAmountOfExternalAllocatedMemory (sizeof (*this ));
138
+ }
139
+
140
+
141
+ CallbackInfo::~CallbackInfo () {
142
+ persistent_.Reset ();
143
+ env_->RemoveCleanupHook (CleanupHook, this );
144
+ }
145
+
146
+
147
+ void CallbackInfo::CleanupHook (void * data) {
148
+ CallbackInfo* self = static_cast <CallbackInfo*>(data);
149
+
150
+ {
151
+ HandleScope handle_scope (self->env_ ->isolate ());
152
+ Local<ArrayBuffer> ab = self->persistent_ .Get (self->env_ ->isolate ());
153
+ CHECK (!ab.IsEmpty ());
154
+ ab->Detach ();
155
+ }
156
+
157
+ self->WeakCallback (self->env_ ->isolate ());
131
158
}
132
159
133
160
@@ -391,7 +418,7 @@ MaybeLocal<Object> New(Environment* env,
391
418
}
392
419
MaybeLocal<Uint8Array> ui = Buffer::New (env, ab, 0 , length);
393
420
394
- CallbackInfo::New (env-> isolate () , ab, callback, data, hint);
421
+ CallbackInfo::New (env, ab, callback, data, hint);
395
422
396
423
if (ui.IsEmpty ())
397
424
return MaybeLocal<Object>();
0 commit comments