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

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

Issue 1513493002: Improve upper bound finalization in VM and fix #25122. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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
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 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1262 const intptr_t num_type_params = cls.NumTypeParameters(); 1262 const intptr_t num_type_params = cls.NumTypeParameters();
1263 TypeParameter& type_param = TypeParameter::Handle(); 1263 TypeParameter& type_param = TypeParameter::Handle();
1264 AbstractType& bound = AbstractType::Handle(); 1264 AbstractType& bound = AbstractType::Handle();
1265 const TypeArguments& type_params = 1265 const TypeArguments& type_params =
1266 TypeArguments::Handle(cls.type_parameters()); 1266 TypeArguments::Handle(cls.type_parameters());
1267 ASSERT((type_params.IsNull() && (num_type_params == 0)) || 1267 ASSERT((type_params.IsNull() && (num_type_params == 0)) ||
1268 (type_params.Length() == num_type_params)); 1268 (type_params.Length() == num_type_params));
1269 for (intptr_t i = 0; i < num_type_params; i++) { 1269 for (intptr_t i = 0; i < num_type_params; i++) {
1270 type_param ^= type_params.TypeAt(i); 1270 type_param ^= type_params.TypeAt(i);
1271 bound = type_param.bound(); 1271 bound = type_param.bound();
1272 if (bound.IsFinalized() || bound.IsBeingFinalized()) { 1272 // Bound may be finalized, but not canonical yet.
1273 if (bound.IsCanonical() || bound.IsBeingFinalized()) {
1273 // A bound involved in F-bounded quantification may form a cycle. 1274 // A bound involved in F-bounded quantification may form a cycle.
1274 continue; 1275 continue;
1275 } 1276 }
1276 bound = FinalizeType(cls, bound, kCanonicalize); 1277 bound = FinalizeType(cls, bound, kCanonicalize);
1277 type_param.set_bound(bound); 1278 type_param.set_bound(bound);
1278 } 1279 }
1279 } 1280 }
1280 1281
1281 1282
1282 void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) { 1283 void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after
2224 } 2225 }
2225 // Finalize super class. 2226 // Finalize super class.
2226 Class& super_class = Class::Handle(cls.SuperClass()); 2227 Class& super_class = Class::Handle(cls.SuperClass());
2227 if (!super_class.IsNull()) { 2228 if (!super_class.IsNull()) {
2228 FinalizeTypesInClass(super_class); 2229 FinalizeTypesInClass(super_class);
2229 } 2230 }
2230 // Finalize type parameters before finalizing the super type. 2231 // Finalize type parameters before finalizing the super type.
2231 FinalizeTypeParameters(cls); // May change super type. 2232 FinalizeTypeParameters(cls); // May change super type.
2232 super_class = cls.SuperClass(); 2233 super_class = cls.SuperClass();
2233 ASSERT(super_class.IsNull() || super_class.is_type_finalized()); 2234 ASSERT(super_class.IsNull() || super_class.is_type_finalized());
2234 ResolveUpperBounds(cls); 2235 // Only resolving rather than finalizing the upper bounds here would result in
2236 // instantiated type parameters of the super type to temporarily have
2237 // unfinalized bounds. It is more efficient to finalize them early.
2238 FinalizeUpperBounds(cls);
2235 // Finalize super type. 2239 // Finalize super type.
2236 AbstractType& super_type = AbstractType::Handle(cls.super_type()); 2240 AbstractType& super_type = AbstractType::Handle(cls.super_type());
2237 if (!super_type.IsNull()) { 2241 if (!super_type.IsNull()) {
2238 // In case of a bound error in the super type in production mode, the 2242 // In case of a bound error in the super type in production mode, the
2239 // finalized super type will have a BoundedType as type argument for the 2243 // finalized super type will have a BoundedType as type argument for the
2240 // out of bound type argument. 2244 // out of bound type argument.
2241 // It should not be a problem if the class is written to a snapshot and 2245 // It should not be a problem if the class is written to a snapshot and
2242 // later executed in checked mode. Note that the finalized type argument 2246 // later executed in checked mode. Note that the finalized type argument
2243 // vector of any type of the base class will contain a BoundedType for the 2247 // vector of any type of the base class will contain a BoundedType for the
2244 // out of bound type argument. 2248 // out of bound type argument.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2337 // 'ResolveAndFinalizeMemberTypes(cls)' has not been called yet, unfinalized 2341 // 'ResolveAndFinalizeMemberTypes(cls)' has not been called yet, unfinalized
2338 // member types could choke the snapshotter. 2342 // member types could choke the snapshotter.
2339 ASSERT(Array::Handle(cls.functions()).Length() == 0); 2343 ASSERT(Array::Handle(cls.functions()).Length() == 0);
2340 } 2344 }
2341 } 2345 }
2342 2346
2343 2347
2344 void ClassFinalizer::FinalizeClass(const Class& cls) { 2348 void ClassFinalizer::FinalizeClass(const Class& cls) {
2345 Thread* thread = Thread::Current(); 2349 Thread* thread = Thread::Current();
2346 HANDLESCOPE(thread); 2350 HANDLESCOPE(thread);
2351 ASSERT(cls.is_type_finalized());
2347 if (cls.is_finalized()) { 2352 if (cls.is_finalized()) {
2348 return; 2353 return;
2349 } 2354 }
2350 if (FLAG_trace_class_finalization) { 2355 if (FLAG_trace_class_finalization) {
2351 THR_Print("Finalize %s\n", cls.ToCString()); 2356 THR_Print("Finalize %s\n", cls.ToCString());
2352 } 2357 }
2353 if (cls.is_patch()) { 2358 if (cls.is_patch()) {
2354 // The fields and functions of a patch class are copied to the 2359 // The fields and functions of a patch class are copied to the
2355 // patched class after parsing. There is nothing to finalize. 2360 // patched class after parsing. There is nothing to finalize.
2356 ASSERT(Array::Handle(cls.functions()).Length() == 0); 2361 ASSERT(Array::Handle(cls.functions()).Length() == 0);
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
3203 ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields()); 3208 ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields());
3204 field ^= fields_array.At(0); 3209 field ^= fields_array.At(0);
3205 ASSERT(field.Offset() == ByteBuffer::data_offset()); 3210 ASSERT(field.Offset() == ByteBuffer::data_offset());
3206 name ^= field.name(); 3211 name ^= field.name();
3207 expected_name ^= String::New("_data"); 3212 expected_name ^= String::New("_data");
3208 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name)); 3213 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
3209 #endif 3214 #endif
3210 } 3215 }
3211 3216
3212 } // namespace dart 3217 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698