| Index: runtime/vm/pages.cc
 | 
| diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
 | 
| index 6d959cda750bbb4a5311767f88289a3669522e83..450af9a63a0551bbb980258503f3c49964e9bac6 100644
 | 
| --- a/runtime/vm/pages.cc
 | 
| +++ b/runtime/vm/pages.cc
 | 
| @@ -229,16 +229,16 @@ HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
 | 
|    } else {
 | 
|      // Should not allocate executable pages when running from a precompiled
 | 
|      // snapshot.
 | 
| -    ASSERT(Dart::snapshot_kind() != Snapshot::kAppAOT);
 | 
| +    ASSERT(Dart::vm_snapshot_kind() != Snapshot::kAppAOT);
 | 
|  
 | 
|      if (exec_pages_ == NULL) {
 | 
|        exec_pages_ = page;
 | 
|      } else {
 | 
| -      if (FLAG_write_protect_code) {
 | 
| +      if (FLAG_write_protect_code && !exec_pages_tail_->embedder_allocated()) {
 | 
|          exec_pages_tail_->WriteProtect(false);
 | 
|        }
 | 
|        exec_pages_tail_->set_next(page);
 | 
| -      if (FLAG_write_protect_code) {
 | 
| +      if (FLAG_write_protect_code && !exec_pages_tail_->embedder_allocated()) {
 | 
|          exec_pages_tail_->WriteProtect(true);
 | 
|        }
 | 
|      }
 | 
| @@ -626,7 +626,7 @@ void PageSpace::VisitObjects(ObjectVisitor* visitor) const {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void PageSpace::VisitObjectsNoEmbedderPages(ObjectVisitor* visitor) const {
 | 
| +void PageSpace::VisitObjectsNoExternalPages(ObjectVisitor* visitor) const {
 | 
|    for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
 | 
|      if (!it.page()->embedder_allocated()) {
 | 
|        it.page()->VisitObjects(visitor);
 | 
| @@ -635,6 +635,15 @@ void PageSpace::VisitObjectsNoEmbedderPages(ObjectVisitor* visitor) const {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void PageSpace::VisitObjectsExternalPages(ObjectVisitor* visitor) const {
 | 
| +  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
 | 
| +    if (it.page()->embedder_allocated()) {
 | 
| +      it.page()->VisitObjects(visitor);
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void PageSpace::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
 | 
|    for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
 | 
|      it.page()->VisitObjectPointers(visitor);
 | 
| @@ -802,12 +811,15 @@ void PageSpace::WriteProtectCode(bool read_only) {
 | 
|      HeapPage* page = exec_pages_;
 | 
|      while (page != NULL) {
 | 
|        ASSERT(page->type() == HeapPage::kExecutable);
 | 
| -      page->WriteProtect(read_only);
 | 
| +      if (!page->embedder_allocated()) {
 | 
| +        page->WriteProtect(read_only);
 | 
| +      }
 | 
|        page = page->next();
 | 
|      }
 | 
|      page = large_pages_;
 | 
|      while (page != NULL) {
 | 
| -      if (page->type() == HeapPage::kExecutable) {
 | 
| +      if (page->type() == HeapPage::kExecutable &&
 | 
| +          !page->embedder_allocated()) {
 | 
|          page->WriteProtect(read_only);
 | 
|        }
 | 
|        page = page->next();
 | 
| @@ -1095,18 +1107,20 @@ void PageSpace::SetupExternalPage(void* pointer,
 | 
|      first = &exec_pages_;
 | 
|      tail = &exec_pages_tail_;
 | 
|    } else {
 | 
| -    page->type_ = HeapPage::kReadOnlyData;
 | 
| +    page->type_ = HeapPage::kData;
 | 
|      first = &pages_;
 | 
|      tail = &pages_tail_;
 | 
|    }
 | 
|    if (*first == NULL) {
 | 
|      *first = page;
 | 
|    } else {
 | 
| -    if (is_executable && FLAG_write_protect_code) {
 | 
| +    if (is_executable && FLAG_write_protect_code &&
 | 
| +        !(*tail)->embedder_allocated()) {
 | 
|        (*tail)->WriteProtect(false);
 | 
|      }
 | 
|      (*tail)->set_next(page);
 | 
| -    if (is_executable && FLAG_write_protect_code) {
 | 
| +    if (is_executable && FLAG_write_protect_code &&
 | 
| +        !(*tail)->embedder_allocated()) {
 | 
|        (*tail)->WriteProtect(true);
 | 
|      }
 | 
|    }
 | 
| 
 |