Chromium Code Reviews| Index: runtime/vm/snapshot_test.cc |
| diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
| index e4f682946d0553ee858af6341da86e6c9d4adf35..2604914235b0c463aa9a1c9a802a6b88f46d4013 100644 |
| --- a/runtime/vm/snapshot_test.cc |
| +++ b/runtime/vm/snapshot_test.cc |
| @@ -241,13 +241,17 @@ Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) { |
| writer.WriteMessage(mint); |
| intptr_t buffer_len = writer.BytesWritten(); |
| - // Read object back from the snapshot. |
| - MessageSnapshotReader reader(buffer, |
| - buffer_len, |
| - Isolate::Current(), |
| - Thread::Current()->zone()); |
| - const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| - EXPECT(serialized_object.IsMint()); |
| + { |
| + // Switch to a regular zone, where VM handle allocation is allowed. |
| + StackZone zone(Isolate::Current()); |
| + // Read object back from the snapshot. |
| + MessageSnapshotReader reader(buffer, |
| + buffer_len, |
| + Isolate::Current(), |
| + Thread::Current()->zone()); |
| + const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| + EXPECT(serialized_object.IsMint()); |
| + } |
| // Read object back from the snapshot into a C structure. |
| ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| @@ -441,18 +445,22 @@ Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { |
| writer.WriteMessage(bigint); |
| intptr_t buffer_len = writer.BytesWritten(); |
| - // Read object back from the snapshot. |
| - MessageSnapshotReader reader(buffer, |
| - buffer_len, |
| - Isolate::Current(), |
| - Thread::Current()->zone()); |
| - Bigint& serialized_bigint = Bigint::Handle(); |
| - serialized_bigint ^= reader.ReadObject(); |
| - const char* str1 = bigint.ToHexCString(allocator); |
| - const char* str2 = serialized_bigint.ToHexCString(allocator); |
| - EXPECT_STREQ(str1, str2); |
| - free(const_cast<char*>(str1)); |
| - free(const_cast<char*>(str2)); |
| + { |
| + // Switch to a regular zone, where VM handle allocation is allowed. |
| + StackZone zone(Isolate::Current()); |
| + // Read object back from the snapshot. |
| + MessageSnapshotReader reader(buffer, |
| + buffer_len, |
| + Isolate::Current(), |
| + Thread::Current()->zone()); |
| + Bigint& serialized_bigint = Bigint::Handle(); |
| + serialized_bigint ^= reader.ReadObject(); |
| + const char* str1 = bigint.ToHexCString(allocator); |
| + const char* str2 = serialized_bigint.ToHexCString(allocator); |
| + EXPECT_STREQ(str1, str2); |
| + free(const_cast<char*>(str1)); |
| + free(const_cast<char*>(str2)); |
| + } |
| // Read object back from the snapshot into a C structure. |
| ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| @@ -466,10 +474,9 @@ Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { |
| void CheckBigint(const char* bigint_value) { |
| StackZone zone(Isolate::Current()); |
| - ApiNativeScope scope; |
| - |
| Bigint& bigint = Bigint::Handle(); |
| bigint ^= Bigint::NewFromCString(bigint_value); |
| + ApiNativeScope scope; |
| Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint); |
| EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type); |
| char* hex_value = TestCase::BigintToHexValue(bigint_cobject); |
| @@ -1588,7 +1595,8 @@ TEST_CASE(IntArrayMessage) { |
| // Helper function to call a top level Dart function, serialize the |
| // result and deserialize the result into a Dart_CObject structure. |
| static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib, |
| - const char* dart_function) { |
| + const char* dart_function, |
| + Object* tmp_handle) { |
|
siva
2015/06/19 23:30:46
Why is it not Ok to allocate the StackZone here in
koda
2015/06/22 17:18:51
That would make the return value a dangling pointe
|
| Dart_Handle result; |
| result = Dart_Invoke(lib, NewString(dart_function), 0, NULL); |
| EXPECT_VALID(result); |
| @@ -1596,8 +1604,8 @@ static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib, |
| // Serialize the list into a message. |
| uint8_t* buffer; |
| MessageWriter writer(&buffer, &zone_allocator, false); |
| - const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
| - writer.WriteMessage(list); |
| + *tmp_handle = Api::UnwrapHandle(result); |
| + writer.WriteMessage(*tmp_handle); |
| intptr_t buffer_len = writer.BytesWritten(); |
| // Read object back from the snapshot into a C structure. |
| @@ -1827,10 +1835,12 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
| { |
| DARTSCOPE(isolate); |
| + StackZone zone(isolate); |
| + Object& tmp = Object::Handle(); |
| { |
| // Generate a list of nulls from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getList"); |
| + Dart_CObject* root = GetDeserializedDartMessage(lib, "getList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1842,7 +1852,7 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
| { |
| // Generate a list of ints from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList"); |
| + Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1855,7 +1865,8 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
| { |
| // Generate a list of strings from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getStringList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1869,7 +1880,8 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
| { |
| // Generate a list of objects of different types from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getMixedList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1945,10 +1957,12 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { |
| { |
| DARTSCOPE(isolate); |
| + StackZone zone(isolate); |
| + Object& tmp = Object::Handle(); |
| { |
| // Generate a list of nulls from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getList"); |
| + Dart_CObject* root = GetDeserializedDartMessage(lib, "getList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1960,7 +1974,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { |
| { |
| // Generate a list of ints from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getIntList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1973,7 +1988,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { |
| { |
| // Generate a list of strings from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getStringList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -1987,7 +2003,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { |
| { |
| // Generate a list of lists from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getListList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getListList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2005,7 +2022,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { |
| { |
| // Generate a list of objects of different types from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getMixedList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2177,11 +2195,13 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| DARTSCOPE(isolate); |
| - |
| + StackZone zone(isolate); |
| + Object& tmp = Object::Handle(); |
| { |
| // Generate a list of strings from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getStringList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2195,7 +2215,8 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| // Generate a list of medium ints from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getMintList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2209,7 +2230,8 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| // Generate a list of bigints from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getBigintList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2225,7 +2247,8 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| // Generate a list of doubles from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getDoubleList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2243,7 +2266,8 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| // Generate a list of Uint8Lists from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getTypedDataList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2259,7 +2283,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| // Generate a list of Uint8List views from Dart code. |
| ApiNativeScope scope; |
| Dart_CObject* root = |
| - GetDeserializedDartMessage(lib, "getTypedDataViewList"); |
| + GetDeserializedDartMessage(lib, "getTypedDataViewList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2276,7 +2300,8 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| // Generate a list of objects of different types from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getMixedList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2303,7 +2328,8 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| { |
| // Generate a list of objects of different types from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getSelfRefList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2394,10 +2420,13 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| DARTSCOPE(isolate); |
| + StackZone zone(isolate); |
| + Object& tmp = Object::Handle(); |
| { |
| // Generate a list of strings from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getStringList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2411,7 +2440,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| // Generate a list of medium ints from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getMintList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2425,7 +2455,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| // Generate a list of bigints from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getBigintList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2441,7 +2472,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| // Generate a list of doubles from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getDoubleList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2460,7 +2492,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| // Generate a list of Uint8Lists from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getTypedDataList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2476,7 +2509,7 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| // Generate a list of Uint8List views from Dart code. |
| ApiNativeScope scope; |
| Dart_CObject* root = |
| - GetDeserializedDartMessage(lib, "getTypedDataViewList"); |
| + GetDeserializedDartMessage(lib, "getTypedDataViewList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2493,7 +2526,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| // Generate a list of objects of different types from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getMixedList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2520,7 +2554,8 @@ UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| { |
| // Generate a list of objects of different types from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getSelfRefList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| @@ -2626,10 +2661,13 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithTypedData) { |
| { |
| DARTSCOPE(isolate); |
| + StackZone zone(isolate); |
| + Object& tmp = Object::Handle(); |
| { |
| // Generate a list of Uint8Lists from Dart code. |
| ApiNativeScope scope; |
| - Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList"); |
| + Dart_CObject* root = |
| + GetDeserializedDartMessage(lib, "getTypedDataList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| struct { |
| @@ -2663,7 +2701,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithTypedData) { |
| ApiNativeScope scope; |
| Dart_CObject* root = |
| - GetDeserializedDartMessage(lib, "getTypedDataViewList"); |
| + GetDeserializedDartMessage(lib, "getTypedDataViewList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| struct { |
| @@ -2719,7 +2757,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithTypedData) { |
| // Generate a list of Uint8Lists from Dart code. |
| ApiNativeScope scope; |
| Dart_CObject* root = |
| - GetDeserializedDartMessage(lib, "getMultipleTypedDataViewList"); |
| + GetDeserializedDartMessage(lib, "getMultipleTypedDataViewList", &tmp); |
| EXPECT_NOTNULL(root); |
| EXPECT_EQ(Dart_CObject_kArray, root->type); |
| struct { |