27
27
#include " node.h"
28
28
#include " node_external_reference.h"
29
29
#include " util-inl.h"
30
+ #include " v8-profiler.h"
30
31
#include " v8.h"
31
32
32
33
namespace node {
@@ -35,6 +36,9 @@ using v8::Array;
35
36
using v8::BigInt;
36
37
using v8::CFunction;
37
38
using v8::Context;
39
+ using v8::CpuProfile;
40
+ using v8::CpuProfilingResult;
41
+ using v8::CpuProfilingStatus;
38
42
using v8::DictionaryTemplate;
39
43
using v8::FunctionCallbackInfo;
40
44
using v8::FunctionTemplate;
@@ -47,6 +51,7 @@ using v8::Isolate;
47
51
using v8::Local;
48
52
using v8::LocalVector;
49
53
using v8::MaybeLocal;
54
+ using v8::Number;
50
55
using v8::Object;
51
56
using v8::ScriptCompiler;
52
57
using v8::String;
@@ -241,6 +246,39 @@ void SetFlagsFromString(const FunctionCallbackInfo<Value>& args) {
241
246
V8::SetFlagsFromString (*flags, static_cast <size_t >(flags.length ()));
242
247
}
243
248
249
+ void StartCpuProfile (const FunctionCallbackInfo<Value>& args) {
250
+ Environment* env = Environment::GetCurrent (args);
251
+ Isolate* isolate = env->isolate ();
252
+ CpuProfilingResult result = env->StartCpuProfile ();
253
+ if (result.status == CpuProfilingStatus::kErrorTooManyProfilers ) {
254
+ return THROW_ERR_CPU_PROFILE_TOO_MANY (isolate,
255
+ " There are too many CPU profiles" );
256
+ } else if (result.status == CpuProfilingStatus::kStarted ) {
257
+ args.GetReturnValue ().Set (Number::New (isolate, result.id ));
258
+ }
259
+ }
260
+
261
+ void StopCpuProfile (const FunctionCallbackInfo<Value>& args) {
262
+ Environment* env = Environment::GetCurrent (args);
263
+ Isolate* isolate = env->isolate ();
264
+ CHECK (args[0 ]->IsUint32 ());
265
+ uint32_t profile_id = args[0 ]->Uint32Value (env->context ()).FromJust ();
266
+ CpuProfile* profile = env->StopCpuProfile (profile_id);
267
+ if (!profile) {
268
+ return THROW_ERR_CPU_PROFILE_NOT_STARTED (isolate,
269
+ " CPU profile not started" );
270
+ }
271
+ auto json_out_stream = std::make_unique<node::JSONOutputStream>();
272
+ profile->Serialize (json_out_stream.get (),
273
+ CpuProfile::SerializationFormat::kJSON );
274
+ profile->Delete ();
275
+ Local<Value> ret;
276
+ if (ToV8Value (env->context (), json_out_stream->out_stream ().str (), isolate)
277
+ .ToLocal (&ret)) {
278
+ args.GetReturnValue ().Set (ret);
279
+ }
280
+ }
281
+
244
282
static void IsStringOneByteRepresentation (
245
283
const FunctionCallbackInfo<Value>& args) {
246
284
CHECK_EQ (args.Length (), 1 );
@@ -699,6 +737,9 @@ void Initialize(Local<Object> target,
699
737
// Export symbols used by v8.setFlagsFromString()
700
738
SetMethod (context, target, " setFlagsFromString" , SetFlagsFromString);
701
739
740
+ SetMethod (context, target, " startCpuProfile" , StartCpuProfile);
741
+ SetMethod (context, target, " stopCpuProfile" , StopCpuProfile);
742
+
702
743
// Export symbols used by v8.isStringOneByteRepresentation()
703
744
SetFastMethodNoSideEffect (context,
704
745
target,
@@ -743,6 +784,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
743
784
registry->Register (GetCppHeapStatistics);
744
785
registry->Register (IsStringOneByteRepresentation);
745
786
registry->Register (fast_is_string_one_byte_representation_);
787
+ registry->Register (StartCpuProfile);
788
+ registry->Register (StopCpuProfile);
746
789
}
747
790
748
791
} // namespace v8_utils
0 commit comments