14
14
* limitations under the License.
15
15
*/
16
16
17
- #include " v8-profiler.h"
18
- #include " nan.h"
19
17
#include < memory>
20
18
19
+ #include " nan.h"
20
+ #include " v8-profiler.h"
21
+
21
22
using namespace v8 ;
22
23
23
24
// Sampling Heap Profiler
24
25
25
26
Local<Value> TranslateAllocationProfile (AllocationProfile::Node* node) {
26
27
Local<Object> js_node = Nan::New<Object>();
27
- js_node->Set (Nan::New<String>(" name" ).ToLocalChecked (),
28
- node->name );
28
+ js_node->Set (Nan::New<String>(" name" ).ToLocalChecked (), node->name );
29
29
js_node->Set (Nan::New<String>(" scriptName" ).ToLocalChecked (),
30
- node->script_name );
30
+ node->script_name );
31
31
js_node->Set (Nan::New<String>(" scriptId" ).ToLocalChecked (),
32
- Nan::New<Integer>(node->script_id ));
32
+ Nan::New<Integer>(node->script_id ));
33
33
js_node->Set (Nan::New<String>(" lineNumber" ).ToLocalChecked (),
34
- Nan::New<Integer>(node->line_number ));
34
+ Nan::New<Integer>(node->line_number ));
35
35
js_node->Set (Nan::New<String>(" columnNumber" ).ToLocalChecked (),
36
- Nan::New<Integer>(node->column_number ));
36
+ Nan::New<Integer>(node->column_number ));
37
37
Local<Array> children = Nan::New<Array>(node->children .size ());
38
38
for (size_t i = 0 ; i < node->children .size (); i++) {
39
39
children->Set (i, TranslateAllocationProfile (node->children [i]));
40
40
}
41
- js_node->Set (Nan::New<String>(" children" ).ToLocalChecked (),
42
- children);
41
+ js_node->Set (Nan::New<String>(" children" ).ToLocalChecked (), children);
43
42
Local<Array> allocations = Nan::New<Array>(node->allocations .size ());
44
43
for (size_t i = 0 ; i < node->allocations .size (); i++) {
45
44
AllocationProfile::Allocation alloc = node->allocations [i];
46
45
Local<Object> js_alloc = Nan::New<Object>();
47
46
js_alloc->Set (Nan::New<String>(" sizeBytes" ).ToLocalChecked (),
48
- Nan::New<Number>(alloc.size ));
47
+ Nan::New<Number>(alloc.size ));
49
48
js_alloc->Set (Nan::New<String>(" count" ).ToLocalChecked (),
50
- Nan::New<Number>(alloc.count ));
49
+ Nan::New<Number>(alloc.count ));
51
50
allocations->Set (i, js_alloc);
52
51
}
53
- js_node->Set (Nan::New<String>(" allocations" ).ToLocalChecked (),
54
- allocations);
52
+ js_node->Set (Nan::New<String>(" allocations" ).ToLocalChecked (), allocations);
55
53
return js_node;
56
54
}
57
55
@@ -72,8 +70,8 @@ NAN_METHOD(StartSamplingHeapProfiler) {
72
70
int stack_depth = info[1 ].As <Integer>()->IntegerValue ();
73
71
#endif
74
72
75
- info.GetIsolate ()->GetHeapProfiler ()->
76
- StartSamplingHeapProfiler ( sample_interval, stack_depth);
73
+ info.GetIsolate ()->GetHeapProfiler ()->StartSamplingHeapProfiler (
74
+ sample_interval, stack_depth);
77
75
} else {
78
76
info.GetIsolate ()->GetHeapProfiler ()->StartSamplingHeapProfiler ();
79
77
}
@@ -89,26 +87,25 @@ NAN_METHOD(StopSamplingHeapProfiler) {
89
87
// getAllocationProfile(): AllocationProfileNode
90
88
NAN_METHOD (GetAllocationProfile) {
91
89
std::unique_ptr<v8::AllocationProfile> profile (
92
- info.GetIsolate ()->GetHeapProfiler ()->GetAllocationProfile ());
90
+ info.GetIsolate ()->GetHeapProfiler ()->GetAllocationProfile ());
93
91
AllocationProfile::Node* root = profile->GetRootNode ();
94
92
info.GetReturnValue ().Set (TranslateAllocationProfile (root));
95
93
}
96
94
97
-
98
95
// Time profiler
99
96
100
97
#if NODE_MODULE_VERSION > NODE_8_0_MODULE_VERSION
101
- // This profiler exists for the lifetime of the program. Not calling
98
+ // This profiler exists for the lifetime of the program. Not calling
102
99
// CpuProfiler::Dispose() is intentional.
103
100
CpuProfiler* cpuProfiler = CpuProfiler::New(v8::Isolate::GetCurrent());
104
101
#else
105
102
CpuProfiler* cpuProfiler = v8::Isolate::GetCurrent()->GetCpuProfiler ();
106
103
#endif
107
104
108
105
Local<Object> CreateTimeNode (Local<String> name, Local<String> scriptName,
109
- Local<Integer> scriptId, Local<Integer> lineNumber,
110
- Local<Integer> columnNumber, Local<Integer> hitCount ,
111
- Local<Array> children) {
106
+ Local<Integer> scriptId, Local<Integer> lineNumber,
107
+ Local<Integer> columnNumber ,
108
+ Local<Integer> hitCount, Local<Array> children) {
112
109
Local<Object> js_node = Nan::New<Object>();
113
110
js_node->Set (Nan::New<String>(" name" ).ToLocalChecked (), name);
114
111
js_node->Set (Nan::New<String>(" scriptName" ).ToLocalChecked (), scriptName);
@@ -120,13 +117,12 @@ Local<Object> CreateTimeNode(Local<String> name, Local<String> scriptName,
120
117
return js_node;
121
118
}
122
119
123
-
124
120
#if NODE_MODULE_VERSION > NODE_11_0_MODULE_VERSION
125
121
Local<Object> TranslateLineNumbersTimeProfileNode (const CpuProfileNode* parent,
126
- const CpuProfileNode* node);
122
+ const CpuProfileNode* node);
127
123
128
124
Local<Array> GetLineNumberTimeProfileChildren (const CpuProfileNode* parent,
129
- const CpuProfileNode* node) {
125
+ const CpuProfileNode* node) {
130
126
unsigned int index = 0 ;
131
127
Local<Array> children;
132
128
int32_t count = node->GetChildrenCount ();
@@ -138,53 +134,47 @@ Local<Array> GetLineNumberTimeProfileChildren(const CpuProfileNode* parent,
138
134
node->GetLineTicks (&entries[0 ], hitLineCount);
139
135
children = Nan::New<Array>(count + hitLineCount);
140
136
for (const CpuProfileNode::LineTick entry : entries) {
141
- children->Set (index++, CreateTimeNode (
142
- node->GetFunctionName (),
143
- node->GetScriptResourceName (),
144
- Nan::New<Integer>(node->GetScriptId ()),
145
- Nan::New<Integer>(entry.line ),
146
- Nan::New<Integer>(0 ),
147
- Nan::New<Integer>(entry.hit_count ),
148
- Nan::New<Array>(0 )
149
- ));
137
+ children->Set (
138
+ index++, CreateTimeNode (
139
+ node->GetFunctionName (), node->GetScriptResourceName (),
140
+ Nan::New<Integer>(node->GetScriptId ()),
141
+ Nan::New<Integer>(entry.line ), Nan::New<Integer>(0 ),
142
+ Nan::New<Integer>(entry.hit_count ), Nan::New<Array>(0 )));
150
143
}
151
144
} else if (hitCount > 0 ) {
152
145
// Handle nodes for pseudo-functions like "process" and "garbage collection"
153
146
// which do not have hit line counts.
154
147
children = Nan::New<Array>(count + 1 );
155
- children->Set (index++, CreateTimeNode (
156
- node->GetFunctionName (),
157
- node->GetScriptResourceName (),
158
- Nan::New<Integer>(node->GetScriptId ()),
159
- Nan::New<Integer>(node->GetLineNumber ()),
160
- Nan::New<Integer>(node->GetColumnNumber ()),
161
- Nan::New<Integer>(hitCount),
162
- Nan::New<Array>(0 )
163
- ));
148
+ children->Set (
149
+ index++,
150
+ CreateTimeNode (node->GetFunctionName (), node->GetScriptResourceName (),
151
+ Nan::New<Integer>(node->GetScriptId ()),
152
+ Nan::New<Integer>(node->GetLineNumber ()),
153
+ Nan::New<Integer>(node->GetColumnNumber ()),
154
+ Nan::New<Integer>(hitCount), Nan::New<Array>(0 )));
164
155
} else {
165
156
children = Nan::New<Array>(count);
166
157
}
167
158
168
159
for (int32_t i = 0 ; i < count; i++) {
169
- children->Set (index++, TranslateLineNumbersTimeProfileNode (node,
170
- node->GetChild (i)));
160
+ children->Set (index++,
161
+ TranslateLineNumbersTimeProfileNode (node, node->GetChild (i)));
171
162
};
172
163
173
164
return children;
174
165
}
175
166
176
167
Local<Object> TranslateLineNumbersTimeProfileNode (const CpuProfileNode* parent,
177
- const CpuProfileNode* node) {
178
- return CreateTimeNode (parent->GetFunctionName (),
179
- parent->GetScriptResourceName (),
180
- Nan::New<Integer>(parent->GetScriptId ()),
181
- Nan::New<Integer>(node->GetLineNumber ()),
182
- Nan::New<Integer>(node->GetColumnNumber ()),
183
- Nan::New<Integer>(0 ),
184
- GetLineNumberTimeProfileChildren (parent, node));
168
+ const CpuProfileNode* node) {
169
+ return CreateTimeNode (
170
+ parent->GetFunctionName (), parent->GetScriptResourceName (),
171
+ Nan::New<Integer>(parent->GetScriptId ()),
172
+ Nan::New<Integer>(node->GetLineNumber ()),
173
+ Nan::New<Integer>(node->GetColumnNumber ()), Nan::New<Integer>(0 ),
174
+ GetLineNumberTimeProfileChildren (parent, node));
185
175
}
186
176
187
- // In profiles with line- level accurate line numbers, a node's line number
177
+ // In profiles with line level accurate line numbers, a node's line number
188
178
// and column number refer to the line/column from which the function was
189
179
// called.
190
180
Local<Value> TranslateLineNumbersTimeProfileRoot (const CpuProfileNode* node) {
@@ -207,15 +197,11 @@ Local<Value> TranslateLineNumbersTimeProfileRoot(const CpuProfileNode* node) {
207
197
}
208
198
}
209
199
210
- return CreateTimeNode (
211
- node->GetFunctionName (),
212
- node->GetScriptResourceName (),
213
- Nan::New<Integer>(node->GetScriptId ()),
214
- Nan::New<Integer>(node->GetLineNumber ()),
215
- Nan::New<Integer>(node->GetColumnNumber ()),
216
- Nan::New<Integer>(0 ),
217
- children
218
- );
200
+ return CreateTimeNode (node->GetFunctionName (), node->GetScriptResourceName (),
201
+ Nan::New<Integer>(node->GetScriptId ()),
202
+ Nan::New<Integer>(node->GetLineNumber ()),
203
+ Nan::New<Integer>(node->GetColumnNumber ()),
204
+ Nan::New<Integer>(0 ), children);
219
205
}
220
206
#endif
221
207
@@ -226,49 +212,44 @@ Local<Value> TranslateTimeProfileNode(const CpuProfileNode* node) {
226
212
children->Set (i, TranslateTimeProfileNode (node->GetChild (i)));
227
213
}
228
214
229
- return CreateTimeNode (
230
- node->GetFunctionName (),
231
- node->GetScriptResourceName (),
232
- Nan::New<Integer>(node->GetScriptId ()),
233
- Nan::New<Integer>(node->GetLineNumber ()),
234
- Nan::New<Integer>(node->GetColumnNumber ()),
235
- Nan::New<Integer>(node->GetHitCount ()),
236
- children
237
- );
215
+ return CreateTimeNode (node->GetFunctionName (), node->GetScriptResourceName (),
216
+ Nan::New<Integer>(node->GetScriptId ()),
217
+ Nan::New<Integer>(node->GetLineNumber ()),
218
+ Nan::New<Integer>(node->GetColumnNumber ()),
219
+ Nan::New<Integer>(node->GetHitCount ()), children);
238
220
}
239
221
240
- Local<Value> TranslateTimeProfile (const CpuProfile* profile, bool hasDetailedLines) {
222
+ Local<Value> TranslateTimeProfile (const CpuProfile* profile,
223
+ bool includeLineInfo) {
241
224
Local<Object> js_profile = Nan::New<Object>();
242
225
js_profile->Set (Nan::New<String>(" title" ).ToLocalChecked (),
243
- profile->GetTitle ());
226
+ profile->GetTitle ());
244
227
245
228
#if NODE_MODULE_VERSION > NODE_11_0_MODULE_VERSION
246
- if (hasDetailedLines ) {
229
+ if (includeLineInfo ) {
247
230
js_profile->Set (
248
- Nan::New<String>(" topDownRoot" ).ToLocalChecked (),
249
- TranslateLineNumbersTimeProfileRoot (profile->GetTopDownRoot ()));
231
+ Nan::New<String>(" topDownRoot" ).ToLocalChecked (),
232
+ TranslateLineNumbersTimeProfileRoot (profile->GetTopDownRoot ()));
250
233
} else {
251
- js_profile->Set (
252
- Nan::New<String>(" topDownRoot" ).ToLocalChecked (),
253
- TranslateTimeProfileNode (profile->GetTopDownRoot ()));
234
+ js_profile->Set (Nan::New<String>(" topDownRoot" ).ToLocalChecked (),
235
+ TranslateTimeProfileNode (profile->GetTopDownRoot ()));
254
236
}
255
237
#else
256
- js_profile->Set (
257
- Nan::New<String>(" topDownRoot" ).ToLocalChecked (),
258
- TranslateTimeProfileNode (profile->GetTopDownRoot ()));
238
+ js_profile->Set (Nan::New<String>(" topDownRoot" ).ToLocalChecked (),
239
+ TranslateTimeProfileNode (profile->GetTopDownRoot ()));
259
240
#endif
260
241
js_profile->Set (Nan::New<String>(" startTime" ).ToLocalChecked (),
261
- Nan::New<Number>(profile->GetStartTime ()));
242
+ Nan::New<Number>(profile->GetStartTime ()));
262
243
js_profile->Set (Nan::New<String>(" endTime" ).ToLocalChecked (),
263
- Nan::New<Number>(profile->GetEndTime ()));
244
+ Nan::New<Number>(profile->GetEndTime ()));
264
245
return js_profile;
265
246
}
266
247
267
248
// Signature:
268
249
// startProfiling(runName: string, includeLineInfo: boolean)
269
250
NAN_METHOD (StartProfiling) {
270
251
if (info.Length () != 2 ) {
271
- return Nan::ThrowTypeError (" StartProfling must have two arguments." );
252
+ return Nan::ThrowTypeError (" StartProfiling must have two arguments." );
272
253
}
273
254
if (!info[0 ]->IsString ()) {
274
255
return Nan::ThrowTypeError (" First argument must be a string." );
@@ -280,11 +261,11 @@ NAN_METHOD(StartProfiling) {
280
261
Local<String> name =
281
262
Nan::MaybeLocal<String>(info[0 ].As <String>()).ToLocalChecked ();
282
263
283
- // Sample counts and timestamps are not used, so we do not need to record
284
- // samples.
285
- bool recordSamples = false ;
264
+ // Sample counts and timestamps are not used, so we do not need to record
265
+ // samples.
266
+ const bool recordSamples = false ;
286
267
287
- // Line- level accurate line information is not available in Node 11 or earlier.
268
+ // Line level accurate line information is not available in Node 11 or earlier.
288
269
#if NODE_MODULE_VERSION > NODE_11_0_MODULE_VERSION
289
270
bool includeLineInfo =
290
271
Nan::MaybeLocal<Boolean>(info[1 ].As <Boolean>()).ToLocalChecked ()->Value ();
@@ -300,7 +281,7 @@ bool recordSamples = false;
300
281
}
301
282
302
283
// Signature:
303
- // stopProfiling(runName: string, includedLineInfo : boolean): TimeProfile
284
+ // stopProfiling(runName: string, includeLineInfo : boolean): TimeProfile
304
285
NAN_METHOD (StopProfiling) {
305
286
if (info.Length () != 2 ) {
306
287
return Nan::ThrowTypeError (" StopProfling must have two arguments." );
@@ -313,12 +294,12 @@ NAN_METHOD(StopProfiling) {
313
294
}
314
295
Local<String> name =
315
296
Nan::MaybeLocal<String>(info[0 ].As <String>()).ToLocalChecked ();
316
- bool includedLineInfo =
297
+ bool includeLineInfo =
317
298
Nan::MaybeLocal<Boolean>(info[1 ].As <Boolean>()).ToLocalChecked ()->Value ();
318
299
319
300
CpuProfile* profile = cpuProfiler->StopProfiling (name);
320
301
Local<Value> translated_profile =
321
- TranslateTimeProfile (profile, includedLineInfo );
302
+ TranslateTimeProfile (profile, includeLineInfo );
322
303
profile->Delete ();
323
304
info.GetReturnValue ().Set (translated_profile);
324
305
}
@@ -334,26 +315,32 @@ NAN_METHOD(SetSamplingInterval) {
334
315
cpuProfiler->SetSamplingInterval (us);
335
316
}
336
317
337
-
338
318
NAN_MODULE_INIT (InitAll) {
339
319
Local<Object> timeProfiler = Nan::New<Object>();
340
320
Nan::Set (timeProfiler, Nan::New (" startProfiling" ).ToLocalChecked (),
341
- Nan::GetFunction (Nan::New<FunctionTemplate>(StartProfiling)).ToLocalChecked ());
321
+ Nan::GetFunction (Nan::New<FunctionTemplate>(StartProfiling))
322
+ .ToLocalChecked ());
342
323
Nan::Set (timeProfiler, Nan::New (" stopProfiling" ).ToLocalChecked (),
343
- Nan::GetFunction (Nan::New<FunctionTemplate>(StopProfiling)).ToLocalChecked ());
324
+ Nan::GetFunction (Nan::New<FunctionTemplate>(StopProfiling))
325
+ .ToLocalChecked ());
344
326
Nan::Set (timeProfiler, Nan::New (" setSamplingInterval" ).ToLocalChecked (),
345
- Nan::GetFunction (Nan::New<FunctionTemplate>(SetSamplingInterval)).ToLocalChecked ());
327
+ Nan::GetFunction (Nan::New<FunctionTemplate>(SetSamplingInterval))
328
+ .ToLocalChecked ());
346
329
target->Set (Nan::New<String>(" timeProfiler" ).ToLocalChecked (), timeProfiler);
347
330
348
331
Local<Object> heapProfiler = Nan::New<Object>();
349
- Nan::Set (heapProfiler, Nan::New (" startSamplingHeapProfiler" ).ToLocalChecked (),
350
- Nan::GetFunction (Nan::New<FunctionTemplate>(StartSamplingHeapProfiler)).ToLocalChecked ());
351
- Nan::Set (heapProfiler, Nan::New (" stopSamplingHeapProfiler" ).ToLocalChecked (),
352
- Nan::GetFunction (Nan::New<FunctionTemplate>(StopSamplingHeapProfiler)).ToLocalChecked ());
332
+ Nan::Set (
333
+ heapProfiler, Nan::New (" startSamplingHeapProfiler" ).ToLocalChecked (),
334
+ Nan::GetFunction (Nan::New<FunctionTemplate>(StartSamplingHeapProfiler))
335
+ .ToLocalChecked ());
336
+ Nan::Set (
337
+ heapProfiler, Nan::New (" stopSamplingHeapProfiler" ).ToLocalChecked (),
338
+ Nan::GetFunction (Nan::New<FunctionTemplate>(StopSamplingHeapProfiler))
339
+ .ToLocalChecked ());
353
340
Nan::Set (heapProfiler, Nan::New (" getAllocationProfile" ).ToLocalChecked (),
354
- Nan::GetFunction (Nan::New<FunctionTemplate>(GetAllocationProfile)).ToLocalChecked ());
341
+ Nan::GetFunction (Nan::New<FunctionTemplate>(GetAllocationProfile))
342
+ .ToLocalChecked ());
355
343
target->Set (Nan::New<String>(" heapProfiler" ).ToLocalChecked (), heapProfiler);
356
344
}
357
345
358
346
NODE_MODULE (google_cloud_profiler, InitAll);
359
-
0 commit comments