Chromium Code Reviews| Index: test/cctest/test-heap-profiler.cc |
| diff --git a/test/cctest/test-heap-profiler.cc b/test/cctest/test-heap-profiler.cc |
| index 6b452960b5ecb3c6746459583213b4e6e653ead3..a023e561fce66befe7acffc95ae0a27653247254 100644 |
| --- a/test/cctest/test-heap-profiler.cc |
| +++ b/test/cctest/test-heap-profiler.cc |
| @@ -2021,3 +2021,75 @@ TEST(HeapObjectsTracker) { |
| "for (var i = 0; i < 3; ++i)" |
| " a.shift();\n"); |
| } |
| + |
| + |
| +static const char* record_allocation_traces_source = |
| +"var topFunctions = [];\n" |
| +"var global = this;\n" |
| +"var calls = 0;\n" |
| +"function generateFunctions(width, depth) {\n" |
| +" var script = [];\n" |
| +" for (var i = 0; i < width; i++) {\n" |
| +" for (var j = 0; j < depth; j++) {\n" |
| +" script.push('function f_' + i + '_' + j + '(x) {\\n');\n" |
| +" script.push(' try {\\n');\n" |
| +" if (j < depth-2) {\n" |
| +" script.push(' return f_' + i + '_' + (j+1) + '(x+1);\\n');\n" |
|
loislo
2013/10/16 15:14:08
80 symbols
yurys
2013/10/17 15:27:35
Done.
|
| +" } else if (j == depth - 2) {\n" |
| +" script.push(' return new f_' + i + '_' + (depth - 1) + '();\\n');\n" |
|
loislo
2013/10/16 15:14:08
80 symbols
yurys
2013/10/17 15:27:35
Done.
|
| +" } else if (j == depth - 1) {\n" |
| +" script.push(' /*++calls; empty */\\n');\n" |
| +" }\n" |
| +" script.push(' } catch (e) {}\\n');\n" |
| +" script.push('}\\n');\n" |
| +" \n" |
| +" }\n" |
| +" }\n" |
| +" var script = script.join('');\n" |
| +" global.eval(script);\n" |
| +" for (var i = 0; i < width; i++) {\n" |
| +" topFunctions.push(this['f_' + i + '_0']);\n" |
| +" }\n" |
| +"}\n" |
| +"\n" |
| +"var width = 5;\n" |
| +"var depth = 5;\n" |
| +"generateFunctions(width, depth);\n" |
| +"var instances = [];\n" |
| +"function start() {\n" |
| +" for (var i = 0; i < width; i++) {\n" |
| +" instances.push(topFunctions[i](0));\n" |
| +" }\n" |
| +"}\n" |
| +"\n" |
| +"for (var i = 0; i < 1000; i++) start();\n"; |
| + |
| + |
| +class StreamPrinter : public v8::OutputStream { |
| + public: |
| + virtual void EndOfStream() { |
| + } |
| + virtual int GetChunkSize() { return 1024; } |
| + virtual WriteResult WriteAsciiChunk(char* data, int size) { |
| +// for (int i = 0; i < size; i++) { |
| +// printf("%c", data[i]); |
| +// } |
| + return kContinue; |
| + } |
| +}; |
| + |
| +TEST(RecordAllocationTraces) { |
| + v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| + LocalContext env; |
| + HeapObjectsTracker tracker; |
| + |
| + CompileRun(record_allocation_traces_source); |
| + |
| + |
| + // Print heap snapshot with collected allocation traces. |
| + v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| + const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
| + v8::String::New("Test")); |
| + StreamPrinter printer; |
| + snapshot->Serialize(&printer, v8::HeapSnapshot::kJSON); |
| +} |