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
-~----------~----~----~----~------~----~------~--~---

Reply via email to