Author: mikhail.naga...@gmail.com Date: Mon Feb 2 04:54:56 2009 New Revision: 1205
Added: changes/mnaganov/ changes/mnaganov/line-numbers/ changes/mnaganov/line-numbers/bleeding_edge/ - copied from r1204, /branches/bleeding_edge/ Modified: changes/mnaganov/line-numbers/bleeding_edge/src/compiler.cc changes/mnaganov/line-numbers/bleeding_edge/src/factory.cc changes/mnaganov/line-numbers/bleeding_edge/src/log.cc changes/mnaganov/line-numbers/bleeding_edge/src/log.h changes/mnaganov/line-numbers/bleeding_edge/src/objects-inl.h changes/mnaganov/line-numbers/bleeding_edge/src/objects.cc changes/mnaganov/line-numbers/bleeding_edge/src/objects.h changes/mnaganov/line-numbers/bleeding_edge/tools/tickprocessor.py Log: Adding src_file_name:line_number into perf log entries for compiled JS functions. Thus, instead of the following profiler records: 1.5% 1.5% LazyCompile: <anonymous> we'll now have these: 1.5% 1.5% LazyCompile: <anonymous> richards.js:309 Modified: changes/mnaganov/line-numbers/bleeding_edge/src/compiler.cc ============================================================================== --- /branches/bleeding_edge/src/compiler.cc (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/compiler.cc Mon Feb 2 04:54:56 2009 @@ -293,7 +293,18 @@ } // Generate the code, update the function info, and return the code. - LOG(CodeCreateEvent("LazyCompile", *code, *lit->name())); +#ifdef ENABLE_LOGGING_AND_PROFILING + if (script->name()->IsString()) { + int lineNum = script->GetLineNumber(start_position); + if (lineNum > 0) { + lineNum += script->line_offset()->value() + 1; + } + LOG(CodeCreateEvent("LazyCompile", *code, *lit->name(), + String::cast(script->name()), lineNum)); + } else { + LOG(CodeCreateEvent("LazyCompile", *code, *lit->name())); + } +#endif // Update the shared function info with the compiled code. shared->set_code(*code); Modified: changes/mnaganov/line-numbers/bleeding_edge/src/factory.cc ============================================================================== --- /branches/bleeding_edge/src/factory.cc (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/factory.cc Mon Feb 2 04:54:56 2009 @@ -160,6 +160,7 @@ script->set_column_offset(Smi::FromInt(0)); script->set_type(Smi::FromInt(SCRIPT_TYPE_NORMAL)); script->set_wrapper(*Factory::NewProxy(0, TENURED)); + script->set_line_ends(*(Factory::NewFixedArray(0))); return script; } Modified: changes/mnaganov/line-numbers/bleeding_edge/src/log.cc ============================================================================== --- /branches/bleeding_edge/src/log.cc (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/log.cc Mon Feb 2 04:54:56 2009 @@ -587,6 +587,20 @@ #endif } +void Logger::CodeCreateEvent(const char* tag, Code* code, String* name, + String* source, int line) { +#ifdef ENABLE_LOGGING_AND_PROFILING + if (logfile_ == NULL || !FLAG_log_code) return; + ScopedLock sl(mutex_); + SmartPointer<char> str = + name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); + SmartPointer<char> sourcestr = + source->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); + fprintf(logfile_, "code-creation,%s,0x%x,%d,\"%s %s:%d\"\n", tag, + reinterpret_cast<unsigned int>(code->address()), + code->instruction_size(), *str, *sourcestr, line); +#endif +} void Logger::CodeCreateEvent(const char* tag, Code* code, int args_count) { #ifdef ENABLE_LOGGING_AND_PROFILING @@ -599,7 +613,6 @@ args_count); #endif } - void Logger::CodeAllocateEvent(Code* code, Assembler* assem) { #ifdef ENABLE_LOGGING_AND_PROFILING Modified: changes/mnaganov/line-numbers/bleeding_edge/src/log.h ============================================================================== --- /branches/bleeding_edge/src/log.h (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/log.h Mon Feb 2 04:54:56 2009 @@ -163,6 +163,8 @@ // Emits a code create event. static void CodeCreateEvent(const char* tag, Code* code, const char* source); static void CodeCreateEvent(const char* tag, Code* code, String* name); + static void CodeCreateEvent(const char* tag, Code* code, String* name, + String* source, int line); static void CodeCreateEvent(const char* tag, Code* code, int args_count); static void CodeAllocateEvent(Code* code, Assembler* assem); // Emits a code move event. Modified: changes/mnaganov/line-numbers/bleeding_edge/src/objects-inl.h ============================================================================== --- /branches/bleeding_edge/src/objects-inl.h (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/objects-inl.h Mon Feb 2 04:54:56 2009 @@ -1989,6 +1989,7 @@ ACCESSORS(Script, column_offset, Smi, kColumnOffsetOffset) ACCESSORS(Script, wrapper, Proxy, kWrapperOffset) ACCESSORS(Script, type, Smi, kTypeOffset) +ACCESSORS(Script, line_ends, FixedArray, kLineEndsOffset) ACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex) ACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex) Modified: changes/mnaganov/line-numbers/bleeding_edge/src/objects.cc ============================================================================== --- /branches/bleeding_edge/src/objects.cc (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/objects.cc Mon Feb 2 04:54:56 2009 @@ -6775,6 +6775,54 @@ } +// Init line_ends array with code positions of line ends inside script source +void Script::InitLineEnds() { + if (line_ends()->length() > 0) return; + + String* src = String::cast(source()); + SmartPointer<uc16> data = src->ToWideCString(); + const int srclen = src->length(); + Handle<JSArray> array = Factory::NewJSArray(0); + int array_index = 0; + for (int i = 0; i < srclen; ++i) { + if (data[i] == 0x000A) { + SetElement(array, array_index++, Handle<Smi>(Smi::FromInt(i))); + } + } + + // If the script does not end with a line ending add the final end position + // as just past the last line ending. + if (array_index == 0 || + (Smi::cast(array->GetElement(array_index - 1))->value() != srclen - 1)) { + SetElement(array, array_index++, Handle<Smi>(Smi::FromInt(srclen))); + } + + set_line_ends(FixedArray::cast(line_ends()->AddKeysFromJSArray(*array))); + ASSERT(line_ends()->length() > 0); +} + + +// Convert code position into line number +int Script::GetLineNumber(int code_position) { + InitLineEnds(); + + int line = -1; + if (code_position <= (Smi::cast(line_ends()->get(0)))->value()) { + line = 0; + } else { + for (int i = 1; i < line_ends()->length(); ++i) { + if ((Smi::cast(line_ends()->get(i - 1)))->value() < code_position && + code_position <= (Smi::cast(line_ends()->get(i)))->value()) { + line = i; + break; + } + } + } + + return line != -1 ? line + line_offset()->value() : line; +} + + // Check if there is a break point at this code position. bool DebugInfo::HasBreakPoint(int code_position) { // Get the break point info object for this code position. Modified: changes/mnaganov/line-numbers/bleeding_edge/src/objects.h ============================================================================== --- /branches/bleeding_edge/src/objects.h (original) +++ changes/mnaganov/line-numbers/bleeding_edge/src/objects.h Mon Feb 2 04:54:56 2009 @@ -2537,6 +2537,9 @@ // [type]: the script type. DECL_ACCESSORS(type, Smi) + // [line_ends]: array of line ends positions + DECL_ACCESSORS(line_ends, FixedArray) + static inline Script* cast(Object* obj); #ifdef DEBUG @@ -2544,13 +2547,17 @@ void ScriptVerify(); #endif + void InitLineEnds(); + int GetLineNumber(int code_position); + static const int kSourceOffset = HeapObject::kHeaderSize; static const int kNameOffset = kSourceOffset + kPointerSize; static const int kLineOffsetOffset = kNameOffset + kPointerSize; static const int kColumnOffsetOffset = kLineOffsetOffset + kPointerSize; static const int kWrapperOffset = kColumnOffsetOffset + kPointerSize; static const int kTypeOffset = kWrapperOffset + kPointerSize; - static const int kSize = kTypeOffset + kPointerSize; + static const int kLineEndsOffset = kTypeOffset + kPointerSize; + static const int kSize = kLineEndsOffset + kPointerSize; private: DISALLOW_IMPLICIT_CONSTRUCTORS(Script); Modified: changes/mnaganov/line-numbers/bleeding_edge/tools/tickprocessor.py ============================================================================== --- /branches/bleeding_edge/tools/tickprocessor.py (original) +++ changes/mnaganov/line-numbers/bleeding_edge/tools/tickprocessor.py Mon Feb 2 04:54:56 2009 @@ -104,7 +104,10 @@ def ToString(self): name = self.name - if name == '': name = '<anonymous>' + if name == '': + name = '<anonymous>' + elif name.startswith(' '): + name = '<anonymous>' + name return self.type + ': ' + name --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---