OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/bigint_operations.h" | 6 #include "vm/bigint_operations.h" |
7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
10 #include "vm/snapshot.h" | 10 #include "vm/snapshot.h" |
(...skipping 24 matching lines...) Expand all Loading... | |
35 } | 35 } |
36 return false; | 36 return false; |
37 } | 37 } |
38 | 38 |
39 | 39 |
40 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 40 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
41 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); | 41 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); |
42 } | 42 } |
43 | 43 |
44 | 44 |
45 static void FreeDeserializedDartMessage(Dart_CMessage* cmessage) { | |
46 for (int i = 0; i < cmessage->allocated_length; i++) { | |
47 free(cmessage->allocated[i]); | |
48 } | |
49 free(cmessage->original_message - Snapshot::kHeaderSize); | |
50 free(cmessage); | |
51 } | |
52 | |
53 | |
45 TEST_CASE(SerializeNull) { | 54 TEST_CASE(SerializeNull) { |
46 // Write snapshot with object content. | 55 // Write snapshot with object content. |
47 uint8_t* buffer; | 56 uint8_t* buffer; |
48 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 57 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
49 const Object& null_object = Object::Handle(); | 58 const Object& null_object = Object::Handle(); |
50 writer.WriteObject(null_object.raw()); | 59 writer.WriteObject(null_object.raw()); |
51 writer.FinalizeBuffer(); | 60 writer.FinalizeBuffer(); |
52 | 61 |
53 // Create a snapshot object using the buffer. | 62 // Create a snapshot object using the buffer. |
54 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 63 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
55 | 64 |
56 // Read object back from the snapshot. | 65 // Read object back from the snapshot. |
57 SnapshotReader reader(snapshot, Isolate::Current()); | 66 SnapshotReader reader(snapshot, Isolate::Current()); |
58 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 67 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
59 EXPECT(Equals(null_object, serialized_object)); | 68 EXPECT(Equals(null_object, serialized_object)); |
60 | 69 |
61 // Read object back from the snapshot into a C structure. | 70 // Read object back from the snapshot into a C structure. |
siva
2012/02/01 01:48:36
If you start a Zone here and use a zone allocator
Søren Gjesse
2012/02/01 12:12:23
Agree. But I wanted to cover the case where the em
| |
62 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 71 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
63 writer.BytesWritten(), | 72 writer.BytesWritten(), |
64 &allocator); | 73 &allocator); |
65 Dart_CObject* cobject = mreader.ReadObject(); | 74 Dart_CObject* cobject = cmessage->object; |
66 EXPECT_NOTNULL(cobject); | 75 EXPECT_NOTNULL(cobject); |
67 EXPECT_EQ(Dart_CObject::kNull, cobject->type); | 76 EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
68 free(cobject); | 77 FreeDeserializedDartMessage(cmessage); |
69 } | 78 } |
70 | 79 |
71 | 80 |
72 TEST_CASE(SerializeSmi1) { | 81 TEST_CASE(SerializeSmi1) { |
73 // Write snapshot with object content. | 82 // Write snapshot with object content. |
74 uint8_t* buffer; | 83 uint8_t* buffer; |
75 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 84 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
76 const Smi& smi = Smi::Handle(Smi::New(124)); | 85 const Smi& smi = Smi::Handle(Smi::New(124)); |
77 writer.WriteObject(smi.raw()); | 86 writer.WriteObject(smi.raw()); |
78 writer.FinalizeBuffer(); | 87 writer.FinalizeBuffer(); |
79 | 88 |
80 // Create a snapshot object using the buffer. | 89 // Create a snapshot object using the buffer. |
81 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 90 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
82 | 91 |
83 // Read object back from the snapshot. | 92 // Read object back from the snapshot. |
84 SnapshotReader reader(snapshot, Isolate::Current()); | 93 SnapshotReader reader(snapshot, Isolate::Current()); |
85 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 94 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
86 EXPECT(Equals(smi, serialized_object)); | 95 EXPECT(Equals(smi, serialized_object)); |
87 | 96 |
88 // Read object back from the snapshot into a C structure. | 97 // Read object back from the snapshot into a C structure. |
89 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 98 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
90 writer.BytesWritten(), | 99 writer.BytesWritten(), |
91 &allocator); | 100 &allocator); |
92 Dart_CObject* cobject = mreader.ReadObject(); | 101 Dart_CObject* cobject = cmessage->object; |
93 EXPECT_NOTNULL(cobject); | 102 EXPECT_NOTNULL(cobject); |
94 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 103 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
95 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 104 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
96 free(cobject); | 105 FreeDeserializedDartMessage(cmessage); |
siva
2012/02/01 01:48:36
Ditto comment here and below about not needing Fre
Søren Gjesse
2012/02/01 12:12:23
See above.
| |
97 } | 106 } |
98 | 107 |
99 | 108 |
100 TEST_CASE(SerializeSmi2) { | 109 TEST_CASE(SerializeSmi2) { |
101 // Write snapshot with object content. | 110 // Write snapshot with object content. |
102 uint8_t* buffer; | 111 uint8_t* buffer; |
103 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 112 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
104 const Smi& smi = Smi::Handle(Smi::New(-1)); | 113 const Smi& smi = Smi::Handle(Smi::New(-1)); |
105 writer.WriteObject(smi.raw()); | 114 writer.WriteObject(smi.raw()); |
106 writer.FinalizeBuffer(); | 115 writer.FinalizeBuffer(); |
107 | 116 |
108 // Create a snapshot object using the buffer. | 117 // Create a snapshot object using the buffer. |
109 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 118 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
110 | 119 |
111 // Read object back from the snapshot. | 120 // Read object back from the snapshot. |
112 SnapshotReader reader(snapshot, Isolate::Current()); | 121 SnapshotReader reader(snapshot, Isolate::Current()); |
113 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 122 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
114 EXPECT(Equals(smi, serialized_object)); | 123 EXPECT(Equals(smi, serialized_object)); |
115 | 124 |
116 // Read object back from the snapshot into a C structure. | 125 // Read object back from the snapshot into a C structure. |
117 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 126 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
118 writer.BytesWritten(), | 127 writer.BytesWritten(), |
119 &allocator); | 128 &allocator); |
120 Dart_CObject* cobject = mreader.ReadObject(); | 129 Dart_CObject* cobject = cmessage->object; |
121 EXPECT_NOTNULL(cobject); | 130 EXPECT_NOTNULL(cobject); |
122 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 131 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
123 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 132 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
124 free(cobject); | 133 FreeDeserializedDartMessage(cmessage); |
125 } | 134 } |
126 | 135 |
127 | 136 |
128 TEST_CASE(SerializeDouble) { | 137 TEST_CASE(SerializeDouble) { |
129 // Write snapshot with object content. | 138 // Write snapshot with object content. |
130 uint8_t* buffer; | 139 uint8_t* buffer; |
131 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 140 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
132 const Double& dbl = Double::Handle(Double::New(101.29)); | 141 const Double& dbl = Double::Handle(Double::New(101.29)); |
133 writer.WriteObject(dbl.raw()); | 142 writer.WriteObject(dbl.raw()); |
134 writer.FinalizeBuffer(); | 143 writer.FinalizeBuffer(); |
135 | 144 |
136 // Create a snapshot object using the buffer. | 145 // Create a snapshot object using the buffer. |
137 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 146 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
138 | 147 |
139 // Read object back from the snapshot. | 148 // Read object back from the snapshot. |
140 SnapshotReader reader(snapshot, Isolate::Current()); | 149 SnapshotReader reader(snapshot, Isolate::Current()); |
141 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 150 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
142 EXPECT(Equals(dbl, serialized_object)); | 151 EXPECT(Equals(dbl, serialized_object)); |
143 | 152 |
144 // Read object back from the snapshot into a C structure. | 153 // Read object back from the snapshot into a C structure. |
145 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 154 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
146 writer.BytesWritten(), | 155 writer.BytesWritten(), |
147 &allocator); | 156 &allocator); |
148 Dart_CObject* cobject = mreader.ReadObject(); | 157 Dart_CObject* cobject = cmessage->object; |
149 EXPECT_NOTNULL(cobject); | 158 EXPECT_NOTNULL(cobject); |
150 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); | 159 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
151 EXPECT_EQ(dbl.value(), cobject->value.as_double); | 160 EXPECT_EQ(dbl.value(), cobject->value.as_double); |
152 free(cobject); | 161 FreeDeserializedDartMessage(cmessage); |
153 } | 162 } |
154 | 163 |
155 | 164 |
156 TEST_CASE(SerializeBool) { | 165 TEST_CASE(SerializeBool) { |
157 // Write snapshot with object content. | 166 // Write snapshot with object content. |
158 uint8_t* buffer; | 167 uint8_t* buffer; |
159 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 168 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
160 const Bool& bool1 = Bool::Handle(Bool::True()); | 169 const Bool& bool1 = Bool::Handle(Bool::True()); |
161 const Bool& bool2 = Bool::Handle(Bool::False()); | 170 const Bool& bool2 = Bool::Handle(Bool::False()); |
162 writer.WriteObject(bool1.raw()); | 171 writer.WriteObject(bool1.raw()); |
163 writer.WriteObject(bool2.raw()); | 172 writer.WriteObject(bool2.raw()); |
164 writer.FinalizeBuffer(); | 173 writer.FinalizeBuffer(); |
165 | 174 |
166 // Create a snapshot object using the buffer. | 175 // Create a snapshot object using the buffer. |
167 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 176 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
168 | 177 |
169 // Read object back from the snapshot. | 178 // Read object back from the snapshot. |
170 SnapshotReader reader(snapshot, Isolate::Current()); | 179 SnapshotReader reader(snapshot, Isolate::Current()); |
171 EXPECT(Bool::True() == reader.ReadObject()); | 180 EXPECT(Bool::True() == reader.ReadObject()); |
172 EXPECT(Bool::False() == reader.ReadObject()); | 181 EXPECT(Bool::False() == reader.ReadObject()); |
173 | |
174 // Read object back from the snapshot into a C structure. | |
175 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | |
176 writer.BytesWritten(), | |
177 &allocator); | |
178 Dart_CObject* cobject1 = mreader.ReadObject(); | |
179 EXPECT_NOTNULL(cobject1); | |
180 EXPECT_EQ(Dart_CObject::kBool, cobject1->type); | |
181 EXPECT_EQ(true, cobject1->value.as_bool); | |
182 Dart_CObject* cobject2 = mreader.ReadObject(); | |
183 EXPECT_NOTNULL(cobject2); | |
184 EXPECT_EQ(Dart_CObject::kBool, cobject2->type); | |
185 EXPECT_EQ(false, cobject2->value.as_bool); | |
186 free(cobject1); | |
187 free(cobject2); | |
188 } | 182 } |
189 | 183 |
190 | 184 |
185 TEST_CASE(SerializeTrue) { | |
186 // Write snapshot with true object. | |
187 uint8_t* buffer; | |
188 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | |
189 const Bool& bl = Bool::Handle(Bool::True()); | |
190 writer.WriteObject(bl.raw()); | |
191 writer.FinalizeBuffer(); | |
192 | |
193 // Create a snapshot object using the buffer. | |
194 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | |
195 USE(snapshot); | |
siva
2012/02/01 01:48:36
Why not just Snapshot::SetupFromBuffer(buffer);
Søren Gjesse
2012/02/01 12:12:23
Done.
| |
196 | |
197 // Read object back from the snapshot into a C structure. | |
198 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
199 writer.BytesWritten(), | |
200 &allocator); | |
201 Dart_CObject* cobject = cmessage->object; | |
202 EXPECT_NOTNULL(cobject); | |
203 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | |
204 EXPECT_EQ(true, cobject->value.as_bool); | |
205 FreeDeserializedDartMessage(cmessage); | |
206 } | |
207 | |
208 | |
209 TEST_CASE(SerializeFalse) { | |
210 // Write snapshot with false object. | |
211 uint8_t* buffer; | |
212 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | |
213 const Bool& bl = Bool::Handle(Bool::False()); | |
214 writer.WriteObject(bl.raw()); | |
215 writer.FinalizeBuffer(); | |
216 | |
217 // Create a snapshot object using the buffer. | |
218 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | |
219 USE(snapshot); | |
siva
2012/02/01 01:48:36
Ditto.
Søren Gjesse
2012/02/01 12:12:23
Done.
| |
220 | |
221 // Read object back from the snapshot into a C structure. | |
222 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
223 writer.BytesWritten(), | |
224 &allocator); | |
225 Dart_CObject* cobject = cmessage->object; | |
226 EXPECT_NOTNULL(cobject); | |
227 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | |
228 EXPECT_EQ(false, cobject->value.as_bool); | |
229 FreeDeserializedDartMessage(cmessage); | |
230 } | |
231 | |
232 | |
191 TEST_CASE(SerializeBigint) { | 233 TEST_CASE(SerializeBigint) { |
192 // Write snapshot with object content. | 234 // Write snapshot with object content. |
193 uint8_t* buffer; | 235 uint8_t* buffer; |
194 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 236 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
195 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); | 237 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); |
196 writer.WriteObject(bigint.raw()); | 238 writer.WriteObject(bigint.raw()); |
197 writer.FinalizeBuffer(); | 239 writer.FinalizeBuffer(); |
198 | 240 |
199 // Create a snapshot object using the buffer. | 241 // Create a snapshot object using the buffer. |
200 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 242 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
201 | 243 |
202 // Read object back from the snapshot. | 244 // Read object back from the snapshot. |
203 SnapshotReader reader(snapshot, Isolate::Current()); | 245 SnapshotReader reader(snapshot, Isolate::Current()); |
204 Bigint& obj = Bigint::Handle(); | 246 Bigint& obj = Bigint::Handle(); |
205 obj ^= reader.ReadObject(); | 247 obj ^= reader.ReadObject(); |
206 OS::Print("%lld", BigintOperations::ToInt64(obj)); | 248 OS::Print("%lld", BigintOperations::ToInt64(obj)); |
207 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); | 249 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); |
208 | 250 |
209 // Read object back from the snapshot into a C structure. | 251 // Read object back from the snapshot into a C structure. |
210 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 252 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
211 writer.BytesWritten(), | 253 writer.BytesWritten(), |
212 &allocator); | 254 &allocator); |
213 Dart_CObject* cobject = mreader.ReadObject(); | 255 Dart_CObject* cobject = cmessage->object; |
214 // Bigint not supported. | 256 // Bigint not supported. |
215 EXPECT(cobject == NULL); | 257 EXPECT(cobject == NULL); |
258 FreeDeserializedDartMessage(cmessage); | |
216 } | 259 } |
217 | 260 |
218 | 261 |
219 TEST_CASE(SerializeSingletons) { | 262 TEST_CASE(SerializeSingletons) { |
220 // Write snapshot with object content. | 263 // Write snapshot with object content. |
221 uint8_t* buffer; | 264 uint8_t* buffer; |
222 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 265 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
223 writer.WriteObject(Object::class_class()); | 266 writer.WriteObject(Object::class_class()); |
224 writer.WriteObject(Object::null_class()); | 267 writer.WriteObject(Object::null_class()); |
225 writer.WriteObject(Object::type_class()); | 268 writer.WriteObject(Object::type_class()); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
280 // Create a snapshot object using the buffer. | 323 // Create a snapshot object using the buffer. |
281 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 324 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
282 | 325 |
283 // Read object back from the snapshot. | 326 // Read object back from the snapshot. |
284 SnapshotReader reader(snapshot, Isolate::Current()); | 327 SnapshotReader reader(snapshot, Isolate::Current()); |
285 String& serialized_str = String::Handle(); | 328 String& serialized_str = String::Handle(); |
286 serialized_str ^= reader.ReadObject(); | 329 serialized_str ^= reader.ReadObject(); |
287 EXPECT(str.Equals(serialized_str)); | 330 EXPECT(str.Equals(serialized_str)); |
288 | 331 |
289 // Read object back from the snapshot into a C structure. | 332 // Read object back from the snapshot into a C structure. |
290 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 333 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
291 writer.BytesWritten(), | 334 writer.BytesWritten(), |
292 &allocator); | 335 &allocator); |
293 Dart_CObject* cobject = mreader.ReadObject(); | 336 Dart_CObject* cobject = cmessage->object; |
294 EXPECT_EQ(Dart_CObject::kString, cobject->type); | 337 EXPECT_EQ(Dart_CObject::kString, cobject->type); |
295 EXPECT_STREQ(cstr, cobject->value.as_string); | 338 EXPECT_STREQ(cstr, cobject->value.as_string); |
296 free(cobject); | 339 FreeDeserializedDartMessage(cmessage); |
297 } | 340 } |
298 | 341 |
299 | 342 |
300 TEST_CASE(SerializeArray) { | 343 TEST_CASE(SerializeArray) { |
301 // Write snapshot with object content. | 344 // Write snapshot with object content. |
302 uint8_t* buffer; | 345 uint8_t* buffer; |
303 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 346 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
304 const int kArrayLength = 10; | 347 const int kArrayLength = 10; |
305 Array& array = Array::Handle(Array::New(kArrayLength)); | 348 Array& array = Array::Handle(Array::New(kArrayLength)); |
306 Smi& smi = Smi::Handle(); | 349 Smi& smi = Smi::Handle(); |
307 for (int i = 0; i < kArrayLength; i++) { | 350 for (int i = 0; i < kArrayLength; i++) { |
308 smi ^= Smi::New(i); | 351 smi ^= Smi::New(i); |
309 array.SetAt(i, smi); | 352 array.SetAt(i, smi); |
310 } | 353 } |
311 writer.WriteObject(array.raw()); | 354 writer.WriteObject(array.raw()); |
312 writer.FinalizeBuffer(); | 355 writer.FinalizeBuffer(); |
313 | 356 |
314 // Create a snapshot object using the buffer. | 357 // Create a snapshot object using the buffer. |
315 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 358 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
316 | 359 |
317 // Read object back from the snapshot. | 360 // Read object back from the snapshot. |
318 SnapshotReader reader(snapshot, Isolate::Current()); | 361 SnapshotReader reader(snapshot, Isolate::Current()); |
319 Array& serialized_array = Array::Handle(); | 362 Array& serialized_array = Array::Handle(); |
320 serialized_array ^= reader.ReadObject(); | 363 serialized_array ^= reader.ReadObject(); |
321 EXPECT(array.Equals(serialized_array)); | 364 EXPECT(array.Equals(serialized_array)); |
322 | 365 |
323 // Read object back from the snapshot into a C structure. | 366 // Read object back from the snapshot into a C structure. |
324 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 367 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
325 writer.BytesWritten(), | 368 writer.BytesWritten(), |
326 &allocator); | 369 &allocator); |
327 Dart_CObject* cobject = mreader.ReadObject(); | 370 Dart_CObject* cobject = cmessage->object; |
328 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 371 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
329 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 372 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
330 for (int i = 0; i < kArrayLength; i++) { | 373 for (int i = 0; i < kArrayLength; i++) { |
331 Dart_CObject* element = cobject->value.as_array.values[i]; | 374 Dart_CObject* element = cobject->value.as_array.values[i]; |
332 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 375 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
333 EXPECT_EQ(i, element->value.as_int32); | 376 EXPECT_EQ(i, element->value.as_int32); |
334 free(element); | |
335 } | 377 } |
336 free(cobject); | 378 FreeDeserializedDartMessage(cmessage); |
337 } | 379 } |
338 | 380 |
339 | 381 |
340 TEST_CASE(SerializeEmptyArray) { | 382 TEST_CASE(SerializeEmptyArray) { |
341 // Write snapshot with object content. | 383 // Write snapshot with object content. |
342 uint8_t* buffer; | 384 uint8_t* buffer; |
343 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 385 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
344 const int kArrayLength = 0; | 386 const int kArrayLength = 0; |
345 Array& array = Array::Handle(Array::New(kArrayLength)); | 387 Array& array = Array::Handle(Array::New(kArrayLength)); |
346 writer.WriteObject(array.raw()); | 388 writer.WriteObject(array.raw()); |
347 writer.FinalizeBuffer(); | 389 writer.FinalizeBuffer(); |
348 | 390 |
349 // Create a snapshot object using the buffer. | 391 // Create a snapshot object using the buffer. |
350 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 392 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
351 | 393 |
352 // Read object back from the snapshot. | 394 // Read object back from the snapshot. |
353 SnapshotReader reader(snapshot, Isolate::Current()); | 395 SnapshotReader reader(snapshot, Isolate::Current()); |
354 Array& serialized_array = Array::Handle(); | 396 Array& serialized_array = Array::Handle(); |
355 serialized_array ^= reader.ReadObject(); | 397 serialized_array ^= reader.ReadObject(); |
356 EXPECT(array.Equals(serialized_array)); | 398 EXPECT(array.Equals(serialized_array)); |
357 | 399 |
358 // Read object back from the snapshot into a C structure. | 400 // Read object back from the snapshot into a C structure. |
359 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 401 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
360 writer.BytesWritten(), | 402 writer.BytesWritten(), |
361 &allocator); | 403 &allocator); |
362 Dart_CObject* cobject = mreader.ReadObject(); | 404 Dart_CObject* cobject = cmessage->object; |
363 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 405 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
364 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 406 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
365 EXPECT(cobject->value.as_array.values == NULL); | 407 EXPECT(cobject->value.as_array.values == NULL); |
366 free(cobject); | 408 FreeDeserializedDartMessage(cmessage); |
367 } | 409 } |
368 | 410 |
369 | 411 |
370 TEST_CASE(SerializeScript) { | 412 TEST_CASE(SerializeScript) { |
371 const char* kScriptChars = | 413 const char* kScriptChars = |
372 "class A {\n" | 414 "class A {\n" |
373 " static bar() { return 42; }\n" | 415 " static bar() { return 42; }\n" |
374 " static fly() { return 5; }\n" | 416 " static fly() { return 5; }\n" |
375 "}\n"; | 417 "}\n"; |
376 | 418 |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
647 TEST_CASE(IntArrayMessage) { | 689 TEST_CASE(IntArrayMessage) { |
648 uint8_t* buffer = NULL; | 690 uint8_t* buffer = NULL; |
649 MessageWriter writer(&buffer, &allocator); | 691 MessageWriter writer(&buffer, &allocator); |
650 | 692 |
651 static const int kArrayLength = 2; | 693 static const int kArrayLength = 2; |
652 intptr_t data[kArrayLength] = {1, 2}; | 694 intptr_t data[kArrayLength] = {1, 2}; |
653 int len = kArrayLength; | 695 int len = kArrayLength; |
654 writer.WriteMessage(len, data); | 696 writer.WriteMessage(len, data); |
655 | 697 |
656 // Read object back from the snapshot into a C structure. | 698 // Read object back from the snapshot into a C structure. |
657 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 699 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
658 writer.BytesWritten(), | 700 writer.BytesWritten(), |
659 &allocator); | 701 &allocator); |
660 Dart_CObject* value = mreader.ReadObject(); | 702 Dart_CObject* cobject = cmessage->object; |
661 EXPECT_EQ(Dart_CObject::kArray, value->type); | 703 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
662 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 704 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
663 for (int i = 0; i < kArrayLength; i++) { | 705 for (int i = 0; i < kArrayLength; i++) { |
664 Dart_CObject* element = value->value.as_array.values[i]; | 706 Dart_CObject* element = cobject->value.as_array.values[i]; |
665 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 707 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
666 EXPECT_EQ(i + 1, element->value.as_int32); | 708 EXPECT_EQ(i + 1, element->value.as_int32); |
667 free(element); | |
668 } | 709 } |
669 free(value); | 710 FreeDeserializedDartMessage(cmessage); |
670 } | 711 } |
671 | 712 |
672 | 713 |
673 // Helper function to call a top level Dart function, serialize the | 714 // Helper function to call a top level Dart function, serialize the |
674 // result and deserialize the result into a Dart_CObject structure. | 715 // result and deserialize the result into a Dart_CObject structure. |
675 static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib, | 716 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, |
676 const char* dart_function) { | 717 const char* dart_function) { |
677 Dart_Handle result; | 718 Dart_Handle result; |
678 result = Dart_InvokeStatic(lib, | 719 result = Dart_InvokeStatic(lib, |
679 Dart_NewString(""), | 720 Dart_NewString(""), |
680 Dart_NewString(dart_function), | 721 Dart_NewString(dart_function), |
681 0, | 722 0, |
682 NULL); | 723 NULL); |
683 EXPECT_VALID(result); | 724 EXPECT_VALID(result); |
684 | 725 |
685 // Serialize the list into a message. | 726 // Serialize the list into a message. |
686 uint8_t* buffer; | 727 uint8_t* buffer; |
687 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 728 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
688 const Object& list = Object::Handle(Api::UnwrapHandle(result)); | 729 const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
689 writer.WriteObject(list.raw()); | 730 writer.WriteObject(list.raw()); |
690 writer.FinalizeBuffer(); | 731 writer.FinalizeBuffer(); |
691 | 732 |
692 // Read object back from the snapshot into a C structure. | 733 // Read object back from the snapshot into a C structure. |
693 CMessageReader reader(buffer + Snapshot::kHeaderSize, | 734 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
694 writer.BytesWritten(), | 735 writer.BytesWritten(), |
695 &allocator); | 736 &allocator); |
696 Dart_CObject* value = reader.ReadObject(); | 737 return cmessage; |
697 free(buffer); | |
698 return value; | |
699 } | 738 } |
700 | 739 |
701 | 740 |
702 UNIT_TEST_CASE(DartGeneratedMessages) { | 741 UNIT_TEST_CASE(DartGeneratedMessages) { |
703 static const char* kCustomIsolateScriptChars = | 742 static const char* kCustomIsolateScriptChars = |
704 "getSmi() {\n" | 743 "getSmi() {\n" |
705 " return 42;\n" | 744 " return 42;\n" |
706 "}\n" | 745 "}\n" |
707 "getString() {\n" | 746 "getString() {\n" |
708 " return \"Hello, world!\";\n" | 747 " return \"Hello, world!\";\n" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
740 | 779 |
741 { | 780 { |
742 uint8_t* buffer; | 781 uint8_t* buffer; |
743 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 782 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
744 Smi& smi = Smi::Handle(); | 783 Smi& smi = Smi::Handle(); |
745 smi ^= Api::UnwrapHandle(smi_result); | 784 smi ^= Api::UnwrapHandle(smi_result); |
746 writer.WriteObject(smi.raw()); | 785 writer.WriteObject(smi.raw()); |
747 writer.FinalizeBuffer(); | 786 writer.FinalizeBuffer(); |
748 | 787 |
749 // Read object back from the snapshot into a C structure. | 788 // Read object back from the snapshot into a C structure. |
750 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 789 Dart_CMessage* cmessage = |
790 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
751 writer.BytesWritten(), | 791 writer.BytesWritten(), |
752 &allocator); | 792 &allocator); |
753 Dart_CObject* value = mreader.ReadObject(); | 793 Dart_CObject* cobject = cmessage->object; |
754 EXPECT_NOTNULL(value); | 794 EXPECT_NOTNULL(cobject); |
755 EXPECT_EQ(Dart_CObject::kInt32, value->type); | 795 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
756 EXPECT_EQ(42, value->value.as_int32); | 796 EXPECT_EQ(42, cobject->value.as_int32); |
757 free(value); | 797 FreeDeserializedDartMessage(cmessage); |
758 free(buffer); | |
759 } | 798 } |
760 { | 799 { |
761 uint8_t* buffer; | 800 uint8_t* buffer; |
762 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 801 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
763 String& str = String::Handle(); | 802 String& str = String::Handle(); |
764 str ^= Api::UnwrapHandle(string_result); | 803 str ^= Api::UnwrapHandle(string_result); |
765 writer.WriteObject(str.raw()); | 804 writer.WriteObject(str.raw()); |
766 writer.FinalizeBuffer(); | 805 writer.FinalizeBuffer(); |
767 | 806 |
768 // Read object back from the snapshot into a C structure. | 807 // Read object back from the snapshot into a C structure. |
769 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 808 Dart_CMessage* cmessage = |
809 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
770 writer.BytesWritten(), | 810 writer.BytesWritten(), |
771 &allocator); | 811 &allocator); |
772 Dart_CObject* value = mreader.ReadObject(); | 812 Dart_CObject* cobject = cmessage->object; |
773 EXPECT_NOTNULL(value); | 813 EXPECT_NOTNULL(cobject); |
774 EXPECT_EQ(Dart_CObject::kString, value->type); | 814 EXPECT_EQ(Dart_CObject::kString, cobject->type); |
775 EXPECT_STREQ("Hello, world!", value->value.as_string); | 815 EXPECT_STREQ("Hello, world!", cobject->value.as_string); |
776 free(value); | 816 FreeDeserializedDartMessage(cmessage); |
777 free(buffer); | |
778 } | 817 } |
779 } | 818 } |
780 Dart_ExitScope(); | 819 Dart_ExitScope(); |
781 Dart_ShutdownIsolate(); | 820 Dart_ShutdownIsolate(); |
782 } | 821 } |
783 | 822 |
784 | 823 |
785 UNIT_TEST_CASE(DartGeneratedListMessages) { | 824 UNIT_TEST_CASE(DartGeneratedListMessages) { |
786 const int kArrayLength = 10; | 825 const int kArrayLength = 10; |
787 static const char* kScriptChars = | 826 static const char* kScriptChars = |
(...skipping 26 matching lines...) Expand all Loading... | |
814 Dart_EnterScope(); | 853 Dart_EnterScope(); |
815 | 854 |
816 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 855 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
817 EXPECT_VALID(lib); | 856 EXPECT_VALID(lib); |
818 | 857 |
819 { | 858 { |
820 DARTSCOPE_NOCHECKS(isolate); | 859 DARTSCOPE_NOCHECKS(isolate); |
821 | 860 |
822 { | 861 { |
823 // Generate a list of nulls from Dart code. | 862 // Generate a list of nulls from Dart code. |
824 Dart_CObject* value = GetDeserializedDartObject(lib, "getList"); | 863 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); |
864 Dart_CObject* value = cmessage->object; | |
825 EXPECT_NOTNULL(value); | 865 EXPECT_NOTNULL(value); |
826 EXPECT_EQ(Dart_CObject::kArray, value->type); | 866 EXPECT_EQ(Dart_CObject::kArray, value->type); |
827 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 867 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
828 for (int i = 0; i < kArrayLength; i++) { | 868 for (int i = 0; i < kArrayLength; i++) { |
829 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 869 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
830 free(value->value.as_array.values[i]); | |
831 } | 870 } |
832 free(value); | 871 FreeDeserializedDartMessage(cmessage); |
833 } | 872 } |
834 { | 873 { |
835 // Generate a list of ints from Dart code. | 874 // Generate a list of ints from Dart code. |
836 Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList"); | 875 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); |
876 Dart_CObject* value = cmessage->object; | |
837 EXPECT_NOTNULL(value); | 877 EXPECT_NOTNULL(value); |
838 EXPECT_EQ(Dart_CObject::kArray, value->type); | 878 EXPECT_EQ(Dart_CObject::kArray, value->type); |
839 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 879 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
840 for (int i = 0; i < kArrayLength; i++) { | 880 for (int i = 0; i < kArrayLength; i++) { |
841 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); | 881 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
842 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); | 882 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
843 free(value->value.as_array.values[i]); | |
844 } | 883 } |
845 free(value); | 884 FreeDeserializedDartMessage(cmessage); |
846 } | 885 } |
847 { | 886 { |
848 // Generate a list of strings from Dart code. | 887 // Generate a list of strings from Dart code. |
849 Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList"); | 888 Dart_CMessage* cmessage = |
889 GetDeserializedDartMessage(lib, "getStringList"); | |
890 Dart_CObject* value = cmessage->object; | |
850 EXPECT_NOTNULL(value); | 891 EXPECT_NOTNULL(value); |
851 EXPECT_EQ(Dart_CObject::kArray, value->type); | 892 EXPECT_EQ(Dart_CObject::kArray, value->type); |
852 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 893 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
853 for (int i = 0; i < kArrayLength; i++) { | 894 for (int i = 0; i < kArrayLength; i++) { |
854 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); | 895 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); |
855 char buffer[3]; | 896 char buffer[3]; |
856 snprintf(buffer, sizeof(buffer), "%d", i); | 897 snprintf(buffer, sizeof(buffer), "%d", i); |
857 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); | 898 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
858 free(value->value.as_array.values[i]); | |
859 } | 899 } |
860 free(value); | 900 FreeDeserializedDartMessage(cmessage); |
861 } | 901 } |
862 { | 902 { |
863 // Generate a list of objects of different types from Dart code. | 903 // Generate a list of objects of different types from Dart code. |
864 Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList"); | 904 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
905 Dart_CObject* value = cmessage->object; | |
865 EXPECT_NOTNULL(value); | 906 EXPECT_NOTNULL(value); |
866 EXPECT_EQ(Dart_CObject::kArray, value->type); | 907 EXPECT_EQ(Dart_CObject::kArray, value->type); |
867 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 908 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
868 | 909 |
869 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); | 910 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); |
870 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); | 911 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); |
871 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); | 912 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); |
872 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); | 913 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); |
873 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); | 914 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); |
874 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); | 915 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); |
875 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); | 916 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); |
876 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); | 917 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); |
877 | 918 |
878 for (int i = 0; i < kArrayLength; i++) { | 919 for (int i = 0; i < kArrayLength; i++) { |
879 if (i > 3) { | 920 if (i > 3) { |
880 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 921 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
881 } | 922 } |
882 free(value->value.as_array.values[i]); | |
883 } | 923 } |
884 free(value); | 924 FreeDeserializedDartMessage(cmessage); |
885 } | 925 } |
886 } | 926 } |
887 Dart_ExitScope(); | 927 Dart_ExitScope(); |
888 Dart_ShutdownIsolate(); | 928 Dart_ShutdownIsolate(); |
889 } | 929 } |
890 | 930 |
891 | 931 |
892 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { | 932 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
893 const int kArrayLength = 10; | 933 const int kArrayLength = 10; |
894 static const char* kScriptChars = | 934 static const char* kScriptChars = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
926 Dart_EnterScope(); | 966 Dart_EnterScope(); |
927 | 967 |
928 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 968 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
929 EXPECT_VALID(lib); | 969 EXPECT_VALID(lib); |
930 | 970 |
931 { | 971 { |
932 DARTSCOPE_NOCHECKS(isolate); | 972 DARTSCOPE_NOCHECKS(isolate); |
933 | 973 |
934 { | 974 { |
935 // Generate a list of strings from Dart code. | 975 // Generate a list of strings from Dart code. |
936 Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList"); | 976 Dart_CMessage* cmessage = |
977 GetDeserializedDartMessage(lib, "getStringList"); | |
978 Dart_CObject* object = cmessage->object; | |
937 EXPECT_NOTNULL(object); | 979 EXPECT_NOTNULL(object); |
938 EXPECT_EQ(Dart_CObject::kArray, object->type); | 980 EXPECT_EQ(Dart_CObject::kArray, object->type); |
939 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 981 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
940 for (int i = 0; i < kArrayLength; i++) { | 982 for (int i = 0; i < kArrayLength; i++) { |
941 Dart_CObject* element = object->value.as_array.values[i]; | 983 Dart_CObject* element = object->value.as_array.values[i]; |
942 EXPECT_EQ(object->value.as_array.values[0], element); | 984 EXPECT_EQ(object->value.as_array.values[0], element); |
943 EXPECT_EQ(Dart_CObject::kString, element->type); | 985 EXPECT_EQ(Dart_CObject::kString, element->type); |
944 EXPECT_STREQ("Hello, world!", element->value.as_string); | 986 EXPECT_STREQ("Hello, world!", element->value.as_string); |
945 } | 987 } |
946 free(object->value.as_array.values[0]); | 988 FreeDeserializedDartMessage(cmessage); |
947 free(object); | |
948 } | 989 } |
949 { | 990 { |
950 // Generate a list of doubles from Dart code. | 991 // Generate a list of doubles from Dart code. |
951 Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList"); | 992 Dart_CMessage* cmessage = |
993 GetDeserializedDartMessage(lib, "getDoubleList"); | |
994 Dart_CObject* object = cmessage->object; | |
952 EXPECT_NOTNULL(object); | 995 EXPECT_NOTNULL(object); |
953 EXPECT_EQ(Dart_CObject::kArray, object->type); | 996 EXPECT_EQ(Dart_CObject::kArray, object->type); |
954 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 997 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
955 for (int i = 0; i < kArrayLength; i++) { | 998 for (int i = 0; i < kArrayLength; i++) { |
956 Dart_CObject* element = object->value.as_array.values[i]; | 999 Dart_CObject* element = object->value.as_array.values[i]; |
957 EXPECT_EQ(object->value.as_array.values[0], element); | 1000 EXPECT_EQ(object->value.as_array.values[0], element); |
958 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1001 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
959 EXPECT_EQ(3.14, element->value.as_double); | 1002 EXPECT_EQ(3.14, element->value.as_double); |
960 } | 1003 } |
961 free(object->value.as_array.values[0]); | 1004 FreeDeserializedDartMessage(cmessage); |
962 free(object); | |
963 } | 1005 } |
964 { | 1006 { |
965 // Generate a list of objects of different types from Dart code. | 1007 // Generate a list of objects of different types from Dart code. |
966 Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList"); | 1008 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
1009 Dart_CObject* object = cmessage->object; | |
967 EXPECT_NOTNULL(object); | 1010 EXPECT_NOTNULL(object); |
968 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1011 EXPECT_EQ(Dart_CObject::kArray, object->type); |
969 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1012 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
970 for (int i = 0; i < kArrayLength; i++) { | 1013 for (int i = 0; i < kArrayLength; i++) { |
971 Dart_CObject* element = object->value.as_array.values[i]; | 1014 Dart_CObject* element = object->value.as_array.values[i]; |
972 if ((i % 2) == 0) { | 1015 if ((i % 2) == 0) { |
973 EXPECT_EQ(object->value.as_array.values[0], element); | 1016 EXPECT_EQ(object->value.as_array.values[0], element); |
974 EXPECT_EQ(Dart_CObject::kString, element->type); | 1017 EXPECT_EQ(Dart_CObject::kString, element->type); |
975 EXPECT_STREQ("A", element->value.as_string); | 1018 EXPECT_STREQ("A", element->value.as_string); |
976 } else { | 1019 } else { |
977 EXPECT_EQ(object->value.as_array.values[1], element); | 1020 EXPECT_EQ(object->value.as_array.values[1], element); |
978 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1021 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
979 EXPECT_STREQ(2.72, element->value.as_double); | 1022 EXPECT_STREQ(2.72, element->value.as_double); |
980 } | 1023 } |
981 } | 1024 } |
982 free(object->value.as_array.values[0]); | 1025 FreeDeserializedDartMessage(cmessage); |
983 free(object->value.as_array.values[1]); | |
984 free(object); | |
985 } | 1026 } |
986 { | 1027 { |
987 // Generate a list of objects of different types from Dart code. | 1028 // Generate a list of objects of different types from Dart code. |
988 Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList"); | 1029 Dart_CMessage* cmessage = |
1030 GetDeserializedDartMessage(lib, "getSelfRefList"); | |
1031 Dart_CObject* object = cmessage->object; | |
989 EXPECT_NOTNULL(object); | 1032 EXPECT_NOTNULL(object); |
990 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1033 EXPECT_EQ(Dart_CObject::kArray, object->type); |
991 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1034 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
992 for (int i = 0; i < kArrayLength; i++) { | 1035 for (int i = 0; i < kArrayLength; i++) { |
993 Dart_CObject* element = object->value.as_array.values[i]; | 1036 Dart_CObject* element = object->value.as_array.values[i]; |
994 EXPECT_EQ(Dart_CObject::kArray, element->type); | 1037 EXPECT_EQ(Dart_CObject::kArray, element->type); |
995 EXPECT_EQ(object, element); | 1038 EXPECT_EQ(object, element); |
996 } | 1039 } |
997 free(object); | 1040 FreeDeserializedDartMessage(cmessage); |
998 } | 1041 } |
999 } | 1042 } |
1000 Dart_ExitScope(); | 1043 Dart_ExitScope(); |
1001 Dart_ShutdownIsolate(); | 1044 Dart_ShutdownIsolate(); |
1002 } | 1045 } |
1003 | 1046 |
1004 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1047 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
1005 | 1048 |
1006 } // namespace dart | 1049 } // namespace dart |
OLD | NEW |