Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: runtime/vm/class_finalizer.cc

Issue 463103002: Fix bug with CHA dependencies by recording a set of classes for registering code. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: address remaining comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/cha_test.cc ('k') | runtime/vm/compiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 if (!super_type.IsMalformed() && super_type.HasResolvedTypeClass()) { 86 if (!super_type.IsMalformed() && super_type.HasResolvedTypeClass()) {
87 cls ^= super_type.type_class(); 87 cls ^= super_type.type_class();
88 if (cls.is_finalized()) { 88 if (cls.is_finalized()) {
89 AddSuperType(super_type, finalized_super_classes); 89 AddSuperType(super_type, finalized_super_classes);
90 } 90 }
91 } 91 }
92 } 92 }
93 } 93 }
94 94
95 95
96 static void CollectImmediateSuperInterfaces(
97 const Class& cls, GrowableArray<intptr_t>* cids) {
98 const Array& interfaces = Array::Handle(cls.interfaces());
99 Class& ifc = Class::Handle();
100 AbstractType& type = AbstractType::Handle();
101 for (intptr_t i = 0; i < interfaces.Length(); ++i) {
102 type ^= interfaces.At(i);
103 if (type.IsMalformed()) continue;
104 if (!type.HasResolvedTypeClass()) continue;
105 ifc ^= type.type_class();
106 for (intptr_t j = 0; j < cids->length(); ++j) {
107 if ((*cids)[j] == ifc.id()) {
108 // Already added.
109 return;
110 }
111 }
112 cids->Add(ifc.id());
113 }
114 }
115
116
96 // Processing ObjectStore::pending_classes_ occurs: 117 // Processing ObjectStore::pending_classes_ occurs:
97 // a) when bootstrap process completes (VerifyBootstrapClasses). 118 // a) when bootstrap process completes (VerifyBootstrapClasses).
98 // b) after the user classes are loaded (dart_api). 119 // b) after the user classes are loaded (dart_api).
99 bool ClassFinalizer::ProcessPendingClasses() { 120 bool ClassFinalizer::ProcessPendingClasses() {
100 Isolate* isolate = Isolate::Current(); 121 Isolate* isolate = Isolate::Current();
101 ASSERT(isolate != NULL); 122 ASSERT(isolate != NULL);
102 HANDLESCOPE(isolate); 123 HANDLESCOPE(isolate);
103 ObjectStore* object_store = isolate->object_store(); 124 ObjectStore* object_store = isolate->object_store();
104 const Error& error = Error::Handle(isolate, object_store->sticky_error()); 125 const Error& error = Error::Handle(isolate, object_store->sticky_error());
105 if (!error.IsNull()) { 126 if (!error.IsNull()) {
(...skipping 2174 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 } 2301 }
2281 if (FLAG_trace_class_finalization) { 2302 if (FLAG_trace_class_finalization) {
2282 OS::Print("Finalize %s\n", cls.ToCString()); 2303 OS::Print("Finalize %s\n", cls.ToCString());
2283 } 2304 }
2284 if (cls.IsMixinApplication()) { 2305 if (cls.IsMixinApplication()) {
2285 // Copy instance methods and fields from the mixin class. 2306 // Copy instance methods and fields from the mixin class.
2286 // This has to happen before the check whether the methods of 2307 // This has to happen before the check whether the methods of
2287 // the class conflict with inherited methods. 2308 // the class conflict with inherited methods.
2288 ApplyMixinMembers(cls); 2309 ApplyMixinMembers(cls);
2289 } 2310 }
2290 GrowableArray<intptr_t> added_subclass_to_cids;
2291 CollectFinalizedSuperClasses(cls, &added_subclass_to_cids);
2292 // Ensure super class is finalized. 2311 // Ensure super class is finalized.
2293 const Class& super = Class::Handle(cls.SuperClass()); 2312 const Class& super = Class::Handle(cls.SuperClass());
2294 if (!super.IsNull()) { 2313 if (!super.IsNull()) {
2295 FinalizeClass(super); 2314 FinalizeClass(super);
2296 } 2315 }
2297 // Mark as parsed and finalized. 2316 // Mark as parsed and finalized.
2298 cls.Finalize(); 2317 cls.Finalize();
2299 // Mixin app alias classes may still lack their forwarding constructor. 2318 // Mixin app alias classes may still lack their forwarding constructor.
2300 if (cls.is_mixin_app_alias() && 2319 if (cls.is_mixin_app_alias() &&
2301 (cls.functions() == Object::empty_array().raw())) { 2320 (cls.functions() == Object::empty_array().raw())) {
2302 const GrowableObjectArray& cloned_funcs = 2321 const GrowableObjectArray& cloned_funcs =
2303 GrowableObjectArray::Handle(GrowableObjectArray::New()); 2322 GrowableObjectArray::Handle(GrowableObjectArray::New());
2304 CreateForwardingConstructors(cls, cloned_funcs); 2323 CreateForwardingConstructors(cls, cloned_funcs);
2305 const Array& functions = Array::Handle(Array::MakeArray(cloned_funcs)); 2324 const Array& functions = Array::Handle(Array::MakeArray(cloned_funcs));
2306 cls.SetFunctions(functions); 2325 cls.SetFunctions(functions);
2307 } 2326 }
2308 // Every class should have at least a constructor, unless it is a top level 2327 // Every class should have at least a constructor, unless it is a top level
2309 // class or a signature class. 2328 // class or a signature class.
2310 ASSERT(cls.IsTopLevel() || 2329 ASSERT(cls.IsTopLevel() ||
2311 cls.IsSignatureClass() || 2330 cls.IsSignatureClass() ||
2312 (Array::Handle(cls.functions()).Length() > 0)); 2331 (Array::Handle(cls.functions()).Length() > 0));
2313 // Resolve and finalize all member types. 2332 // Resolve and finalize all member types.
2314 ResolveAndFinalizeMemberTypes(cls); 2333 ResolveAndFinalizeMemberTypes(cls);
2315 // Run additional checks after all types are finalized. 2334 // Run additional checks after all types are finalized.
2316 if (cls.is_const()) { 2335 if (cls.is_const()) {
2317 CheckForLegalConstClass(cls); 2336 CheckForLegalConstClass(cls);
2318 } 2337 }
2319 if (FLAG_use_cha) { 2338 if (FLAG_use_cha) {
2320 RemoveCHAOptimizedCode(added_subclass_to_cids); 2339 GrowableArray<intptr_t> cids;
2340 CollectFinalizedSuperClasses(cls, &cids);
2341 CollectImmediateSuperInterfaces(cls, &cids);
2342 RemoveCHAOptimizedCode(cids);
2321 } 2343 }
2322 } 2344 }
2323 2345
2324 2346
2325 bool ClassFinalizer::IsSuperCycleFree(const Class& cls) { 2347 bool ClassFinalizer::IsSuperCycleFree(const Class& cls) {
2326 Class& test1 = Class::Handle(cls.raw()); 2348 Class& test1 = Class::Handle(cls.raw());
2327 Class& test2 = Class::Handle(cls.SuperClass()); 2349 Class& test2 = Class::Handle(cls.SuperClass());
2328 // A finalized class has been checked for cycles. 2350 // A finalized class has been checked for cycles.
2329 // Using the hare and tortoise algorithm for locating cycles. 2351 // Using the hare and tortoise algorithm for locating cycles.
2330 while (!test1.is_type_finalized() && 2352 while (!test1.is_type_finalized() &&
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
3056 ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields()); 3078 ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields());
3057 field ^= fields_array.At(0); 3079 field ^= fields_array.At(0);
3058 ASSERT(field.Offset() == ByteBuffer::data_offset()); 3080 ASSERT(field.Offset() == ByteBuffer::data_offset());
3059 name ^= field.name(); 3081 name ^= field.name();
3060 expected_name ^= String::New("_data"); 3082 expected_name ^= String::New("_data");
3061 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name)); 3083 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
3062 #endif 3084 #endif
3063 } 3085 }
3064 3086
3065 } // namespace dart 3087 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/cha_test.cc ('k') | runtime/vm/compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698