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/exceptions.h" | 10 #include "vm/exceptions.h" |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 isolate_(isolate), | 150 isolate_(isolate), |
151 cls_(Class::Handle()), | 151 cls_(Class::Handle()), |
152 obj_(Object::Handle()), | 152 obj_(Object::Handle()), |
153 str_(String::Handle()), | 153 str_(String::Handle()), |
154 library_(Library::Handle()), | 154 library_(Library::Handle()), |
155 type_(AbstractType::Handle()), | 155 type_(AbstractType::Handle()), |
156 type_arguments_(AbstractTypeArguments::Handle()), | 156 type_arguments_(AbstractTypeArguments::Handle()), |
157 tokens_(Array::Handle()), | 157 tokens_(Array::Handle()), |
158 stream_(TokenStream::Handle()), | 158 stream_(TokenStream::Handle()), |
159 data_(ExternalUint8Array::Handle()), | 159 data_(ExternalUint8Array::Handle()), |
| 160 error_(UnhandledException::Handle()), |
160 backward_references_((kind == Snapshot::kFull) ? | 161 backward_references_((kind == Snapshot::kFull) ? |
161 kNumInitialReferencesInFullSnapshot : | 162 kNumInitialReferencesInFullSnapshot : |
162 kNumInitialReferences) { | 163 kNumInitialReferences) { |
163 } | 164 } |
164 | 165 |
165 | 166 |
166 RawObject* SnapshotReader::ReadObject() { | 167 RawObject* SnapshotReader::ReadObject() { |
167 Object& obj = Object::Handle(ReadObjectImpl()); | 168 // Setup for long jump in case there is an exception while reading. |
168 for (intptr_t i = 0; i < backward_references_.length(); i++) { | 169 LongJump* base = isolate()->long_jump_base(); |
169 if (!backward_references_[i]->is_deserialized()) { | 170 LongJump jump; |
170 ReadObjectImpl(); | 171 isolate()->set_long_jump_base(&jump); |
171 backward_references_[i]->set_state(kIsDeserialized); | 172 const Instance& null_object = Instance::Handle(); |
| 173 *ErrorHandle() = UnhandledException::New(null_object, null_object); |
| 174 if (setjmp(*jump.Set()) == 0) { |
| 175 Object& obj = Object::Handle(ReadObjectImpl()); |
| 176 for (intptr_t i = 0; i < backward_references_.length(); i++) { |
| 177 if (!backward_references_[i]->is_deserialized()) { |
| 178 ReadObjectImpl(); |
| 179 backward_references_[i]->set_state(kIsDeserialized); |
| 180 } |
172 } | 181 } |
| 182 isolate()->set_long_jump_base(base); |
| 183 return obj.raw(); |
| 184 } else { |
| 185 // An error occurred while reading, return the error object. |
| 186 const Error& err = Error::Handle(isolate()->object_store()->sticky_error()); |
| 187 isolate()->object_store()->clear_sticky_error(); |
| 188 isolate()->set_long_jump_base(base); |
| 189 return err.raw(); |
173 } | 190 } |
174 return obj.raw(); | |
175 } | 191 } |
176 | 192 |
177 | 193 |
178 RawClass* SnapshotReader::ReadClassId(intptr_t object_id) { | 194 RawClass* SnapshotReader::ReadClassId(intptr_t object_id) { |
179 ASSERT(kind_ != Snapshot::kFull); | 195 ASSERT(kind_ != Snapshot::kFull); |
180 // Read the class header information and lookup the class. | 196 // Read the class header information and lookup the class. |
181 intptr_t class_header = ReadIntptrValue(); | 197 intptr_t class_header = ReadIntptrValue(); |
182 ASSERT((class_header & kSmiTagMask) != kSmiTag); | 198 ASSERT((class_header & kSmiTagMask) != kSmiTag); |
183 Class& cls = Class::ZoneHandle(isolate(), Class::null()); | 199 Class& cls = Class::ZoneHandle(isolate(), Class::null()); |
184 cls = LookupInternalClass(class_header); | 200 cls = LookupInternalClass(class_header); |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 RawObject* SnapshotReader::AllocateUninitialized(const Class& cls, | 624 RawObject* SnapshotReader::AllocateUninitialized(const Class& cls, |
609 intptr_t size) { | 625 intptr_t size) { |
610 ASSERT(isolate()->no_gc_scope_depth() != 0); | 626 ASSERT(isolate()->no_gc_scope_depth() != 0); |
611 ASSERT(Utils::IsAligned(size, kObjectAlignment)); | 627 ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
612 Heap* heap = isolate()->heap(); | 628 Heap* heap = isolate()->heap(); |
613 | 629 |
614 uword address = heap->TryAllocate(size, Heap::kOld); | 630 uword address = heap->TryAllocate(size, Heap::kOld); |
615 if (address == 0) { | 631 if (address == 0) { |
616 // Use the preallocated out of memory exception to avoid calling | 632 // Use the preallocated out of memory exception to avoid calling |
617 // into dart code or allocating any code. | 633 // into dart code or allocating any code. |
| 634 // We do a longjmp at this point to unwind out of the entire |
| 635 // read part and return the error object back. |
618 const Instance& exception = | 636 const Instance& exception = |
619 Instance::Handle(object_store()->out_of_memory()); | 637 Instance::Handle(object_store()->out_of_memory()); |
620 Exceptions::Throw(exception); | 638 ErrorHandle()->set_exception(exception); |
621 UNREACHABLE(); | 639 Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle()); |
622 } | 640 } |
623 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 641 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); |
624 uword tags = 0; | 642 uword tags = 0; |
625 intptr_t index = cls.id(); | 643 intptr_t index = cls.id(); |
626 ASSERT(index != kIllegalCid); | 644 ASSERT(index != kIllegalCid); |
627 tags = RawObject::ClassIdTag::update(index, tags); | 645 tags = RawObject::ClassIdTag::update(index, tags); |
628 tags = RawObject::SizeTag::update(size, tags); | 646 tags = RawObject::SizeTag::update(size, tags); |
629 raw_obj->ptr()->tags_ = tags; | 647 raw_obj->ptr()->tags_ = tags; |
630 return raw_obj; | 648 return raw_obj; |
631 } | 649 } |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 UnmarkAll(); | 1315 UnmarkAll(); |
1298 isolate->set_long_jump_base(base); | 1316 isolate->set_long_jump_base(base); |
1299 } else { | 1317 } else { |
1300 isolate->set_long_jump_base(base); | 1318 isolate->set_long_jump_base(base); |
1301 ThrowException(exception_type(), exception_msg()); | 1319 ThrowException(exception_type(), exception_msg()); |
1302 } | 1320 } |
1303 } | 1321 } |
1304 | 1322 |
1305 | 1323 |
1306 } // namespace dart | 1324 } // namespace dart |
OLD | NEW |