From: yangguo@chromium.org Date: Fri, 22 Nov 2013 10:52:15 +0000 (+0000) Subject: Dispose external string resource on heap teardown. X-Git-Tag: upstream/4.7.83~11597 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3acd5dcdcef4f6ae1f287b8834fb81c4bf33793a;p=platform%2Fupstream%2Fv8.git 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 --- diff --git a/src/heap.cc b/src/heap.cc index b5fe184..f28c926 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -7816,7 +7816,13 @@ void ExternalStringTable::CleanUp() { 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(); + for (int i = 0; i < old_space_strings_.length(); ++i) { + heap_->FinalizeExternalString(ExternalString::cast(old_space_strings_[i])); + } old_space_strings_.Free(); } diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 761b402..7803c87 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -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 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) { double target; i::OS::MemCopy(&target, &value, sizeof(target));