| Index: runtime/vm/snapshot_test.cc
 | 
| diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
 | 
| index 2cd08d5c5a0cef93b80028c67c40a412e122b59b..bb8fe8f453b77df7d54c81a3a0224886e960173a 100644
 | 
| --- a/runtime/vm/snapshot_test.cc
 | 
| +++ b/runtime/vm/snapshot_test.cc
 | 
| @@ -38,15 +38,34 @@ static bool Equals(const Object& expected, const Object& actual) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
 | 
| +static uint8_t* malloc_allocator(
 | 
| +    uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
 | 
|    return reinterpret_cast<uint8_t*>(realloc(ptr, new_size));
 | 
|  }
 | 
|  
 | 
|  
 | 
| +static uint8_t* zone_allocator(
 | 
| +    uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
 | 
| +  Zone* zone = Isolate::Current()->current_zone();
 | 
| +  return reinterpret_cast<uint8_t*>(
 | 
| +      zone->Reallocate(reinterpret_cast<uword>(ptr), old_size, new_size));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +static Dart_CMessage* DecodeMessage(uint8_t* message,
 | 
| +                                    intptr_t length,
 | 
| +                                    ReAlloc allocator) {
 | 
| +  CMessageReader message_reader(message, length, allocator);
 | 
| +  return message_reader.ReadMessage();
 | 
| +}
 | 
| +
 | 
| +
 | 
|  TEST_CASE(SerializeNull) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Object& null_object = Object::Handle();
 | 
|    writer.WriteObject(null_object.raw());
 | 
|    writer.FinalizeBuffer();
 | 
| @@ -60,20 +79,21 @@ TEST_CASE(SerializeNull) {
 | 
|    EXPECT(Equals(null_object, serialized_object));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                        writer.BytesWritten(),
 | 
| -                        &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_NOTNULL(cobject);
 | 
|    EXPECT_EQ(Dart_CObject::kNull, cobject->type);
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeSmi1) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Smi& smi = Smi::Handle(Smi::New(124));
 | 
|    writer.WriteObject(smi.raw());
 | 
|    writer.FinalizeBuffer();
 | 
| @@ -87,21 +107,22 @@ TEST_CASE(SerializeSmi1) {
 | 
|    EXPECT(Equals(smi, serialized_object));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_NOTNULL(cobject);
 | 
|    EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
 | 
|    EXPECT_EQ(smi.Value(), cobject->value.as_int32);
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeSmi2) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Smi& smi = Smi::Handle(Smi::New(-1));
 | 
|    writer.WriteObject(smi.raw());
 | 
|    writer.FinalizeBuffer();
 | 
| @@ -115,21 +136,22 @@ TEST_CASE(SerializeSmi2) {
 | 
|    EXPECT(Equals(smi, serialized_object));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_NOTNULL(cobject);
 | 
|    EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
 | 
|    EXPECT_EQ(smi.Value(), cobject->value.as_int32);
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeDouble) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Double& dbl = Double::Handle(Double::New(101.29));
 | 
|    writer.WriteObject(dbl.raw());
 | 
|    writer.FinalizeBuffer();
 | 
| @@ -143,21 +165,22 @@ TEST_CASE(SerializeDouble) {
 | 
|    EXPECT(Equals(dbl, serialized_object));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_NOTNULL(cobject);
 | 
|    EXPECT_EQ(Dart_CObject::kDouble, cobject->type);
 | 
|    EXPECT_EQ(dbl.value(), cobject->value.as_double);
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeBool) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Bool& bool1 = Bool::Handle(Bool::True());
 | 
|    const Bool& bool2 = Bool::Handle(Bool::False());
 | 
|    writer.WriteObject(bool1.raw());
 | 
| @@ -171,28 +194,63 @@ TEST_CASE(SerializeBool) {
 | 
|    SnapshotReader reader(snapshot, Isolate::Current());
 | 
|    EXPECT(Bool::True() == reader.ReadObject());
 | 
|    EXPECT(Bool::False() == reader.ReadObject());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST_CASE(SerializeTrue) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
| +  // Write snapshot with true object.
 | 
| +  uint8_t* buffer;
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
| +  const Bool& bl = Bool::Handle(Bool::True());
 | 
| +  writer.WriteObject(bl.raw());
 | 
| +  writer.FinalizeBuffer();
 | 
| +
 | 
| +  // Create a snapshot object using the buffer.
 | 
| +  Snapshot::SetupFromBuffer(buffer);
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject1 = mreader.ReadObject();
 | 
| -  EXPECT_NOTNULL(cobject1);
 | 
| -  EXPECT_EQ(Dart_CObject::kBool, cobject1->type);
 | 
| -  EXPECT_EQ(true, cobject1->value.as_bool);
 | 
| -  Dart_CObject* cobject2 = mreader.ReadObject();
 | 
| -  EXPECT_NOTNULL(cobject2);
 | 
| -  EXPECT_EQ(Dart_CObject::kBool, cobject2->type);
 | 
| -  EXPECT_EQ(false, cobject2->value.as_bool);
 | 
| -  free(cobject1);
 | 
| -  free(cobject2);
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
| +  EXPECT_NOTNULL(cobject);
 | 
| +  EXPECT_EQ(Dart_CObject::kBool, cobject->type);
 | 
| +  EXPECT_EQ(true, cobject->value.as_bool);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST_CASE(SerializeFalse) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
| +  // Write snapshot with false object.
 | 
| +  uint8_t* buffer;
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
| +  const Bool& bl = Bool::Handle(Bool::False());
 | 
| +  writer.WriteObject(bl.raw());
 | 
| +  writer.FinalizeBuffer();
 | 
| +
 | 
| +  // Create a snapshot object using the buffer.
 | 
| +  Snapshot::SetupFromBuffer(buffer);
 | 
| +
 | 
| +  // Read object back from the snapshot into a C structure.
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
| +  EXPECT_NOTNULL(cobject);
 | 
| +  EXPECT_EQ(Dart_CObject::kBool, cobject->type);
 | 
| +  EXPECT_EQ(false, cobject->value.as_bool);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeBigint) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL));
 | 
