@@ -84,7 +84,7 @@ using v8::Value;
84
84
85
85
namespace {
86
86
87
- class CallbackInfo {
87
+ class CallbackInfo : public Cleanable {
88
88
public:
89
89
static inline Local<ArrayBuffer> CreateTrackedArrayBuffer (
90
90
Environment* env,
@@ -95,9 +95,9 @@ class CallbackInfo {
95
95
96
96
CallbackInfo (const CallbackInfo&) = delete ;
97
97
CallbackInfo& operator =(const CallbackInfo&) = delete ;
98
+ void Clean ();
98
99
99
100
private:
100
- static void CleanupHook (void * data);
101
101
inline void OnBackingStoreFree ();
102
102
inline void CallAndResetCallback ();
103
103
inline CallbackInfo (Environment* env,
@@ -112,7 +112,6 @@ class CallbackInfo {
112
112
Environment* const env_;
113
113
};
114
114
115
-
116
115
Local<ArrayBuffer> CallbackInfo::CreateTrackedArrayBuffer (
117
116
Environment* env,
118
117
char * data,
@@ -152,25 +151,23 @@ CallbackInfo::CallbackInfo(Environment* env,
152
151
data_ (data),
153
152
hint_(hint),
154
153
env_(env) {
155
- env->AddCleanupHook (CleanupHook, this );
154
+ env->cleanable_queue ()-> PushFront ( this );
156
155
env->isolate ()->AdjustAmountOfExternalAllocatedMemory (sizeof (*this ));
157
156
}
158
157
159
- void CallbackInfo::CleanupHook (void * data) {
160
- CallbackInfo* self = static_cast <CallbackInfo*>(data);
161
-
158
+ void CallbackInfo::Clean () {
162
159
{
163
- HandleScope handle_scope (self-> env_ ->isolate ());
164
- Local<ArrayBuffer> ab = self-> persistent_ .Get (self-> env_ ->isolate ());
160
+ HandleScope handle_scope (env_->isolate ());
161
+ Local<ArrayBuffer> ab = persistent_.Get (env_->isolate ());
165
162
if (!ab.IsEmpty () && ab->IsDetachable ()) {
166
163
ab->Detach (Local<Value>()).Check ();
167
- self-> persistent_ .Reset ();
164
+ persistent_.Reset ();
168
165
}
169
166
}
170
167
171
168
// Call the callback in this case, but don't delete `this` yet because the
172
169
// BackingStore deleter callback will do so later.
173
- self-> CallAndResetCallback ();
170
+ CallAndResetCallback ();
174
171
}
175
172
176
173
void CallbackInfo::CallAndResetCallback () {
@@ -182,7 +179,7 @@ void CallbackInfo::CallAndResetCallback() {
182
179
}
183
180
if (callback != nullptr ) {
184
181
// Clean up all Environment-related state and run the callback.
185
- env_-> RemoveCleanupHook (CleanupHook, this );
182
+ cleanable_queue_. Remove ( );
186
183
int64_t change_in_bytes = -static_cast <int64_t >(sizeof (*this ));
187
184
env_->isolate ()->AdjustAmountOfExternalAllocatedMemory (change_in_bytes);
188
185
0 commit comments