@@ -448,30 +448,54 @@ void CreateHeapSnapshotStream(const FunctionCallbackInfo<Value>& args) {
448448void TriggerHeapSnapshot (const FunctionCallbackInfo<Value>& args) {
449449 Environment* env = Environment::GetCurrent (args);
450450 Isolate* isolate = args.GetIsolate ();
451- CHECK_EQ (args.Length (), 2 );
451+ CHECK_EQ (args.Length (), 3 );
452452 Local<Value> filename_v = args[0 ];
453453 auto options = GetHeapSnapshotOptions (args[1 ]);
454+ bool has_path = !args[2 ]->IsUndefined () && !args[2 ]->IsNull ();
455+ std::string final_filename;
456+ BufferValue path_v (isolate, args[2 ]);
457+ ToNamespacedPath (env, &path_v);
454458
455459 if (filename_v->IsUndefined ()) {
456460 DiagnosticFilename name (env, " Heap" , " heapsnapshot" );
457- THROW_IF_INSUFFICIENT_PERMISSIONS (
458- env,
459- permission::PermissionScope::kFileSystemWrite ,
460- Environment::GetCwd (env->exec_path ()));
461- if (WriteSnapshot (env, *name, options).IsNothing ()) return ;
462- if (String::NewFromUtf8 (isolate, *name).ToLocal (&filename_v)) {
463- args.GetReturnValue ().Set (filename_v);
461+ if (!has_path) {
462+ THROW_IF_INSUFFICIENT_PERMISSIONS (
463+ env,
464+ permission::PermissionScope::kFileSystemWrite ,
465+ Environment::GetCwd (env->exec_path ()));
466+ final_filename = *name;
467+ } else {
468+ THROW_IF_INSUFFICIENT_PERMISSIONS (
469+ env,
470+ permission::PermissionScope::kFileSystemWrite ,
471+ path_v.ToStringView ());
472+ final_filename = path_v.ToString () + " /" +
473+ *name; // NOLINT(readability/pointer_notation)
474+ }
475+ } else {
476+ BufferValue filename (isolate, filename_v);
477+ CHECK_NOT_NULL (*filename);
478+
479+ if (has_path) {
480+ final_filename = path_v.ToString () + " /" + filename.ToString ();
481+ THROW_IF_INSUFFICIENT_PERMISSIONS (
482+ env,
483+ permission::PermissionScope::kFileSystemWrite ,
484+ final_filename);
485+ } else {
486+ ToNamespacedPath (env, &filename);
487+ THROW_IF_INSUFFICIENT_PERMISSIONS (
488+ env,
489+ permission::PermissionScope::kFileSystemWrite ,
490+ filename.ToStringView ());
491+ final_filename = filename.ToString ();
464492 }
465- return ;
466493 }
467494
468- BufferValue path (isolate, filename_v);
469- CHECK_NOT_NULL (*path);
470- ToNamespacedPath (env, &path);
471- THROW_IF_INSUFFICIENT_PERMISSIONS (
472- env, permission::PermissionScope::kFileSystemWrite , path.ToStringView ());
473- if (WriteSnapshot (env, *path, options).IsNothing ()) return ;
474- return args.GetReturnValue ().Set (filename_v);
495+ if (WriteSnapshot (env, final_filename.c_str (), options).IsNothing ()) return ;
496+
497+ args.GetReturnValue ().Set (
498+ String::NewFromUtf8 (isolate, final_filename.c_str ()).ToLocalChecked ());
475499}
476500
477501void Initialize (Local<Object> target,
0 commit comments