@@ -448,30 +448,52 @@ 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, permission::PermissionScope::kFileSystemWrite , final_filename);
483+ } else {
484+ ToNamespacedPath (env, &filename);
485+ THROW_IF_INSUFFICIENT_PERMISSIONS (
486+ env,
487+ permission::PermissionScope::kFileSystemWrite ,
488+ filename.ToStringView ());
489+ final_filename = filename.ToString ();
464490 }
465- return ;
466491 }
467492
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);
493+ if (WriteSnapshot (env, final_filename.c_str (), options).IsNothing ()) return ;
494+
495+ args.GetReturnValue ().Set (
496+ String::NewFromUtf8 (isolate, final_filename.c_str ()).ToLocalChecked ());
475497}
476498
477499void Initialize (Local<Object> target,
0 commit comments