| Index: src/profile-generator.cc
|
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc
|
| index 17c0835727cf5d5e353e23eb5eaaf5e62fd0f340..46e7aabcdbe5ad470490df3c340e2ea6e226aa11 100644
|
| --- a/src/profile-generator.cc
|
| +++ b/src/profile-generator.cc
|
| @@ -383,7 +383,7 @@ CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag,
|
| const char* name) {
|
| CodeEntry* entry = new CodeEntry(tag,
|
| CodeEntry::kEmptyNamePrefix,
|
| - name,
|
| + GetFunctionName(name),
|
| "",
|
| v8::CpuProfileNode::kNoLineNumberInfo);
|
| code_entries_.Add(entry);
|
| @@ -416,13 +416,6 @@ CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag,
|
| }
|
|
|
|
|
| -const char* CpuProfilesCollection::GetFunctionName(String* name) {
|
| - const char* maybe_empty_name = GetName(name);
|
| - return strlen(maybe_empty_name) > 0 ?
|
| - maybe_empty_name : "(anonymous function)";
|
| -}
|
| -
|
| -
|
| const char* CpuProfilesCollection::GetName(String* name) {
|
| if (name->IsString()) {
|
| char* c_name =
|
| @@ -473,44 +466,56 @@ void CpuProfilesCollection::AddPathToCurrentProfiles(
|
| }
|
|
|
|
|
| +const char* ProfileGenerator::kAnonymousFunctionName = "(anonymous function)";
|
| +const char* ProfileGenerator::kProgramEntryName = "(program)";
|
| +const char* ProfileGenerator::kGarbageCollectorEntryName =
|
| + "(garbage collector)";
|
| +
|
|
|
| ProfileGenerator::ProfileGenerator(CpuProfilesCollection* profiles)
|
| : profiles_(profiles),
|
| program_entry_(
|
| - profiles->NewCodeEntry(Logger::FUNCTION_TAG, "(program)")) {
|
| + profiles->NewCodeEntry(Logger::FUNCTION_TAG, kProgramEntryName)),
|
| + gc_entry_(
|
| + profiles->NewCodeEntry(Logger::BUILTIN_TAG,
|
| + kGarbageCollectorEntryName)) {
|
| }
|
|
|
|
|
| void ProfileGenerator::RecordTickSample(const TickSample& sample) {
|
| - // Allocate space for stack frames + pc + function + (program).
|
| + // Allocate space for stack frames + pc + function + vm-state.
|
| ScopedVector<CodeEntry*> entries(sample.frames_count + 3);
|
| + // As actual number of decoded code entries may vary, initialize
|
| + // entries vector with NULL values.
|
| CodeEntry** entry = entries.start();
|
| - *entry++ = code_map_.FindEntry(sample.pc);
|
| + memset(entry, 0, entries.length() * sizeof(*entry));
|
| + if (sample.pc != NULL) {
|
| + *entry++ = code_map_.FindEntry(sample.pc);
|
|
|
| - if (sample.function != NULL) {
|
| - *entry = code_map_.FindEntry(sample.function);
|
| - if (*entry != NULL && !(*entry)->is_js_function()) {
|
| - *entry = NULL;
|
| - } else {
|
| - CodeEntry* pc_entry = *entries.start();
|
| - if (pc_entry == NULL || pc_entry->is_js_function())
|
| + if (sample.function != NULL) {
|
| + *entry = code_map_.FindEntry(sample.function);
|
| + if (*entry != NULL && !(*entry)->is_js_function()) {
|
| *entry = NULL;
|
| + } else {
|
| + CodeEntry* pc_entry = *entries.start();
|
| + if (pc_entry == NULL || pc_entry->is_js_function())
|
| + *entry = NULL;
|
| + }
|
| + entry++;
|
| }
|
| - entry++;
|
| - } else {
|
| - *entry++ = NULL;
|
| - }
|
|
|
| - for (const Address *stack_pos = sample.stack,
|
| - *stack_end = stack_pos + sample.frames_count;
|
| - stack_pos != stack_end;
|
| - ++stack_pos) {
|
| - *entry++ = code_map_.FindEntry(*stack_pos);
|
| + for (const Address *stack_pos = sample.stack,
|
| + *stack_end = stack_pos + sample.frames_count;
|
| + stack_pos != stack_end;
|
| + ++stack_pos) {
|
| + *entry++ = code_map_.FindEntry(*stack_pos);
|
| + }
|
| }
|
|
|
| - // WebKit CPU profiles visualization requires "(program)" to be the
|
| - // topmost entry.
|
| - *entry++ = FLAG_prof_browser_mode ? program_entry_ : NULL;
|
| + if (FLAG_prof_browser_mode) {
|
| + // Put VM state as the topmost entry.
|
| + *entry++ = EntryForVMState(sample.state);
|
| + }
|
|
|
| profiles_->AddPathToCurrentProfiles(entries);
|
| }
|
|
|