@@ -236,26 +236,24 @@ class HeapSnapshotStream : public AsyncWrap,
236236 public:
237237 HeapSnapshotStream (
238238 Environment* env,
239- const HeapSnapshot* snapshot,
239+ HeapSnapshotPointer&& snapshot,
240240 v8::Local<v8::Object> obj) :
241241 AsyncWrap (env, obj, AsyncWrap::PROVIDER_HEAPSNAPSHOT),
242242 StreamBase (env),
243- snapshot_ (snapshot) {
243+ snapshot_ (std::move( snapshot) ) {
244244 MakeWeak ();
245245 StreamBase::AttachToObject (GetObject ());
246246 }
247247
248- ~HeapSnapshotStream () override {
249- Cleanup ();
250- }
248+ ~HeapSnapshotStream () override {}
251249
252250 int GetChunkSize () override {
253251 return 65536 ; // big chunks == faster
254252 }
255253
256254 void EndOfStream () override {
257255 EmitRead (UV_EOF);
258- Cleanup ();
256+ snapshot_. reset ();
259257 }
260258
261259 WriteResult WriteAsciiChunk (char * data, int size) override {
@@ -309,22 +307,13 @@ class HeapSnapshotStream : public AsyncWrap,
309307 SET_SELF_SIZE (HeapSnapshotStream)
310308
311309 private:
312- void Cleanup () {
313- if (snapshot_ != nullptr ) {
314- const_cast <HeapSnapshot*>(snapshot_)->Delete ();
315- snapshot_ = nullptr ;
316- }
317- }
318-
319-
320- const HeapSnapshot* snapshot_;
310+ HeapSnapshotPointer snapshot_;
321311};
322312
323313inline void TakeSnapshot (Isolate* isolate, v8::OutputStream* out) {
324- const HeapSnapshot* const snapshot =
325- isolate->GetHeapProfiler ()->TakeHeapSnapshot ();
314+ HeapSnapshotPointer snapshot {
315+ isolate->GetHeapProfiler ()->TakeHeapSnapshot () } ;
326316 snapshot->Serialize (out, HeapSnapshot::kJSON );
327- const_cast <HeapSnapshot*>(snapshot)->Delete ();
328317}
329318
330319inline bool WriteSnapshot (Isolate* isolate, const char * filename) {
@@ -339,20 +328,44 @@ inline bool WriteSnapshot(Isolate* isolate, const char* filename) {
339328
340329} // namespace
341330
342- void CreateHeapSnapshotStream (const FunctionCallbackInfo<Value>& args) {
343- Environment* env = Environment::GetCurrent (args);
331+ void DeleteHeapSnapshot (const v8::HeapSnapshot* snapshot) {
332+ const_cast <HeapSnapshot*>(snapshot)->Delete ();
333+ }
334+
335+ BaseObjectPtr<AsyncWrap> CreateHeapSnapshotStream (
336+ Environment* env, HeapSnapshotPointer&& snapshot) {
344337 HandleScope scope (env->isolate ());
345- const HeapSnapshot* const snapshot =
346- env->isolate ()->GetHeapProfiler ()->TakeHeapSnapshot ();
347- CHECK_NOT_NULL (snapshot);
338+
339+ if (env->streambaseoutputstream_constructor_template ().IsEmpty ()) {
340+ // Create FunctionTemplate for HeapSnapshotStream
341+ Local<FunctionTemplate> os = FunctionTemplate::New (env->isolate ());
342+ os->Inherit (AsyncWrap::GetConstructorTemplate (env));
343+ Local<ObjectTemplate> ost = os->InstanceTemplate ();
344+ ost->SetInternalFieldCount (StreamBase::kStreamBaseFieldCount );
345+ os->SetClassName (
346+ FIXED_ONE_BYTE_STRING (env->isolate (), " HeapSnapshotStream" ));
347+ StreamBase::AddMethods (env, os);
348+ env->set_streambaseoutputstream_constructor_template (ost);
349+ }
350+
348351 Local<Object> obj;
349352 if (!env->streambaseoutputstream_constructor_template ()
350353 ->NewInstance (env->context ())
351354 .ToLocal (&obj)) {
352- return ;
355+ return {} ;
353356 }
354- HeapSnapshotStream* out = new HeapSnapshotStream (env, snapshot, obj);
355- args.GetReturnValue ().Set (out->object ());
357+ return MakeBaseObject<HeapSnapshotStream>(env, std::move (snapshot), obj);
358+ }
359+
360+ void CreateHeapSnapshotStream (const FunctionCallbackInfo<Value>& args) {
361+ Environment* env = Environment::GetCurrent (args);
362+ HeapSnapshotPointer snapshot {
363+ env->isolate ()->GetHeapProfiler ()->TakeHeapSnapshot () };
364+ CHECK (snapshot);
365+ BaseObjectPtr<AsyncWrap> stream =
366+ CreateHeapSnapshotStream (env, std::move (snapshot));
367+ if (stream)
368+ args.GetReturnValue ().Set (stream->object ());
356369}
357370
358371void TriggerHeapSnapshot (const FunctionCallbackInfo<Value>& args) {
@@ -388,15 +401,6 @@ void Initialize(Local<Object> target,
388401 env->SetMethod (target, " buildEmbedderGraph" , BuildEmbedderGraph);
389402 env->SetMethod (target, " triggerHeapSnapshot" , TriggerHeapSnapshot);
390403 env->SetMethod (target, " createHeapSnapshotStream" , CreateHeapSnapshotStream);
391-
392- // Create FunctionTemplate for HeapSnapshotStream
393- Local<FunctionTemplate> os = FunctionTemplate::New (env->isolate ());
394- os->Inherit (AsyncWrap::GetConstructorTemplate (env));
395- Local<ObjectTemplate> ost = os->InstanceTemplate ();
396- ost->SetInternalFieldCount (StreamBase::kStreamBaseFieldCount );
397- os->SetClassName (FIXED_ONE_BYTE_STRING (env->isolate (), " HeapSnapshotStream" ));
398- StreamBase::AddMethods (env, os);
399- env->set_streambaseoutputstream_constructor_template (ost);
400404}
401405
402406} // namespace heap
0 commit comments