| Index: src/serialize.cc
 | 
| diff --git a/src/serialize.cc b/src/serialize.cc
 | 
| index 8a383db1430dd273a2728aeded5794c705c69f2d..d5d06a0677f51daa36381a3181ff073d94886d44 100644
 | 
| --- a/src/serialize.cc
 | 
| +++ b/src/serialize.cc
 | 
| @@ -2046,14 +2046,12 @@ void Serializer::ObjectSerializer::VisitExternalOneByteString(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -static Code* CloneCodeObject(HeapObject* code) {
 | 
| -  Address copy = new byte[code->Size()];
 | 
| -  MemCopy(copy, code->address(), code->Size());
 | 
| -  return Code::cast(HeapObject::FromAddress(copy));
 | 
| -}
 | 
| -
 | 
| -
 | 
| -static void WipeOutRelocations(Code* code) {
 | 
| +Address Serializer::ObjectSerializer::PrepareCode() {
 | 
| +  // To make snapshots reproducible, we make a copy of the code object
 | 
| +  // and wipe all pointers in the copy, which we then serialize.
 | 
| +  Code* code = serializer_->CopyCode(Code::cast(object_));
 | 
| +  // Code age headers are not serializable.
 | 
| +  code->MakeYoung(serializer_->isolate());
 | 
|    int mode_mask =
 | 
|        RelocInfo::kCodeTargetMask |
 | 
|        RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
 | 
| @@ -2064,6 +2062,10 @@ static void WipeOutRelocations(Code* code) {
 | 
|        it.rinfo()->WipeOut();
 | 
|      }
 | 
|    }
 | 
| +  // We need to wipe out the header fields *after* wiping out the
 | 
| +  // relocations, because some of these fields are needed for the latter.
 | 
| +  code->WipeOutHeader();
 | 
| +  return code->address();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2101,17 +2103,7 @@ int Serializer::ObjectSerializer::OutputRawData(
 | 
|        sink_->PutInt(bytes_to_output, "length");
 | 
|      }
 | 
|  
 | 
| -    // To make snapshots reproducible, we need to wipe out all pointers in code.
 | 
| -    if (code_object_) {
 | 
| -      Code* code = CloneCodeObject(object_);
 | 
| -      // Code age headers are not serializable.
 | 
| -      code->MakeYoung(serializer_->isolate());
 | 
| -      WipeOutRelocations(code);
 | 
| -      // We need to wipe out the header fields *after* wiping out the
 | 
| -      // relocations, because some of these fields are needed for the latter.
 | 
| -      code->WipeOutHeader();
 | 
| -      object_start = code->address();
 | 
| -    }
 | 
| +    if (code_object_) object_start = PrepareCode();
 | 
|  
 | 
|      const char* description = code_object_ ? "Code" : "Byte";
 | 
|  #ifdef MEMORY_SANITIZER
 | 
| @@ -2119,7 +2111,6 @@ int Serializer::ObjectSerializer::OutputRawData(
 | 
|      MSAN_MEMORY_IS_INITIALIZED(object_start + base, bytes_to_output);
 | 
|  #endif  // MEMORY_SANITIZER
 | 
|      sink_->PutRaw(object_start + base, bytes_to_output, description);
 | 
| -    if (code_object_) delete[] object_start;
 | 
|    }
 | 
|    if (to_skip != 0 && return_skip == kIgnoringReturn) {
 | 
|      sink_->Put(kSkip, "Skip");
 | 
| @@ -2178,6 +2169,14 @@ void Serializer::InitializeCodeAddressMap() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +Code* Serializer::CopyCode(Code* code) {
 | 
| +  code_buffer_.Rewind(0);  // Clear buffer without deleting backing store.
 | 
| +  int size = code->CodeSize();
 | 
| +  code_buffer_.AddAll(Vector<byte>(code->address(), size));
 | 
| +  return Code::cast(HeapObject::FromAddress(&code_buffer_.first()));
 | 
| +}
 | 
| +
 | 
| +
 | 
|  ScriptData* CodeSerializer::Serialize(Isolate* isolate,
 | 
|                                        Handle<SharedFunctionInfo> info,
 | 
|                                        Handle<String> source) {
 | 
| 
 |