| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/class_finalizer.h" | 5 #include "vm/class_finalizer.h" |
| 6 | 6 |
| 7 #include "vm/code_generator.h" | 7 #include "vm/code_generator.h" |
| 8 #include "vm/flags.h" | 8 #include "vm/flags.h" |
| 9 #include "vm/heap.h" | 9 #include "vm/heap.h" |
| 10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 116 |
| 117 // Processing ObjectStore::pending_classes_ occurs: | 117 // Processing ObjectStore::pending_classes_ occurs: |
| 118 // a) when bootstrap process completes (VerifyBootstrapClasses). | 118 // a) when bootstrap process completes (VerifyBootstrapClasses). |
| 119 // b) after the user classes are loaded (dart_api). | 119 // b) after the user classes are loaded (dart_api). |
| 120 bool ClassFinalizer::ProcessPendingClasses() { | 120 bool ClassFinalizer::ProcessPendingClasses() { |
| 121 Thread* thread = Thread::Current(); | 121 Thread* thread = Thread::Current(); |
| 122 Isolate* isolate = thread->isolate(); | 122 Isolate* isolate = thread->isolate(); |
| 123 ASSERT(isolate != NULL); | 123 ASSERT(isolate != NULL); |
| 124 HANDLESCOPE(thread); | 124 HANDLESCOPE(thread); |
| 125 ObjectStore* object_store = isolate->object_store(); | 125 ObjectStore* object_store = isolate->object_store(); |
| 126 const Error& error = | 126 const Error& error = Error::Handle(thread->zone(), thread->sticky_error()); |
| 127 Error::Handle(thread->zone(), object_store->sticky_error()); | |
| 128 if (!error.IsNull()) { | 127 if (!error.IsNull()) { |
| 129 return false; | 128 return false; |
| 130 } | 129 } |
| 131 if (AllClassesFinalized()) { | 130 if (AllClassesFinalized()) { |
| 132 return true; | 131 return true; |
| 133 } | 132 } |
| 134 | 133 |
| 135 LongJumpScope jump; | 134 LongJumpScope jump; |
| 136 if (setjmp(*jump.Set()) == 0) { | 135 if (setjmp(*jump.Set()) == 0) { |
| 137 GrowableObjectArray& class_array = GrowableObjectArray::Handle(); | 136 GrowableObjectArray& class_array = GrowableObjectArray::Handle(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 if (cls.is_finalized() || cls.is_prefinalized()) { | 234 if (cls.is_finalized() || cls.is_prefinalized()) { |
| 236 // Pre-finalized bootstrap classes must not define any fields. | 235 // Pre-finalized bootstrap classes must not define any fields. |
| 237 ASSERT(!cls.HasInstanceFields()); | 236 ASSERT(!cls.HasInstanceFields()); |
| 238 } | 237 } |
| 239 } | 238 } |
| 240 | 239 |
| 241 // Finalize type hierarchy for types that aren't pre-finalized | 240 // Finalize type hierarchy for types that aren't pre-finalized |
| 242 // by Object::Init(). | 241 // by Object::Init(). |
| 243 if (!ProcessPendingClasses()) { | 242 if (!ProcessPendingClasses()) { |
| 244 // TODO(srdjan): Exit like a real VM instead. | 243 // TODO(srdjan): Exit like a real VM instead. |
| 245 const Error& err = Error::Handle(object_store->sticky_error()); | 244 const Error& err = Error::Handle(Thread::Current()->sticky_error()); |
| 246 OS::PrintErr("Could not verify bootstrap classes : %s\n", | 245 OS::PrintErr("Could not verify bootstrap classes : %s\n", |
| 247 err.ToErrorCString()); | 246 err.ToErrorCString()); |
| 248 OS::Exit(255); | 247 OS::Exit(255); |
| 249 } | 248 } |
| 250 if (FLAG_trace_class_finalization) { | 249 if (FLAG_trace_class_finalization) { |
| 251 OS::Print("VerifyBootstrapClasses END.\n"); | 250 OS::Print("VerifyBootstrapClasses END.\n"); |
| 252 } | 251 } |
| 253 Isolate::Current()->heap()->Verify(); | 252 Isolate::Current()->heap()->Verify(); |
| 254 } | 253 } |
| 255 #endif // defined(DART_NO_SNAPSHOT). | 254 #endif // defined(DART_NO_SNAPSHOT). |
| (...skipping 3038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3294 ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields()); | 3293 ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields()); |
| 3295 field ^= fields_array.At(0); | 3294 field ^= fields_array.At(0); |
| 3296 ASSERT(field.Offset() == ByteBuffer::data_offset()); | 3295 ASSERT(field.Offset() == ByteBuffer::data_offset()); |
| 3297 name ^= field.name(); | 3296 name ^= field.name(); |
| 3298 expected_name ^= String::New("_data"); | 3297 expected_name ^= String::New("_data"); |
| 3299 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name)); | 3298 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name)); |
| 3300 #endif | 3299 #endif |
| 3301 } | 3300 } |
| 3302 | 3301 |
| 3303 } // namespace dart | 3302 } // namespace dart |
| OLD | NEW |