@@ -2019,7 +2019,12 @@ RawError* Object::Init(Isolate* isolate,
20192019bool Object::InVMHeap() const {
20202020 if (FLAG_verify_handles && raw()->IsVMHeapObject()) {
20212021 Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
2022- ASSERT(vm_isolate_heap->Contains(RawObject::ToAddr(raw())));
2022+ uword addr = RawObject::ToAddr(raw());
2023+ if (!vm_isolate_heap->Contains(addr)) {
2024+ ASSERT(FLAG_write_protect_code);
2025+ addr = RawObject::ToAddr(HeapPage::ToWritable(raw()));
2026+ ASSERT(vm_isolate_heap->Contains(addr));
2027+ }
20232028 }
20242029 return raw()->IsVMHeapObject();
20252030}
@@ -2080,8 +2085,12 @@ void Object::CheckHandle() const {
20802085 Isolate* isolate = Isolate::Current();
20812086 Heap* isolate_heap = isolate->heap();
20822087 Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
2083- ASSERT(isolate_heap->Contains(RawObject::ToAddr(raw_)) ||
2084- vm_isolate_heap->Contains(RawObject::ToAddr(raw_)));
2088+ uword addr = RawObject::ToAddr(raw_);
2089+ if (!isolate_heap->Contains(addr) && !vm_isolate_heap->Contains(addr)) {
2090+ ASSERT(FLAG_write_protect_code);
2091+ addr = RawObject::ToAddr(HeapPage::ToWritable(raw_));
2092+ ASSERT(isolate_heap->Contains(addr) || vm_isolate_heap->Contains(addr));
2093+ }
20852094 }
20862095 }
20872096#endif
@@ -14569,6 +14578,24 @@ RawCode* Code::FinalizeCode(FlowGraphCompiler* compiler,
1456914578 object->raw());
1457014579 }
1457114580
14581+ // Write protect instructions and, if supported by OS, use dual mapping
14582+ // for execution.
14583+ if (FLAG_write_protect_code) {
14584+ uword address = RawObject::ToAddr(instrs.raw());
14585+ // Check if a dual mapping exists.
14586+ instrs = Instructions::RawCast(HeapPage::ToExecutable(instrs.raw()));
14587+ uword exec_address = RawObject::ToAddr(instrs.raw());
14588+ if (exec_address != address) {
14589+ VirtualMemory::Protect(reinterpret_cast<void*>(address),
14590+ instrs.raw()->HeapSize(),
14591+ VirtualMemory::kReadOnly);
14592+ address = exec_address;
14593+ }
14594+ VirtualMemory::Protect(reinterpret_cast<void*>(address),
14595+ instrs.raw()->HeapSize(),
14596+ VirtualMemory::kReadExecute);
14597+ }
14598+
1457214599 // Hook up Code and Instructions objects.
1457314600 code.SetActiveInstructions(instrs);
1457414601 code.set_instructions(instrs);
@@ -14579,13 +14606,6 @@ RawCode* Code::FinalizeCode(FlowGraphCompiler* compiler,
1457914606 code.set_object_pool(object_pool->raw());
1458014607 }
1458114608
14582- if (FLAG_write_protect_code) {
14583- uword address = RawObject::ToAddr(instrs.raw());
14584- VirtualMemory::Protect(reinterpret_cast<void*>(address),
14585- instrs.raw()->HeapSize(),
14586- VirtualMemory::kReadExecute);
14587- }
14588-
1458914609#if defined(DART_PRECOMPILER)
1459014610 if (stats != nullptr) {
1459114611 stats->Finalize();
0 commit comments