| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/snapshot.h" | 5 #include "vm/snapshot.h" |
| 6 | 6 |
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/bigint_operations.h" | 8 #include "vm/bigint_operations.h" |
| 9 #include "vm/bootstrap.h" | 9 #include "vm/bootstrap.h" |
| 10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 AllocateUninitialized(cls_, Class::InstanceSize())); | 471 AllocateUninitialized(cls_, Class::InstanceSize())); |
| 472 Instance fake; | 472 Instance fake; |
| 473 obj->ptr()->handle_vtable_ = fake.vtable(); | 473 obj->ptr()->handle_vtable_ = fake.vtable(); |
| 474 cls_ = obj; | 474 cls_ = obj; |
| 475 cls_.set_id(kIllegalCid); | 475 cls_.set_id(kIllegalCid); |
| 476 isolate()->RegisterClass(cls_); | 476 isolate()->RegisterClass(cls_); |
| 477 return cls_.raw(); | 477 return cls_.raw(); |
| 478 } | 478 } |
| 479 | 479 |
| 480 | 480 |
| 481 RawInstance* SnapshotReader::NewInstance() { |
| 482 ASSERT(kind_ == Snapshot::kFull); |
| 483 ASSERT(isolate()->no_gc_scope_depth() != 0); |
| 484 cls_ = object_store()->object_class(); |
| 485 RawInstance* obj = reinterpret_cast<RawInstance*>( |
| 486 AllocateUninitialized(cls_, Instance::InstanceSize())); |
| 487 return obj; |
| 488 } |
| 489 |
| 490 |
| 481 RawMint* SnapshotReader::NewMint(int64_t value) { | 491 RawMint* SnapshotReader::NewMint(int64_t value) { |
| 482 ASSERT(kind_ == Snapshot::kFull); | 492 ASSERT(kind_ == Snapshot::kFull); |
| 483 ASSERT(isolate()->no_gc_scope_depth() != 0); | 493 ASSERT(isolate()->no_gc_scope_depth() != 0); |
| 484 cls_ = object_store()->mint_class(); | 494 cls_ = object_store()->mint_class(); |
| 485 RawMint* obj = reinterpret_cast<RawMint*>( | 495 RawMint* obj = reinterpret_cast<RawMint*>( |
| 486 AllocateUninitialized(cls_, Mint::InstanceSize())); | 496 AllocateUninitialized(cls_, Mint::InstanceSize())); |
| 487 obj->ptr()->value_ = value; | 497 obj->ptr()->value_ = value; |
| 488 return obj; | 498 return obj; |
| 489 } | 499 } |
| 490 | 500 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 if (address == 0) { | 704 if (address == 0) { |
| 695 // Use the preallocated out of memory exception to avoid calling | 705 // Use the preallocated out of memory exception to avoid calling |
| 696 // into dart code or allocating any code. | 706 // into dart code or allocating any code. |
| 697 // We do a longjmp at this point to unwind out of the entire | 707 // We do a longjmp at this point to unwind out of the entire |
| 698 // read part and return the error object back. | 708 // read part and return the error object back. |
| 699 const Instance& exception = | 709 const Instance& exception = |
| 700 Instance::Handle(object_store()->out_of_memory()); | 710 Instance::Handle(object_store()->out_of_memory()); |
| 701 ErrorHandle()->set_exception(exception); | 711 ErrorHandle()->set_exception(exception); |
| 702 Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle()); | 712 Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle()); |
| 703 } | 713 } |
| 714 // Make sure to initialize the last word, as this can be left untouched in |
| 715 // case the object deserialized has an alignment tail. |
| 716 *reinterpret_cast<RawObject**>(address + size - kWordSize) = Object::null(); |
| 717 |
| 704 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 718 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); |
| 705 uword tags = 0; | 719 uword tags = 0; |
| 706 intptr_t index = cls.id(); | 720 intptr_t index = cls.id(); |
| 707 ASSERT(index != kIllegalCid); | 721 ASSERT(index != kIllegalCid); |
| 708 tags = RawObject::ClassIdTag::update(index, tags); | 722 tags = RawObject::ClassIdTag::update(index, tags); |
| 709 tags = RawObject::SizeTag::update(size, tags); | 723 tags = RawObject::SizeTag::update(size, tags); |
| 710 raw_obj->ptr()->tags_ = tags; | 724 raw_obj->ptr()->tags_ = tags; |
| 711 return raw_obj; | 725 return raw_obj; |
| 712 } | 726 } |
| 713 | 727 |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1504 NoGCScope no_gc; | 1518 NoGCScope no_gc; |
| 1505 WriteObject(obj.raw()); | 1519 WriteObject(obj.raw()); |
| 1506 UnmarkAll(); | 1520 UnmarkAll(); |
| 1507 } else { | 1521 } else { |
| 1508 ThrowException(exception_type(), exception_msg()); | 1522 ThrowException(exception_type(), exception_msg()); |
| 1509 } | 1523 } |
| 1510 } | 1524 } |
| 1511 | 1525 |
| 1512 | 1526 |
| 1513 } // namespace dart | 1527 } // namespace dart |
| OLD | NEW |