|    writer.WriteObject(bigint.raw());
 | 
|    writer.FinalizeBuffer();
 | 
| @@ -208,10 +266,10 @@ TEST_CASE(SerializeBigint) {
 | 
|    EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    // Bigint not supported.
 | 
|    EXPECT(cobject == NULL);
 | 
|  }
 | 
| @@ -220,7 +278,7 @@ TEST_CASE(SerializeBigint) {
 | 
|  TEST_CASE(SerializeSingletons) {
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &malloc_allocator);
 | 
|    writer.WriteObject(Object::class_class());
 | 
|    writer.WriteObject(Object::null_class());
 | 
|    writer.WriteObject(Object::type_class());
 | 
| @@ -266,13 +324,17 @@ TEST_CASE(SerializeSingletons) {
 | 
|    EXPECT(Object::exception_handlers_class() == reader.ReadObject());
 | 
|    EXPECT(Object::context_class() == reader.ReadObject());
 | 
|    EXPECT(Object::context_scope_class() == reader.ReadObject());
 | 
| +
 | 
| +  free(buffer);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeString) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    static const char* cstr = "This string shall be serialized";
 | 
|    String& str = String::Handle(String::New(cstr));
 | 
|    writer.WriteObject(str.raw());
 | 
| @@ -288,20 +350,21 @@ TEST_CASE(SerializeString) {
 | 
|    EXPECT(str.Equals(serialized_str));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_EQ(Dart_CObject::kString, cobject->type);
 | 
|    EXPECT_STREQ(cstr, cobject->value.as_string);
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeArray) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const int kArrayLength = 10;
 | 
|    Array& array = Array::Handle(Array::New(kArrayLength));
 | 
|    Smi& smi = Smi::Handle();
 | 
| @@ -322,26 +385,26 @@ TEST_CASE(SerializeArray) {
 | 
|    EXPECT(array.Equals(serialized_array));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_EQ(Dart_CObject::kArray, cobject->type);
 | 
|    EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
 | 
|    for (int i = 0; i < kArrayLength; i++) {
 | 
|      Dart_CObject* element = cobject->value.as_array.values[i];
 | 
|      EXPECT_EQ(Dart_CObject::kInt32, element->type);
 | 
|      EXPECT_EQ(i, element->value.as_int32);
 | 
| -    free(element);
 | 
|    }
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  TEST_CASE(SerializeEmptyArray) {
 | 
| +  Zone zone(Isolate::Current());
 | 
| +
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const int kArrayLength = 0;
 | 
|    Array& array = Array::Handle(Array::New(kArrayLength));
 | 
|    writer.WriteObject(array.raw());
 | 
| @@ -357,14 +420,13 @@ TEST_CASE(SerializeEmptyArray) {
 | 
|    EXPECT(array.Equals(serialized_array));
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* cobject = mreader.ReadObject();
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
|    EXPECT_EQ(Dart_CObject::kArray, cobject->type);
 | 
|    EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
 | 
|    EXPECT(cobject->value.as_array.values == NULL);
 | 
| -  free(cobject);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -385,7 +447,7 @@ TEST_CASE(SerializeScript) {
 | 
|  
 | 
|    // Write snapshot with object content.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kScript, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kScript, &buffer, &malloc_allocator);
 | 
|    writer.WriteObject(script.raw());
 | 
|    writer.FinalizeBuffer();
 | 
|  
 | 
| @@ -415,6 +477,8 @@ TEST_CASE(SerializeScript) {
 | 
|      actual_literal ^= serialized_tokens.LiteralAt(i);
 | 
|      EXPECT(expected_literal.Equals(actual_literal));
 | 
|    }
 | 
| +
 | 
| +  free(buffer);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -454,7 +518,7 @@ UNIT_TEST_CASE(FullSnapshot) {
 | 
|      Isolate* isolate = Isolate::Current();
 | 
|      Zone zone(isolate);
 | 
|      HandleScope scope(isolate);
 | 
| -    SnapshotWriter writer(Snapshot::kFull, &buffer, &allocator);
 | 
| +    SnapshotWriter writer(Snapshot::kFull, &buffer, &malloc_allocator);
 | 
|      writer.WriteFullSnapshot();
 | 
|    }
 | 
|  
 | 
| @@ -510,7 +574,7 @@ UNIT_TEST_CASE(FullSnapshot1) {
 | 
|      OS::PrintErr("Without Snapshot: %dus\n", timer1.TotalElapsedTime());
 | 
|  
 | 
|      // Write snapshot with object content.
 | 
| -    SnapshotWriter writer(Snapshot::kFull, &buffer, &allocator);
 | 
| +    SnapshotWriter writer(Snapshot::kFull, &buffer, &malloc_allocator);
 | 
|      writer.WriteFullSnapshot();
 | 
|  
 | 
|      // Invoke a function which returns an object.
 | 
| @@ -674,8 +738,9 @@ UNIT_TEST_CASE(ScriptSnapshot) {
 | 
|  
 | 
|  
 | 
|  TEST_CASE(IntArrayMessage) {
 | 
| +  Zone zone(Isolate::Current());
 | 
|    uint8_t* buffer = NULL;
 | 
| -  MessageWriter writer(&buffer, &allocator);
 | 
| +  MessageWriter writer(&buffer, &zone_allocator);
 | 
|  
 | 
|    static const int kArrayLength = 2;
 | 
|    intptr_t data[kArrayLength] = {1, 2};
 | 
| @@ -683,26 +748,24 @@ TEST_CASE(IntArrayMessage) {
 | 
|    writer.WriteMessage(len, data);
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                         writer.BytesWritten(),
 | 
| -                         &allocator);
 | 
| -  Dart_CObject* value = mreader.ReadObject();
 | 
| -  EXPECT_EQ(Dart_CObject::kArray, value->type);
 | 
| -  EXPECT_EQ(kArrayLength, value->value.as_array.length);
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  Dart_CObject* cobject = cmessage->root;
 | 
| +  EXPECT_EQ(Dart_CObject::kArray, cobject->type);
 | 
| +  EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
 | 
|    for (int i = 0; i < kArrayLength; i++) {
 | 
| -    Dart_CObject* element = value->value.as_array.values[i];
 | 
| +    Dart_CObject* element = cobject->value.as_array.values[i];
 | 
|      EXPECT_EQ(Dart_CObject::kInt32, element->type);
 | 
|      EXPECT_EQ(i + 1, element->value.as_int32);
 | 
| -    free(element);
 | 
|    }
 | 
| -  free(value);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  // Helper function to call a top level Dart function, serialize the
 | 
|  // result and deserialize the result into a Dart_CObject structure.
 | 
| -static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib,
 | 
| -                                               const char* dart_function) {
 | 
| +static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib,
 | 
| +                                                 const char* dart_function) {
 | 
|    Dart_Handle result;
 | 
|    result = Dart_InvokeStatic(lib,
 | 
|                               Dart_NewString(""),
 | 
| @@ -713,18 +776,16 @@ static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib,
 | 
|  
 | 
|    // Serialize the list into a message.
 | 
|    uint8_t* buffer;
 | 
| -  SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +  SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|    const Object& list = Object::Handle(Api::UnwrapHandle(result));
 | 
|    writer.WriteObject(list.raw());
 | 
|    writer.FinalizeBuffer();
 | 
|  
 | 
|    // Read object back from the snapshot into a C structure.
 | 
| -  CMessageReader reader(buffer + Snapshot::kHeaderSize,
 | 
| -                        writer.BytesWritten(),
 | 
| -                        &allocator);
 | 
| -  Dart_CObject* value = reader.ReadObject();
 | 
| -  free(buffer);
 | 
| -  return value;
 | 
| +  Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                          writer.BytesWritten(),
 | 
| +                                          &zone_allocator);
 | 
| +  return cmessage;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -768,42 +829,40 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
 | 
|      DARTSCOPE_NOCHECKS(isolate);
 | 
|  
 | 
|      {
 | 
| +      Zone zone(Isolate::Current());
 | 
|        uint8_t* buffer;
 | 
| -      SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +      SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|        Smi& smi = Smi::Handle();
 | 
|        smi ^= Api::UnwrapHandle(smi_result);
 | 
|        writer.WriteObject(smi.raw());
 | 
|        writer.FinalizeBuffer();
 | 
|  
 | 
|        // Read object back from the snapshot into a C structure.
 | 
| -      CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                             writer.BytesWritten(),
 | 
| -                             &allocator);
 | 
| -      Dart_CObject* value = mreader.ReadObject();
 | 
| -      EXPECT_NOTNULL(value);
 | 
| -      EXPECT_EQ(Dart_CObject::kInt32, value->type);
 | 
| -      EXPECT_EQ(42, value->value.as_int32);
 | 
| -      free(value);
 | 
| -      free(buffer);
 | 
| +      Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                              writer.BytesWritten(),
 | 
| +                                              &zone_allocator);
 | 
| +      Dart_CObject* cobject = cmessage->root;
 | 
| +      EXPECT_NOTNULL(cobject);
 | 
| +      EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
 | 
| +      EXPECT_EQ(42, cobject->value.as_int32);
 | 
|      }
 | 
|      {
 | 
| +      Zone zone(Isolate::Current());
 | 
|        uint8_t* buffer;
 | 
| -      SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
 | 
| +      SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
 | 
|        String& str = String::Handle();
 | 
|        str ^= Api::UnwrapHandle(string_result);
 | 
|        writer.WriteObject(str.raw());
 | 
|        writer.FinalizeBuffer();
 | 
|  
 | 
|        // Read object back from the snapshot into a C structure.
 | 
| -      CMessageReader mreader(buffer + Snapshot::kHeaderSize,
 | 
| -                             writer.BytesWritten(),
 | 
| -                             &allocator);
 | 
| -      Dart_CObject* value = mreader.ReadObject();
 | 
| -      EXPECT_NOTNULL(value);
 | 
| -      EXPECT_EQ(Dart_CObject::kString, value->type);
 | 
| -      EXPECT_STREQ("Hello, world!", value->value.as_string);
 | 
| -      free(value);
 | 
| -      free(buffer);
 | 
| +      Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
 | 
| +                                              writer.BytesWritten(),
 | 
| +                                              &zone_allocator);
 | 
| +      Dart_CObject* cobject = cmessage->root;
 | 
| +      EXPECT_NOTNULL(cobject);
 | 
| +      EXPECT_EQ(Dart_CObject::kString, cobject->type);
 | 
| +      EXPECT_STREQ("Hello, world!", cobject->value.as_string);
 | 
|      }
 | 
|    }
 | 
|    Dart_ExitScope();
 | 
| @@ -850,32 +909,35 @@ UNIT_TEST_CASE(DartGeneratedListMessages) {
 | 
|  
 | 
|      {
 | 
|        // Generate a list of nulls from Dart code.
 | 
| -      Dart_CObject* value = GetDeserializedDartObject(lib, "getList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList");
 | 
| +      Dart_CObject* value = cmessage->root;
 | 
|        EXPECT_NOTNULL(value);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, value->type);
 | 
|        EXPECT_EQ(kArrayLength, value->value.as_array.length);
 | 
|        for (int i = 0; i < kArrayLength; i++) {
 | 
|          EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type);
 | 
| -        free(value->value.as_array.values[i]);
 | 
|        }
 | 
| -      free(value);
 | 
|      }
 | 
|      {
 | 
|        // Generate a list of ints from Dart code.
 | 
| -      Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList");
 | 
| +      Dart_CObject* value = cmessage->root;
 | 
|        EXPECT_NOTNULL(value);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, value->type);
 | 
|        EXPECT_EQ(kArrayLength, value->value.as_array.length);
 | 
|        for (int i = 0; i < kArrayLength; i++) {
 | 
|          EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type);
 | 
|          EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32);
 | 
| -        free(value->value.as_array.values[i]);
 | 
|        }
 | 
| -      free(value);
 | 
|      }
 | 
