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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_api_message.h" |
10 #include "vm/dart_api_state.h" | 11 #include "vm/dart_api_state.h" |
11 #include "vm/snapshot.h" | 12 #include "vm/snapshot.h" |
12 #include "vm/unit_test.h" | 13 #include "vm/unit_test.h" |
13 | 14 |
14 namespace dart { | 15 namespace dart { |
15 | 16 |
16 // Check if serialized and deserialized objects are equal. | 17 // Check if serialized and deserialized objects are equal. |
17 static bool Equals(const Object& expected, const Object& actual) { | 18 static bool Equals(const Object& expected, const Object& actual) { |
18 if (expected.IsNull()) { | 19 if (expected.IsNull()) { |
19 return actual.IsNull(); | 20 return actual.IsNull(); |
(...skipping 28 matching lines...) Expand all Loading... |
48 uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 49 uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
49 Zone* zone = Isolate::Current()->current_zone(); | 50 Zone* zone = Isolate::Current()->current_zone(); |
50 return reinterpret_cast<uint8_t*>( | 51 return reinterpret_cast<uint8_t*>( |
51 zone->Reallocate(reinterpret_cast<uword>(ptr), old_size, new_size)); | 52 zone->Reallocate(reinterpret_cast<uword>(ptr), old_size, new_size)); |
52 } | 53 } |
53 | 54 |
54 | 55 |
55 static Dart_CObject* DecodeMessage(uint8_t* message, | 56 static Dart_CObject* DecodeMessage(uint8_t* message, |
56 intptr_t length, | 57 intptr_t length, |
57 ReAlloc allocator) { | 58 ReAlloc allocator) { |
58 CMessageReader message_reader(message, length, allocator); | 59 ApiMessageReader message_reader(message, length, allocator); |
59 return message_reader.ReadMessage(); | 60 return message_reader.ReadMessage(); |
60 } | 61 } |
61 | 62 |
62 | 63 |
63 // Compare two Dart_CObject object graphs rooted in first and | 64 // Compare two Dart_CObject object graphs rooted in first and |
64 // second. The second graph will be destroyed by this operation no matter | 65 // second. The second graph will be destroyed by this operation no matter |
65 // whether the graphs are equal or not. | 66 // whether the graphs are equal or not. |
66 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { | 67 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { |
67 // Return immediately if entering a cycle. | 68 // Return immediately if entering a cycle. |
68 if (second->type == Dart_CObject::kNumberOfTypes) return; | 69 if (second->type == Dart_CObject::kNumberOfTypes) return; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 } | 101 } |
101 } | 102 } |
102 | 103 |
103 | 104 |
104 static void CheckEncodeDecodeMessage(Dart_CObject* root) { | 105 static void CheckEncodeDecodeMessage(Dart_CObject* root) { |
105 // Encode and decode the message. | 106 // Encode and decode the message. |
106 uint8_t* buffer = NULL; | 107 uint8_t* buffer = NULL; |
107 MessageWriter writer(&buffer, &malloc_allocator); | 108 MessageWriter writer(&buffer, &malloc_allocator); |
108 writer.WriteCMessage(root); | 109 writer.WriteCMessage(root); |
109 | 110 |
110 Zone zone(Isolate::Current()); | |
111 Dart_CObject* new_root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 111 Dart_CObject* new_root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
112 writer.BytesWritten(), | 112 writer.BytesWritten(), |
113 &zone_allocator); | 113 &zone_allocator); |
114 | 114 |
115 // Check that the two messages are the same. | 115 // Check that the two messages are the same. |
116 CompareDartCObjects(root, new_root); | 116 CompareDartCObjects(root, new_root); |
117 } | 117 } |
118 | 118 |
119 TEST_CASE(SerializeNull) { | 119 TEST_CASE(SerializeNull) { |
120 Zone zone(Isolate::Current()); | 120 Zone zone(Isolate::Current()); |
121 | 121 |
122 // Write snapshot with object content. | 122 // Write snapshot with object content. |
123 uint8_t* buffer; | 123 uint8_t* buffer; |
124 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 124 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
125 const Object& null_object = Object::Handle(); | 125 const Object& null_object = Object::Handle(); |
126 writer.WriteObject(null_object.raw()); | 126 writer.WriteObject(null_object.raw()); |
127 writer.FinalizeBuffer(); | 127 writer.FinalizeBuffer(); |
128 | 128 |
129 // Create a snapshot object using the buffer. | 129 // Create a snapshot object using the buffer. |
130 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 130 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
131 | 131 |
132 // Read object back from the snapshot. | 132 // Read object back from the snapshot. |
133 SnapshotReader reader(snapshot, Isolate::Current()); | 133 SnapshotReader reader(snapshot, Isolate::Current()); |
134 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 134 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
135 EXPECT(Equals(null_object, serialized_object)); | 135 EXPECT(Equals(null_object, serialized_object)); |
136 | 136 |
137 // Read object back from the snapshot into a C structure. | 137 // Read object back from the snapshot into a C structure. |
| 138 ApiNativeScope scope; |
138 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 139 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
139 writer.BytesWritten(), | 140 writer.BytesWritten(), |
140 &zone_allocator); | 141 &zone_allocator); |
141 EXPECT_NOTNULL(root); | 142 EXPECT_NOTNULL(root); |
142 EXPECT_EQ(Dart_CObject::kNull, root->type); | 143 EXPECT_EQ(Dart_CObject::kNull, root->type); |
143 CheckEncodeDecodeMessage(root); | 144 CheckEncodeDecodeMessage(root); |
144 } | 145 } |
145 | 146 |
146 | 147 |
147 TEST_CASE(SerializeSmi1) { | 148 TEST_CASE(SerializeSmi1) { |
148 Zone zone(Isolate::Current()); | 149 Zone zone(Isolate::Current()); |
149 | 150 |
150 // Write snapshot with object content. | 151 // Write snapshot with object content. |
151 uint8_t* buffer; | 152 uint8_t* buffer; |
152 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 153 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
153 const Smi& smi = Smi::Handle(Smi::New(124)); | 154 const Smi& smi = Smi::Handle(Smi::New(124)); |
154 writer.WriteObject(smi.raw()); | 155 writer.WriteObject(smi.raw()); |
155 writer.FinalizeBuffer(); | 156 writer.FinalizeBuffer(); |
156 | 157 |
157 // Create a snapshot object using the buffer. | 158 // Create a snapshot object using the buffer. |
158 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 159 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
159 | 160 |
160 // Read object back from the snapshot. | 161 // Read object back from the snapshot. |
161 SnapshotReader reader(snapshot, Isolate::Current()); | 162 SnapshotReader reader(snapshot, Isolate::Current()); |
162 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 163 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
163 EXPECT(Equals(smi, serialized_object)); | 164 EXPECT(Equals(smi, serialized_object)); |
164 | 165 |
165 // Read object back from the snapshot into a C structure. | 166 // Read object back from the snapshot into a C structure. |
| 167 ApiNativeScope scope; |
166 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 168 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
167 writer.BytesWritten(), | 169 writer.BytesWritten(), |
168 &zone_allocator); | 170 &zone_allocator); |
169 EXPECT_NOTNULL(root); | 171 EXPECT_NOTNULL(root); |
170 EXPECT_EQ(Dart_CObject::kInt32, root->type); | 172 EXPECT_EQ(Dart_CObject::kInt32, root->type); |
171 EXPECT_EQ(smi.Value(), root->value.as_int32); | 173 EXPECT_EQ(smi.Value(), root->value.as_int32); |
172 CheckEncodeDecodeMessage(root); | 174 CheckEncodeDecodeMessage(root); |
173 } | 175 } |
174 | 176 |
175 | 177 |
176 TEST_CASE(SerializeSmi2) { | 178 TEST_CASE(SerializeSmi2) { |
177 Zone zone(Isolate::Current()); | 179 Zone zone(Isolate::Current()); |
178 | 180 |
179 // Write snapshot with object content. | 181 // Write snapshot with object content. |
180 uint8_t* buffer; | 182 uint8_t* buffer; |
181 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 183 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
182 const Smi& smi = Smi::Handle(Smi::New(-1)); | 184 const Smi& smi = Smi::Handle(Smi::New(-1)); |
183 writer.WriteObject(smi.raw()); | 185 writer.WriteObject(smi.raw()); |
184 writer.FinalizeBuffer(); | 186 writer.FinalizeBuffer(); |
185 | 187 |
186 // Create a snapshot object using the buffer. | 188 // Create a snapshot object using the buffer. |
187 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 189 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
188 | 190 |
189 // Read object back from the snapshot. | 191 // Read object back from the snapshot. |
190 SnapshotReader reader(snapshot, Isolate::Current()); | 192 SnapshotReader reader(snapshot, Isolate::Current()); |
191 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 193 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
192 EXPECT(Equals(smi, serialized_object)); | 194 EXPECT(Equals(smi, serialized_object)); |
193 | 195 |
194 // Read object back from the snapshot into a C structure. | 196 // Read object back from the snapshot into a C structure. |
| 197 ApiNativeScope scope; |
195 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 198 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
196 writer.BytesWritten(), | 199 writer.BytesWritten(), |
197 &zone_allocator); | 200 &zone_allocator); |
198 EXPECT_NOTNULL(root); | 201 EXPECT_NOTNULL(root); |
199 EXPECT_EQ(Dart_CObject::kInt32, root->type); | 202 EXPECT_EQ(Dart_CObject::kInt32, root->type); |
200 EXPECT_EQ(smi.Value(), root->value.as_int32); | 203 EXPECT_EQ(smi.Value(), root->value.as_int32); |
201 CheckEncodeDecodeMessage(root); | 204 CheckEncodeDecodeMessage(root); |
202 } | 205 } |
203 | 206 |
204 | 207 |
205 TEST_CASE(SerializeDouble) { | 208 TEST_CASE(SerializeDouble) { |
206 Zone zone(Isolate::Current()); | 209 Zone zone(Isolate::Current()); |
207 | 210 |
208 // Write snapshot with object content. | 211 // Write snapshot with object content. |
209 uint8_t* buffer; | 212 uint8_t* buffer; |
210 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 213 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
211 const Double& dbl = Double::Handle(Double::New(101.29)); | 214 const Double& dbl = Double::Handle(Double::New(101.29)); |
212 writer.WriteObject(dbl.raw()); | 215 writer.WriteObject(dbl.raw()); |
213 writer.FinalizeBuffer(); | 216 writer.FinalizeBuffer(); |
214 | 217 |
215 // Create a snapshot object using the buffer. | 218 // Create a snapshot object using the buffer. |
216 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 219 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
217 | 220 |
218 // Read object back from the snapshot. | 221 // Read object back from the snapshot. |
219 SnapshotReader reader(snapshot, Isolate::Current()); | 222 SnapshotReader reader(snapshot, Isolate::Current()); |
220 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 223 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
221 EXPECT(Equals(dbl, serialized_object)); | 224 EXPECT(Equals(dbl, serialized_object)); |
222 | 225 |
223 // Read object back from the snapshot into a C structure. | 226 // Read object back from the snapshot into a C structure. |
| 227 ApiNativeScope scope; |
224 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 228 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
225 writer.BytesWritten(), | 229 writer.BytesWritten(), |
226 &zone_allocator); | 230 &zone_allocator); |
227 EXPECT_NOTNULL(root); | 231 EXPECT_NOTNULL(root); |
228 EXPECT_EQ(Dart_CObject::kDouble, root->type); | 232 EXPECT_EQ(Dart_CObject::kDouble, root->type); |
229 EXPECT_EQ(dbl.value(), root->value.as_double); | 233 EXPECT_EQ(dbl.value(), root->value.as_double); |
230 CheckEncodeDecodeMessage(root); | 234 CheckEncodeDecodeMessage(root); |
231 } | 235 } |
232 | 236 |
233 | 237 |
(...skipping 26 matching lines...) Expand all Loading... |
260 uint8_t* buffer; | 264 uint8_t* buffer; |
261 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 265 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
262 const Bool& bl = Bool::Handle(Bool::True()); | 266 const Bool& bl = Bool::Handle(Bool::True()); |
263 writer.WriteObject(bl.raw()); | 267 writer.WriteObject(bl.raw()); |
264 writer.FinalizeBuffer(); | 268 writer.FinalizeBuffer(); |
265 | 269 |
266 // Create a snapshot object using the buffer. | 270 // Create a snapshot object using the buffer. |
267 Snapshot::SetupFromBuffer(buffer); | 271 Snapshot::SetupFromBuffer(buffer); |
268 | 272 |
269 // Read object back from the snapshot into a C structure. | 273 // Read object back from the snapshot into a C structure. |
| 274 ApiNativeScope scope; |
270 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 275 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
271 writer.BytesWritten(), | 276 writer.BytesWritten(), |
272 &zone_allocator); | 277 &zone_allocator); |
273 EXPECT_NOTNULL(root); | 278 EXPECT_NOTNULL(root); |
274 EXPECT_EQ(Dart_CObject::kBool, root->type); | 279 EXPECT_EQ(Dart_CObject::kBool, root->type); |
275 EXPECT_EQ(true, root->value.as_bool); | 280 EXPECT_EQ(true, root->value.as_bool); |
276 CheckEncodeDecodeMessage(root); | 281 CheckEncodeDecodeMessage(root); |
277 } | 282 } |
278 | 283 |
279 | 284 |
280 TEST_CASE(SerializeFalse) { | 285 TEST_CASE(SerializeFalse) { |
281 Zone zone(Isolate::Current()); | 286 Zone zone(Isolate::Current()); |
282 | 287 |
283 // Write snapshot with false object. | 288 // Write snapshot with false object. |
284 uint8_t* buffer; | 289 uint8_t* buffer; |
285 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 290 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
286 const Bool& bl = Bool::Handle(Bool::False()); | 291 const Bool& bl = Bool::Handle(Bool::False()); |
287 writer.WriteObject(bl.raw()); | 292 writer.WriteObject(bl.raw()); |
288 writer.FinalizeBuffer(); | 293 writer.FinalizeBuffer(); |
289 | 294 |
290 // Create a snapshot object using the buffer. | 295 // Create a snapshot object using the buffer. |
291 Snapshot::SetupFromBuffer(buffer); | 296 Snapshot::SetupFromBuffer(buffer); |
292 | 297 |
293 // Read object back from the snapshot into a C structure. | 298 // Read object back from the snapshot into a C structure. |
| 299 ApiNativeScope scope; |
294 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 300 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
295 writer.BytesWritten(), | 301 writer.BytesWritten(), |
296 &zone_allocator); | 302 &zone_allocator); |
297 EXPECT_NOTNULL(root); | 303 EXPECT_NOTNULL(root); |
298 EXPECT_EQ(Dart_CObject::kBool, root->type); | 304 EXPECT_EQ(Dart_CObject::kBool, root->type); |
299 EXPECT_EQ(false, root->value.as_bool); | 305 EXPECT_EQ(false, root->value.as_bool); |
300 CheckEncodeDecodeMessage(root); | 306 CheckEncodeDecodeMessage(root); |
301 } | 307 } |
302 | 308 |
303 | 309 |
(...skipping 11 matching lines...) Expand all Loading... |
315 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 321 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
316 | 322 |
317 // Read object back from the snapshot. | 323 // Read object back from the snapshot. |
318 SnapshotReader reader(snapshot, Isolate::Current()); | 324 SnapshotReader reader(snapshot, Isolate::Current()); |
319 Bigint& obj = Bigint::Handle(); | 325 Bigint& obj = Bigint::Handle(); |
320 obj ^= reader.ReadObject(); | 326 obj ^= reader.ReadObject(); |
321 OS::Print("%lld", BigintOperations::ToInt64(obj)); | 327 OS::Print("%lld", BigintOperations::ToInt64(obj)); |
322 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); | 328 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); |
323 | 329 |
324 // Read object back from the snapshot into a C structure. | 330 // Read object back from the snapshot into a C structure. |
| 331 ApiNativeScope scope; |
325 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 332 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
326 writer.BytesWritten(), | 333 writer.BytesWritten(), |
327 &zone_allocator); | 334 &zone_allocator); |
328 // Bigint not supported. | 335 // Bigint not supported. |
329 EXPECT(root == NULL); | 336 EXPECT(root == NULL); |
330 } | 337 } |
331 | 338 |
332 | 339 |
333 TEST_CASE(SerializeSingletons) { | 340 TEST_CASE(SerializeSingletons) { |
334 // Write snapshot with object content. | 341 // Write snapshot with object content. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 // Create a snapshot object using the buffer. | 405 // Create a snapshot object using the buffer. |
399 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 406 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
400 | 407 |
401 // Read object back from the snapshot. | 408 // Read object back from the snapshot. |
402 SnapshotReader reader(snapshot, Isolate::Current()); | 409 SnapshotReader reader(snapshot, Isolate::Current()); |
403 String& serialized_str = String::Handle(); | 410 String& serialized_str = String::Handle(); |
404 serialized_str ^= reader.ReadObject(); | 411 serialized_str ^= reader.ReadObject(); |
405 EXPECT(str.Equals(serialized_str)); | 412 EXPECT(str.Equals(serialized_str)); |
406 | 413 |
407 // Read object back from the snapshot into a C structure. | 414 // Read object back from the snapshot into a C structure. |
| 415 ApiNativeScope scope; |
408 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 416 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
409 writer.BytesWritten(), | 417 writer.BytesWritten(), |
410 &zone_allocator); | 418 &zone_allocator); |
411 EXPECT_EQ(Dart_CObject::kString, root->type); | 419 EXPECT_EQ(Dart_CObject::kString, root->type); |
412 EXPECT_STREQ(cstr, root->value.as_string); | 420 EXPECT_STREQ(cstr, root->value.as_string); |
413 CheckEncodeDecodeMessage(root); | 421 CheckEncodeDecodeMessage(root); |
414 } | 422 } |
415 | 423 |
416 | 424 |
417 TEST_CASE(SerializeArray) { | 425 TEST_CASE(SerializeArray) { |
(...skipping 15 matching lines...) Expand all Loading... |
433 // Create a snapshot object using the buffer. | 441 // Create a snapshot object using the buffer. |
434 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 442 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
435 | 443 |
436 // Read object back from the snapshot. | 444 // Read object back from the snapshot. |
437 SnapshotReader reader(snapshot, Isolate::Current()); | 445 SnapshotReader reader(snapshot, Isolate::Current()); |
438 Array& serialized_array = Array::Handle(); | 446 Array& serialized_array = Array::Handle(); |
439 serialized_array ^= reader.ReadObject(); | 447 serialized_array ^= reader.ReadObject(); |
440 EXPECT(array.Equals(serialized_array)); | 448 EXPECT(array.Equals(serialized_array)); |
441 | 449 |
442 // Read object back from the snapshot into a C structure. | 450 // Read object back from the snapshot into a C structure. |
| 451 ApiNativeScope scope; |
443 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 452 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
444 writer.BytesWritten(), | 453 writer.BytesWritten(), |
445 &zone_allocator); | 454 &zone_allocator); |
446 EXPECT_EQ(Dart_CObject::kArray, root->type); | 455 EXPECT_EQ(Dart_CObject::kArray, root->type); |
447 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 456 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
448 for (int i = 0; i < kArrayLength; i++) { | 457 for (int i = 0; i < kArrayLength; i++) { |
449 Dart_CObject* element = root->value.as_array.values[i]; | 458 Dart_CObject* element = root->value.as_array.values[i]; |
450 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 459 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
451 EXPECT_EQ(i, element->value.as_int32); | 460 EXPECT_EQ(i, element->value.as_int32); |
452 } | 461 } |
(...skipping 15 matching lines...) Expand all Loading... |
468 // Create a snapshot object using the buffer. | 477 // Create a snapshot object using the buffer. |
469 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 478 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
470 | 479 |
471 // Read object back from the snapshot. | 480 // Read object back from the snapshot. |
472 SnapshotReader reader(snapshot, Isolate::Current()); | 481 SnapshotReader reader(snapshot, Isolate::Current()); |
473 Array& serialized_array = Array::Handle(); | 482 Array& serialized_array = Array::Handle(); |
474 serialized_array ^= reader.ReadObject(); | 483 serialized_array ^= reader.ReadObject(); |
475 EXPECT(array.Equals(serialized_array)); | 484 EXPECT(array.Equals(serialized_array)); |
476 | 485 |
477 // Read object back from the snapshot into a C structure. | 486 // Read object back from the snapshot into a C structure. |
| 487 ApiNativeScope scope; |
478 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 488 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
479 writer.BytesWritten(), | 489 writer.BytesWritten(), |
480 &zone_allocator); | 490 &zone_allocator); |
481 EXPECT_EQ(Dart_CObject::kArray, root->type); | 491 EXPECT_EQ(Dart_CObject::kArray, root->type); |
482 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 492 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
483 EXPECT(root->value.as_array.values == NULL); | 493 EXPECT(root->value.as_array.values == NULL); |
484 CheckEncodeDecodeMessage(root); | 494 CheckEncodeDecodeMessage(root); |
485 } | 495 } |
486 | 496 |
487 | 497 |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 Zone zone(Isolate::Current()); | 806 Zone zone(Isolate::Current()); |
797 uint8_t* buffer = NULL; | 807 uint8_t* buffer = NULL; |
798 MessageWriter writer(&buffer, &zone_allocator); | 808 MessageWriter writer(&buffer, &zone_allocator); |
799 | 809 |
800 static const int kArrayLength = 2; | 810 static const int kArrayLength = 2; |
801 intptr_t data[kArrayLength] = {1, 2}; | 811 intptr_t data[kArrayLength] = {1, 2}; |
802 int len = kArrayLength; | 812 int len = kArrayLength; |
803 writer.WriteMessage(len, data); | 813 writer.WriteMessage(len, data); |
804 | 814 |
805 // Read object back from the snapshot into a C structure. | 815 // Read object back from the snapshot into a C structure. |
| 816 ApiNativeScope scope; |
806 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 817 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
807 writer.BytesWritten(), | 818 writer.BytesWritten(), |
808 &zone_allocator); | 819 &zone_allocator); |
809 EXPECT_EQ(Dart_CObject::kArray, root->type); | 820 EXPECT_EQ(Dart_CObject::kArray, root->type); |
810 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 821 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
811 for (int i = 0; i < kArrayLength; i++) { | 822 for (int i = 0; i < kArrayLength; i++) { |
812 Dart_CObject* element = root->value.as_array.values[i]; | 823 Dart_CObject* element = root->value.as_array.values[i]; |
813 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 824 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
814 EXPECT_EQ(i + 1, element->value.as_int32); | 825 EXPECT_EQ(i + 1, element->value.as_int32); |
815 } | 826 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 { | 896 { |
886 Zone zone(Isolate::Current()); | 897 Zone zone(Isolate::Current()); |
887 uint8_t* buffer; | 898 uint8_t* buffer; |
888 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 899 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
889 Smi& smi = Smi::Handle(); | 900 Smi& smi = Smi::Handle(); |
890 smi ^= Api::UnwrapHandle(smi_result); | 901 smi ^= Api::UnwrapHandle(smi_result); |
891 writer.WriteObject(smi.raw()); | 902 writer.WriteObject(smi.raw()); |
892 writer.FinalizeBuffer(); | 903 writer.FinalizeBuffer(); |
893 | 904 |
894 // Read object back from the snapshot into a C structure. | 905 // Read object back from the snapshot into a C structure. |
| 906 ApiNativeScope scope; |
895 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 907 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
896 writer.BytesWritten(), | 908 writer.BytesWritten(), |
897 &zone_allocator); | 909 &zone_allocator); |
898 EXPECT_NOTNULL(root); | 910 EXPECT_NOTNULL(root); |
899 EXPECT_EQ(Dart_CObject::kInt32, root->type); | 911 EXPECT_EQ(Dart_CObject::kInt32, root->type); |
900 EXPECT_EQ(42, root->value.as_int32); | 912 EXPECT_EQ(42, root->value.as_int32); |
901 CheckEncodeDecodeMessage(root); | 913 CheckEncodeDecodeMessage(root); |
902 } | 914 } |
903 { | 915 { |
904 Zone zone(Isolate::Current()); | 916 Zone zone(Isolate::Current()); |
905 uint8_t* buffer; | 917 uint8_t* buffer; |
906 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 918 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
907 String& str = String::Handle(); | 919 String& str = String::Handle(); |
908 str ^= Api::UnwrapHandle(string_result); | 920 str ^= Api::UnwrapHandle(string_result); |
909 writer.WriteObject(str.raw()); | 921 writer.WriteObject(str.raw()); |
910 writer.FinalizeBuffer(); | 922 writer.FinalizeBuffer(); |
911 | 923 |
912 // Read object back from the snapshot into a C structure. | 924 // Read object back from the snapshot into a C structure. |
| 925 ApiNativeScope scope; |
913 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, | 926 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
914 writer.BytesWritten(), | 927 writer.BytesWritten(), |
915 &zone_allocator); | 928 &zone_allocator); |
916 EXPECT_NOTNULL(root); | 929 EXPECT_NOTNULL(root); |
917 EXPECT_EQ(Dart_CObject::kString, root->type); | 930 EXPECT_EQ(Dart_CObject::kString, root->type); |
918 EXPECT_STREQ("Hello, world!", root->value.as_string); | 931 EXPECT_STREQ("Hello, world!", root->value.as_string); |
919 CheckEncodeDecodeMessage(root); | 932 CheckEncodeDecodeMessage(root); |
920 } | 933 } |
921 } | 934 } |
922 Dart_ExitScope(); | 935 Dart_ExitScope(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 EXPECT(isolate != NULL); | 968 EXPECT(isolate != NULL); |
956 Dart_EnterScope(); | 969 Dart_EnterScope(); |
957 | 970 |
958 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 971 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
959 EXPECT_VALID(lib); | 972 EXPECT_VALID(lib); |
960 | 973 |
961 { | 974 { |
962 DARTSCOPE_NOCHECKS(isolate); | 975 DARTSCOPE_NOCHECKS(isolate); |
963 { | 976 { |
964 // Generate a list of nulls from Dart code. | 977 // Generate a list of nulls from Dart code. |
965 Zone zone(Isolate::Current()); | 978 ApiNativeScope scope; |
966 Dart_CObject* root = GetDeserializedDartMessage(lib, "getList"); | 979 Dart_CObject* root = GetDeserializedDartMessage(lib, "getList"); |
967 EXPECT_NOTNULL(root); | 980 EXPECT_NOTNULL(root); |
968 EXPECT_EQ(Dart_CObject::kArray, root->type); | 981 EXPECT_EQ(Dart_CObject::kArray, root->type); |
969 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 982 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
970 for (int i = 0; i < kArrayLength; i++) { | 983 for (int i = 0; i < kArrayLength; i++) { |
971 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); | 984 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); |
972 } | 985 } |
973 CheckEncodeDecodeMessage(root); | 986 CheckEncodeDecodeMessage(root); |
974 } | 987 } |
975 { | 988 { |
976 // Generate a list of ints from Dart code. | 989 // Generate a list of ints from Dart code. |
977 Zone zone(Isolate::Current()); | 990 ApiNativeScope scope; |
978 Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList"); | 991 Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList"); |
979 EXPECT_NOTNULL(root); | 992 EXPECT_NOTNULL(root); |
980 EXPECT_EQ(Dart_CObject::kArray, root->type); | 993 EXPECT_EQ(Dart_CObject::kArray, root->type); |
981 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 994 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
982 for (int i = 0; i < kArrayLength; i++) { | 995 for (int i = 0; i < kArrayLength; i++) { |
983 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[i]->type); | 996 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[i]->type); |
984 EXPECT_EQ(i, root->value.as_array.values[i]->value.as_int32); | 997 EXPECT_EQ(i, root->value.as_array.values[i]->value.as_int32); |
985 } | 998 } |
986 CheckEncodeDecodeMessage(root); | 999 CheckEncodeDecodeMessage(root); |
987 } | 1000 } |
988 { | 1001 { |
989 // Generate a list of strings from Dart code. | 1002 // Generate a list of strings from Dart code. |
990 Zone zone(Isolate::Current()); | 1003 ApiNativeScope scope; |
991 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); | 1004 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
992 EXPECT_NOTNULL(root); | 1005 EXPECT_NOTNULL(root); |
993 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1006 EXPECT_EQ(Dart_CObject::kArray, root->type); |
994 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1007 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
995 for (int i = 0; i < kArrayLength; i++) { | 1008 for (int i = 0; i < kArrayLength; i++) { |
996 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[i]->type); | 1009 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[i]->type); |
997 char buffer[3]; | 1010 char buffer[3]; |
998 snprintf(buffer, sizeof(buffer), "%d", i); | 1011 snprintf(buffer, sizeof(buffer), "%d", i); |
999 EXPECT_STREQ(buffer, root->value.as_array.values[i]->value.as_string); | 1012 EXPECT_STREQ(buffer, root->value.as_array.values[i]->value.as_string); |
1000 } | 1013 } |
1001 } | 1014 } |
1002 { | 1015 { |
1003 // Generate a list of objects of different types from Dart code. | 1016 // Generate a list of objects of different types from Dart code. |
1004 Zone zone(Isolate::Current()); | 1017 ApiNativeScope scope; |
1005 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); | 1018 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
1006 EXPECT_NOTNULL(root); | 1019 EXPECT_NOTNULL(root); |
1007 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1020 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1008 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1021 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1009 | 1022 |
1010 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[0]->type); | 1023 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[0]->type); |
1011 EXPECT_EQ(0, root->value.as_array.values[0]->value.as_int32); | 1024 EXPECT_EQ(0, root->value.as_array.values[0]->value.as_int32); |
1012 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[1]->type); | 1025 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[1]->type); |
1013 EXPECT_STREQ("1", root->value.as_array.values[1]->value.as_string); | 1026 EXPECT_STREQ("1", root->value.as_array.values[1]->value.as_string); |
1014 EXPECT_EQ(Dart_CObject::kDouble, root->value.as_array.values[2]->type); | 1027 EXPECT_EQ(Dart_CObject::kDouble, root->value.as_array.values[2]->type); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 Dart_EnterScope(); | 1078 Dart_EnterScope(); |
1066 | 1079 |
1067 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 1080 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
1068 EXPECT_VALID(lib); | 1081 EXPECT_VALID(lib); |
1069 | 1082 |
1070 { | 1083 { |
1071 DARTSCOPE_NOCHECKS(isolate); | 1084 DARTSCOPE_NOCHECKS(isolate); |
1072 | 1085 |
1073 { | 1086 { |
1074 // Generate a list of strings from Dart code. | 1087 // Generate a list of strings from Dart code. |
1075 Zone zone(Isolate::Current()); | 1088 ApiNativeScope scope; |
1076 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); | 1089 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
1077 EXPECT_NOTNULL(root); | 1090 EXPECT_NOTNULL(root); |
1078 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1091 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1079 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1092 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1080 for (int i = 0; i < kArrayLength; i++) { | 1093 for (int i = 0; i < kArrayLength; i++) { |
1081 Dart_CObject* element = root->value.as_array.values[i]; | 1094 Dart_CObject* element = root->value.as_array.values[i]; |
1082 EXPECT_EQ(root->value.as_array.values[0], element); | 1095 EXPECT_EQ(root->value.as_array.values[0], element); |
1083 EXPECT_EQ(Dart_CObject::kString, element->type); | 1096 EXPECT_EQ(Dart_CObject::kString, element->type); |
1084 EXPECT_STREQ("Hello, world!", element->value.as_string); | 1097 EXPECT_STREQ("Hello, world!", element->value.as_string); |
1085 } | 1098 } |
1086 } | 1099 } |
1087 { | 1100 { |
1088 // Generate a list of doubles from Dart code. | 1101 // Generate a list of doubles from Dart code. |
1089 Zone zone(Isolate::Current()); | 1102 ApiNativeScope scope; |
1090 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); | 1103 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
1091 EXPECT_NOTNULL(root); | 1104 EXPECT_NOTNULL(root); |
1092 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1105 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1093 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1106 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1094 for (int i = 0; i < kArrayLength; i++) { | 1107 for (int i = 0; i < kArrayLength; i++) { |
1095 Dart_CObject* element = root->value.as_array.values[i]; | 1108 Dart_CObject* element = root->value.as_array.values[i]; |
1096 EXPECT_EQ(root->value.as_array.values[0], element); | 1109 EXPECT_EQ(root->value.as_array.values[0], element); |
1097 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1110 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
1098 EXPECT_EQ(3.14, element->value.as_double); | 1111 EXPECT_EQ(3.14, element->value.as_double); |
1099 } | 1112 } |
1100 } | 1113 } |
1101 { | 1114 { |
1102 // Generate a list of objects of different types from Dart code. | 1115 // Generate a list of objects of different types from Dart code. |
1103 Zone zone(Isolate::Current()); | 1116 ApiNativeScope scope; |
1104 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); | 1117 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
1105 EXPECT_NOTNULL(root); | 1118 EXPECT_NOTNULL(root); |
1106 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1119 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1107 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1120 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1108 for (int i = 0; i < kArrayLength; i++) { | 1121 for (int i = 0; i < kArrayLength; i++) { |
1109 Dart_CObject* element = root->value.as_array.values[i]; | 1122 Dart_CObject* element = root->value.as_array.values[i]; |
1110 if ((i % 2) == 0) { | 1123 if ((i % 2) == 0) { |
1111 EXPECT_EQ(root->value.as_array.values[0], element); | 1124 EXPECT_EQ(root->value.as_array.values[0], element); |
1112 EXPECT_EQ(Dart_CObject::kString, element->type); | 1125 EXPECT_EQ(Dart_CObject::kString, element->type); |
1113 EXPECT_STREQ("A", element->value.as_string); | 1126 EXPECT_STREQ("A", element->value.as_string); |
1114 } else { | 1127 } else { |
1115 EXPECT_EQ(root->value.as_array.values[1], element); | 1128 EXPECT_EQ(root->value.as_array.values[1], element); |
1116 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1129 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
1117 EXPECT_STREQ(2.72, element->value.as_double); | 1130 EXPECT_STREQ(2.72, element->value.as_double); |
1118 } | 1131 } |
1119 } | 1132 } |
1120 } | 1133 } |
1121 { | 1134 { |
1122 // Generate a list of objects of different types from Dart code. | 1135 // Generate a list of objects of different types from Dart code. |
1123 Zone zone(Isolate::Current()); | 1136 ApiNativeScope scope; |
1124 Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList"); | 1137 Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList"); |
1125 EXPECT_NOTNULL(root); | 1138 EXPECT_NOTNULL(root); |
1126 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1139 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1127 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1140 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1128 for (int i = 0; i < kArrayLength; i++) { | 1141 for (int i = 0; i < kArrayLength; i++) { |
1129 Dart_CObject* element = root->value.as_array.values[i]; | 1142 Dart_CObject* element = root->value.as_array.values[i]; |
1130 EXPECT_EQ(Dart_CObject::kArray, element->type); | 1143 EXPECT_EQ(Dart_CObject::kArray, element->type); |
1131 EXPECT_EQ(root, element); | 1144 EXPECT_EQ(root, element); |
1132 } | 1145 } |
1133 } | 1146 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 EXPECT(Dart_ErrorHasException(result)); | 1218 EXPECT(Dart_ErrorHasException(result)); |
1206 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]\n", | 1219 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]\n", |
1207 Dart_GetError(result)); | 1220 Dart_GetError(result)); |
1208 | 1221 |
1209 Dart_ExitScope(); | 1222 Dart_ExitScope(); |
1210 } | 1223 } |
1211 | 1224 |
1212 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1225 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
1213 | 1226 |
1214 } // namespace dart | 1227 } // namespace dart |
OLD | NEW |