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