|      {
 | 
|        // Generate a list of strings from Dart code.
 | 
| -      Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage =
 | 
| +          GetDeserializedDartMessage(lib, "getStringList");
 | 
| +      Dart_CObject* value = cmessage->root;
 | 
|        EXPECT_NOTNULL(value);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, value->type);
 | 
|        EXPECT_EQ(kArrayLength, value->value.as_array.length);
 | 
| @@ -884,13 +946,13 @@ UNIT_TEST_CASE(DartGeneratedListMessages) {
 | 
|          char buffer[3];
 | 
|          snprintf(buffer, sizeof(buffer), "%d", i);
 | 
|          EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string);
 | 
| -        free(value->value.as_array.values[i]);
 | 
|        }
 | 
| -      free(value);
 | 
|      }
 | 
|      {
 | 
|        // Generate a list of objects of different types from Dart code.
 | 
| -      Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList");
 | 
| +      Dart_CObject* value = cmessage->root;
 | 
|        EXPECT_NOTNULL(value);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, value->type);
 | 
|        EXPECT_EQ(kArrayLength, value->value.as_array.length);
 | 
| @@ -908,9 +970,7 @@ UNIT_TEST_CASE(DartGeneratedListMessages) {
 | 
|          if (i > 3) {
 | 
|            EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type);
 | 
|          }
 | 
