| 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/bootstrap.h" | 8 #include "vm/bootstrap.h" |
| 9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
| 10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
| 11 #include "vm/dart_entry.h" | 11 #include "vm/dart_entry.h" |
| 12 #include "vm/exceptions.h" | 12 #include "vm/exceptions.h" |
| 13 #include "vm/heap.h" | 13 #include "vm/heap.h" |
| 14 #include "vm/lockers.h" | 14 #include "vm/lockers.h" |
| 15 #include "vm/longjump.h" | 15 #include "vm/longjump.h" |
| 16 #include "vm/object.h" | 16 #include "vm/object.h" |
| 17 #include "vm/object_store.h" | 17 #include "vm/object_store.h" |
| 18 #include "vm/snapshot_ids.h" | 18 #include "vm/snapshot_ids.h" |
| 19 #include "vm/stub_code.h" | 19 #include "vm/stub_code.h" |
| 20 #include "vm/symbols.h" | 20 #include "vm/symbols.h" |
| 21 #include "vm/timeline.h" | 21 #include "vm/timeline.h" |
| 22 #include "vm/verified_memory.h" | |
| 23 #include "vm/version.h" | 22 #include "vm/version.h" |
| 24 | 23 |
| 25 // We currently only expect the Dart mutator to read snapshots. | 24 // We currently only expect the Dart mutator to read snapshots. |
| 26 #define ASSERT_NO_SAFEPOINT_SCOPE() \ | 25 #define ASSERT_NO_SAFEPOINT_SCOPE() \ |
| 27 isolate()->AssertCurrentThreadIsMutator(); \ | 26 isolate()->AssertCurrentThreadIsMutator(); \ |
| 28 ASSERT(thread()->no_safepoint_scope_depth() != 0) | 27 ASSERT(thread()->no_safepoint_scope_depth() != 0) |
| 29 | 28 |
| 30 namespace dart { | 29 namespace dart { |
| 31 | 30 |
| 32 static const int kNumInitialReferences = 64; | 31 static const int kNumInitialReferences = 64; |
| (...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1421 ASSERT(IsObjectStoreClassId(class_id) || IsSingletonClassId(class_id)); | 1420 ASSERT(IsObjectStoreClassId(class_id) || IsSingletonClassId(class_id)); |
| 1422 return class_id; | 1421 return class_id; |
| 1423 } | 1422 } |
| 1424 | 1423 |
| 1425 | 1424 |
| 1426 RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id, | 1425 RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id, |
| 1427 intptr_t size) { | 1426 intptr_t size) { |
| 1428 ASSERT_NO_SAFEPOINT_SCOPE(); | 1427 ASSERT_NO_SAFEPOINT_SCOPE(); |
| 1429 ASSERT(Utils::IsAligned(size, kObjectAlignment)); | 1428 ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
| 1430 | 1429 |
| 1431 // Allocate memory where all words look like smis. This is currently | |
| 1432 // only needed for DEBUG-mode validation in StorePointer/StoreSmi, but will | |
| 1433 // be essential with the upcoming deletion barrier. | |
| 1434 uword address = | 1430 uword address = |
| 1435 old_space()->TryAllocateSmiInitializedLocked(size, | 1431 old_space()->TryAllocateDataBumpLocked(size, PageSpace::kForceGrowth); |
| 1436 PageSpace::kForceGrowth); | |
| 1437 if (address == 0) { | 1432 if (address == 0) { |
| 1438 // Use the preallocated out of memory exception to avoid calling | 1433 // Use the preallocated out of memory exception to avoid calling |
| 1439 // into dart code or allocating any code. | 1434 // into dart code or allocating any code. |
| 1440 // We do a longjmp at this point to unwind out of the entire | 1435 // We do a longjmp at this point to unwind out of the entire |
| 1441 // read part and return the error object back. | 1436 // read part and return the error object back. |
| 1442 const UnhandledException& error = UnhandledException::Handle( | 1437 const UnhandledException& error = UnhandledException::Handle( |
| 1443 object_store()->preallocated_unhandled_exception()); | 1438 object_store()->preallocated_unhandled_exception()); |
| 1444 thread()->long_jump_base()->Jump(1, error); | 1439 thread()->long_jump_base()->Jump(1, error); |
| 1445 } | 1440 } |
| 1446 VerifiedMemory::Accept(address, size); | |
| 1447 | 1441 |
| 1448 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 1442 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); |
| 1449 uword tags = 0; | 1443 uword tags = 0; |
| 1450 ASSERT(class_id != kIllegalCid); | 1444 ASSERT(class_id != kIllegalCid); |
| 1451 tags = RawObject::ClassIdTag::update(class_id, tags); | 1445 tags = RawObject::ClassIdTag::update(class_id, tags); |
| 1452 tags = RawObject::SizeTag::update(size, tags); | 1446 tags = RawObject::SizeTag::update(size, tags); |
| 1453 tags = RawObject::VMHeapObjectTag::update(is_vm_isolate(), tags); | 1447 tags = RawObject::VMHeapObjectTag::update(is_vm_isolate(), tags); |
| 1454 raw_obj->ptr()->tags_ = tags; | 1448 raw_obj->ptr()->tags_ = tags; |
| 1455 return raw_obj; | 1449 return raw_obj; |
| 1456 } | 1450 } |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2439 if (setjmp(*jump.Set()) == 0) { | 2433 if (setjmp(*jump.Set()) == 0) { |
| 2440 NoSafepointScope no_safepoint; | 2434 NoSafepointScope no_safepoint; |
| 2441 WriteObject(obj.raw()); | 2435 WriteObject(obj.raw()); |
| 2442 } else { | 2436 } else { |
| 2443 ThrowException(exception_type(), exception_msg()); | 2437 ThrowException(exception_type(), exception_msg()); |
| 2444 } | 2438 } |
| 2445 } | 2439 } |
| 2446 | 2440 |
| 2447 | 2441 |
| 2448 } // namespace dart | 2442 } // namespace dart |
| OLD | NEW |