Commit 055367af authored by kasperl@chromium.org's avatar kasperl@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1872 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent beb5161b
...@@ -431,6 +431,7 @@ TEST(Regress9746) { ...@@ -431,6 +431,7 @@ TEST(Regress9746) {
for (int i = 0; i < kFullStringLength; i++) source[i] = '1'; for (int i = 0; i < kFullStringLength; i++) source[i] = '1';
char* key = new char[kSliceStringLength]; char* key = new char[kSliceStringLength];
for (int i = 0; i < kSliceStringLength; i++) key[i] = '1'; 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 // Allocate an external string resource that keeps track of when it
// is destructed. // is destructed.
...@@ -482,16 +483,33 @@ TEST(Regress9746) { ...@@ -482,16 +483,33 @@ TEST(Regress9746) {
Heap::CollectAllGarbage(); Heap::CollectAllGarbage();
CHECK(!resource_destructed); 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; v8::HandleScope scope;
Vector<const char> vector(key, kSliceStringLength); Handle<String> key_string = Factory::NewStringFromAscii(key_vector);
Handle<String> symbol = Factory::LookupSymbol(vector); String* out;
CHECK(StringShape(*symbol).IsSliced()); CHECK(!Heap::LookupSymbolIfExists(*key_string, &out));
// Make sure the buffer is still a two-byte external string. // Forcing yet another garbage collection must allow us to finally
Handle<String> buffer(Handle<SlicedString>::cast(symbol)->buffer()); // get rid of the external string.
CHECK(StringShape(*buffer).IsExternal()); Heap::CollectAllGarbage();
CHECK(buffer->IsTwoByteRepresentation()); CHECK(resource_destructed);
delete[] source; delete[] source;
delete[] key; delete[] key;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment