| Index: runtime/vm/pages.cc
|
| diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
|
| index caea245f67de75df0201fe0dd9155d3adcabc02e..ff0fa5385a378d9f84e916bf6e48e45630285b90 100644
|
| --- a/runtime/vm/pages.cc
|
| +++ b/runtime/vm/pages.cc
|
| @@ -59,7 +59,7 @@ HeapPage* HeapPage::Initialize(VirtualMemory* memory, PageType type) {
|
| ASSERT(result != NULL);
|
| result->memory_ = memory;
|
| result->next_ = NULL;
|
| - result->executable_ = is_executable;
|
| + result->type_ = type;
|
| return result;
|
| }
|
|
|
| @@ -132,7 +132,7 @@ RawObject* HeapPage::FindObject(FindObjectVisitor* visitor) const {
|
| void HeapPage::WriteProtect(bool read_only) {
|
| VirtualMemory::Protection prot;
|
| if (read_only) {
|
| - if (executable_) {
|
| + if (type_ == kExecutable) {
|
| prot = VirtualMemory::kReadExecute;
|
| } else {
|
| prot = VirtualMemory::kReadOnly;
|
| @@ -665,7 +665,9 @@ void PageSpace::WriteProtect(bool read_only, bool include_code_pages) {
|
| AbandonBumpAllocation();
|
| }
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| - if ((it.page()->type() != HeapPage::kExecutable) || include_code_pages) {
|
| + HeapPage::PageType page_type = it.page()->type();
|
| + if ((page_type != HeapPage::kReadOnlyData) &&
|
| + ((page_type != HeapPage::kExecutable) || include_code_pages)) {
|
| it.page()->WriteProtect(read_only);
|
| }
|
| }
|
| @@ -1071,7 +1073,9 @@ uword PageSpace::TryAllocateSmiInitializedLocked(intptr_t size,
|
| }
|
|
|
|
|
| -void PageSpace::SetupInstructionsSnapshotPage(void* pointer, uword size) {
|
| +void PageSpace::SetupExternalPage(void* pointer,
|
| + uword size,
|
| + bool is_executable) {
|
| // Setup a HeapPage so precompiled Instructions can be traversed.
|
| // Instructions are contiguous at [pointer, pointer + size). HeapPage
|
| // expects to find objects at [memory->start() + ObjectStartOffset,
|
| @@ -1080,23 +1084,31 @@ void PageSpace::SetupInstructionsSnapshotPage(void* pointer, uword size) {
|
| pointer = reinterpret_cast<void*>(reinterpret_cast<uword>(pointer) - offset);
|
| size += offset;
|
|
|
| - ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
|
| -
|
| - VirtualMemory* memory = VirtualMemory::ForInstructionsSnapshot(pointer, size);
|
| + VirtualMemory* memory = VirtualMemory::ForExternalPage(pointer, size);
|
| ASSERT(memory != NULL);
|
| HeapPage* page = reinterpret_cast<HeapPage*>(malloc(sizeof(HeapPage)));
|
| page->memory_ = memory;
|
| page->next_ = NULL;
|
| page->object_end_ = memory->end();
|
| - page->executable_ = true;
|
|
|
| MutexLocker ml(pages_lock_);
|
| - if (exec_pages_ == NULL) {
|
| - exec_pages_ = page;
|
| + HeapPage** first, **tail;
|
| + if (is_executable) {
|
| + ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
|
| + page->type_ = HeapPage::kExecutable;
|
| + first = &exec_pages_;
|
| + tail = &exec_pages_tail_;
|
| + } else {
|
| + page->type_ = HeapPage::kReadOnlyData;
|
| + first = &pages_;
|
| + tail = &pages_tail_;
|
| + }
|
| + if (*first == NULL) {
|
| + *first = page;
|
| } else {
|
| - exec_pages_tail_->set_next(page);
|
| + (*tail)->set_next(page);
|
| }
|
| - exec_pages_tail_ = page;
|
| + (*tail) = page;
|
| }
|
|
|
|
|
|
|