Reviewers: yurys,

Description:
When we do native memory snapshot we counts only external string resources that
have been added to heap->external_string_table_.
I found that not all the strings that have external resources were added to this
table.
We do not add Symbols to the table probably because they have different
lifetime.
But these symbols also could have external resources. As example it could happen
when we assign innerHtml.
The simplest solution is to visit symbol_table too.

BUG=none
TEST=VisitExternalStrings
R=yurys


Please review this at https://chromiumcodereview.appspot.com/11315004/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/heap.cc
  M test/cctest/test-api.cc


Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index 909e7605b0f3094bec5a69472e8a38ed7eed4f5b..a51c790f636c084bd121dbb79005375b11022f0a 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -1586,6 +1586,7 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
     v8::ExternalResourceVisitor* visitor_;
   } visitor_adapter(visitor);
   external_string_table_.Iterate(&visitor_adapter);
+  symbol_table()->IterateElements(&visitor_adapter);
 }


Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 3be068009e275e53bb60903d812af6f841ab6069..fad9b7a2d3ccad4d60f46f18da7f96cd04cefc78 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -14816,11 +14816,13 @@ THREADED_TEST(GetHeapStatistics) {

 class VisitorImpl : public v8::ExternalResourceVisitor {
  public:
-  VisitorImpl(TestResource* r1, TestResource* r2)
+  VisitorImpl(TestResource* r1, TestResource* r2, TestResource* r3)
       : resource1_(r1),
         resource2_(r2),
+        resource3_(r3),
         found_resource1_(false),
-        found_resource2_(false) {}
+        found_resource2_(false),
+        found_resource3_(false) {}
   virtual ~VisitorImpl() {}
   virtual void VisitExternalString(v8::Handle<v8::String> string) {
     if (!string->IsExternal()) {
@@ -14838,17 +14840,24 @@ class VisitorImpl : public v8::ExternalResourceVisitor {
       CHECK(!found_resource2_);
       found_resource2_ = true;
     }
+    if (resource3_ == resource) {
+      CHECK(!found_resource3_);
+      found_resource3_ = true;
+    }
   }
   void CheckVisitedResources() {
     CHECK(found_resource1_);
     CHECK(found_resource2_);
+    CHECK(found_resource3_);
   }

  private:
   v8::String::ExternalStringResource* resource1_;
   v8::String::ExternalStringResource* resource2_;
+  v8::String::ExternalStringResource* resource3_;
   bool found_resource1_;
   bool found_resource2_;
+  bool found_resource3_;
 };

 TEST(VisitExternalStrings) {
@@ -14860,12 +14869,17 @@ TEST(VisitExternalStrings) {
   v8::Local<v8::String> string1 = v8::String::NewExternal(resource1);
   TestResource* resource2 = new TestResource(two_byte_string);
   v8::Local<v8::String> string2 = v8::String::NewExternal(resource2);
+  TestResource* resource3 = new TestResource(two_byte_string);
+  v8::Local<v8::String> symbol = v8::String::NewSymbol("a symbol string");
+  symbol->MakeExternal(resource3);

- // We need to add usages for string1 and string2 to avoid warnings in GCC 4.7
+  // We need to add usages for string1, string2 and symbol string
+  // to avoid warnings in GCC 4.7
   CHECK(string1->IsExternal());
   CHECK(string2->IsExternal());
+  CHECK(symbol->IsExternal());

-  VisitorImpl visitor(resource1, resource2);
+  VisitorImpl visitor(resource1, resource2, resource3);
   v8::V8::VisitExternalResources(&visitor);
   visitor.CheckVisitedResources();
 }


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to