| Index: runtime/vm/object.cc | 
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc | 
| index b138c2a23a38dbecbbe9b1d08e3abdb3194154ff..833f31903f0c540e77eaa594a3cfdbb9d5932448 100644 | 
| --- a/runtime/vm/object.cc | 
| +++ b/runtime/vm/object.cc | 
| @@ -9561,7 +9561,7 @@ RawCode* Code::New(intptr_t pointer_offsets_length) { | 
| result ^= raw; | 
| result.set_pointer_offsets_length(pointer_offsets_length); | 
| result.set_is_optimized(false); | 
| -    result.set_is_alive(true); | 
| +    result.set_is_alive(false); | 
| result.set_comments(Comments::New(0)); | 
| } | 
| return result.raw(); | 
| @@ -9573,7 +9573,11 @@ RawCode* Code::FinalizeCode(const char* name, | 
| bool optimized) { | 
| ASSERT(assembler != NULL); | 
|  | 
| -  // Allocate the Instructions object. | 
| +  // Allocate the Code and Instructions objects.  Code is allocated first | 
| +  // because a GC during allocation of the code will leave the instruction | 
| +  // pages read-only. | 
| +  intptr_t pointer_offset_count = assembler->CountPointerOffsets(); | 
| +  Code& code = Code::ZoneHandle(Code::New(pointer_offset_count)); | 
| Instructions& instrs = | 
| Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); | 
|  | 
| @@ -9590,17 +9594,15 @@ RawCode* Code::FinalizeCode(const char* name, | 
| instrs.size(), | 
| optimized); | 
|  | 
| -  const ZoneGrowableArray<intptr_t>& pointer_offsets = | 
| -      assembler->GetPointerOffsets(); | 
| - | 
| -  // Allocate the code object. | 
| -  Code& code = Code::ZoneHandle(Code::New(pointer_offsets.length())); | 
| { | 
| NoGCScope no_gc; | 
| +    const ZoneGrowableArray<intptr_t>& pointer_offsets = | 
| +        assembler->GetPointerOffsets(); | 
| +    ASSERT(pointer_offsets.length() == pointer_offset_count); | 
| +    ASSERT(code.pointer_offsets_length() == pointer_offsets.length()); | 
|  | 
| // Set pointer offsets list in Code object and resolve all handles in | 
| // the instruction stream to raw objects. | 
| -    ASSERT(code.pointer_offsets_length() == pointer_offsets.length()); | 
| for (intptr_t i = 0; i < pointer_offsets.length(); i++) { | 
| intptr_t offset_in_instrs = pointer_offsets[i]; | 
| code.SetPointerOffsetAt(i, offset_in_instrs); | 
| @@ -9611,6 +9613,7 @@ RawCode* Code::FinalizeCode(const char* name, | 
| // Hook up Code and Instructions objects. | 
| instrs.set_code(code.raw()); | 
| code.set_instructions(instrs.raw()); | 
| +    code.set_is_alive(true); | 
|  | 
| // Set object pool in Instructions object. | 
| const GrowableObjectArray& object_pool = assembler->object_pool(); | 
| @@ -9622,6 +9625,11 @@ RawCode* Code::FinalizeCode(const char* name, | 
| // GrowableObjectArray in new space. | 
| instrs.set_object_pool(Array::MakeArray(object_pool)); | 
| } | 
| +    bool status = | 
| +        VirtualMemory::Protect(reinterpret_cast<void*>(instrs.raw_ptr()), | 
| +                               instrs.raw()->Size(), | 
| +                               VirtualMemory::kReadExecute); | 
| +    ASSERT(status); | 
| } | 
| return code.raw(); | 
| } | 
|  |