Author: [email protected]
Date: Tue Mar 10 08:08:45 2009
New Revision: 1481

Modified:
    branches/bleeding_edge/src/accessors.cc
    branches/bleeding_edge/src/compiler.cc
    branches/bleeding_edge/src/handles.cc
    branches/bleeding_edge/src/handles.h
    branches/bleeding_edge/src/objects.cc
    branches/bleeding_edge/src/objects.h
    branches/bleeding_edge/test/cctest/test-compiler.cc

Log:
Move InitLineEnds and GetLineNumber to handles.cc to avoid
issues with a raw this pointer and GC.

Fix issue with FlattenString where we may keep a StringShape
alive across a GC.
Review URL: http://codereview.chromium.org/43020

Modified: branches/bleeding_edge/src/accessors.cc
==============================================================================
--- branches/bleeding_edge/src/accessors.cc     (original)
+++ branches/bleeding_edge/src/accessors.cc     Tue Mar 10 08:08:45 2009
@@ -275,9 +275,10 @@


  Object* Accessors::ScriptGetLineEnds(Object* object, void*) {
-  Object* script = JSValue::cast(object)->value();
-  Script::cast(script)->InitLineEnds();
-  return Script::cast(script)->line_ends();
+  HandleScope scope;
+  Handle<Script> script(Script::cast(JSValue::cast(object)->value()));
+  InitScriptLineEnds(script);
+  return script->line_ends();
  }



Modified: branches/bleeding_edge/src/compiler.cc
==============================================================================
--- branches/bleeding_edge/src/compiler.cc      (original)
+++ branches/bleeding_edge/src/compiler.cc      Tue Mar 10 08:08:45 2009
@@ -317,7 +317,7 @@
    // the line number is not for free.
    if (Logger::is_enabled() || OProfileAgent::is_enabled()) {
      if (script->name()->IsString()) {
-      int line_num = script->GetLineNumber(start_position);
+      int line_num = GetScriptLineNumber(script, start_position);
        if (line_num > 0) {
          line_num += script->line_offset()->value() + 1;
        }

Modified: branches/bleeding_edge/src/handles.cc
==============================================================================
--- branches/bleeding_edge/src/handles.cc       (original)
+++ branches/bleeding_edge/src/handles.cc       Tue Mar 10 08:08:45 2009
@@ -186,9 +186,7 @@


  void FlattenString(Handle<String> string) {
-  StringShape shape(*string);
-  if (string->IsFlat(shape)) return;
-  CALL_HEAP_FUNCTION_VOID(string->TryFlatten(shape));
+   
CALL_HEAP_FUNCTION_VOID(string->TryFlattenIfNotFlat(StringShape(*string)));
    ASSERT(string->IsFlat(StringShape(*string)));
  }

@@ -340,6 +338,78 @@
    GlobalHandles::MakeWeak(handle.location(), NULL, &ClearWrapperCache);
     
script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location()));
    return result;
+}
+
+
+// Init line_ends array with code positions of line ends inside script
+// source.
+void InitScriptLineEnds(Handle<Script> script) {
+  if (!script->line_ends()->IsUndefined()) return;
+
+  if (!script->source()->IsString()) {
+    ASSERT(script->source()->IsUndefined());
+    script->set_line_ends(*(Factory::NewJSArray(0)));
+    ASSERT(script->line_ends()->IsJSArray());
+    return;
+  }
+
+  Handle<String> src(String::cast(script->source()));
+  const int src_len = src->length();
+  Handle<String> new_line = Factory::NewStringFromAscii(CStrVector("\n"));
+
+  // Pass 1: Identify line count.
+  int line_count = 0;
+  int position = 0;
+  while (position != -1 && position < src_len) {
+    position = Runtime::StringMatch(src, new_line, position);
+    if (position != -1) {
+      position++;
+    }
+    // Even if the last line misses a line end, it is counted.
+    line_count++;
+  }
+
+  // Pass 2: Fill in line ends positions
+  Handle<FixedArray> array = Factory::NewFixedArray(line_count);
+  int array_index = 0;
+  position = 0;
+  while (position != -1 && position < src_len) {
+    position = Runtime::StringMatch(src, new_line, position);
+    // If the script does not end with a line ending add the final end
+    // position as just past the last line ending.
+    array->set(array_index++,
+               Smi::FromInt(position != -1 ? position++ : src_len));
+  }
+  ASSERT(array_index == line_count);
+
+  Handle<JSArray> object = Factory::NewJSArrayWithElements(array);
+  script->set_line_ends(*object);
+  ASSERT(script->line_ends()->IsJSArray());
+}
+
+
+// Convert code position into line number.
+int GetScriptLineNumber(Handle<Script> script, int code_pos) {
+  InitScriptLineEnds(script);
+  AssertNoAllocation no_allocation;
+  JSArray* line_ends_array = JSArray::cast(script->line_ends());
+  const int line_ends_len =  
(Smi::cast(line_ends_array->length()))->value();
+
+  int line = -1;
+  if (line_ends_len > 0 &&
+      code_pos <= (Smi::cast(line_ends_array->GetElement(0)))->value()) {
+    line = 0;
+  } else {
+    for (int i = 1; i < line_ends_len; ++i) {
+      if ((Smi::cast(line_ends_array->GetElement(i - 1)))->value() <  
code_pos &&
+          code_pos <=  
(Smi::cast(line_ends_array->GetElement(i)))->value()) {
+        line = i;
+        break;
+      }
+    }
+  }
+
+  return line != -1 ? line + script->line_offset()->value() : line;
  }



