Author: [email protected]
Date: Tue May  5 23:20:35 2009
New Revision: 1872

Modified:
    branches/bleeding_edge/test/cctest/test-strings.cc

Log:
Extend the regression test case for crbug.com/9746 to
make sure we actually get rid of the external string
eventually.
Review URL: http://codereview.chromium.org/113022

Modified: branches/bleeding_edge/test/cctest/test-strings.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-strings.cc  (original)
+++ branches/bleeding_edge/test/cctest/test-strings.cc  Tue May  5 23:20:35  
2009
@@ -431,6 +431,7 @@
    for (int i = 0; i < kFullStringLength; i++) source[i] = '1';
    char* key = new char[kSliceStringLength];
    for (int i = 0; i < kSliceStringLength; i++) key[i] = '1';
+  Vector<const char> key_vector(key, kSliceStringLength);

    // Allocate an external string resource that keeps track of when it
    // is destructed.
@@ -482,16 +483,33 @@
    Heap::CollectAllGarbage();
    CHECK(!resource_destructed);

-  // Make sure the sliced symbol is still in the table.
+  {
+    v8::HandleScope scope;
+
+    // Make sure the sliced symbol is still in the table.
+    Handle<String> symbol = Factory::LookupSymbol(key_vector);
+    CHECK(StringShape(*symbol).IsSliced());
+
+    // Make sure the buffer is still a two-byte external string.
+    Handle<String> buffer(Handle<SlicedString>::cast(symbol)->buffer());
+    CHECK(StringShape(*buffer).IsExternal());
+    CHECK(buffer->IsTwoByteRepresentation());
+  }
+
+  // Forcing another garbage collection should let us get rid of the
+  // slice from the symbol table. The external string remains in the
+  // heap until the next GC.
+  Heap::CollectAllGarbage();
+  CHECK(!resource_destructed);
    v8::HandleScope scope;
-  Vector<const char> vector(key, kSliceStringLength);
-  Handle<String> symbol = Factory::LookupSymbol(vector);
-  CHECK(StringShape(*symbol).IsSliced());
-
-  // Make sure the buffer is still a two-byte external string.
-  Handle<String> buffer(Handle<SlicedString>::cast(symbol)->buffer());
-  CHECK(StringShape(*buffer).IsExternal());
-  CHECK(buffer->IsTwoByteRepresentation());
+  Handle<String> key_string = Factory::NewStringFromAscii(key_vector);
+  String* out;
+  CHECK(!Heap::LookupSymbolIfExists(*key_string, &out));
+
+  // Forcing yet another garbage collection must allow us to finally
+  // get rid of the external string.
+  Heap::CollectAllGarbage();
+  CHECK(resource_destructed);

    delete[] source;
    delete[] key;

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

Reply via email to