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

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

Issue 834233003: Fix for issue 21398 (only send "literal like" objects across isolates spawned using spawnURI (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/snapshot.cc ('k') | samples/sample_extension/sample_extension.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_debugger_api.h" 7 #include "include/dart_debugger_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/dart_api_impl.h" 10 #include "vm/dart_api_impl.h"
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 const bool result = writer.WriteCMessage(root); 144 const bool result = writer.WriteCMessage(root);
145 EXPECT_EQ(false, result); 145 EXPECT_EQ(false, result);
146 } 146 }
147 147
148 148
149 TEST_CASE(SerializeNull) { 149 TEST_CASE(SerializeNull) {
150 StackZone zone(Isolate::Current()); 150 StackZone zone(Isolate::Current());
151 151
152 // Write snapshot with object content. 152 // Write snapshot with object content.
153 uint8_t* buffer; 153 uint8_t* buffer;
154 MessageWriter writer(&buffer, &zone_allocator); 154 MessageWriter writer(&buffer, &zone_allocator, true);
155 const Object& null_object = Object::Handle(); 155 const Object& null_object = Object::Handle();
156 writer.WriteMessage(null_object); 156 writer.WriteMessage(null_object);
157 intptr_t buffer_len = writer.BytesWritten(); 157 intptr_t buffer_len = writer.BytesWritten();
158 158
159 // Read object back from the snapshot. 159 // Read object back from the snapshot.
160 SnapshotReader reader(buffer, buffer_len, 160 SnapshotReader reader(buffer, buffer_len,
161 Snapshot::kMessage, Isolate::Current()); 161 Snapshot::kMessage, Isolate::Current());
162 const Object& serialized_object = Object::Handle(reader.ReadObject()); 162 const Object& serialized_object = Object::Handle(reader.ReadObject());
163 EXPECT(Equals(null_object, serialized_object)); 163 EXPECT(Equals(null_object, serialized_object));
164 164
165 // Read object back from the snapshot into a C structure. 165 // Read object back from the snapshot into a C structure.
166 ApiNativeScope scope; 166 ApiNativeScope scope;
167 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 167 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
168 Dart_CObject* root = api_reader.ReadMessage(); 168 Dart_CObject* root = api_reader.ReadMessage();
169 EXPECT_NOTNULL(root); 169 EXPECT_NOTNULL(root);
170 EXPECT_EQ(Dart_CObject_kNull, root->type); 170 EXPECT_EQ(Dart_CObject_kNull, root->type);
171 CheckEncodeDecodeMessage(root); 171 CheckEncodeDecodeMessage(root);
172 } 172 }
173 173
174 174
175 TEST_CASE(SerializeSmi1) { 175 TEST_CASE(SerializeSmi1) {
176 StackZone zone(Isolate::Current()); 176 StackZone zone(Isolate::Current());
177 177
178 // Write snapshot with object content. 178 // Write snapshot with object content.
179 uint8_t* buffer; 179 uint8_t* buffer;
180 MessageWriter writer(&buffer, &zone_allocator); 180 MessageWriter writer(&buffer, &zone_allocator, true);
181 const Smi& smi = Smi::Handle(Smi::New(124)); 181 const Smi& smi = Smi::Handle(Smi::New(124));
182 writer.WriteMessage(smi); 182 writer.WriteMessage(smi);
183 intptr_t buffer_len = writer.BytesWritten(); 183 intptr_t buffer_len = writer.BytesWritten();
184 184
185 // Read object back from the snapshot. 185 // Read object back from the snapshot.
186 SnapshotReader reader(buffer, buffer_len, 186 SnapshotReader reader(buffer, buffer_len,
187 Snapshot::kMessage, Isolate::Current()); 187 Snapshot::kMessage, Isolate::Current());
188 const Object& serialized_object = Object::Handle(reader.ReadObject()); 188 const Object& serialized_object = Object::Handle(reader.ReadObject());
189 EXPECT(Equals(smi, serialized_object)); 189 EXPECT(Equals(smi, serialized_object));
190 190
191 // Read object back from the snapshot into a C structure. 191 // Read object back from the snapshot into a C structure.
192 ApiNativeScope scope; 192 ApiNativeScope scope;
193 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 193 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
194 Dart_CObject* root = api_reader.ReadMessage(); 194 Dart_CObject* root = api_reader.ReadMessage();
195 EXPECT_NOTNULL(root); 195 EXPECT_NOTNULL(root);
196 EXPECT_EQ(Dart_CObject_kInt32, root->type); 196 EXPECT_EQ(Dart_CObject_kInt32, root->type);
197 EXPECT_EQ(smi.Value(), root->value.as_int32); 197 EXPECT_EQ(smi.Value(), root->value.as_int32);
198 CheckEncodeDecodeMessage(root); 198 CheckEncodeDecodeMessage(root);
199 } 199 }
200 200
201 201
202 TEST_CASE(SerializeSmi2) { 202 TEST_CASE(SerializeSmi2) {
203 StackZone zone(Isolate::Current()); 203 StackZone zone(Isolate::Current());
204 204
205 // Write snapshot with object content. 205 // Write snapshot with object content.
206 uint8_t* buffer; 206 uint8_t* buffer;
207 MessageWriter writer(&buffer, &zone_allocator); 207 MessageWriter writer(&buffer, &zone_allocator, true);
208 const Smi& smi = Smi::Handle(Smi::New(-1)); 208 const Smi& smi = Smi::Handle(Smi::New(-1));
209 writer.WriteMessage(smi); 209 writer.WriteMessage(smi);
210 intptr_t buffer_len = writer.BytesWritten(); 210 intptr_t buffer_len = writer.BytesWritten();
211 211
212 // Read object back from the snapshot. 212 // Read object back from the snapshot.
213 SnapshotReader reader(buffer, buffer_len, 213 SnapshotReader reader(buffer, buffer_len,
214 Snapshot::kMessage, Isolate::Current()); 214 Snapshot::kMessage, Isolate::Current());
215 const Object& serialized_object = Object::Handle(reader.ReadObject()); 215 const Object& serialized_object = Object::Handle(reader.ReadObject());
216 EXPECT(Equals(smi, serialized_object)); 216 EXPECT(Equals(smi, serialized_object));
217 217
218 // Read object back from the snapshot into a C structure. 218 // Read object back from the snapshot into a C structure.
219 ApiNativeScope scope; 219 ApiNativeScope scope;
220 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 220 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
221 Dart_CObject* root = api_reader.ReadMessage(); 221 Dart_CObject* root = api_reader.ReadMessage();
222 EXPECT_NOTNULL(root); 222 EXPECT_NOTNULL(root);
223 EXPECT_EQ(Dart_CObject_kInt32, root->type); 223 EXPECT_EQ(Dart_CObject_kInt32, root->type);
224 EXPECT_EQ(smi.Value(), root->value.as_int32); 224 EXPECT_EQ(smi.Value(), root->value.as_int32);
225 CheckEncodeDecodeMessage(root); 225 CheckEncodeDecodeMessage(root);
226 } 226 }
227 227
228 228
229 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) { 229 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) {
230 // Write snapshot with object content. 230 // Write snapshot with object content.
231 uint8_t* buffer; 231 uint8_t* buffer;
232 MessageWriter writer(&buffer, &zone_allocator); 232 MessageWriter writer(&buffer, &zone_allocator, true);
233 writer.WriteMessage(mint); 233 writer.WriteMessage(mint);
234 intptr_t buffer_len = writer.BytesWritten(); 234 intptr_t buffer_len = writer.BytesWritten();
235 235
236 // Read object back from the snapshot. 236 // Read object back from the snapshot.
237 SnapshotReader reader(buffer, buffer_len, 237 SnapshotReader reader(buffer, buffer_len,
238 Snapshot::kMessage, Isolate::Current()); 238 Snapshot::kMessage, Isolate::Current());
239 const Object& serialized_object = Object::Handle(reader.ReadObject()); 239 const Object& serialized_object = Object::Handle(reader.ReadObject());
240 EXPECT(serialized_object.IsMint()); 240 EXPECT(serialized_object.IsMint());
241 241
242 // Read object back from the snapshot into a C structure. 242 // Read object back from the snapshot into a C structure.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 // Min negative mint + 1. 292 // Min negative mint + 1.
293 CheckMint(kMinInt64 + 1); 293 CheckMint(kMinInt64 + 1);
294 } 294 }
295 295
296 296
297 TEST_CASE(SerializeDouble) { 297 TEST_CASE(SerializeDouble) {
298 StackZone zone(Isolate::Current()); 298 StackZone zone(Isolate::Current());
299 299
300 // Write snapshot with object content. 300 // Write snapshot with object content.
301 uint8_t* buffer; 301 uint8_t* buffer;
302 MessageWriter writer(&buffer, &zone_allocator); 302 MessageWriter writer(&buffer, &zone_allocator, true);
303 const Double& dbl = Double::Handle(Double::New(101.29)); 303 const Double& dbl = Double::Handle(Double::New(101.29));
304 writer.WriteMessage(dbl); 304 writer.WriteMessage(dbl);
305 intptr_t buffer_len = writer.BytesWritten(); 305 intptr_t buffer_len = writer.BytesWritten();
306 306
307 // Read object back from the snapshot. 307 // Read object back from the snapshot.
308 SnapshotReader reader(buffer, buffer_len, 308 SnapshotReader reader(buffer, buffer_len,
309 Snapshot::kMessage, Isolate::Current()); 309 Snapshot::kMessage, Isolate::Current());
310 const Object& serialized_object = Object::Handle(reader.ReadObject()); 310 const Object& serialized_object = Object::Handle(reader.ReadObject());
311 EXPECT(Equals(dbl, serialized_object)); 311 EXPECT(Equals(dbl, serialized_object));
312 312
313 // Read object back from the snapshot into a C structure. 313 // Read object back from the snapshot into a C structure.
314 ApiNativeScope scope; 314 ApiNativeScope scope;
315 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 315 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
316 Dart_CObject* root = api_reader.ReadMessage(); 316 Dart_CObject* root = api_reader.ReadMessage();
317 EXPECT_NOTNULL(root); 317 EXPECT_NOTNULL(root);
318 EXPECT_EQ(Dart_CObject_kDouble, root->type); 318 EXPECT_EQ(Dart_CObject_kDouble, root->type);
319 EXPECT_EQ(dbl.value(), root->value.as_double); 319 EXPECT_EQ(dbl.value(), root->value.as_double);
320 CheckEncodeDecodeMessage(root); 320 CheckEncodeDecodeMessage(root);
321 } 321 }
322 322
323 323
324 TEST_CASE(SerializeTrue) { 324 TEST_CASE(SerializeTrue) {
325 StackZone zone(Isolate::Current()); 325 StackZone zone(Isolate::Current());
326 326
327 // Write snapshot with true object. 327 // Write snapshot with true object.
328 uint8_t* buffer; 328 uint8_t* buffer;
329 MessageWriter writer(&buffer, &zone_allocator); 329 MessageWriter writer(&buffer, &zone_allocator, true);
330 const Bool& bl = Bool::True(); 330 const Bool& bl = Bool::True();
331 writer.WriteMessage(bl); 331 writer.WriteMessage(bl);
332 intptr_t buffer_len = writer.BytesWritten(); 332 intptr_t buffer_len = writer.BytesWritten();
333 333
334 // Read object back from the snapshot. 334 // Read object back from the snapshot.
335 SnapshotReader reader(buffer, buffer_len, 335 SnapshotReader reader(buffer, buffer_len,
336 Snapshot::kMessage, Isolate::Current()); 336 Snapshot::kMessage, Isolate::Current());
337 const Object& serialized_object = Object::Handle(reader.ReadObject()); 337 const Object& serialized_object = Object::Handle(reader.ReadObject());
338 fprintf(stderr, "%s / %s\n", bl.ToCString(), serialized_object.ToCString()); 338 fprintf(stderr, "%s / %s\n", bl.ToCString(), serialized_object.ToCString());
339 339
340 EXPECT(Equals(bl, serialized_object)); 340 EXPECT(Equals(bl, serialized_object));
341 341
342 // Read object back from the snapshot into a C structure. 342 // Read object back from the snapshot into a C structure.
343 ApiNativeScope scope; 343 ApiNativeScope scope;
344 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 344 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
345 Dart_CObject* root = api_reader.ReadMessage(); 345 Dart_CObject* root = api_reader.ReadMessage();
346 EXPECT_NOTNULL(root); 346 EXPECT_NOTNULL(root);
347 EXPECT_EQ(Dart_CObject_kBool, root->type); 347 EXPECT_EQ(Dart_CObject_kBool, root->type);
348 EXPECT_EQ(true, root->value.as_bool); 348 EXPECT_EQ(true, root->value.as_bool);
349 CheckEncodeDecodeMessage(root); 349 CheckEncodeDecodeMessage(root);
350 } 350 }
351 351
352 352
353 TEST_CASE(SerializeFalse) { 353 TEST_CASE(SerializeFalse) {
354 StackZone zone(Isolate::Current()); 354 StackZone zone(Isolate::Current());
355 355
356 // Write snapshot with false object. 356 // Write snapshot with false object.
357 uint8_t* buffer; 357 uint8_t* buffer;
358 MessageWriter writer(&buffer, &zone_allocator); 358 MessageWriter writer(&buffer, &zone_allocator, true);
359 const Bool& bl = Bool::False(); 359 const Bool& bl = Bool::False();
360 writer.WriteMessage(bl); 360 writer.WriteMessage(bl);
361 intptr_t buffer_len = writer.BytesWritten(); 361 intptr_t buffer_len = writer.BytesWritten();
362 362
363 // Read object back from the snapshot. 363 // Read object back from the snapshot.
364 SnapshotReader reader(buffer, buffer_len, 364 SnapshotReader reader(buffer, buffer_len,
365 Snapshot::kMessage, Isolate::Current()); 365 Snapshot::kMessage, Isolate::Current());
366 const Object& serialized_object = Object::Handle(reader.ReadObject()); 366 const Object& serialized_object = Object::Handle(reader.ReadObject());
367 EXPECT(Equals(bl, serialized_object)); 367 EXPECT(Equals(bl, serialized_object));
368 368
(...skipping 11 matching lines...) Expand all
380 static uword allocator(intptr_t size) { 380 static uword allocator(intptr_t size) {
381 return reinterpret_cast<uword>(malloc(size)); 381 return reinterpret_cast<uword>(malloc(size));
382 } 382 }
383 383
384 384
385 TEST_CASE(SerializeBigint) { 385 TEST_CASE(SerializeBigint) {
386 StackZone zone(Isolate::Current()); 386 StackZone zone(Isolate::Current());
387 387
388 // Write snapshot with object content. 388 // Write snapshot with object content.
389 uint8_t* buffer; 389 uint8_t* buffer;
390 MessageWriter writer(&buffer, &zone_allocator); 390 MessageWriter writer(&buffer, &zone_allocator, true);
391 const char* cstr = "0x270FFFFFFFFFFFFFD8F0"; 391 const char* cstr = "0x270FFFFFFFFFFFFFD8F0";
392 const String& str = String::Handle(String::New(cstr)); 392 const String& str = String::Handle(String::New(cstr));
393 Bigint& bigint = Bigint::Handle(); 393 Bigint& bigint = Bigint::Handle();
394 bigint ^= Integer::NewCanonical(str); 394 bigint ^= Integer::NewCanonical(str);
395 writer.WriteMessage(bigint); 395 writer.WriteMessage(bigint);
396 intptr_t buffer_len = writer.BytesWritten(); 396 intptr_t buffer_len = writer.BytesWritten();
397 397
398 // Read object back from the snapshot. 398 // Read object back from the snapshot.
399 SnapshotReader reader(buffer, buffer_len, 399 SnapshotReader reader(buffer, buffer_len,
400 Snapshot::kMessage, Isolate::Current()); 400 Snapshot::kMessage, Isolate::Current());
(...skipping 11 matching lines...) Expand all
412 char* hex_value = TestCase::BigintToHexValue(root); 412 char* hex_value = TestCase::BigintToHexValue(root);
413 EXPECT_STREQ(cstr, hex_value); 413 EXPECT_STREQ(cstr, hex_value);
414 free(hex_value); 414 free(hex_value);
415 CheckEncodeDecodeMessage(root); 415 CheckEncodeDecodeMessage(root);
416 } 416 }
417 417
418 418
419 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { 419 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) {
420 // Write snapshot with object content. 420 // Write snapshot with object content.
421 uint8_t* buffer; 421 uint8_t* buffer;
422 MessageWriter writer(&buffer, &zone_allocator); 422 MessageWriter writer(&buffer, &zone_allocator, true);
423 writer.WriteMessage(bigint); 423 writer.WriteMessage(bigint);
424 intptr_t buffer_len = writer.BytesWritten(); 424 intptr_t buffer_len = writer.BytesWritten();
425 425
426 // Read object back from the snapshot. 426 // Read object back from the snapshot.
427 SnapshotReader reader(buffer, buffer_len, 427 SnapshotReader reader(buffer, buffer_len,
428 Snapshot::kMessage, Isolate::Current()); 428 Snapshot::kMessage, Isolate::Current());
429 Bigint& serialized_bigint = Bigint::Handle(); 429 Bigint& serialized_bigint = Bigint::Handle();
430 serialized_bigint ^= reader.ReadObject(); 430 serialized_bigint ^= reader.ReadObject();
431 const char* str1 = bigint.ToHexCString(allocator); 431 const char* str1 = bigint.ToHexCString(allocator);
432 const char* str2 = serialized_bigint.ToHexCString(allocator); 432 const char* str2 = serialized_bigint.ToHexCString(allocator);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 CheckBigint("-0x1"); 464 CheckBigint("-0x1");
465 CheckBigint("0x11111111111111111111"); 465 CheckBigint("0x11111111111111111111");
466 CheckBigint("-0x11111111111111111111"); 466 CheckBigint("-0x11111111111111111111");
467 CheckBigint("0x9876543210987654321098765432109876543210"); 467 CheckBigint("0x9876543210987654321098765432109876543210");
468 CheckBigint("-0x9876543210987654321098765432109876543210"); 468 CheckBigint("-0x9876543210987654321098765432109876543210");
469 } 469 }
470 470
471 TEST_CASE(SerializeSingletons) { 471 TEST_CASE(SerializeSingletons) {
472 // Write snapshot with object content. 472 // Write snapshot with object content.
473 uint8_t* buffer; 473 uint8_t* buffer;
474 MessageWriter writer(&buffer, &malloc_allocator); 474 MessageWriter writer(&buffer, &malloc_allocator, true);
475 writer.WriteObject(Object::class_class()); 475 writer.WriteObject(Object::class_class());
476 writer.WriteObject(Object::type_arguments_class()); 476 writer.WriteObject(Object::type_arguments_class());
477 writer.WriteObject(Object::function_class()); 477 writer.WriteObject(Object::function_class());
478 writer.WriteObject(Object::field_class()); 478 writer.WriteObject(Object::field_class());
479 writer.WriteObject(Object::token_stream_class()); 479 writer.WriteObject(Object::token_stream_class());
480 writer.WriteObject(Object::script_class()); 480 writer.WriteObject(Object::script_class());
481 writer.WriteObject(Object::library_class()); 481 writer.WriteObject(Object::library_class());
482 writer.WriteObject(Object::code_class()); 482 writer.WriteObject(Object::code_class());
483 writer.WriteObject(Object::instructions_class()); 483 writer.WriteObject(Object::instructions_class());
484 writer.WriteObject(Object::pc_descriptors_class()); 484 writer.WriteObject(Object::pc_descriptors_class());
(...skipping 21 matching lines...) Expand all
506 506
507 free(buffer); 507 free(buffer);
508 } 508 }
509 509
510 510
511 static void TestString(const char* cstr) { 511 static void TestString(const char* cstr) {
512 StackZone zone(Isolate::Current()); 512 StackZone zone(Isolate::Current());
513 EXPECT(Utf8::IsValid(reinterpret_cast<const uint8_t*>(cstr), strlen(cstr))); 513 EXPECT(Utf8::IsValid(reinterpret_cast<const uint8_t*>(cstr), strlen(cstr)));
514 // Write snapshot with object content. 514 // Write snapshot with object content.
515 uint8_t* buffer; 515 uint8_t* buffer;
516 MessageWriter writer(&buffer, &zone_allocator); 516 MessageWriter writer(&buffer, &zone_allocator, true);
517 String& str = String::Handle(String::New(cstr)); 517 String& str = String::Handle(String::New(cstr));
518 writer.WriteMessage(str); 518 writer.WriteMessage(str);
519 intptr_t buffer_len = writer.BytesWritten(); 519 intptr_t buffer_len = writer.BytesWritten();
520 520
521 // Read object back from the snapshot. 521 // Read object back from the snapshot.
522 SnapshotReader reader(buffer, buffer_len, 522 SnapshotReader reader(buffer, buffer_len,
523 Snapshot::kMessage, Isolate::Current()); 523 Snapshot::kMessage, Isolate::Current());
524 String& serialized_str = String::Handle(); 524 String& serialized_str = String::Handle();
525 serialized_str ^= reader.ReadObject(); 525 serialized_str ^= reader.ReadObject();
526 EXPECT(str.Equals(serialized_str)); 526 EXPECT(str.Equals(serialized_str));
(...skipping 21 matching lines...) Expand all
548 TestString(data); 548 TestString(data);
549 // TODO(sgjesse): Add tests with non-BMP characters. 549 // TODO(sgjesse): Add tests with non-BMP characters.
550 } 550 }
551 551
552 552
553 TEST_CASE(SerializeArray) { 553 TEST_CASE(SerializeArray) {
554 StackZone zone(Isolate::Current()); 554 StackZone zone(Isolate::Current());
555 555
556 // Write snapshot with object content. 556 // Write snapshot with object content.
557 uint8_t* buffer; 557 uint8_t* buffer;
558 MessageWriter writer(&buffer, &zone_allocator); 558 MessageWriter writer(&buffer, &zone_allocator, true);
559 const int kArrayLength = 10; 559 const int kArrayLength = 10;
560 Array& array = Array::Handle(Array::New(kArrayLength)); 560 Array& array = Array::Handle(Array::New(kArrayLength));
561 Smi& smi = Smi::Handle(); 561 Smi& smi = Smi::Handle();
562 for (int i = 0; i < kArrayLength; i++) { 562 for (int i = 0; i < kArrayLength; i++) {
563 smi ^= Smi::New(i); 563 smi ^= Smi::New(i);
564 array.SetAt(i, smi); 564 array.SetAt(i, smi);
565 } 565 }
566 writer.WriteMessage(array); 566 writer.WriteMessage(array);
567 intptr_t buffer_len = writer.BytesWritten(); 567 intptr_t buffer_len = writer.BytesWritten();
568 568
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 ExternalTypedData::MaxElements(kExternalTypedDataUint8ArrayCid) + 1; 638 ExternalTypedData::MaxElements(kExternalTypedDataUint8ArrayCid) + 1;
639 ExpectEncodeFail(&root); 639 ExpectEncodeFail(&root);
640 } 640 }
641 641
642 642
643 TEST_CASE(SerializeEmptyArray) { 643 TEST_CASE(SerializeEmptyArray) {
644 StackZone zone(Isolate::Current()); 644 StackZone zone(Isolate::Current());
645 645
646 // Write snapshot with object content. 646 // Write snapshot with object content.
647 uint8_t* buffer; 647 uint8_t* buffer;
648 MessageWriter writer(&buffer, &zone_allocator); 648 MessageWriter writer(&buffer, &zone_allocator, true);
649 const int kArrayLength = 0; 649 const int kArrayLength = 0;
650 Array& array = Array::Handle(Array::New(kArrayLength)); 650 Array& array = Array::Handle(Array::New(kArrayLength));
651 writer.WriteMessage(array); 651 writer.WriteMessage(array);
652 intptr_t buffer_len = writer.BytesWritten(); 652 intptr_t buffer_len = writer.BytesWritten();
653 653
654 // Read object back from the snapshot. 654 // Read object back from the snapshot.
655 SnapshotReader reader(buffer, buffer_len, 655 SnapshotReader reader(buffer, buffer_len,
656 Snapshot::kMessage, Isolate::Current()); 656 Snapshot::kMessage, Isolate::Current());
657 Array& serialized_array = Array::Handle(); 657 Array& serialized_array = Array::Handle();
658 serialized_array ^= reader.ReadObject(); 658 serialized_array ^= reader.ReadObject();
659 EXPECT(array.CanonicalizeEquals(serialized_array)); 659 EXPECT(array.CanonicalizeEquals(serialized_array));
660 660
661 // Read object back from the snapshot into a C structure. 661 // Read object back from the snapshot into a C structure.
662 ApiNativeScope scope; 662 ApiNativeScope scope;
663 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 663 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
664 Dart_CObject* root = api_reader.ReadMessage(); 664 Dart_CObject* root = api_reader.ReadMessage();
665 EXPECT_EQ(Dart_CObject_kArray, root->type); 665 EXPECT_EQ(Dart_CObject_kArray, root->type);
666 EXPECT_EQ(kArrayLength, root->value.as_array.length); 666 EXPECT_EQ(kArrayLength, root->value.as_array.length);
667 EXPECT(root->value.as_array.values == NULL); 667 EXPECT(root->value.as_array.values == NULL);
668 CheckEncodeDecodeMessage(root); 668 CheckEncodeDecodeMessage(root);
669 } 669 }
670 670
671 671
672 TEST_CASE(SerializeByteArray) { 672 TEST_CASE(SerializeByteArray) {
673 StackZone zone(Isolate::Current()); 673 StackZone zone(Isolate::Current());
674 674
675 // Write snapshot with object content. 675 // Write snapshot with object content.
676 uint8_t* buffer; 676 uint8_t* buffer;
677 MessageWriter writer(&buffer, &zone_allocator); 677 MessageWriter writer(&buffer, &zone_allocator, true);
678 const int kTypedDataLength = 256; 678 const int kTypedDataLength = 256;
679 TypedData& typed_data = TypedData::Handle( 679 TypedData& typed_data = TypedData::Handle(
680 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength)); 680 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength));
681 for (int i = 0; i < kTypedDataLength; i++) { 681 for (int i = 0; i < kTypedDataLength; i++) {
682 typed_data.SetUint8(i, i); 682 typed_data.SetUint8(i, i);
683 } 683 }
684 writer.WriteMessage(typed_data); 684 writer.WriteMessage(typed_data);
685 intptr_t buffer_len = writer.BytesWritten(); 685 intptr_t buffer_len = writer.BytesWritten();
686 686
687 // Read object back from the snapshot. 687 // Read object back from the snapshot.
(...skipping 13 matching lines...) Expand all
701 EXPECT(root->value.as_typed_data.values[i] == i); 701 EXPECT(root->value.as_typed_data.values[i] == i);
702 } 702 }
703 CheckEncodeDecodeMessage(root); 703 CheckEncodeDecodeMessage(root);
704 } 704 }
705 705
706 706
707 #define TEST_TYPED_ARRAY(darttype, ctype) \ 707 #define TEST_TYPED_ARRAY(darttype, ctype) \
708 { \ 708 { \
709 StackZone zone(Isolate::Current()); \ 709 StackZone zone(Isolate::Current()); \
710 uint8_t* buffer; \ 710 uint8_t* buffer; \
711 MessageWriter writer(&buffer, &zone_allocator); \ 711 MessageWriter writer(&buffer, &zone_allocator, true); \
712 const int kArrayLength = 127; \ 712 const int kArrayLength = 127; \
713 TypedData& array = TypedData::Handle( \ 713 TypedData& array = TypedData::Handle( \
714 TypedData::New(kTypedData##darttype##ArrayCid, kArrayLength)); \ 714 TypedData::New(kTypedData##darttype##ArrayCid, kArrayLength)); \
715 intptr_t scale = array.ElementSizeInBytes(); \ 715 intptr_t scale = array.ElementSizeInBytes(); \
716 for (int i = 0; i < kArrayLength; i++) { \ 716 for (int i = 0; i < kArrayLength; i++) { \
717 array.Set##darttype((i * scale), i); \ 717 array.Set##darttype((i * scale), i); \
718 } \ 718 } \
719 writer.WriteMessage(array); \ 719 writer.WriteMessage(array); \
720 intptr_t buffer_len = writer.BytesWritten(); \ 720 intptr_t buffer_len = writer.BytesWritten(); \
721 SnapshotReader reader(buffer, buffer_len, \ 721 SnapshotReader reader(buffer, buffer_len, \
(...skipping 10 matching lines...) Expand all
732 #define TEST_EXTERNAL_TYPED_ARRAY(darttype, ctype) \ 732 #define TEST_EXTERNAL_TYPED_ARRAY(darttype, ctype) \
733 { \ 733 { \
734 StackZone zone(Isolate::Current()); \ 734 StackZone zone(Isolate::Current()); \
735 ctype data[] = { 0, 11, 22, 33, 44, 55, 66, 77 }; \ 735 ctype data[] = { 0, 11, 22, 33, 44, 55, 66, 77 }; \
736 intptr_t length = ARRAY_SIZE(data); \ 736 intptr_t length = ARRAY_SIZE(data); \
737 ExternalTypedData& array = ExternalTypedData::Handle( \ 737 ExternalTypedData& array = ExternalTypedData::Handle( \
738 ExternalTypedData::New(kExternalTypedData##darttype##ArrayCid, \ 738 ExternalTypedData::New(kExternalTypedData##darttype##ArrayCid, \
739 reinterpret_cast<uint8_t*>(data), length)); \ 739 reinterpret_cast<uint8_t*>(data), length)); \
740 intptr_t scale = array.ElementSizeInBytes(); \ 740 intptr_t scale = array.ElementSizeInBytes(); \
741 uint8_t* buffer; \ 741 uint8_t* buffer; \
742 MessageWriter writer(&buffer, &zone_allocator); \ 742 MessageWriter writer(&buffer, &zone_allocator, true); \
743 writer.WriteMessage(array); \ 743 writer.WriteMessage(array); \
744 intptr_t buffer_len = writer.BytesWritten(); \ 744 intptr_t buffer_len = writer.BytesWritten(); \
745 SnapshotReader reader(buffer, buffer_len, \ 745 SnapshotReader reader(buffer, buffer_len, \
746 Snapshot::kMessage, Isolate::Current()); \ 746 Snapshot::kMessage, Isolate::Current()); \
747 TypedData& serialized_array = TypedData::Handle(); \ 747 TypedData& serialized_array = TypedData::Handle(); \
748 serialized_array ^= reader.ReadObject(); \ 748 serialized_array ^= reader.ReadObject(); \
749 for (int i = 0; i < length; i++) { \ 749 for (int i = 0; i < length; i++) { \
750 EXPECT_EQ(static_cast<ctype>(data[i]), \ 750 EXPECT_EQ(static_cast<ctype>(data[i]), \
751 serialized_array.Get##darttype(i*scale)); \ 751 serialized_array.Get##darttype(i*scale)); \
752 } \ 752 } \
(...skipping 26 matching lines...) Expand all
779 TEST_EXTERNAL_TYPED_ARRAY(Float32, float); 779 TEST_EXTERNAL_TYPED_ARRAY(Float32, float);
780 TEST_EXTERNAL_TYPED_ARRAY(Float64, double); 780 TEST_EXTERNAL_TYPED_ARRAY(Float64, double);
781 } 781 }
782 782
783 783
784 TEST_CASE(SerializeEmptyByteArray) { 784 TEST_CASE(SerializeEmptyByteArray) {
785 StackZone zone(Isolate::Current()); 785 StackZone zone(Isolate::Current());
786 786
787 // Write snapshot with object content. 787 // Write snapshot with object content.
788 uint8_t* buffer; 788 uint8_t* buffer;
789 MessageWriter writer(&buffer, &zone_allocator); 789 MessageWriter writer(&buffer, &zone_allocator, true);
790 const int kTypedDataLength = 0; 790 const int kTypedDataLength = 0;
791 TypedData& typed_data = TypedData::Handle( 791 TypedData& typed_data = TypedData::Handle(
792 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength)); 792 TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength));
793 writer.WriteMessage(typed_data); 793 writer.WriteMessage(typed_data);
794 intptr_t buffer_len = writer.BytesWritten(); 794 intptr_t buffer_len = writer.BytesWritten();
795 795
796 // Read object back from the snapshot. 796 // Read object back from the snapshot.
797 SnapshotReader reader(buffer, buffer_len, 797 SnapshotReader reader(buffer, buffer_len,
798 Snapshot::kMessage, Isolate::Current()); 798 Snapshot::kMessage, Isolate::Current());
799 TypedData& serialized_typed_data = TypedData::Handle(); 799 TypedData& serialized_typed_data = TypedData::Handle();
800 serialized_typed_data ^= reader.ReadObject(); 800 serialized_typed_data ^= reader.ReadObject();
801 EXPECT(serialized_typed_data.IsTypedData()); 801 EXPECT(serialized_typed_data.IsTypedData());
802 802
803 // Read object back from the snapshot into a C structure. 803 // Read object back from the snapshot into a C structure.
804 ApiNativeScope scope; 804 ApiNativeScope scope;
805 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 805 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
806 Dart_CObject* root = api_reader.ReadMessage(); 806 Dart_CObject* root = api_reader.ReadMessage();
807 EXPECT_EQ(Dart_CObject_kTypedData, root->type); 807 EXPECT_EQ(Dart_CObject_kTypedData, root->type);
808 EXPECT_EQ(Dart_TypedData_kUint8, root->value.as_typed_data.type); 808 EXPECT_EQ(Dart_TypedData_kUint8, root->value.as_typed_data.type);
809 EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length); 809 EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length);
810 EXPECT(root->value.as_typed_data.values == NULL); 810 EXPECT(root->value.as_typed_data.values == NULL);
811 CheckEncodeDecodeMessage(root); 811 CheckEncodeDecodeMessage(root);
812 } 812 }
813 813
814 814
815 class TestSnapshotWriter : public SnapshotWriter { 815 class TestSnapshotWriter : public SnapshotWriter {
816 public: 816 public:
817 static const intptr_t kInitialSize = 64 * KB; 817 static const intptr_t kInitialSize = 64 * KB;
818 TestSnapshotWriter(uint8_t** buffer, ReAlloc alloc) 818 TestSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
819 : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize) { 819 : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize, true) {
820 ASSERT(buffer != NULL); 820 ASSERT(buffer != NULL);
821 ASSERT(alloc != NULL); 821 ASSERT(alloc != NULL);
822 } 822 }
823 ~TestSnapshotWriter() { } 823 ~TestSnapshotWriter() { }
824 824
825 // Writes just a script object 825 // Writes just a script object
826 void WriteScript(const Script& script) { 826 void WriteScript(const Script& script) {
827 WriteObject(script.raw()); 827 WriteObject(script.raw());
828 UnmarkAll(); 828 UnmarkAll();
829 } 829 }
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 // Helper function to call a top level Dart function, serialize the 1456 // Helper function to call a top level Dart function, serialize the
1457 // result and deserialize the result into a Dart_CObject structure. 1457 // result and deserialize the result into a Dart_CObject structure.
1458 static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib, 1458 static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib,
1459 const char* dart_function) { 1459 const char* dart_function) {
1460 Dart_Handle result; 1460 Dart_Handle result;
1461 result = Dart_Invoke(lib, NewString(dart_function), 0, NULL); 1461 result = Dart_Invoke(lib, NewString(dart_function), 0, NULL);
1462 EXPECT_VALID(result); 1462 EXPECT_VALID(result);
1463 1463
1464 // Serialize the list into a message. 1464 // Serialize the list into a message.
1465 uint8_t* buffer; 1465 uint8_t* buffer;
1466 MessageWriter writer(&buffer, &zone_allocator); 1466 MessageWriter writer(&buffer, &zone_allocator, false);
1467 const Object& list = Object::Handle(Api::UnwrapHandle(result)); 1467 const Object& list = Object::Handle(Api::UnwrapHandle(result));
1468 writer.WriteMessage(list); 1468 writer.WriteMessage(list);
1469 intptr_t buffer_len = writer.BytesWritten(); 1469 intptr_t buffer_len = writer.BytesWritten();
1470 1470
1471 // Read object back from the snapshot into a C structure. 1471 // Read object back from the snapshot into a C structure.
1472 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 1472 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1473 return api_reader.ReadMessage(); 1473 return api_reader.ReadMessage();
1474 } 1474 }
1475 1475
1476 1476
1477 static void CheckString(Dart_Handle dart_string, const char* expected) { 1477 static void CheckString(Dart_Handle dart_string, const char* expected) {
1478 StackZone zone(Isolate::Current()); 1478 StackZone zone(Isolate::Current());
1479 uint8_t* buffer; 1479 uint8_t* buffer;
1480 MessageWriter writer(&buffer, &zone_allocator); 1480 MessageWriter writer(&buffer, &zone_allocator, false);
1481 String& str = String::Handle(); 1481 String& str = String::Handle();
1482 str ^= Api::UnwrapHandle(dart_string); 1482 str ^= Api::UnwrapHandle(dart_string);
1483 writer.WriteMessage(str); 1483 writer.WriteMessage(str);
1484 intptr_t buffer_len = writer.BytesWritten(); 1484 intptr_t buffer_len = writer.BytesWritten();
1485 1485
1486 // Read object back from the snapshot into a C structure. 1486 // Read object back from the snapshot into a C structure.
1487 ApiNativeScope scope; 1487 ApiNativeScope scope;
1488 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 1488 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1489 Dart_CObject* root = api_reader.ReadMessage(); 1489 Dart_CObject* root = api_reader.ReadMessage();
1490 EXPECT_NOTNULL(root); 1490 EXPECT_NOTNULL(root);
1491 EXPECT_EQ(Dart_CObject_kString, root->type); 1491 EXPECT_EQ(Dart_CObject_kString, root->type);
1492 EXPECT_STREQ(expected, root->value.as_string); 1492 EXPECT_STREQ(expected, root->value.as_string);
1493 CheckEncodeDecodeMessage(root); 1493 CheckEncodeDecodeMessage(root);
1494 } 1494 }
1495 1495
1496 1496
1497 static void CheckStringInvalid(Dart_Handle dart_string) { 1497 static void CheckStringInvalid(Dart_Handle dart_string) {
1498 StackZone zone(Isolate::Current()); 1498 StackZone zone(Isolate::Current());
1499 uint8_t* buffer; 1499 uint8_t* buffer;
1500 MessageWriter writer(&buffer, &zone_allocator); 1500 MessageWriter writer(&buffer, &zone_allocator, false);
1501 String& str = String::Handle(); 1501 String& str = String::Handle();
1502 str ^= Api::UnwrapHandle(dart_string); 1502 str ^= Api::UnwrapHandle(dart_string);
1503 writer.WriteMessage(str); 1503 writer.WriteMessage(str);
1504 intptr_t buffer_len = writer.BytesWritten(); 1504 intptr_t buffer_len = writer.BytesWritten();
1505 1505
1506 // Read object back from the snapshot into a C structure. 1506 // Read object back from the snapshot into a C structure.
1507 ApiNativeScope scope; 1507 ApiNativeScope scope;
1508 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 1508 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1509 Dart_CObject* root = api_reader.ReadMessage(); 1509 Dart_CObject* root = api_reader.ReadMessage();
1510 EXPECT_NOTNULL(root); 1510 EXPECT_NOTNULL(root);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 Dart_Invoke(lib, NewString("getCrappyString"), 0, NULL); 1600 Dart_Invoke(lib, NewString("getCrappyString"), 0, NULL);
1601 EXPECT_VALID(crappy_string_result); 1601 EXPECT_VALID(crappy_string_result);
1602 EXPECT(Dart_IsString(crappy_string_result)); 1602 EXPECT(Dart_IsString(crappy_string_result));
1603 1603
1604 { 1604 {
1605 DARTSCOPE(isolate); 1605 DARTSCOPE(isolate);
1606 1606
1607 { 1607 {
1608 StackZone zone(Isolate::Current()); 1608 StackZone zone(Isolate::Current());
1609 uint8_t* buffer; 1609 uint8_t* buffer;
1610 MessageWriter writer(&buffer, &zone_allocator); 1610 MessageWriter writer(&buffer, &zone_allocator, false);
1611 Smi& smi = Smi::Handle(); 1611 Smi& smi = Smi::Handle();
1612 smi ^= Api::UnwrapHandle(smi_result); 1612 smi ^= Api::UnwrapHandle(smi_result);
1613 writer.WriteMessage(smi); 1613 writer.WriteMessage(smi);
1614 intptr_t buffer_len = writer.BytesWritten(); 1614 intptr_t buffer_len = writer.BytesWritten();
1615 1615
1616 // Read object back from the snapshot into a C structure. 1616 // Read object back from the snapshot into a C structure.
1617 ApiNativeScope scope; 1617 ApiNativeScope scope;
1618 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 1618 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1619 Dart_CObject* root = api_reader.ReadMessage(); 1619 Dart_CObject* root = api_reader.ReadMessage();
1620 EXPECT_NOTNULL(root); 1620 EXPECT_NOTNULL(root);
1621 EXPECT_EQ(Dart_CObject_kInt32, root->type); 1621 EXPECT_EQ(Dart_CObject_kInt32, root->type);
1622 EXPECT_EQ(42, root->value.as_int32); 1622 EXPECT_EQ(42, root->value.as_int32);
1623 CheckEncodeDecodeMessage(root); 1623 CheckEncodeDecodeMessage(root);
1624 } 1624 }
1625 { 1625 {
1626 StackZone zone(Isolate::Current()); 1626 StackZone zone(Isolate::Current());
1627 uint8_t* buffer; 1627 uint8_t* buffer;
1628 MessageWriter writer(&buffer, &zone_allocator); 1628 MessageWriter writer(&buffer, &zone_allocator, false);
1629 Bigint& bigint = Bigint::Handle(); 1629 Bigint& bigint = Bigint::Handle();
1630 bigint ^= Api::UnwrapHandle(bigint_result); 1630 bigint ^= Api::UnwrapHandle(bigint_result);
1631 writer.WriteMessage(bigint); 1631 writer.WriteMessage(bigint);
1632 intptr_t buffer_len = writer.BytesWritten(); 1632 intptr_t buffer_len = writer.BytesWritten();
1633 1633
1634 // Read object back from the snapshot into a C structure. 1634 // Read object back from the snapshot into a C structure.
1635 ApiNativeScope scope; 1635 ApiNativeScope scope;
1636 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); 1636 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1637 Dart_CObject* root = api_reader.ReadMessage(); 1637 Dart_CObject* root = api_reader.ReadMessage();
1638 EXPECT_NOTNULL(root); 1638 EXPECT_NOTNULL(root);
(...skipping 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after
2718 EXPECT_SUBSTRING("Exception: nulltruefalse123456æøå3.14[]100123456789\n", 2718 EXPECT_SUBSTRING("Exception: nulltruefalse123456æøå3.14[]100123456789\n",
2719 Dart_GetError(result)); 2719 Dart_GetError(result));
2720 2720
2721 Dart_ExitScope(); 2721 Dart_ExitScope();
2722 } 2722 }
2723 2723
2724 2724
2725 TEST_CASE(OmittedObjectEncodingLength) { 2725 TEST_CASE(OmittedObjectEncodingLength) {
2726 StackZone zone(Isolate::Current()); 2726 StackZone zone(Isolate::Current());
2727 uint8_t* buffer; 2727 uint8_t* buffer;
2728 MessageWriter writer(&buffer, &zone_allocator); 2728 MessageWriter writer(&buffer, &zone_allocator, true);
2729 writer.WriteInlinedObjectHeader(kOmittedObjectId); 2729 writer.WriteInlinedObjectHeader(kOmittedObjectId);
2730 // For performance, we'd like single-byte headers when ids are omitted. 2730 // For performance, we'd like single-byte headers when ids are omitted.
2731 // If this starts failing, consider renumbering the snapshot ids. 2731 // If this starts failing, consider renumbering the snapshot ids.
2732 EXPECT_EQ(1, writer.BytesWritten()); 2732 EXPECT_EQ(1, writer.BytesWritten());
2733 } 2733 }
2734 2734
2735 } // namespace dart 2735 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/snapshot.cc ('k') | samples/sample_extension/sample_extension.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698