Modified: branches/bleeding_edge/src/handles.h
==============================================================================
--- branches/bleeding_edge/src/handles.h        (original)
+++ branches/bleeding_edge/src/handles.h        Tue Mar 10 08:08:45 2009
@@ -225,6 +225,10 @@
  // if none exists.
  Handle<JSValue> GetScriptWrapper(Handle<Script> script);

+// Script line number computations.
+void InitScriptLineEnds(Handle<Script> script);
+int GetScriptLineNumber(Handle<Script> script, int code_position);
+
  // Computes the enumerable keys from interceptors. Used for debug mirrors  
and
  // by GetKeysInFixedArrayFor below.
  v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver,

Modified: branches/bleeding_edge/src/objects.cc
==============================================================================
--- branches/bleeding_edge/src/objects.cc       (original)
+++ branches/bleeding_edge/src/objects.cc       Tue Mar 10 08:08:45 2009
@@ -6959,76 +6959,6 @@
  }


-// Init line_ends array with code positions of line ends inside script  
source
-void Script::InitLineEnds() {
-  if (!line_ends()->IsUndefined()) return;
-
-  if (!source()->IsString()) {
-    ASSERT(source()->IsUndefined());
-    set_line_ends(*(Factory::NewJSArray(0)));
-    ASSERT(line_ends()->IsJSArray());
-    return;
-  }
-
-  Handle<String> src(String::cast(source()));
-  const int src_len = src->length();
-  Handle<String> new_line = Factory::NewStringFromAscii(CStrVector("\n"));
-
-  // Pass 1: Identify line count
-  int line_count = 0;
-  int position = 0;
-  while (position != -1 && position < src_len) {
-    position = Runtime::StringMatch(src, new_line, position);
-    if (position != -1) {
-      position++;
-    }
-    // Even if the last line misses a line end, it is counted
-    line_count++;
-  }
-
-  // Pass 2: Fill in line ends positions
-  Handle<FixedArray> array = Factory::NewFixedArray(line_count);
-  int array_index = 0;
-  position = 0;
-  while (position != -1 && position < src_len) {
-    position = Runtime::StringMatch(src, new_line, position);
-    // If the script does not end with a line ending add the final end  
position
-    // as just past the last line ending.
-    array->set(array_index++,
-               Smi::FromInt(position != -1 ? position++ : src_len));
-  }
-  ASSERT(array_index == line_count);
-
-  Handle<JSArray> object = Factory::NewJSArrayWithElements(array);
-  set_line_ends(*object);
-  ASSERT(line_ends()->IsJSArray());
-}
-
-
-// Convert code position into line number
-int Script::GetLineNumber(int code_pos) {
-  InitLineEnds();
-  JSArray* line_ends_array = JSArray::cast(line_ends());
-  const int line_ends_len =  
(Smi::cast(line_ends_array->length()))->value();
-
-  int line = -1;
-  if (line_ends_len > 0 &&
-      code_pos <= (Smi::cast(line_ends_array->GetElement(0)))->value()) {
-    line = 0;
-  } else {
-    for (int i = 1; i < line_ends_len; ++i) {
-      if ((Smi::cast(line_ends_array->GetElement(i - 1)))->value() <  
code_pos &&
-          code_pos <=  
(Smi::cast(line_ends_array->GetElement(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: branches/bleeding_edge/src/objects.h
==============================================================================
--- branches/bleeding_edge/src/objects.h        (original)
+++ branches/bleeding_edge/src/objects.h        Tue Mar 10 08:08:45 2009
@@ -2576,9 +2576,6 @@
    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;

Modified: branches/bleeding_edge/test/cctest/test-compiler.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-compiler.cc (original)
+++ branches/bleeding_edge/test/cctest/test-compiler.cc Tue Mar 10 08:08:45  
2009
@@ -312,7 +312,7 @@

    Handle<Script> script = Factory::NewScript(Factory::empty_string());
    script->set_source(Heap::undefined_value());
-  CHECK_EQ(-1, script->GetLineNumber(0));
-  CHECK_EQ(-1, script->GetLineNumber(100));
-  CHECK_EQ(-1, script->GetLineNumber(-1));
+  CHECK_EQ(-1, GetScriptLineNumber(script, 0));
+  CHECK_EQ(-1, GetScriptLineNumber(script, 100));
+  CHECK_EQ(-1, GetScriptLineNumber(script, -1));
  }

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to