Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(454)

Side by Side Diff: runtime/vm/snapshot_test.cc

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/snapshot_ids.h ('k') | runtime/vm/source_report.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/globals.h" 5 #include "platform/globals.h"
6 6
7 #include "include/dart_tools_api.h" 7 #include "include/dart_tools_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/class_finalizer.h" 9 #include "vm/class_finalizer.h"
10 #include "vm/clustered_snapshot.h" 10 #include "vm/clustered_snapshot.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 } 43 }
44 if (expected.IsBool()) { 44 if (expected.IsBool()) {
45 if (actual.IsBool()) { 45 if (actual.IsBool()) {
46 return expected.raw() == actual.raw(); 46 return expected.raw() == actual.raw();
47 } 47 }
48 return false; 48 return false;
49 } 49 }
50 return false; 50 return false;
51 } 51 }
52 52
53
54 static uint8_t* malloc_allocator(uint8_t* ptr, 53 static uint8_t* malloc_allocator(uint8_t* ptr,
55 intptr_t old_size, 54 intptr_t old_size,
56 intptr_t new_size) { 55 intptr_t new_size) {
57 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); 56 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size));
58 } 57 }
59 58
60
61 static void malloc_deallocator(uint8_t* ptr) { 59 static void malloc_deallocator(uint8_t* ptr) {
62 free(ptr); 60 free(ptr);
63 } 61 }
64 62
65
66 static uint8_t* zone_allocator(uint8_t* ptr, 63 static uint8_t* zone_allocator(uint8_t* ptr,
67 intptr_t old_size, 64 intptr_t old_size,
68 intptr_t new_size) { 65 intptr_t new_size) {
69 Zone* zone = Thread::Current()->zone(); 66 Zone* zone = Thread::Current()->zone();
70 return zone->Realloc<uint8_t>(ptr, old_size, new_size); 67 return zone->Realloc<uint8_t>(ptr, old_size, new_size);
71 } 68 }
72 69
73
74 static void zone_deallocator(uint8_t* ptr) {} 70 static void zone_deallocator(uint8_t* ptr) {}
75 71
76
77 // Compare two Dart_CObject object graphs rooted in first and 72 // Compare two Dart_CObject object graphs rooted in first and
78 // second. The second graph will be destroyed by this operation no matter 73 // second. The second graph will be destroyed by this operation no matter
79 // whether the graphs are equal or not. 74 // whether the graphs are equal or not.
80 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { 75 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) {
81 // Return immediately if entering a cycle. 76 // Return immediately if entering a cycle.
82 if (second->type == Dart_CObject_kNumberOfTypes) return; 77 if (second->type == Dart_CObject_kNumberOfTypes) return;
83 78
84 EXPECT_NE(first, second); 79 EXPECT_NE(first, second);
85 EXPECT_EQ(first->type, second->type); 80 EXPECT_EQ(first->type, second->type);
86 switch (first->type) { 81 switch (first->type) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 } 124 }
130 break; 125 break;
131 case Dart_CObject_kCapability: 126 case Dart_CObject_kCapability:
132 EXPECT_EQ(first->value.as_capability.id, second->value.as_capability.id); 127 EXPECT_EQ(first->value.as_capability.id, second->value.as_capability.id);
133 break; 128 break;
134 default: 129 default:
135 EXPECT(false); 130 EXPECT(false);
136 } 131 }
137 } 132 }
138 133
139
140 static void CheckEncodeDecodeMessage(Dart_CObject* root) { 134 static void CheckEncodeDecodeMessage(Dart_CObject* root) {
141 // Encode and decode the message. 135 // Encode and decode the message.
142 uint8_t* buffer = NULL; 136 uint8_t* buffer = NULL;
143 ApiMessageWriter writer(&buffer, &malloc_allocator); 137 ApiMessageWriter writer(&buffer, &malloc_allocator);
144 writer.WriteCMessage(root); 138 writer.WriteCMessage(root);
145 139
146 ApiMessageReader api_reader(buffer, writer.BytesWritten()); 140 ApiMessageReader api_reader(buffer, writer.BytesWritten());
147 Dart_CObject* new_root = api_reader.ReadMessage(); 141 Dart_CObject* new_root = api_reader.ReadMessage();
148 142
149 // Check that the two messages are the same. 143 // Check that the two messages are the same.
150 CompareDartCObjects(root, new_root); 144 CompareDartCObjects(root, new_root);
151 145
152 free(buffer); 146 free(buffer);
153 } 147 }
154 148
155
156 static void ExpectEncodeFail(Dart_CObject* root) { 149 static void ExpectEncodeFail(Dart_CObject* root) {
157 uint8_t* buffer = NULL; 150 uint8_t* buffer = NULL;
158 ApiMessageWriter writer(&buffer, &malloc_allocator); 151 ApiMessageWriter writer(&buffer, &malloc_allocator);
159 const bool result = writer.WriteCMessage(root); 152 const bool result = writer.WriteCMessage(root);
160 EXPECT_EQ(false, result); 153 EXPECT_EQ(false, result);
161 free(buffer); 154 free(buffer);
162 } 155 }
163 156
164
165 TEST_CASE(SerializeNull) { 157 TEST_CASE(SerializeNull) {
166 StackZone zone(thread); 158 StackZone zone(thread);
167 159
168 // Write snapshot with object content. 160 // Write snapshot with object content.
169 const Object& null_object = Object::Handle(); 161 const Object& null_object = Object::Handle();
170 uint8_t* buffer; 162 uint8_t* buffer;
171 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 163 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
172 writer.WriteMessage(null_object); 164 writer.WriteMessage(null_object);
173 intptr_t buffer_len = writer.BytesWritten(); 165 intptr_t buffer_len = writer.BytesWritten();
174 166
175 // Read object back from the snapshot. 167 // Read object back from the snapshot.
176 MessageSnapshotReader reader(buffer, buffer_len, thread); 168 MessageSnapshotReader reader(buffer, buffer_len, thread);
177 const Object& serialized_object = Object::Handle(reader.ReadObject()); 169 const Object& serialized_object = Object::Handle(reader.ReadObject());
178 EXPECT(Equals(null_object, serialized_object)); 170 EXPECT(Equals(null_object, serialized_object));
179 171
180 // Read object back from the snapshot into a C structure. 172 // Read object back from the snapshot into a C structure.
181 ApiNativeScope scope; 173 ApiNativeScope scope;
182 ApiMessageReader api_reader(buffer, buffer_len); 174 ApiMessageReader api_reader(buffer, buffer_len);
183 Dart_CObject* root = api_reader.ReadMessage(); 175 Dart_CObject* root = api_reader.ReadMessage();
184 EXPECT_NOTNULL(root); 176 EXPECT_NOTNULL(root);
185 EXPECT_EQ(Dart_CObject_kNull, root->type); 177 EXPECT_EQ(Dart_CObject_kNull, root->type);
186 CheckEncodeDecodeMessage(root); 178 CheckEncodeDecodeMessage(root);
187 } 179 }
188 180
189
190 TEST_CASE(SerializeSmi1) { 181 TEST_CASE(SerializeSmi1) {
191 StackZone zone(thread); 182 StackZone zone(thread);
192 183
193 // Write snapshot with object content. 184 // Write snapshot with object content.
194 const Smi& smi = Smi::Handle(Smi::New(124)); 185 const Smi& smi = Smi::Handle(Smi::New(124));
195 uint8_t* buffer; 186 uint8_t* buffer;
196 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 187 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
197 writer.WriteMessage(smi); 188 writer.WriteMessage(smi);
198 intptr_t buffer_len = writer.BytesWritten(); 189 intptr_t buffer_len = writer.BytesWritten();
199 190
200 // Read object back from the snapshot. 191 // Read object back from the snapshot.
201 MessageSnapshotReader reader(buffer, buffer_len, thread); 192 MessageSnapshotReader reader(buffer, buffer_len, thread);
202 const Object& serialized_object = Object::Handle(reader.ReadObject()); 193 const Object& serialized_object = Object::Handle(reader.ReadObject());
203 EXPECT(Equals(smi, serialized_object)); 194 EXPECT(Equals(smi, serialized_object));
204 195
205 // Read object back from the snapshot into a C structure. 196 // Read object back from the snapshot into a C structure.
206 ApiNativeScope scope; 197 ApiNativeScope scope;
207 ApiMessageReader api_reader(buffer, buffer_len); 198 ApiMessageReader api_reader(buffer, buffer_len);
208 Dart_CObject* root = api_reader.ReadMessage(); 199 Dart_CObject* root = api_reader.ReadMessage();
209 EXPECT_NOTNULL(root); 200 EXPECT_NOTNULL(root);
210 EXPECT_EQ(Dart_CObject_kInt32, root->type); 201 EXPECT_EQ(Dart_CObject_kInt32, root->type);
211 EXPECT_EQ(smi.Value(), root->value.as_int32); 202 EXPECT_EQ(smi.Value(), root->value.as_int32);
212 CheckEncodeDecodeMessage(root); 203 CheckEncodeDecodeMessage(root);
213 } 204 }
214 205
215
216 TEST_CASE(SerializeSmi2) { 206 TEST_CASE(SerializeSmi2) {
217 StackZone zone(thread); 207 StackZone zone(thread);
218 208
219 // Write snapshot with object content. 209 // Write snapshot with object content.
220 const Smi& smi = Smi::Handle(Smi::New(-1)); 210 const Smi& smi = Smi::Handle(Smi::New(-1));
221 uint8_t* buffer; 211 uint8_t* buffer;
222 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 212 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
223 writer.WriteMessage(smi); 213 writer.WriteMessage(smi);
224 intptr_t buffer_len = writer.BytesWritten(); 214 intptr_t buffer_len = writer.BytesWritten();
225 215
226 // Read object back from the snapshot. 216 // Read object back from the snapshot.
227 MessageSnapshotReader reader(buffer, buffer_len, thread); 217 MessageSnapshotReader reader(buffer, buffer_len, thread);
228 const Object& serialized_object = Object::Handle(reader.ReadObject()); 218 const Object& serialized_object = Object::Handle(reader.ReadObject());
229 EXPECT(Equals(smi, serialized_object)); 219 EXPECT(Equals(smi, serialized_object));
230 220
231 // Read object back from the snapshot into a C structure. 221 // Read object back from the snapshot into a C structure.
232 ApiNativeScope scope; 222 ApiNativeScope scope;
233 ApiMessageReader api_reader(buffer, buffer_len); 223 ApiMessageReader api_reader(buffer, buffer_len);
234 Dart_CObject* root = api_reader.ReadMessage(); 224 Dart_CObject* root = api_reader.ReadMessage();
235 EXPECT_NOTNULL(root); 225 EXPECT_NOTNULL(root);
236 EXPECT_EQ(Dart_CObject_kInt32, root->type); 226 EXPECT_EQ(Dart_CObject_kInt32, root->type);
237 EXPECT_EQ(smi.Value(), root->value.as_int32); 227 EXPECT_EQ(smi.Value(), root->value.as_int32);
238 CheckEncodeDecodeMessage(root); 228 CheckEncodeDecodeMessage(root);
239 } 229 }
240 230
241
242 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) { 231 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) {
243 // Write snapshot with object content. 232 // Write snapshot with object content.
244 uint8_t* buffer; 233 uint8_t* buffer;
245 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 234 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
246 writer.WriteMessage(mint); 235 writer.WriteMessage(mint);
247 intptr_t buffer_len = writer.BytesWritten(); 236 intptr_t buffer_len = writer.BytesWritten();
248 237
249 { 238 {
250 // Switch to a regular zone, where VM handle allocation is allowed. 239 // Switch to a regular zone, where VM handle allocation is allowed.
251 Thread* thread = Thread::Current(); 240 Thread* thread = Thread::Current();
252 StackZone zone(thread); 241 StackZone zone(thread);
253 // Read object back from the snapshot. 242 // Read object back from the snapshot.
254 MessageSnapshotReader reader(buffer, buffer_len, thread); 243 MessageSnapshotReader reader(buffer, buffer_len, thread);
255 const Object& serialized_object = Object::Handle(reader.ReadObject()); 244 const Object& serialized_object = Object::Handle(reader.ReadObject());
256 EXPECT(serialized_object.IsMint()); 245 EXPECT(serialized_object.IsMint());
257 } 246 }
258 247
259 // Read object back from the snapshot into a C structure. 248 // Read object back from the snapshot into a C structure.
260 ApiMessageReader api_reader(buffer, buffer_len); 249 ApiMessageReader api_reader(buffer, buffer_len);
261 Dart_CObject* root = api_reader.ReadMessage(); 250 Dart_CObject* root = api_reader.ReadMessage();
262 EXPECT_NOTNULL(root); 251 EXPECT_NOTNULL(root);
263 CheckEncodeDecodeMessage(root); 252 CheckEncodeDecodeMessage(root);
264 return root; 253 return root;
265 } 254 }
266 255
267
268 void CheckMint(int64_t value) { 256 void CheckMint(int64_t value) {
269 ApiNativeScope scope; 257 ApiNativeScope scope;
270 StackZone zone(Thread::Current()); 258 StackZone zone(Thread::Current());
271 259
272 Mint& mint = Mint::Handle(); 260 Mint& mint = Mint::Handle();
273 mint ^= Integer::New(value); 261 mint ^= Integer::New(value);
274 Dart_CObject* mint_cobject = SerializeAndDeserializeMint(mint); 262 Dart_CObject* mint_cobject = SerializeAndDeserializeMint(mint);
275 // On 64-bit platforms mints always require 64-bits as the smi range 263 // On 64-bit platforms mints always require 64-bits as the smi range
276 // here covers most of the 64-bit range. On 32-bit platforms the smi 264 // here covers most of the 64-bit range. On 32-bit platforms the smi
277 // range covers most of the 32-bit range and values outside that 265 // range covers most of the 32-bit range and values outside that
278 // range are also represented as mints. 266 // range are also represented as mints.
279 #if defined(ARCH_IS_64_BIT) 267 #if defined(ARCH_IS_64_BIT)
280 EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type); 268 EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
281 EXPECT_EQ(value, mint_cobject->value.as_int64); 269 EXPECT_EQ(value, mint_cobject->value.as_int64);
282 #else 270 #else
283 if (kMinInt32 < value && value < kMaxInt32) { 271 if (kMinInt32 < value && value < kMaxInt32) {
284 EXPECT_EQ(Dart_CObject_kInt32, mint_cobject->type); 272 EXPECT_EQ(Dart_CObject_kInt32, mint_cobject->type);
285 EXPECT_EQ(value, mint_cobject->value.as_int32); 273 EXPECT_EQ(value, mint_cobject->value.as_int32);
286 } else { 274 } else {
287 EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type); 275 EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
288 EXPECT_EQ(value, mint_cobject->value.as_int64); 276 EXPECT_EQ(value, mint_cobject->value.as_int64);
289 } 277 }
290 #endif 278 #endif
291 } 279 }
292 280
293
294 TEST_CASE(SerializeMints) { 281 TEST_CASE(SerializeMints) {
295 // Min positive mint. 282 // Min positive mint.
296 CheckMint(Smi::kMaxValue + 1); 283 CheckMint(Smi::kMaxValue + 1);
297 // Min positive mint + 1. 284 // Min positive mint + 1.
298 CheckMint(Smi::kMaxValue + 2); 285 CheckMint(Smi::kMaxValue + 2);
299 // Max negative mint. 286 // Max negative mint.
300 CheckMint(Smi::kMinValue - 1); 287 CheckMint(Smi::kMinValue - 1);
301 // Max negative mint - 1. 288 // Max negative mint - 1.
302 CheckMint(Smi::kMinValue - 2); 289 CheckMint(Smi::kMinValue - 2);
303 // Max positive mint. 290 // Max positive mint.
304 CheckMint(kMaxInt64); 291 CheckMint(kMaxInt64);
305 // Max positive mint - 1. 292 // Max positive mint - 1.
306 CheckMint(kMaxInt64 - 1); 293 CheckMint(kMaxInt64 - 1);
307 // Min negative mint. 294 // Min negative mint.
308 CheckMint(kMinInt64); 295 CheckMint(kMinInt64);
309 // Min negative mint + 1. 296 // Min negative mint + 1.
310 CheckMint(kMinInt64 + 1); 297 CheckMint(kMinInt64 + 1);
311 } 298 }
312 299
313
314 TEST_CASE(SerializeDouble) { 300 TEST_CASE(SerializeDouble) {
315 StackZone zone(thread); 301 StackZone zone(thread);
316 302
317 // Write snapshot with object content. 303 // Write snapshot with object content.
318 const Double& dbl = Double::Handle(Double::New(101.29)); 304 const Double& dbl = Double::Handle(Double::New(101.29));
319 uint8_t* buffer; 305 uint8_t* buffer;
320 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 306 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
321 writer.WriteMessage(dbl); 307 writer.WriteMessage(dbl);
322 intptr_t buffer_len = writer.BytesWritten(); 308 intptr_t buffer_len = writer.BytesWritten();
323 309
324 // Read object back from the snapshot. 310 // Read object back from the snapshot.
325 MessageSnapshotReader reader(buffer, buffer_len, thread); 311 MessageSnapshotReader reader(buffer, buffer_len, thread);
326 const Object& serialized_object = Object::Handle(reader.ReadObject()); 312 const Object& serialized_object = Object::Handle(reader.ReadObject());
327 EXPECT(Equals(dbl, serialized_object)); 313 EXPECT(Equals(dbl, serialized_object));
328 314
329 // Read object back from the snapshot into a C structure. 315 // Read object back from the snapshot into a C structure.
330 ApiNativeScope scope; 316 ApiNativeScope scope;
331 ApiMessageReader api_reader(buffer, buffer_len); 317 ApiMessageReader api_reader(buffer, buffer_len);
332 Dart_CObject* root = api_reader.ReadMessage(); 318 Dart_CObject* root = api_reader.ReadMessage();
333 EXPECT_NOTNULL(root); 319 EXPECT_NOTNULL(root);
334 EXPECT_EQ(Dart_CObject_kDouble, root->type); 320 EXPECT_EQ(Dart_CObject_kDouble, root->type);
335 EXPECT_EQ(dbl.value(), root->value.as_double); 321 EXPECT_EQ(dbl.value(), root->value.as_double);
336 CheckEncodeDecodeMessage(root); 322 CheckEncodeDecodeMessage(root);
337 } 323 }
338 324
339
340 TEST_CASE(SerializeTrue) { 325 TEST_CASE(SerializeTrue) {
341 StackZone zone(thread); 326 StackZone zone(thread);
342 327
343 // Write snapshot with true object. 328 // Write snapshot with true object.
344 const Bool& bl = Bool::True(); 329 const Bool& bl = Bool::True();
345 uint8_t* buffer; 330 uint8_t* buffer;
346 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 331 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
347 writer.WriteMessage(bl); 332 writer.WriteMessage(bl);
348 intptr_t buffer_len = writer.BytesWritten(); 333 intptr_t buffer_len = writer.BytesWritten();
349 334
350 // Read object back from the snapshot. 335 // Read object back from the snapshot.
351 MessageSnapshotReader reader(buffer, buffer_len, thread); 336 MessageSnapshotReader reader(buffer, buffer_len, thread);
352 const Object& serialized_object = Object::Handle(reader.ReadObject()); 337 const Object& serialized_object = Object::Handle(reader.ReadObject());
353 fprintf(stderr, "%s / %s\n", bl.ToCString(), serialized_object.ToCString()); 338 fprintf(stderr, "%s / %s\n", bl.ToCString(), serialized_object.ToCString());
354 339
355 EXPECT(Equals(bl, serialized_object)); 340 EXPECT(Equals(bl, serialized_object));
356 341
357 // Read object back from the snapshot into a C structure. 342 // Read object back from the snapshot into a C structure.
358 ApiNativeScope scope; 343 ApiNativeScope scope;
359 ApiMessageReader api_reader(buffer, buffer_len); 344 ApiMessageReader api_reader(buffer, buffer_len);
360 Dart_CObject* root = api_reader.ReadMessage(); 345 Dart_CObject* root = api_reader.ReadMessage();
361 EXPECT_NOTNULL(root); 346 EXPECT_NOTNULL(root);
362 EXPECT_EQ(Dart_CObject_kBool, root->type); 347 EXPECT_EQ(Dart_CObject_kBool, root->type);
363 EXPECT_EQ(true, root->value.as_bool); 348 EXPECT_EQ(true, root->value.as_bool);
364 CheckEncodeDecodeMessage(root); 349 CheckEncodeDecodeMessage(root);
365 } 350 }
366 351
367
368 TEST_CASE(SerializeFalse) { 352 TEST_CASE(SerializeFalse) {
369 StackZone zone(thread); 353 StackZone zone(thread);
370 354
371 // Write snapshot with false object. 355 // Write snapshot with false object.
372 const Bool& bl = Bool::False(); 356 const Bool& bl = Bool::False();
373 uint8_t* buffer; 357 uint8_t* buffer;
374 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 358 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
375 writer.WriteMessage(bl); 359 writer.WriteMessage(bl);
376 intptr_t buffer_len = writer.BytesWritten(); 360 intptr_t buffer_len = writer.BytesWritten();
377 361
378 // Read object back from the snapshot. 362 // Read object back from the snapshot.
379 MessageSnapshotReader reader(buffer, buffer_len, thread); 363 MessageSnapshotReader reader(buffer, buffer_len, thread);
380 const Object& serialized_object = Object::Handle(reader.ReadObject()); 364 const Object& serialized_object = Object::Handle(reader.ReadObject());
381 EXPECT(Equals(bl, serialized_object)); 365 EXPECT(Equals(bl, serialized_object));
382 366
383 // Read object back from the snapshot into a C structure. 367 // Read object back from the snapshot into a C structure.
384 ApiNativeScope scope; 368 ApiNativeScope scope;
385 ApiMessageReader api_reader(buffer, buffer_len); 369 ApiMessageReader api_reader(buffer, buffer_len);
386 Dart_CObject* root = api_reader.ReadMessage(); 370 Dart_CObject* root = api_reader.ReadMessage();
387 EXPECT_NOTNULL(root); 371 EXPECT_NOTNULL(root);
388 EXPECT_EQ(Dart_CObject_kBool, root->type); 372 EXPECT_EQ(Dart_CObject_kBool, root->type);
389 EXPECT_EQ(false, root->value.as_bool); 373 EXPECT_EQ(false, root->value.as_bool);
390 CheckEncodeDecodeMessage(root); 374 CheckEncodeDecodeMessage(root);
391 } 375 }
392 376
393
394 TEST_CASE(SerializeCapability) { 377 TEST_CASE(SerializeCapability) {
395 // Write snapshot with object content. 378 // Write snapshot with object content.
396 const Capability& capability = Capability::Handle(Capability::New(12345)); 379 const Capability& capability = Capability::Handle(Capability::New(12345));
397 uint8_t* buffer; 380 uint8_t* buffer;
398 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 381 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
399 writer.WriteMessage(capability); 382 writer.WriteMessage(capability);
400 intptr_t buffer_len = writer.BytesWritten(); 383 intptr_t buffer_len = writer.BytesWritten();
401 384
402 // Read object back from the snapshot. 385 // Read object back from the snapshot.
403 MessageSnapshotReader reader(buffer, buffer_len, thread); 386 MessageSnapshotReader reader(buffer, buffer_len, thread);
404 Capability& obj = Capability::Handle(); 387 Capability& obj = Capability::Handle();
405 obj ^= reader.ReadObject(); 388 obj ^= reader.ReadObject();
406 389
407 EXPECT_STREQ(12345, obj.Id()); 390 EXPECT_STREQ(12345, obj.Id());
408 391
409 // Read object back from the snapshot into a C structure. 392 // Read object back from the snapshot into a C structure.
410 ApiNativeScope scope; 393 ApiNativeScope scope;
411 ApiMessageReader api_reader(buffer, buffer_len); 394 ApiMessageReader api_reader(buffer, buffer_len);
412 Dart_CObject* root = api_reader.ReadMessage(); 395 Dart_CObject* root = api_reader.ReadMessage();
413 EXPECT_NOTNULL(root); 396 EXPECT_NOTNULL(root);
414 EXPECT_EQ(Dart_CObject_kCapability, root->type); 397 EXPECT_EQ(Dart_CObject_kCapability, root->type);
415 int64_t id = root->value.as_capability.id; 398 int64_t id = root->value.as_capability.id;
416 EXPECT_EQ(12345, id); 399 EXPECT_EQ(12345, id);
417 CheckEncodeDecodeMessage(root); 400 CheckEncodeDecodeMessage(root);
418 } 401 }
419 402
420
421 TEST_CASE(SerializeBigint) { 403 TEST_CASE(SerializeBigint) {
422 // Write snapshot with object content. 404 // Write snapshot with object content.
423 const char* cstr = "0x270FFFFFFFFFFFFFD8F0"; 405 const char* cstr = "0x270FFFFFFFFFFFFFD8F0";
424 const String& str = String::Handle(String::New(cstr)); 406 const String& str = String::Handle(String::New(cstr));
425 Bigint& bigint = Bigint::Handle(); 407 Bigint& bigint = Bigint::Handle();
426 bigint ^= Integer::NewCanonical(str); 408 bigint ^= Integer::NewCanonical(str);
427 uint8_t* buffer; 409 uint8_t* buffer;
428 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 410 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
429 writer.WriteMessage(bigint); 411 writer.WriteMessage(bigint);
430 intptr_t buffer_len = writer.BytesWritten(); 412 intptr_t buffer_len = writer.BytesWritten();
(...skipping 11 matching lines...) Expand all
442 ApiMessageReader api_reader(buffer, buffer_len); 424 ApiMessageReader api_reader(buffer, buffer_len);
443 Dart_CObject* root = api_reader.ReadMessage(); 425 Dart_CObject* root = api_reader.ReadMessage();
444 EXPECT_NOTNULL(root); 426 EXPECT_NOTNULL(root);
445 EXPECT_EQ(Dart_CObject_kBigint, root->type); 427 EXPECT_EQ(Dart_CObject_kBigint, root->type);
446 char* hex_value = TestCase::BigintToHexValue(root); 428 char* hex_value = TestCase::BigintToHexValue(root);
447 EXPECT_STREQ(cstr, hex_value); 429 EXPECT_STREQ(cstr, hex_value);
448 free(hex_value); 430 free(hex_value);
449 CheckEncodeDecodeMessage(root); 431 CheckEncodeDecodeMessage(root);
450 } 432 }
451 433
452
453 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { 434 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) {
454 // Write snapshot with object content. 435 // Write snapshot with object content.
455 uint8_t* buffer; 436 uint8_t* buffer;
456 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 437 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
457 writer.WriteMessage(bigint); 438 writer.WriteMessage(bigint);
458 intptr_t buffer_len = writer.BytesWritten(); 439 intptr_t buffer_len = writer.BytesWritten();
459 440
460 { 441 {
461 // Switch to a regular zone, where VM handle allocation is allowed. 442 // Switch to a regular zone, where VM handle allocation is allowed.
462 Thread* thread = Thread::Current(); 443 Thread* thread = Thread::Current();
463 StackZone zone(thread); 444 StackZone zone(thread);
464 // Read object back from the snapshot. 445 // Read object back from the snapshot.
465 MessageSnapshotReader reader(buffer, buffer_len, thread); 446 MessageSnapshotReader reader(buffer, buffer_len, thread);
466 Bigint& serialized_bigint = Bigint::Handle(); 447 Bigint& serialized_bigint = Bigint::Handle();
467 serialized_bigint ^= reader.ReadObject(); 448 serialized_bigint ^= reader.ReadObject();
468 const char* str1 = bigint.ToHexCString(thread->zone()); 449 const char* str1 = bigint.ToHexCString(thread->zone());
469 const char* str2 = serialized_bigint.ToHexCString(thread->zone()); 450 const char* str2 = serialized_bigint.ToHexCString(thread->zone());
470 EXPECT_STREQ(str1, str2); 451 EXPECT_STREQ(str1, str2);
471 } 452 }
472 453
473 // Read object back from the snapshot into a C structure. 454 // Read object back from the snapshot into a C structure.
474 ApiMessageReader api_reader(buffer, buffer_len); 455 ApiMessageReader api_reader(buffer, buffer_len);
475 Dart_CObject* root = api_reader.ReadMessage(); 456 Dart_CObject* root = api_reader.ReadMessage();
476 // Bigint not supported. 457 // Bigint not supported.
477 EXPECT_NOTNULL(root); 458 EXPECT_NOTNULL(root);
478 CheckEncodeDecodeMessage(root); 459 CheckEncodeDecodeMessage(root);
479 return root; 460 return root;
480 } 461 }
481 462
482
483 void CheckBigint(const char* bigint_value) { 463 void CheckBigint(const char* bigint_value) {
484 ApiNativeScope scope; 464 ApiNativeScope scope;
485 StackZone zone(Thread::Current()); 465 StackZone zone(Thread::Current());
486 Bigint& bigint = Bigint::Handle(); 466 Bigint& bigint = Bigint::Handle();
487 bigint ^= Bigint::NewFromCString(bigint_value); 467 bigint ^= Bigint::NewFromCString(bigint_value);
488 Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint); 468 Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint);
489 EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type); 469 EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type);
490 char* hex_value = TestCase::BigintToHexValue(bigint_cobject); 470 char* hex_value = TestCase::BigintToHexValue(bigint_cobject);
491 EXPECT_STREQ(bigint_value, hex_value); 471 EXPECT_STREQ(bigint_value, hex_value);
492 free(hex_value); 472 free(hex_value);
493 } 473 }
494 474
495
496 TEST_CASE(SerializeBigint2) { 475 TEST_CASE(SerializeBigint2) {
497 CheckBigint("0x0"); 476 CheckBigint("0x0");
498 CheckBigint("0x1"); 477 CheckBigint("0x1");
499 CheckBigint("-0x1"); 478 CheckBigint("-0x1");
500 CheckBigint("0x11111111111111111111"); 479 CheckBigint("0x11111111111111111111");
501 CheckBigint("-0x11111111111111111111"); 480 CheckBigint("-0x11111111111111111111");
502 CheckBigint("0x9876543210987654321098765432109876543210"); 481 CheckBigint("0x9876543210987654321098765432109876543210");
503 CheckBigint("-0x9876543210987654321098765432109876543210"); 482 CheckBigint("-0x9876543210987654321098765432109876543210");
504 } 483 }
505 484
(...skipping 28 matching lines...) Expand all
534 EXPECT(Object::code_class() == reader.ReadObject()); 513 EXPECT(Object::code_class() == reader.ReadObject());
535 EXPECT(Object::instructions_class() == reader.ReadObject()); 514 EXPECT(Object::instructions_class() == reader.ReadObject());
536 EXPECT(Object::pc_descriptors_class() == reader.ReadObject()); 515 EXPECT(Object::pc_descriptors_class() == reader.ReadObject());
537 EXPECT(Object::exception_handlers_class() == reader.ReadObject()); 516 EXPECT(Object::exception_handlers_class() == reader.ReadObject());
538 EXPECT(Object::context_class() == reader.ReadObject()); 517 EXPECT(Object::context_class() == reader.ReadObject());
539 EXPECT(Object::context_scope_class() == reader.ReadObject()); 518 EXPECT(Object::context_scope_class() == reader.ReadObject());
540 519
541 free(buffer); 520 free(buffer);
542 } 521 }
543 522
544
545 static void TestString(const char* cstr) { 523 static void TestString(const char* cstr) {
546 Thread* thread = Thread::Current(); 524 Thread* thread = Thread::Current();
547 EXPECT(Utf8::IsValid(reinterpret_cast<const uint8_t*>(cstr), strlen(cstr))); 525 EXPECT(Utf8::IsValid(reinterpret_cast<const uint8_t*>(cstr), strlen(cstr)));
548 // Write snapshot with object content. 526 // Write snapshot with object content.
549 String& str = String::Handle(String::New(cstr)); 527 String& str = String::Handle(String::New(cstr));
550 uint8_t* buffer; 528 uint8_t* buffer;
551 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 529 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
552 writer.WriteMessage(str); 530 writer.WriteMessage(str);
553 intptr_t buffer_len = writer.BytesWritten(); 531 intptr_t buffer_len = writer.BytesWritten();
554 532
555 // Read object back from the snapshot. 533 // Read object back from the snapshot.
556 MessageSnapshotReader reader(buffer, buffer_len, thread); 534 MessageSnapshotReader reader(buffer, buffer_len, thread);
557 String& serialized_str = String::Handle(); 535 String& serialized_str = String::Handle();
558 serialized_str ^= reader.ReadObject(); 536 serialized_str ^= reader.ReadObject();
559 EXPECT(str.Equals(serialized_str)); 537 EXPECT(str.Equals(serialized_str));
560 538
561 // Read object back from the snapshot into a C structure. 539 // Read object back from the snapshot into a C structure.
562 ApiNativeScope scope; 540 ApiNativeScope scope;
563 ApiMessageReader api_reader(buffer, buffer_len); 541 ApiMessageReader api_reader(buffer, buffer_len);
564 Dart_CObject* root = api_reader.ReadMessage(); 542 Dart_CObject* root = api_reader.ReadMessage();
565 EXPECT_EQ(Dart_CObject_kString, root->type); 543 EXPECT_EQ(Dart_CObject_kString, root->type);
566 EXPECT_STREQ(cstr, root->value.as_string); 544 EXPECT_STREQ(cstr, root->value.as_string);
567 CheckEncodeDecodeMessage(root); 545 CheckEncodeDecodeMessage(root);
568 } 546 }
569 547
570
571 TEST_CASE(SerializeString) { 548 TEST_CASE(SerializeString) {
572 TestString("This string shall be serialized"); 549 TestString("This string shall be serialized");
573 TestString("æøå"); // This file is UTF-8 encoded. 550 TestString("æøå"); // This file is UTF-8 encoded.
574 const char* data = 551 const char* data =
575 "\x01" 552 "\x01"
576 "\x7F" 553 "\x7F"
577 "\xC2\x80" // U+0080 554 "\xC2\x80" // U+0080
578 "\xDF\xBF" // U+07FF 555 "\xDF\xBF" // U+07FF
579 "\xE0\xA0\x80" // U+0800 556 "\xE0\xA0\x80" // U+0800
580 "\xEF\xBF\xBF"; // U+FFFF 557 "\xEF\xBF\xBF"; // U+FFFF
581 558
582 TestString(data); 559 TestString(data);
583 // TODO(sgjesse): Add tests with non-BMP characters. 560 // TODO(sgjesse): Add tests with non-BMP characters.
584 } 561 }
585 562
586
587 TEST_CASE(SerializeArray) { 563 TEST_CASE(SerializeArray) {
588 // Write snapshot with object content. 564 // Write snapshot with object content.
589 const int kArrayLength = 10; 565 const int kArrayLength = 10;
590 Array& array = Array::Handle(Array::New(kArrayLength)); 566 Array& array = Array::Handle(Array::New(kArrayLength));
591 Smi& smi = Smi::Handle(); 567 Smi& smi = Smi::Handle();
592 for (int i = 0; i < kArrayLength; i++) { 568 for (int i = 0; i < kArrayLength; i++) {
593 smi ^= Smi::New(i); 569 smi ^= Smi::New(i);
594 array.SetAt(i, smi); 570 array.SetAt(i, smi);
595 } 571 }
596 uint8_t* buffer; 572 uint8_t* buffer;
(...skipping 14 matching lines...) Expand all
611 EXPECT_EQ(Dart_CObject_kArray, root->type); 587 EXPECT_EQ(Dart_CObject_kArray, root->type);
612 EXPECT_EQ(kArrayLength, root->value.as_array.length); 588 EXPECT_EQ(kArrayLength, root->value.as_array.length);
613 for (int i = 0; i < kArrayLength; i++) { 589 for (int i = 0; i < kArrayLength; i++) {
614 Dart_CObject* element = root->value.as_array.values[i]; 590 Dart_CObject* element = root->value.as_array.values[i];
615 EXPECT_EQ(Dart_CObject_kInt32, element->type); 591 EXPECT_EQ(Dart_CObject_kInt32, element->type);
616 EXPECT_EQ(i, element->value.as_int32); 592 EXPECT_EQ(i, element->value.as_int32);
617 } 593 }
618 CheckEncodeDecodeMessage(root); 594 CheckEncodeDecodeMessage(root);
619 } 595 }
620 596
621
622 TEST_CASE(FailSerializeLargeArray) { 597 TEST_CASE(FailSerializeLargeArray) {
623 Dart_CObject root; 598 Dart_CObject root;
624 root.type = Dart_CObject_kArray; 599 root.type = Dart_CObject_kArray;
625 root.value.as_array.length = Array::kMaxElements + 1; 600 root.value.as_array.length = Array::kMaxElements + 1;
626 root.value.as_array.values = NULL; 601 root.value.as_array.values = NULL;
627 ExpectEncodeFail(&root); 602 ExpectEncodeFail(&root);
628 } 603 }
629 604
630
631 TEST_CASE(FailSerializeLargeNestedArray) { 605 TEST_CASE(FailSerializeLargeNestedArray) {
632 Dart_CObject parent; 606 Dart_CObject parent;
633 Dart_CObject child; 607 Dart_CObject child;
634 Dart_CObject* values[1] = {&child}; 608 Dart_CObject* values[1] = {&child};
635 609
636 parent.type = Dart_CObject_kArray; 610 parent.type = Dart_CObject_kArray;
637 parent.value.as_array.length = 1; 611 parent.value.as_array.length = 1;
638 parent.value.as_array.values = values; 612 parent.value.as_array.values = values;
639 child.type = Dart_CObject_kArray; 613 child.type = Dart_CObject_kArray;
640 child.value.as_array.length = Array::kMaxElements + 1; 614 child.value.as_array.length = Array::kMaxElements + 1;
641 ExpectEncodeFail(&parent); 615 ExpectEncodeFail(&parent);
642 } 616 }
643 617
644
645 TEST_CASE(FailSerializeLargeTypedDataInt8) { 618 TEST_CASE(FailSerializeLargeTypedDataInt8) {
646 Dart_CObject root; 619 Dart_CObject root;
647 root.type = Dart_CObject_kTypedData; 620 root.type = Dart_CObject_kTypedData;
648 root.value.as_typed_data.type = Dart_TypedData_kInt8; 621 root.value.as_typed_data.type = Dart_TypedData_kInt8;
649 root.value.as_typed_data.length = 622 root.value.as_typed_data.length =
650 TypedData::MaxElements(kTypedDataInt8ArrayCid) + 1; 623 TypedData::MaxElements(kTypedDataInt8ArrayCid) + 1;
651 ExpectEncodeFail(&root); 624 ExpectEncodeFail(&root);
652 } 625 }
653 626
654
655 TEST_CASE(FailSerializeLargeTypedDataUint8) { 627 TEST_CASE(FailSerializeLargeTypedDataUint8) {
656 Dart_CObject root; 628 Dart_CObject root;
657 root.type = Dart_CObject_kTypedData; 629 root.type = Dart_CObject_kTypedData;
658 root.value.as_typed_data.type = Dart_TypedData_kUint8; 630 root.value.as_typed_data.type = Dart_TypedData_kUint8;
659 root.value.as_typed_data.length = 631 root.value.as_typed_data.length =
660 TypedData::MaxElements(kTypedDataUint8ArrayCid) + 1; 632 TypedData::MaxElements(kTypedDataUint8ArrayCid) + 1;
661 ExpectEncodeFail(&root); 633 ExpectEncodeFail(&root);
662 } 634 }
663 635
664
665 TEST_CASE(FailSerializeLargeExternalTypedData) { 636 TEST_CASE(FailSerializeLargeExternalTypedData) {
666 Dart_CObject root; 637 Dart_CObject root;
667 root.type = Dart_CObject_kExternalTypedData; 638 root.type = Dart_CObject_kExternalTypedData;
668 root.value.as_typed_data.length = 639 root.value.as_typed_data.length =
669 ExternalTypedData::MaxElements(kExternalTypedDataUint8ArrayCid) + 1; 640 ExternalTypedData::MaxElements(kExternalTypedDataUint8ArrayCid) + 1;
670 ExpectEncodeFail(&root); 641 ExpectEncodeFail(&root);
671 } 642 }
672 643
673
674 TEST_CASE(SerializeEmptyArray) { 644 TEST_CASE(SerializeEmptyArray) {
675 // Write snapshot with object content. 645 // Write snapshot with object content.
676 const int kArrayLength = 0; 646 const int kArrayLength = 0;
677 Array& array = Array::Handle(Array::New(kArrayLength)); 647 Array& array = Array::Handle(Array::New(kArrayLength));
678 uint8_t* buffer; 648 uint8_t* buffer;
679 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 649 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
680 writer.WriteMessage(array); 650 writer.WriteMessage(array);
681 intptr_t buffer_len = writer.BytesWritten(); 651 intptr_t buffer_len = writer.BytesWritten();
682 652
683 // Read object back from the snapshot. 653 // Read object back from the snapshot.
684 MessageSnapshotReader reader(buffer, buffer_len, thread); 654 MessageSnapshotReader reader(buffer, buffer_len, thread);
685 Array& serialized_array = Array::Handle(); 655 Array& serialized_array = Array::Handle();
686 serialized_array ^= reader.ReadObject(); 656 serialized_array ^= reader.ReadObject();
687 EXPECT(array.CanonicalizeEquals(serialized_array)); 657 EXPECT(array.CanonicalizeEquals(serialized_array));
688 658
689 // Read object back from the snapshot into a C structure. 659 // Read object back from the snapshot into a C structure.
690 ApiNativeScope scope; 660 ApiNativeScope scope;
691 ApiMessageReader api_reader(buffer, buffer_len); 661 ApiMessageReader api_reader(buffer, buffer_len);
692 Dart_CObject* root = api_reader.ReadMessage(); 662 Dart_CObject* root = api_reader.ReadMessage();
693 EXPECT_EQ(Dart_CObject_kArray, root->type); 663 EXPECT_EQ(Dart_CObject_kArray, root->type);
694 EXPECT_EQ(kArrayLength, root->value.as_array.length); 664 EXPECT_EQ(kArrayLength, root->value.as_array.length);
695 EXPECT(root->value.as_array.values == NULL); 665 EXPECT(root->value.as_array.values == NULL);
696 CheckEncodeDecodeMessage(root); 666 CheckEncodeDecodeMessage(root);
697 } 667 }
698 668
699
700 TEST_CASE(SerializeByteArray) { 669 TEST_CASE(SerializeByteArray) {
701 // Write snapshot with object content. 670 // Write snapshot with object content.
702 const int kTypedDataLength = 256; 671 const int kTypedDataLength = 256;
703 TypedData& typed_data = TypedData::Handle( 672 TypedData& typed_data = TypedData::Handle(
704 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength)); 673 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength));
705 for (int i = 0; i < kTypedDataLength; i++) { 674 for (int i = 0; i < kTypedDataLength; i++) {
706 typed_data.SetUint8(i, i); 675 typed_data.SetUint8(i, i);
707 } 676 }
708 uint8_t* buffer; 677 uint8_t* buffer;
709 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 678 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
(...skipping 11 matching lines...) Expand all
721 ApiMessageReader api_reader(buffer, buffer_len); 690 ApiMessageReader api_reader(buffer, buffer_len);
722 Dart_CObject* root = api_reader.ReadMessage(); 691 Dart_CObject* root = api_reader.ReadMessage();
723 EXPECT_EQ(Dart_CObject_kTypedData, root->type); 692 EXPECT_EQ(Dart_CObject_kTypedData, root->type);
724 EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length); 693 EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length);
725 for (int i = 0; i < kTypedDataLength; i++) { 694 for (int i = 0; i < kTypedDataLength; i++) {
726 EXPECT(root->value.as_typed_data.values[i] == i); 695 EXPECT(root->value.as_typed_data.values[i] == i);
727 } 696 }
728 CheckEncodeDecodeMessage(root); 697 CheckEncodeDecodeMessage(root);
729 } 698 }
730 699
731
732 #define TEST_TYPED_ARRAY(darttype, ctype) \ 700 #define TEST_TYPED_ARRAY(darttype, ctype) \
733 { \ 701 { \
734 StackZone zone(thread); \ 702 StackZone zone(thread); \
735 const int kArrayLength = 127; \ 703 const int kArrayLength = 127; \
736 TypedData& array = TypedData::Handle( \ 704 TypedData& array = TypedData::Handle( \
737 TypedData::New(kTypedData##darttype##ArrayCid, kArrayLength)); \ 705 TypedData::New(kTypedData##darttype##ArrayCid, kArrayLength)); \
738 intptr_t scale = array.ElementSizeInBytes(); \ 706 intptr_t scale = array.ElementSizeInBytes(); \
739 for (int i = 0; i < kArrayLength; i++) { \ 707 for (int i = 0; i < kArrayLength; i++) { \
740 array.Set##darttype((i * scale), i); \ 708 array.Set##darttype((i * scale), i); \
741 } \ 709 } \
742 uint8_t* buffer; \ 710 uint8_t* buffer; \
743 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); \ 711 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); \
744 writer.WriteMessage(array); \ 712 writer.WriteMessage(array); \
745 intptr_t buffer_len = writer.BytesWritten(); \ 713 intptr_t buffer_len = writer.BytesWritten(); \
746 MessageSnapshotReader reader(buffer, buffer_len, thread); \ 714 MessageSnapshotReader reader(buffer, buffer_len, thread); \
747 TypedData& serialized_array = TypedData::Handle(); \ 715 TypedData& serialized_array = TypedData::Handle(); \
748 serialized_array ^= reader.ReadObject(); \ 716 serialized_array ^= reader.ReadObject(); \
749 for (int i = 0; i < kArrayLength; i++) { \ 717 for (int i = 0; i < kArrayLength; i++) { \
750 EXPECT_EQ(static_cast<ctype>(i), \ 718 EXPECT_EQ(static_cast<ctype>(i), \
751 serialized_array.Get##darttype(i* scale)); \ 719 serialized_array.Get##darttype(i* scale)); \
752 } \ 720 } \
753 } 721 }
754 722
755
756 #define TEST_EXTERNAL_TYPED_ARRAY(darttype, ctype) \ 723 #define TEST_EXTERNAL_TYPED_ARRAY(darttype, ctype) \
757 { \ 724 { \
758 StackZone zone(thread); \ 725 StackZone zone(thread); \
759 ctype data[] = {0, 11, 22, 33, 44, 55, 66, 77}; \ 726 ctype data[] = {0, 11, 22, 33, 44, 55, 66, 77}; \
760 intptr_t length = ARRAY_SIZE(data); \ 727 intptr_t length = ARRAY_SIZE(data); \
761 ExternalTypedData& array = ExternalTypedData::Handle( \ 728 ExternalTypedData& array = ExternalTypedData::Handle( \
762 ExternalTypedData::New(kExternalTypedData##darttype##ArrayCid, \ 729 ExternalTypedData::New(kExternalTypedData##darttype##ArrayCid, \
763 reinterpret_cast<uint8_t*>(data), length)); \ 730 reinterpret_cast<uint8_t*>(data), length)); \
764 intptr_t scale = array.ElementSizeInBytes(); \ 731 intptr_t scale = array.ElementSizeInBytes(); \
765 uint8_t* buffer; \ 732 uint8_t* buffer; \
766 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); \ 733 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); \
767 writer.WriteMessage(array); \ 734 writer.WriteMessage(array); \
768 intptr_t buffer_len = writer.BytesWritten(); \ 735 intptr_t buffer_len = writer.BytesWritten(); \
769 MessageSnapshotReader reader(buffer, buffer_len, thread); \ 736 MessageSnapshotReader reader(buffer, buffer_len, thread); \
770 TypedData& serialized_array = TypedData::Handle(); \ 737 TypedData& serialized_array = TypedData::Handle(); \
771 serialized_array ^= reader.ReadObject(); \ 738 serialized_array ^= reader.ReadObject(); \
772 for (int i = 0; i < length; i++) { \ 739 for (int i = 0; i < length; i++) { \
773 EXPECT_EQ(static_cast<ctype>(data[i]), \ 740 EXPECT_EQ(static_cast<ctype>(data[i]), \
774 serialized_array.Get##darttype(i* scale)); \ 741 serialized_array.Get##darttype(i* scale)); \
775 } \ 742 } \
776 } 743 }
777 744
778
779 TEST_CASE(SerializeTypedArray) { 745 TEST_CASE(SerializeTypedArray) {
780 TEST_TYPED_ARRAY(Int8, int8_t); 746 TEST_TYPED_ARRAY(Int8, int8_t);
781 TEST_TYPED_ARRAY(Uint8, uint8_t); 747 TEST_TYPED_ARRAY(Uint8, uint8_t);
782 TEST_TYPED_ARRAY(Int16, int16_t); 748 TEST_TYPED_ARRAY(Int16, int16_t);
783 TEST_TYPED_ARRAY(Uint16, uint16_t); 749 TEST_TYPED_ARRAY(Uint16, uint16_t);
784 TEST_TYPED_ARRAY(Int32, int32_t); 750 TEST_TYPED_ARRAY(Int32, int32_t);
785 TEST_TYPED_ARRAY(Uint32, uint32_t); 751 TEST_TYPED_ARRAY(Uint32, uint32_t);
786 TEST_TYPED_ARRAY(Int64, int64_t); 752 TEST_TYPED_ARRAY(Int64, int64_t);
787 TEST_TYPED_ARRAY(Uint64, uint64_t); 753 TEST_TYPED_ARRAY(Uint64, uint64_t);
788 TEST_TYPED_ARRAY(Float32, float); 754 TEST_TYPED_ARRAY(Float32, float);
789 TEST_TYPED_ARRAY(Float64, double); 755 TEST_TYPED_ARRAY(Float64, double);
790 } 756 }
791 757
792
793 TEST_CASE(SerializeExternalTypedArray) { 758 TEST_CASE(SerializeExternalTypedArray) {
794 TEST_EXTERNAL_TYPED_ARRAY(Int8, int8_t); 759 TEST_EXTERNAL_TYPED_ARRAY(Int8, int8_t);
795 TEST_EXTERNAL_TYPED_ARRAY(Uint8, uint8_t); 760 TEST_EXTERNAL_TYPED_ARRAY(Uint8, uint8_t);
796 TEST_EXTERNAL_TYPED_ARRAY(Int16, int16_t); 761 TEST_EXTERNAL_TYPED_ARRAY(Int16, int16_t);
797 TEST_EXTERNAL_TYPED_ARRAY(Uint16, uint16_t); 762 TEST_EXTERNAL_TYPED_ARRAY(Uint16, uint16_t);
798 TEST_EXTERNAL_TYPED_ARRAY(Int32, int32_t); 763 TEST_EXTERNAL_TYPED_ARRAY(Int32, int32_t);
799 TEST_EXTERNAL_TYPED_ARRAY(Uint32, uint32_t); 764 TEST_EXTERNAL_TYPED_ARRAY(Uint32, uint32_t);
800 TEST_EXTERNAL_TYPED_ARRAY(Int64, int64_t); 765 TEST_EXTERNAL_TYPED_ARRAY(Int64, int64_t);
801 TEST_EXTERNAL_TYPED_ARRAY(Uint64, uint64_t); 766 TEST_EXTERNAL_TYPED_ARRAY(Uint64, uint64_t);
802 TEST_EXTERNAL_TYPED_ARRAY(Float32, float); 767 TEST_EXTERNAL_TYPED_ARRAY(Float32, float);
803 TEST_EXTERNAL_TYPED_ARRAY(Float64, double); 768 TEST_EXTERNAL_TYPED_ARRAY(Float64, double);
804 } 769 }
805 770
806
807 TEST_CASE(SerializeEmptyByteArray) { 771 TEST_CASE(SerializeEmptyByteArray) {
808 // Write snapshot with object content. 772 // Write snapshot with object content.
809 const int kTypedDataLength = 0; 773 const int kTypedDataLength = 0;
810 TypedData& typed_data = TypedData::Handle( 774 TypedData& typed_data = TypedData::Handle(
811 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength)); 775 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength));
812 uint8_t* buffer; 776 uint8_t* buffer;
813 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 777 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
814 writer.WriteMessage(typed_data); 778 writer.WriteMessage(typed_data);
815 intptr_t buffer_len = writer.BytesWritten(); 779 intptr_t buffer_len = writer.BytesWritten();
816 780
817 // Read object back from the snapshot. 781 // Read object back from the snapshot.
818 MessageSnapshotReader reader(buffer, buffer_len, thread); 782 MessageSnapshotReader reader(buffer, buffer_len, thread);
819 TypedData& serialized_typed_data = TypedData::Handle(); 783 TypedData& serialized_typed_data = TypedData::Handle();
820 serialized_typed_data ^= reader.ReadObject(); 784 serialized_typed_data ^= reader.ReadObject();
821 EXPECT(serialized_typed_data.IsTypedData()); 785 EXPECT(serialized_typed_data.IsTypedData());
822 786
823 // Read object back from the snapshot into a C structure. 787 // Read object back from the snapshot into a C structure.
824 ApiNativeScope scope; 788 ApiNativeScope scope;
825 ApiMessageReader api_reader(buffer, buffer_len); 789 ApiMessageReader api_reader(buffer, buffer_len);
826 Dart_CObject* root = api_reader.ReadMessage(); 790 Dart_CObject* root = api_reader.ReadMessage();
827 EXPECT_EQ(Dart_CObject_kTypedData, root->type); 791 EXPECT_EQ(Dart_CObject_kTypedData, root->type);
828 EXPECT_EQ(Dart_TypedData_kUint8, root->value.as_typed_data.type); 792 EXPECT_EQ(Dart_TypedData_kUint8, root->value.as_typed_data.type);
829 EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length); 793 EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length);
830 EXPECT(root->value.as_typed_data.values == NULL); 794 EXPECT(root->value.as_typed_data.values == NULL);
831 CheckEncodeDecodeMessage(root); 795 CheckEncodeDecodeMessage(root);
832 } 796 }
833 797
834
835 class TestSnapshotWriter : public SnapshotWriter { 798 class TestSnapshotWriter : public SnapshotWriter {
836 public: 799 public:
837 static const intptr_t kInitialSize = 64 * KB; 800 static const intptr_t kInitialSize = 64 * KB;
838 TestSnapshotWriter(uint8_t** buffer, ReAlloc alloc) 801 TestSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
839 : SnapshotWriter(Thread::Current(), 802 : SnapshotWriter(Thread::Current(),
840 Snapshot::kScript, 803 Snapshot::kScript,
841 buffer, 804 buffer,
842 alloc, 805 alloc,
843 NULL, 806 NULL,
844 kInitialSize, 807 kInitialSize,
845 &forward_list_, 808 &forward_list_,
846 true /* can_send_any_object */), 809 true /* can_send_any_object */),
847 forward_list_(thread(), kMaxPredefinedObjectIds) { 810 forward_list_(thread(), kMaxPredefinedObjectIds) {
848 ASSERT(buffer != NULL); 811 ASSERT(buffer != NULL);
849 ASSERT(alloc != NULL); 812 ASSERT(alloc != NULL);
850 } 813 }
851 ~TestSnapshotWriter() {} 814 ~TestSnapshotWriter() {}
852 815
853 // Writes just a script object 816 // Writes just a script object
854 void WriteScript(const Script& script) { WriteObject(script.raw()); } 817 void WriteScript(const Script& script) { WriteObject(script.raw()); }
855 818
856 private: 819 private:
857 ForwardList forward_list_; 820 ForwardList forward_list_;
858 821
859 DISALLOW_COPY_AND_ASSIGN(TestSnapshotWriter); 822 DISALLOW_COPY_AND_ASSIGN(TestSnapshotWriter);
860 }; 823 };
861 824
862
863 static void GenerateSourceAndCheck(const Script& script) { 825 static void GenerateSourceAndCheck(const Script& script) {
864 // Check if we are able to generate the source from the token stream. 826 // Check if we are able to generate the source from the token stream.
865 // Rescan this source and compare the token stream to see if they are 827 // Rescan this source and compare the token stream to see if they are
866 // the same. 828 // the same.
867 Zone* zone = Thread::Current()->zone(); 829 Zone* zone = Thread::Current()->zone();
868 const TokenStream& expected_tokens = 830 const TokenStream& expected_tokens =
869 TokenStream::Handle(zone, script.tokens()); 831 TokenStream::Handle(zone, script.tokens());
870 TokenStream::Iterator expected_iterator(zone, expected_tokens, 832 TokenStream::Iterator expected_iterator(zone, expected_tokens,
871 TokenPosition::kMinSource, 833 TokenPosition::kMinSource,
872 TokenStream::Iterator::kAllTokens); 834 TokenStream::Iterator::kAllTokens);
(...skipping 15 matching lines...) Expand all
888 expected_literal ^= expected_iterator.CurrentLiteral(); 850 expected_literal ^= expected_iterator.CurrentLiteral();
889 actual_literal ^= reconstructed_iterator.CurrentLiteral(); 851 actual_literal ^= reconstructed_iterator.CurrentLiteral();
890 EXPECT_STREQ(expected_literal.ToCString(), actual_literal.ToCString()); 852 EXPECT_STREQ(expected_literal.ToCString(), actual_literal.ToCString());
891 expected_iterator.Advance(); 853 expected_iterator.Advance();
892 reconstructed_iterator.Advance(); 854 reconstructed_iterator.Advance();
893 expected_kind = expected_iterator.CurrentTokenKind(); 855 expected_kind = expected_iterator.CurrentTokenKind();
894 reconstructed_kind = reconstructed_iterator.CurrentTokenKind(); 856 reconstructed_kind = reconstructed_iterator.CurrentTokenKind();
895 } 857 }
896 } 858 }
897 859
898
899 TEST_CASE(SerializeScript) { 860 TEST_CASE(SerializeScript) {
900 const char* kScriptChars = 861 const char* kScriptChars =
901 "class A {\n" 862 "class A {\n"
902 " static bar() { return 42; }\n" 863 " static bar() { return 42; }\n"
903 " static fly() { return 5; }\n" 864 " static fly() { return 5; }\n"
904 " static s1() { return 'this is a string in the source'; }\n" 865 " static s1() { return 'this is a string in the source'; }\n"
905 " static s2() { return 'this is a \"string\" in the source'; }\n" 866 " static s2() { return 'this is a \"string\" in the source'; }\n"
906 " static s3() { return 'this is a \\\'string\\\' in \"the\" source'; }\n" 867 " static s3() { return 'this is a \\\'string\\\' in \"the\" source'; }\n"
907 " static s4() { return 'this \"is\" a \"string\" in \"the\" source'; }\n" 868 " static s4() { return 'this \"is\" a \"string\" in \"the\" source'; }\n"
908 " static ms1() {\n" 869 " static ms1() {\n"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 } 955 }
995 956
996 // Check if we are able to generate the source from the token stream. 957 // Check if we are able to generate the source from the token stream.
997 // Rescan this source and compare the token stream to see if they are 958 // Rescan this source and compare the token stream to see if they are
998 // the same. 959 // the same.
999 GenerateSourceAndCheck(serialized_script); 960 GenerateSourceAndCheck(serialized_script);
1000 961
1001 free(buffer); 962 free(buffer);
1002 } 963 }
1003 964
1004
1005 #if !defined(PRODUCT) // Uses mirrors. 965 #if !defined(PRODUCT) // Uses mirrors.
1006 VM_UNIT_TEST_CASE(CanonicalizationInScriptSnapshots) { 966 VM_UNIT_TEST_CASE(CanonicalizationInScriptSnapshots) {
1007 const char* kScriptChars = 967 const char* kScriptChars =
1008 "\n" 968 "\n"
1009 "import 'dart:mirrors';" 969 "import 'dart:mirrors';"
1010 "import 'dart:isolate';" 970 "import 'dart:isolate';"
1011 "void main() {" 971 "void main() {"
1012 " if (reflectClass(MyException).superclass.reflectedType != " 972 " if (reflectClass(MyException).superclass.reflectedType != "
1013 " IsolateSpawnException) {" 973 " IsolateSpawnException) {"
1014 " throw new Exception('Canonicalization failure');" 974 " throw new Exception('Canonicalization failure');"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 result = Dart_Invoke(result, NewString("main"), 0, NULL); 1061 result = Dart_Invoke(result, NewString("main"), 0, NULL);
1102 EXPECT_VALID(result); 1062 EXPECT_VALID(result);
1103 Dart_ExitScope(); 1063 Dart_ExitScope();
1104 Dart_ShutdownIsolate(); 1064 Dart_ShutdownIsolate();
1105 } 1065 }
1106 free(script_snapshot); 1066 free(script_snapshot);
1107 free(full_snapshot); 1067 free(full_snapshot);
1108 } 1068 }
1109 #endif 1069 #endif
1110 1070
1111
1112 VM_UNIT_TEST_CASE(ScriptSnapshotsUpdateSubclasses) { 1071 VM_UNIT_TEST_CASE(ScriptSnapshotsUpdateSubclasses) {
1113 const char* kScriptChars = 1072 const char* kScriptChars =
1114 "class _DebugDuration extends Duration {\n" 1073 "class _DebugDuration extends Duration {\n"
1115 " const _DebugDuration() : super(milliseconds: 42);\n" 1074 " const _DebugDuration() : super(milliseconds: 42);\n"
1116 "}\n" 1075 "}\n"
1117 "foo(x, y) {\n" 1076 "foo(x, y) {\n"
1118 " for (var i = 0; i < 1000000; i++) {\n" 1077 " for (var i = 0; i < 1000000; i++) {\n"
1119 " if (x != y) {\n" 1078 " if (x != y) {\n"
1120 " throw 'Boom!';\n" 1079 " throw 'Boom!';\n"
1121 " }\n" 1080 " }\n"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 } 1174 }
1216 free(script_snapshot); 1175 free(script_snapshot);
1217 free(full_snapshot); 1176 free(full_snapshot);
1218 1177
1219 FLAG_max_polymorphic_checks = saved_max_polymorphic_checks; 1178 FLAG_max_polymorphic_checks = saved_max_polymorphic_checks;
1220 #if !defined(PRODUCT) 1179 #if !defined(PRODUCT)
1221 FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode; 1180 FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
1222 #endif 1181 #endif
1223 } 1182 }
1224 1183
1225
1226 static void IterateScripts(const Library& lib) { 1184 static void IterateScripts(const Library& lib) {
1227 const Array& lib_scripts = Array::Handle(lib.LoadedScripts()); 1185 const Array& lib_scripts = Array::Handle(lib.LoadedScripts());
1228 Script& script = Script::Handle(); 1186 Script& script = Script::Handle();
1229 String& uri = String::Handle(); 1187 String& uri = String::Handle();
1230 for (intptr_t i = 0; i < lib_scripts.Length(); i++) { 1188 for (intptr_t i = 0; i < lib_scripts.Length(); i++) {
1231 script ^= lib_scripts.At(i); 1189 script ^= lib_scripts.At(i);
1232 EXPECT(!script.IsNull()); 1190 EXPECT(!script.IsNull());
1233 uri = script.url(); 1191 uri = script.url();
1234 OS::Print("Generating source for part: %s\n", uri.ToCString()); 1192 OS::Print("Generating source for part: %s\n", uri.ToCString());
1235 GenerateSourceAndCheck(script); 1193 GenerateSourceAndCheck(script);
(...skipping 17 matching lines...) Expand all
1253 EXPECT(!lib.IsNull()); 1211 EXPECT(!lib.IsNull());
1254 uri = lib.url(); 1212 uri = lib.url();
1255 OS::Print("Generating source for library: %s\n", uri.ToCString()); 1213 OS::Print("Generating source for library: %s\n", uri.ToCString());
1256 IterateScripts(lib); 1214 IterateScripts(lib);
1257 } 1215 }
1258 1216
1259 MallocHooks::set_stack_trace_collection_enabled( 1217 MallocHooks::set_stack_trace_collection_enabled(
1260 stack_trace_collection_enabled); 1218 stack_trace_collection_enabled);
1261 } 1219 }
1262 1220
1263
1264 VM_UNIT_TEST_CASE(FullSnapshot) { 1221 VM_UNIT_TEST_CASE(FullSnapshot) {
1265 const char* kScriptChars = 1222 const char* kScriptChars =
1266 "class Fields {\n" 1223 "class Fields {\n"
1267 " Fields(int i, int j) : fld1 = i, fld2 = j {}\n" 1224 " Fields(int i, int j) : fld1 = i, fld2 = j {}\n"
1268 " int fld1;\n" 1225 " int fld1;\n"
1269 " final int fld2;\n" 1226 " final int fld2;\n"
1270 " final int bigint_fld = 0xfffffffffff;\n" 1227 " final int bigint_fld = 0xfffffffffff;\n"
1271 " static int fld3;\n" 1228 " static int fld3;\n"
1272 " static const int smi_sfld = 10;\n" 1229 " static const int smi_sfld = 10;\n"
1273 " static const int bigint_sfld = 0xfffffffffff;\n" 1230 " static const int bigint_sfld = 0xfffffffffff;\n"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 // Invoke a function which returns an object. 1284 // Invoke a function which returns an object.
1328 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("FieldsTest")); 1285 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("FieldsTest"));
1329 result = Dart_Invoke(cls, NewString("testMain"), 0, NULL); 1286 result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
1330 EXPECT_VALID(result); 1287 EXPECT_VALID(result);
1331 Dart_ExitScope(); 1288 Dart_ExitScope();
1332 } 1289 }
1333 Dart_ShutdownIsolate(); 1290 Dart_ShutdownIsolate();
1334 free(isolate_snapshot_data_buffer); 1291 free(isolate_snapshot_data_buffer);
1335 } 1292 }
1336 1293
1337
1338 VM_UNIT_TEST_CASE(FullSnapshot1) { 1294 VM_UNIT_TEST_CASE(FullSnapshot1) {
1339 // This buffer has to be static for this to compile with Visual Studio. 1295 // This buffer has to be static for this to compile with Visual Studio.
1340 // If it is not static compilation of this file with Visual Studio takes 1296 // If it is not static compilation of this file with Visual Studio takes
1341 // more than 30 minutes! 1297 // more than 30 minutes!
1342 static const char kFullSnapshotScriptChars[] = { 1298 static const char kFullSnapshotScriptChars[] = {
1343 #include "snapshot_test.dat" 1299 #include "snapshot_test.dat"
1344 }; 1300 };
1345 const char* kScriptChars = kFullSnapshotScriptChars; 1301 const char* kScriptChars = kFullSnapshotScriptChars;
1346 1302
1347 uint8_t* isolate_snapshot_data_buffer; 1303 uint8_t* isolate_snapshot_data_buffer;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 // Print the error. It is probably an unhandled exception. 1349 // Print the error. It is probably an unhandled exception.
1394 fprintf(stderr, "%s\n", Dart_GetError(result)); 1350 fprintf(stderr, "%s\n", Dart_GetError(result));
1395 } 1351 }
1396 EXPECT_VALID(result); 1352 EXPECT_VALID(result);
1397 Dart_ExitScope(); 1353 Dart_ExitScope();
1398 } 1354 }
1399 Dart_ShutdownIsolate(); 1355 Dart_ShutdownIsolate();
1400 free(isolate_snapshot_data_buffer); 1356 free(isolate_snapshot_data_buffer);
1401 } 1357 }
1402 1358
1403
1404 #ifndef PRODUCT 1359 #ifndef PRODUCT
1405 1360
1406
1407 VM_UNIT_TEST_CASE(ScriptSnapshot) { 1361 VM_UNIT_TEST_CASE(ScriptSnapshot) {
1408 const char* kLibScriptChars = 1362 const char* kLibScriptChars =
1409 "library dart_import_lib;" 1363 "library dart_import_lib;"
1410 "class LibFields {" 1364 "class LibFields {"
1411 " LibFields(int i, int j) : fld1 = i, fld2 = j {}" 1365 " LibFields(int i, int j) : fld1 = i, fld2 = j {}"
1412 " int fld1;" 1366 " int fld1;"
1413 " final int fld2;" 1367 " final int fld2;"
1414 "}"; 1368 "}";
1415 const char* kScriptChars = 1369 const char* kScriptChars =
1416 "class TestTrace implements StackTrace {" 1370 "class TestTrace implements StackTrace {"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 Dart_Handle cls = Dart_GetClass(result, NewString("FieldsTest")); 1485 Dart_Handle cls = Dart_GetClass(result, NewString("FieldsTest"));
1532 result = Dart_Invoke(cls, NewString("testMain"), 0, NULL); 1486 result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
1533 EXPECT_VALID(result); 1487 EXPECT_VALID(result);
1534 Dart_ExitScope(); 1488 Dart_ExitScope();
1535 Dart_ShutdownIsolate(); 1489 Dart_ShutdownIsolate();
1536 } 1490 }
1537 free(full_snapshot); 1491 free(full_snapshot);
1538 free(script_snapshot); 1492 free(script_snapshot);
1539 } 1493 }
1540 1494
1541
1542 VM_UNIT_TEST_CASE(ScriptSnapshot1) { 1495 VM_UNIT_TEST_CASE(ScriptSnapshot1) {
1543 const char* kScriptChars = 1496 const char* kScriptChars =
1544 "class _SimpleNumEnumerable<T extends num> {" 1497 "class _SimpleNumEnumerable<T extends num> {"
1545 "final Iterable<T> _source;" 1498 "final Iterable<T> _source;"
1546 "const _SimpleNumEnumerable(this._source) : super();" 1499 "const _SimpleNumEnumerable(this._source) : super();"
1547 "}"; 1500 "}";
1548 1501
1549 Dart_Handle result; 1502 Dart_Handle result;
1550 uint8_t* buffer; 1503 uint8_t* buffer;
1551 intptr_t size; 1504 intptr_t size;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 EXPECT_VALID(result); 1557 EXPECT_VALID(result);
1605 Dart_ExitScope(); 1558 Dart_ExitScope();
1606 } 1559 }
1607 1560
1608 FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode; 1561 FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
1609 Dart_ShutdownIsolate(); 1562 Dart_ShutdownIsolate();
1610 free(full_snapshot); 1563 free(full_snapshot);
1611 free(script_snapshot); 1564 free(script_snapshot);
1612 } 1565 }
1613 1566
1614
1615 VM_UNIT_TEST_CASE(ScriptSnapshot2) { 1567 VM_UNIT_TEST_CASE(ScriptSnapshot2) {
1616 // The snapshot of this library is always created in production mode, but 1568 // The snapshot of this library is always created in production mode, but
1617 // loaded and executed in both production and checked modes. 1569 // loaded and executed in both production and checked modes.
1618 // This test verifies that type information is still contained in the snapshot 1570 // This test verifies that type information is still contained in the snapshot
1619 // although it was created in production mode and that type errors and 1571 // although it was created in production mode and that type errors and
1620 // compilation errors (for const fields) are correctly reported according to 1572 // compilation errors (for const fields) are correctly reported according to
1621 // the execution mode. 1573 // the execution mode.
1622 const char* kLibScriptChars = 1574 const char* kLibScriptChars =
1623 "library dart_import_lib;" 1575 "library dart_import_lib;"
1624 "const String s = 1.0;" 1576 "const String s = 1.0;"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 // Invoke the test_b function. 1672 // Invoke the test_b function.
1721 result = Dart_Invoke(lib, NewString("test_b"), 0, NULL); 1673 result = Dart_Invoke(lib, NewString("test_b"), 0, NULL);
1722 EXPECT(Dart_IsError(result) == saved_enable_type_checks_mode); 1674 EXPECT(Dart_IsError(result) == saved_enable_type_checks_mode);
1723 Dart_ExitScope(); 1675 Dart_ExitScope();
1724 } 1676 }
1725 Dart_ShutdownIsolate(); 1677 Dart_ShutdownIsolate();
1726 free(full_snapshot); 1678 free(full_snapshot);
1727 free(script_snapshot); 1679 free(script_snapshot);
1728 } 1680 }
1729 1681
1730
1731 VM_UNIT_TEST_CASE(MismatchedSnapshotKinds) { 1682 VM_UNIT_TEST_CASE(MismatchedSnapshotKinds) {
1732 const char* kScriptChars = "main() { print('Hello, world!'); }"; 1683 const char* kScriptChars = "main() { print('Hello, world!'); }";
1733 Dart_Handle result; 1684 Dart_Handle result;
1734 1685
1735 uint8_t* buffer; 1686 uint8_t* buffer;
1736 intptr_t size; 1687 intptr_t size;
1737 intptr_t vm_isolate_snapshot_size; 1688 intptr_t vm_isolate_snapshot_size;
1738 uint8_t* isolate_snapshot = NULL; 1689 uint8_t* isolate_snapshot = NULL;
1739 intptr_t isolate_snapshot_size; 1690 intptr_t isolate_snapshot_size;
1740 uint8_t* full_snapshot = NULL; 1691 uint8_t* full_snapshot = NULL;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1804 "Dart_LoadScriptFromSnapshot expects parameter" 1755 "Dart_LoadScriptFromSnapshot expects parameter"
1805 " 'buffer' to be a script type snapshot."); 1756 " 'buffer' to be a script type snapshot.");
1806 1757
1807 Dart_ExitScope(); 1758 Dart_ExitScope();
1808 } 1759 }
1809 Dart_ShutdownIsolate(); 1760 Dart_ShutdownIsolate();
1810 free(full_snapshot); 1761 free(full_snapshot);
1811 free(script_snapshot); 1762 free(script_snapshot);
1812 } 1763 }
1813 1764
1814
1815 #endif // !PRODUCT 1765 #endif // !PRODUCT
1816 1766
1817
1818 TEST_CASE(IntArrayMessage) { 1767 TEST_CASE(IntArrayMessage) {
1819 StackZone zone(Thread::Current()); 1768 StackZone zone(Thread::Current());
1820 uint8_t* buffer = NULL; 1769 uint8_t* buffer = NULL;
1821 ApiMessageWriter writer(&buffer, &zone_allocator); 1770 ApiMessageWriter writer(&buffer, &zone_allocator);
1822 1771
1823 static const int kArrayLength = 2; 1772 static const int kArrayLength = 2;
1824 intptr_t data[kArrayLength] = {1, 2}; 1773 intptr_t data[kArrayLength] = {1, 2};
1825 int len = kArrayLength; 1774 int len = kArrayLength;
1826 writer.WriteMessage(len, data); 1775 writer.WriteMessage(len, data);
1827 1776
1828 // Read object back from the snapshot into a C structure. 1777 // Read object back from the snapshot into a C structure.
1829 ApiNativeScope scope; 1778 ApiNativeScope scope;
1830 ApiMessageReader api_reader(buffer, writer.BytesWritten()); 1779 ApiMessageReader api_reader(buffer, writer.BytesWritten());
1831 Dart_CObject* root = api_reader.ReadMessage(); 1780 Dart_CObject* root = api_reader.ReadMessage();
1832 EXPECT_EQ(Dart_CObject_kArray, root->type); 1781 EXPECT_EQ(Dart_CObject_kArray, root->type);
1833 EXPECT_EQ(kArrayLength, root->value.as_array.length); 1782 EXPECT_EQ(kArrayLength, root->value.as_array.length);
1834 for (int i = 0; i < kArrayLength; i++) { 1783 for (int i = 0; i < kArrayLength; i++) {
1835 Dart_CObject* element = root->value.as_array.values[i]; 1784 Dart_CObject* element = root->value.as_array.values[i];
1836 EXPECT_EQ(Dart_CObject_kInt32, element->type); 1785 EXPECT_EQ(Dart_CObject_kInt32, element->type);
1837 EXPECT_EQ(i + 1, element->value.as_int32); 1786 EXPECT_EQ(i + 1, element->value.as_int32);
1838 } 1787 }
1839 CheckEncodeDecodeMessage(root); 1788 CheckEncodeDecodeMessage(root);
1840 } 1789 }
1841 1790
1842
1843 // Helper function to call a top level Dart function and serialize the result. 1791 // Helper function to call a top level Dart function and serialize the result.
1844 static uint8_t* GetSerialized(Dart_Handle lib, 1792 static uint8_t* GetSerialized(Dart_Handle lib,
1845 const char* dart_function, 1793 const char* dart_function,
1846 intptr_t* buffer_len) { 1794 intptr_t* buffer_len) {
1847 Dart_Handle result; 1795 Dart_Handle result;
1848 result = Dart_Invoke(lib, NewString(dart_function), 0, NULL); 1796 result = Dart_Invoke(lib, NewString(dart_function), 0, NULL);
1849 EXPECT_VALID(result); 1797 EXPECT_VALID(result);
1850 Object& obj = Object::Handle(Api::UnwrapHandle(result)); 1798 Object& obj = Object::Handle(Api::UnwrapHandle(result));
1851 1799
1852 // Serialize the object into a message. 1800 // Serialize the object into a message.
1853 uint8_t* buffer; 1801 uint8_t* buffer;
1854 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, false); 1802 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, false);
1855 writer.WriteMessage(obj); 1803 writer.WriteMessage(obj);
1856 *buffer_len = writer.BytesWritten(); 1804 *buffer_len = writer.BytesWritten();
1857 return buffer; 1805 return buffer;
1858 } 1806 }
1859 1807
1860
1861 // Helper function to deserialize the result into a Dart_CObject structure. 1808 // Helper function to deserialize the result into a Dart_CObject structure.
1862 static Dart_CObject* GetDeserialized(uint8_t* buffer, intptr_t buffer_len) { 1809 static Dart_CObject* GetDeserialized(uint8_t* buffer, intptr_t buffer_len) {
1863 // Read object back from the snapshot into a C structure. 1810 // Read object back from the snapshot into a C structure.
1864 ApiMessageReader api_reader(buffer, buffer_len); 1811 ApiMessageReader api_reader(buffer, buffer_len);
1865 return api_reader.ReadMessage(); 1812 return api_reader.ReadMessage();
1866 } 1813 }
1867 1814
1868
1869 static void CheckString(Dart_Handle dart_string, const char* expected) { 1815 static void CheckString(Dart_Handle dart_string, const char* expected) {
1870 StackZone zone(Thread::Current()); 1816 StackZone zone(Thread::Current());
1871 String& str = String::Handle(); 1817 String& str = String::Handle();
1872 str ^= Api::UnwrapHandle(dart_string); 1818 str ^= Api::UnwrapHandle(dart_string);
1873 uint8_t* buffer; 1819 uint8_t* buffer;
1874 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, false); 1820 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, false);
1875 writer.WriteMessage(str); 1821 writer.WriteMessage(str);
1876 intptr_t buffer_len = writer.BytesWritten(); 1822 intptr_t buffer_len = writer.BytesWritten();
1877 1823
1878 // Read object back from the snapshot into a C structure. 1824 // Read object back from the snapshot into a C structure.
1879 ApiNativeScope scope; 1825 ApiNativeScope scope;
1880 ApiMessageReader api_reader(buffer, buffer_len); 1826 ApiMessageReader api_reader(buffer, buffer_len);
1881 Dart_CObject* root = api_reader.ReadMessage(); 1827 Dart_CObject* root = api_reader.ReadMessage();
1882 EXPECT_NOTNULL(root); 1828 EXPECT_NOTNULL(root);
1883 EXPECT_EQ(Dart_CObject_kString, root->type); 1829 EXPECT_EQ(Dart_CObject_kString, root->type);
1884 EXPECT_STREQ(expected, root->value.as_string); 1830 EXPECT_STREQ(expected, root->value.as_string);
1885 CheckEncodeDecodeMessage(root); 1831 CheckEncodeDecodeMessage(root);
1886 } 1832 }
1887 1833
1888
1889 static void CheckStringInvalid(Dart_Handle dart_string) { 1834 static void CheckStringInvalid(Dart_Handle dart_string) {
1890 StackZone zone(Thread::Current()); 1835 StackZone zone(Thread::Current());
1891 String& str = String::Handle(); 1836 String& str = String::Handle();
1892 str ^= Api::UnwrapHandle(dart_string); 1837 str ^= Api::UnwrapHandle(dart_string);
1893 uint8_t* buffer; 1838 uint8_t* buffer;
1894 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, false); 1839 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, false);
1895 writer.WriteMessage(str); 1840 writer.WriteMessage(str);
1896 intptr_t buffer_len = writer.BytesWritten(); 1841 intptr_t buffer_len = writer.BytesWritten();
1897 1842
1898 // Read object back from the snapshot into a C structure. 1843 // Read object back from the snapshot into a C structure.
1899 ApiNativeScope scope; 1844 ApiNativeScope scope;
1900 ApiMessageReader api_reader(buffer, buffer_len); 1845 ApiMessageReader api_reader(buffer, buffer_len);
1901 Dart_CObject* root = api_reader.ReadMessage(); 1846 Dart_CObject* root = api_reader.ReadMessage();
1902 EXPECT_NOTNULL(root); 1847 EXPECT_NOTNULL(root);
1903 EXPECT_EQ(Dart_CObject_kUnsupported, root->type); 1848 EXPECT_EQ(Dart_CObject_kUnsupported, root->type);
1904 } 1849 }
1905 1850
1906
1907 VM_UNIT_TEST_CASE(DartGeneratedMessages) { 1851 VM_UNIT_TEST_CASE(DartGeneratedMessages) {
1908 static const char* kCustomIsolateScriptChars = 1852 static const char* kCustomIsolateScriptChars =
1909 "getSmi() {\n" 1853 "getSmi() {\n"
1910 " return 42;\n" 1854 " return 42;\n"
1911 "}\n" 1855 "}\n"
1912 "getBigint() {\n" 1856 "getBigint() {\n"
1913 " return -0x424242424242424242424242424242424242;\n" 1857 " return -0x424242424242424242424242424242424242;\n"
1914 "}\n" 1858 "}\n"
1915 "getAsciiString() {\n" 1859 "getAsciiString() {\n"
1916 " return \"Hello, world!\";\n" 1860 " return \"Hello, world!\";\n"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2044 "\xf0\xa0\x80\x80"); 1988 "\xf0\xa0\x80\x80");
2045 CheckStringInvalid(lead_surrogate_string_result); 1989 CheckStringInvalid(lead_surrogate_string_result);
2046 CheckStringInvalid(trail_surrogate_string_result); 1990 CheckStringInvalid(trail_surrogate_string_result);
2047 CheckStringInvalid(crappy_string_result); 1991 CheckStringInvalid(crappy_string_result);
2048 CheckStringInvalid(surrogates_string_result); 1992 CheckStringInvalid(surrogates_string_result);
2049 } 1993 }
2050 Dart_ExitScope(); 1994 Dart_ExitScope();
2051 Dart_ShutdownIsolate(); 1995 Dart_ShutdownIsolate();
2052 } 1996 }
2053 1997
2054
2055 VM_UNIT_TEST_CASE(DartGeneratedListMessages) { 1998 VM_UNIT_TEST_CASE(DartGeneratedListMessages) {
2056 const int kArrayLength = 10; 1999 const int kArrayLength = 10;
2057 static const char* kScriptChars = 2000 static const char* kScriptChars =
2058 "final int kArrayLength = 10;\n" 2001 "final int kArrayLength = 10;\n"
2059 "getList() {\n" 2002 "getList() {\n"
2060 " return new List(kArrayLength);\n" 2003 " return new List(kArrayLength);\n"
2061 "}\n" 2004 "}\n"
2062 "getIntList() {\n" 2005 "getIntList() {\n"
2063 " var list = new List<int>(kArrayLength);\n" 2006 " var list = new List<int>(kArrayLength);\n"
2064 " for (var i = 0; i < kArrayLength; i++) list[i] = i;\n" 2007 " for (var i = 0; i < kArrayLength; i++) list[i] = i;\n"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
2155 if (i > 3) { 2098 if (i > 3) {
2156 EXPECT_EQ(Dart_CObject_kNull, root->value.as_array.values[i]->type); 2099 EXPECT_EQ(Dart_CObject_kNull, root->value.as_array.values[i]->type);
2157 } 2100 }
2158 } 2101 }
2159 } 2102 }
2160 } 2103 }
2161 Dart_ExitScope(); 2104 Dart_ExitScope();
2162 Dart_ShutdownIsolate(); 2105 Dart_ShutdownIsolate();
2163 } 2106 }
2164 2107
2165
2166 VM_UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { 2108 VM_UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) {
2167 const int kArrayLength = 10; 2109 const int kArrayLength = 10;
2168 static const char* kScriptChars = 2110 static const char* kScriptChars =
2169 "final int kArrayLength = 10;\n" 2111 "final int kArrayLength = 10;\n"
2170 "getList() {\n" 2112 "getList() {\n"
2171 " return [null, null, null, null, null, null, null, null, null, null];\n" 2113 " return [null, null, null, null, null, null, null, null, null, null];\n"
2172 "}\n" 2114 "}\n"
2173 "getIntList() {\n" 2115 "getIntList() {\n"
2174 " return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n" 2116 " return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n"
2175 "}\n" 2117 "}\n"
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2376 e = element->value.as_array.values[i]; 2318 e = element->value.as_array.values[i];
2377 EXPECT_EQ(Dart_CObject_kInt32, e->type); 2319 EXPECT_EQ(Dart_CObject_kInt32, e->type);
2378 EXPECT_EQ(i + 1, e->value.as_int32); 2320 EXPECT_EQ(i + 1, e->value.as_int32);
2379 } 2321 }
2380 } 2322 }
2381 } 2323 }
2382 Dart_ExitScope(); 2324 Dart_ExitScope();
2383 Dart_ShutdownIsolate(); 2325 Dart_ShutdownIsolate();
2384 } 2326 }
2385 2327
2386
2387 VM_UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { 2328 VM_UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
2388 const int kArrayLength = 10; 2329 const int kArrayLength = 10;
2389 static const char* kScriptChars = 2330 static const char* kScriptChars =
2390 "import 'dart:typed_data';\n" 2331 "import 'dart:typed_data';\n"
2391 "final int kArrayLength = 10;\n" 2332 "final int kArrayLength = 10;\n"
2392 "getStringList() {\n" 2333 "getStringList() {\n"
2393 " var s = 'Hello, world!';\n" 2334 " var s = 'Hello, world!';\n"
2394 " var list = new List<String>(kArrayLength);\n" 2335 " var list = new List<String>(kArrayLength);\n"
2395 " for (var i = 0; i < kArrayLength; i++) list[i] = s;\n" 2336 " for (var i = 0; i < kArrayLength; i++) list[i] = s;\n"
2396 " return list;\n" 2337 " return list;\n"
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 Dart_CObject* element = root->value.as_array.values[i]; 2537 Dart_CObject* element = root->value.as_array.values[i];
2597 EXPECT_EQ(Dart_CObject_kArray, element->type); 2538 EXPECT_EQ(Dart_CObject_kArray, element->type);
2598 EXPECT_EQ(root, element); 2539 EXPECT_EQ(root, element);
2599 } 2540 }
2600 } 2541 }
2601 } 2542 }
2602 Dart_ExitScope(); 2543 Dart_ExitScope();
2603 Dart_ShutdownIsolate(); 2544 Dart_ShutdownIsolate();
2604 } 2545 }
2605 2546
2606
2607 VM_UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { 2547 VM_UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) {
2608 const int kArrayLength = 10; 2548 const int kArrayLength = 10;
2609 static const char* kScriptChars = 2549 static const char* kScriptChars =
2610 "import 'dart:typed_data';\n" 2550 "import 'dart:typed_data';\n"
2611 "final int kArrayLength = 10;\n" 2551 "final int kArrayLength = 10;\n"
2612 "getStringList() {\n" 2552 "getStringList() {\n"
2613 " var s = 'Hello, world!';\n" 2553 " var s = 'Hello, world!';\n"
2614 " var list = [s, s, s, s, s, s, s, s, s, s];\n" 2554 " var list = [s, s, s, s, s, s, s, s, s, s];\n"
2615 " return list;\n" 2555 " return list;\n"
2616 "}\n" 2556 "}\n"
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 Dart_CObject* element = root->value.as_array.values[i]; 2763 Dart_CObject* element = root->value.as_array.values[i];
2824 EXPECT_EQ(Dart_CObject_kArray, element->type); 2764 EXPECT_EQ(Dart_CObject_kArray, element->type);
2825 EXPECT_EQ(root, element); 2765 EXPECT_EQ(root, element);
2826 } 2766 }
2827 } 2767 }
2828 } 2768 }
2829 Dart_ExitScope(); 2769 Dart_ExitScope();
2830 Dart_ShutdownIsolate(); 2770 Dart_ShutdownIsolate();
2831 } 2771 }
2832 2772
2833
2834 static void CheckTypedData(Dart_CObject* object, 2773 static void CheckTypedData(Dart_CObject* object,
2835 Dart_TypedData_Type typed_data_type, 2774 Dart_TypedData_Type typed_data_type,
2836 int len) { 2775 int len) {
2837 EXPECT_EQ(Dart_CObject_kTypedData, object->type); 2776 EXPECT_EQ(Dart_CObject_kTypedData, object->type);
2838 EXPECT_EQ(typed_data_type, object->value.as_typed_data.type); 2777 EXPECT_EQ(typed_data_type, object->value.as_typed_data.type);
2839 EXPECT_EQ(len, object->value.as_typed_data.length); 2778 EXPECT_EQ(len, object->value.as_typed_data.length);
2840 } 2779 }
2841 2780
2842 VM_UNIT_TEST_CASE(DartGeneratedListMessagesWithTypedData) { 2781 VM_UNIT_TEST_CASE(DartGeneratedListMessagesWithTypedData) {
2843 static const char* kScriptChars = 2782 static const char* kScriptChars =
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
3018 root->value.as_array.values[i]->value.as_typed_data.values); 2957 root->value.as_array.values[i]->value.as_typed_data.values);
3019 i++; 2958 i++;
3020 } 2959 }
3021 EXPECT_EQ(i, root->value.as_array.length); 2960 EXPECT_EQ(i, root->value.as_array.length);
3022 } 2961 }
3023 } 2962 }
3024 Dart_ExitScope(); 2963 Dart_ExitScope();
3025 Dart_ShutdownIsolate(); 2964 Dart_ShutdownIsolate();
3026 } 2965 }
3027 2966
3028
3029 VM_UNIT_TEST_CASE(PostCObject) { 2967 VM_UNIT_TEST_CASE(PostCObject) {
3030 // Create a native port for posting from C to Dart 2968 // Create a native port for posting from C to Dart
3031 TestIsolateScope __test_isolate__; 2969 TestIsolateScope __test_isolate__;
3032 const char* kScriptChars = 2970 const char* kScriptChars =
3033 "import 'dart:isolate';\n" 2971 "import 'dart:isolate';\n"
3034 "main() {\n" 2972 "main() {\n"
3035 " var messageCount = 0;\n" 2973 " var messageCount = 0;\n"
3036 " var exception = '';\n" 2974 " var exception = '';\n"
3037 " var port = new RawReceivePort();\n" 2975 " var port = new RawReceivePort();\n"
3038 " var sendPort = port.sendPort;\n" 2976 " var sendPort = port.sendPort;\n"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3114 3052
3115 result = Dart_RunLoop(); 3053 result = Dart_RunLoop();
3116 EXPECT(Dart_IsError(result)); 3054 EXPECT(Dart_IsError(result));
3117 EXPECT(Dart_ErrorHasException(result)); 3055 EXPECT(Dart_ErrorHasException(result));
3118 EXPECT_SUBSTRING("Exception: nulltruefalse123456æøå3.14[]100123456789\n", 3056 EXPECT_SUBSTRING("Exception: nulltruefalse123456æøå3.14[]100123456789\n",
3119 Dart_GetError(result)); 3057 Dart_GetError(result));
3120 3058
3121 Dart_ExitScope(); 3059 Dart_ExitScope();
3122 } 3060 }
3123 3061
3124
3125 TEST_CASE(OmittedObjectEncodingLength) { 3062 TEST_CASE(OmittedObjectEncodingLength) {
3126 StackZone zone(Thread::Current()); 3063 StackZone zone(Thread::Current());
3127 uint8_t* buffer; 3064 uint8_t* buffer;
3128 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true); 3065 MessageWriter writer(&buffer, &zone_allocator, &zone_deallocator, true);
3129 writer.WriteInlinedObjectHeader(kOmittedObjectId); 3066 writer.WriteInlinedObjectHeader(kOmittedObjectId);
3130 // For performance, we'd like single-byte headers when ids are omitted. 3067 // For performance, we'd like single-byte headers when ids are omitted.
3131 // If this starts failing, consider renumbering the snapshot ids. 3068 // If this starts failing, consider renumbering the snapshot ids.
3132 EXPECT_EQ(1, writer.BytesWritten()); 3069 EXPECT_EQ(1, writer.BytesWritten());
3133 } 3070 }
3134 3071
3135 } // namespace dart 3072 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/snapshot_ids.h ('k') | runtime/vm/source_report.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698