| -        free(value->value.as_array.values[i]);
 | 
|        }
 | 
| -      free(value);
 | 
|      }
 | 
|    }
 | 
|    Dart_ExitScope();
 | 
| @@ -962,7 +1022,10 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
 | 
|  
 | 
|      {
 | 
|        // Generate a list of strings from Dart code.
 | 
| -      Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage =
 | 
| +          GetDeserializedDartMessage(lib, "getStringList");
 | 
| +      Dart_CObject* object = cmessage->root;
 | 
|        EXPECT_NOTNULL(object);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, object->type);
 | 
|        EXPECT_EQ(kArrayLength, object->value.as_array.length);
 | 
| @@ -972,12 +1035,13 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
 | 
|          EXPECT_EQ(Dart_CObject::kString, element->type);
 | 
|          EXPECT_STREQ("Hello, world!", element->value.as_string);
 | 
|        }
 | 
| -      free(object->value.as_array.values[0]);
 | 
| -      free(object);
 | 
|      }
 | 
|      {
 | 
|        // Generate a list of doubles from Dart code.
 | 
| -      Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage =
 | 
| +          GetDeserializedDartMessage(lib, "getDoubleList");
 | 
| +      Dart_CObject* object = cmessage->root;
 | 
|        EXPECT_NOTNULL(object);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, object->type);
 | 
