Dispose external string resource on heap teardown.

R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/83253002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18001 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
yangguo@chromium.org 2013-11-22 10:52:15 +00:00
parent 21fb1401bd
commit 3acd5dcdce
2 changed files with 26 additions and 0 deletions

View File

@ -7816,7 +7816,13 @@ void ExternalStringTable::CleanUp() {
void ExternalStringTable::TearDown() { void ExternalStringTable::TearDown() {
for (int i = 0; i < new_space_strings_.length(); ++i) {
heap_->FinalizeExternalString(ExternalString::cast(new_space_strings_[i]));
}
new_space_strings_.Free(); new_space_strings_.Free();
for (int i = 0; i < old_space_strings_.length(); ++i) {
heap_->FinalizeExternalString(ExternalString::cast(old_space_strings_[i]));
}
old_space_strings_.Free(); old_space_strings_.Free();
} }

View File

@ -17188,6 +17188,26 @@ TEST(VisitExternalStrings) {
} }
TEST(ExternalStringCollectedAtTearDown) {
int destroyed = 0;
v8::Isolate* isolate = v8::Isolate::New();
{ v8::Isolate::Scope isolate_scope(isolate);
v8::HandleScope handle_scope(isolate);
const char* s = "One string to test them all, one string to find them.";
TestAsciiResource* inscription =
new TestAsciiResource(i::StrDup(s), &destroyed);
v8::Local<v8::String> ring = v8::String::NewExternal(inscription);
// Ring is still alive. Orcs are roaming freely across our lands.
CHECK_EQ(0, destroyed);
USE(ring);
}
isolate->Dispose();
// Ring has been destroyed. Free Peoples of Middle-earth Rejoice.
CHECK_EQ(1, destroyed);
}
static double DoubleFromBits(uint64_t value) { static double DoubleFromBits(uint64_t value) {
double target; double target;
i::OS::MemCopy(&target, &value, sizeof(target)); i::OS::MemCopy(&target, &value, sizeof(target));