2727#include " node.h"
2828#include " node_external_reference.h"
2929#include " util-inl.h"
30+ #include " v8-profiler.h"
3031#include " v8.h"
3132
3233namespace node {
@@ -35,6 +36,9 @@ using v8::Array;
3536using v8::BigInt;
3637using v8::CFunction;
3738using v8::Context;
39+ using v8::CpuProfile;
40+ using v8::CpuProfilingResult;
41+ using v8::CpuProfilingStatus;
3842using v8::DictionaryTemplate;
3943using v8::FunctionCallbackInfo;
4044using v8::FunctionTemplate;
@@ -47,6 +51,8 @@ using v8::Isolate;
4751using v8::Local;
4852using v8::LocalVector;
4953using v8::MaybeLocal;
54+ using v8::Name;
55+ using v8::Number;
5056using v8::Object;
5157using v8::ScriptCompiler;
5258using v8::String;
@@ -243,6 +249,39 @@ void SetFlagsFromString(const FunctionCallbackInfo<Value>& args) {
243249 V8::SetFlagsFromString (*flags, static_cast <size_t >(flags.length ()));
244250}
245251
252+ void StartCpuProfile (const FunctionCallbackInfo<Value>& args) {
253+ Environment* env = Environment::GetCurrent (args);
254+ Isolate* isolate = env->isolate ();
255+ CpuProfilingResult result = env->StartCpuProfile ();
256+ if (result.status == CpuProfilingStatus::kErrorTooManyProfilers ) {
257+ return THROW_ERR_CPU_PROFILE_TOO_MANY (isolate,
258+ " There are too many CPU profiles" );
259+ } else if (result.status == CpuProfilingStatus::kStarted ) {
260+ args.GetReturnValue ().Set (Number::New (isolate, result.id ));
261+ }
262+ }
263+
264+ void StopCpuProfile (const FunctionCallbackInfo<Value>& args) {
265+ Environment* env = Environment::GetCurrent (args);
266+ Isolate* isolate = env->isolate ();
267+ CHECK (args[0 ]->IsUint32 ());
268+ uint32_t profile_id = args[0 ]->Uint32Value (env->context ()).FromJust ();
269+ CpuProfile* profile = env->StopCpuProfile (profile_id);
270+ if (!profile) {
271+ return THROW_ERR_CPU_PROFILE_NOT_STARTED (isolate,
272+ " CPU profile not started" );
273+ }
274+ auto json_out_stream = std::make_unique<node::JSONOutputStream>();
275+ profile->Serialize (json_out_stream.get (),
276+ CpuProfile::SerializationFormat::kJSON );
277+ profile->Delete ();
278+ Local<Value> ret;
279+ if (ToV8Value (env->context (), json_out_stream->out_stream ().str (), isolate)
280+ .ToLocal (&ret)) {
281+ args.GetReturnValue ().Set (ret);
282+ }
283+ }
284+
246285static void IsStringOneByteRepresentation (
247286 const FunctionCallbackInfo<Value>& args) {
248287 CHECK_EQ (args.Length (), 1 );
@@ -701,6 +740,9 @@ void Initialize(Local<Object> target,
701740 // Export symbols used by v8.setFlagsFromString()
702741 SetMethod (context, target, " setFlagsFromString" , SetFlagsFromString);
703742
743+ SetMethod (context, target, " startCpuProfile" , StartCpuProfile);
744+ SetMethod (context, target, " stopCpuProfile" , StopCpuProfile);
745+
704746 // Export symbols used by v8.isStringOneByteRepresentation()
705747 SetFastMethodNoSideEffect (context,
706748 target,
@@ -745,6 +787,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
745787 registry->Register (GetCppHeapStatistics);
746788 registry->Register (IsStringOneByteRepresentation);
747789 registry->Register (fast_is_string_one_byte_representation_);
790+ registry->Register (StartCpuProfile);
791+ registry->Register (StopCpuProfile);
748792}
749793
750794} // namespace v8_utils
0 commit comments