|        EXPECT_EQ(kArrayLength, object->value.as_array.length);
 | 
| @@ -987,12 +1051,12 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
 | 
|          EXPECT_EQ(Dart_CObject::kDouble, element->type);
 | 
|          EXPECT_EQ(3.14, element->value.as_double);
 | 
|        }
 | 
| -      free(object->value.as_array.values[0]);
 | 
| -      free(object);
 | 
|      }
 | 
|      {
 | 
|        // Generate a list of objects of different types from Dart code.
 | 
| -      Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList");
 | 
| +      Dart_CObject* object = cmessage->root;
 | 
|        EXPECT_NOTNULL(object);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, object->type);
 | 
|        EXPECT_EQ(kArrayLength, object->value.as_array.length);
 | 
| @@ -1008,13 +1072,13 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
 | 
|            EXPECT_STREQ(2.72, element->value.as_double);
 | 
|          }
 | 
|        }
 | 
| -      free(object->value.as_array.values[0]);
 | 
| -      free(object->value.as_array.values[1]);
 | 
| -      free(object);
 | 
|      }
 | 
|      {
 | 
|        // Generate a list of objects of different types from Dart code.
 | 
| -      Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList");
 | 
| +      Zone zone(Isolate::Current());
 | 
| +      Dart_CMessage* cmessage =
 | 
| +          GetDeserializedDartMessage(lib, "getSelfRefList");
 | 
| +      Dart_CObject* object = cmessage->root;
 | 
|        EXPECT_NOTNULL(object);
 | 
|        EXPECT_EQ(Dart_CObject::kArray, object->type);
 | 
|        EXPECT_EQ(kArrayLength, object->value.as_array.length);
 | 
| @@ -1023,7 +1087,6 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
 | 
|          EXPECT_EQ(Dart_CObject::kArray, element->type);
 | 
|          EXPECT_EQ(object, element);
 | 
|        }
 | 
| -      free(object);
 | 
|      }
 | 
|    }
 | 
|    Dart_ExitScope();
 | 
| 
 |