Reviewers: Mads Ager, Description: Extend the regression test case for crbug.com/9746 to make sure we actually get rid of the external string eventually.
Please review this at http://codereview.chromium.org/113022 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M test/cctest/test-strings.cc Index: test/cctest/test-strings.cc =================================================================== --- test/cctest/test-strings.cc (revision 1871) +++ test/cctest/test-strings.cc (working copy) @@ -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()); + Handle<String> key_string = Factory::NewStringFromAscii(key_vector); + String* out; + CHECK(!Heap::LookupSymbolIfExists(*key_string, &out)); - // 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 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 -~----------~----~----~----~------~----~------~--~---
