| 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 | 
|---|