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

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

Issue 2755723003: Make sure the signature of the call method is finalized before involving it (Closed)
Patch Set: Created 3 years, 9 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
« no previous file with comments | « runtime/vm/flow_graph_builder.cc ('k') | runtime/vm/object.h » ('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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 <map> 5 #include <map>
6 #include <set> 6 #include <set>
7 #include <string> 7 #include <string>
8 8
9 #include "vm/kernel_to_il.h" 9 #include "vm/kernel_to_il.h"
10 10
(...skipping 1267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 ASSERT(!klass.IsNull()); 1278 ASSERT(!klass.IsNull());
1279 // Note that if cls is _Closure, the returned type will be _Closure, 1279 // Note that if cls is _Closure, the returned type will be _Closure,
1280 // and not the signature type. 1280 // and not the signature type.
1281 Type& type = Type::ZoneHandle(Z, klass.CanonicalType()); 1281 Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
1282 if (!type.IsNull()) { 1282 if (!type.IsNull()) {
1283 return type; 1283 return type;
1284 } 1284 }
1285 type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()), 1285 type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
1286 klass.token_pos()); 1286 klass.token_pos());
1287 if (klass.is_type_finalized()) { 1287 if (klass.is_type_finalized()) {
1288 type ^= ClassFinalizer::FinalizeType( 1288 type ^= ClassFinalizer::FinalizeType(klass, type);
1289 klass, type, ClassFinalizer::kCanonicalizeWellFormed);
1290 // Note that the receiver type may now be a malbounded type. 1289 // Note that the receiver type may now be a malbounded type.
1291 klass.SetCanonicalType(type); 1290 klass.SetCanonicalType(type);
1292 } 1291 }
1293 return type; 1292 return type;
1294 } 1293 }
1295 1294
1296 1295
1297 void TranslationHelper::ReportError(const char* format, ...) { 1296 void TranslationHelper::ReportError(const char* format, ...) {
1298 const Script& null_script = Script::Handle(Z); 1297 const Script& null_script = Script::Handle(Z);
1299 1298
(...skipping 3064 matching lines...) Expand 10 before | Expand all | Expand 10 after
4364 result_ = AbstractType::dynamic_type().raw(); 4363 result_ = AbstractType::dynamic_type().raw();
4365 } 4364 }
4366 parameter_types.SetAt(pos, result_); 4365 parameter_types.SetAt(pos, result_);
4367 parameter_names.SetAt(pos, H.DartSymbol(tuple->first())); 4366 parameter_names.SetAt(pos, H.DartSymbol(tuple->first()));
4368 } 4367 }
4369 4368
4370 Type& signature_type = 4369 Type& signature_type =
4371 Type::ZoneHandle(Z, signature_function.SignatureType()); 4370 Type::ZoneHandle(Z, signature_function.SignatureType());
4372 4371
4373 if (finalize_) { 4372 if (finalize_) {
4374 signature_type ^= ClassFinalizer::FinalizeType( 4373 signature_type ^=
4375 *active_class_->klass, signature_type, ClassFinalizer::kCanonicalize); 4374 ClassFinalizer::FinalizeType(*active_class_->klass, signature_type);
4376 // Do not refer to signature_function anymore, since it may have been 4375 // Do not refer to signature_function anymore, since it may have been
4377 // replaced during canonicalization. 4376 // replaced during canonicalization.
4378 signature_function = Function::null(); 4377 signature_function = Function::null();
4379 } 4378 }
4380 4379
4381 result_ = signature_type.raw(); 4380 result_ = signature_type.raw();
4382 } 4381 }
4383 4382
4384 4383
4385 static intptr_t FindTypeParameterIndex(List<TypeParameter>* parameters, 4384 static intptr_t FindTypeParameterIndex(List<TypeParameter>* parameters,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
4466 // => We therefore ignore errors in `A` or `B`. 4465 // => We therefore ignore errors in `A` or `B`.
4467 const TypeArguments& type_arguments = TranslateTypeArguments( 4466 const TypeArguments& type_arguments = TranslateTypeArguments(
4468 node->type_arguments().raw_array(), node->type_arguments().length()); 4467 node->type_arguments().raw_array(), node->type_arguments().length());
4469 4468
4470 4469
4471 dart::Object& klass = 4470 dart::Object& klass =
4472 dart::Object::Handle(Z, H.ToUnresolvedClass(node->klass())); 4471 dart::Object::Handle(Z, H.ToUnresolvedClass(node->klass()));
4473 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); 4472 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
4474 if (finalize_) { 4473 if (finalize_) {
4475 ASSERT(active_class_->klass != NULL); 4474 ASSERT(active_class_->klass != NULL);
4476 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_, 4475 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
4477 ClassFinalizer::kCanonicalize);
4478 } 4476 }
4479 } 4477 }
4480 4478
4481 4479
4482 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { 4480 void DartTypeTranslator::VisitDynamicType(DynamicType* node) {
4483 result_ = Object::dynamic_type().raw(); 4481 result_ = Object::dynamic_type().raw();
4484 } 4482 }
4485 4483
4486 4484
4487 void DartTypeTranslator::VisitVoidType(VoidType* node) { 4485 void DartTypeTranslator::VisitVoidType(VoidType* node) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4525 const TypeArguments& type_arguments = 4523 const TypeArguments& type_arguments =
4526 TranslateTypeArguments(receiver_type_arguments, length); 4524 TranslateTypeArguments(receiver_type_arguments, length);
4527 if (type_arguments.IsNull()) return type_arguments; 4525 if (type_arguments.IsNull()) return type_arguments;
4528 4526
4529 // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to 4527 // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
4530 // finalize the argument types. 4528 // finalize the argument types.
4531 // (This can for example make the [type_arguments] vector larger) 4529 // (This can for example make the [type_arguments] vector larger)
4532 Type& type = Type::Handle( 4530 Type& type = Type::Handle(
4533 Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource)); 4531 Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
4534 if (finalize_) { 4532 if (finalize_) {
4535 type ^= ClassFinalizer::FinalizeType( 4533 type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
4536 *active_class_->klass, type, ClassFinalizer::kCanonicalizeWellFormed);
4537 } 4534 }
4538 4535
4539 const TypeArguments& instantiated_type_arguments = 4536 const TypeArguments& instantiated_type_arguments =
4540 TypeArguments::ZoneHandle(Z, type.arguments()); 4537 TypeArguments::ZoneHandle(Z, type.arguments());
4541 return instantiated_type_arguments; 4538 return instantiated_type_arguments;
4542 } 4539 }
4543 4540
4544 4541
4545 const Type& DartTypeTranslator::ReceiverType(const dart::Class& klass) { 4542 const Type& DartTypeTranslator::ReceiverType(const dart::Class& klass) {
4546 ASSERT(!klass.IsNull()); 4543 ASSERT(!klass.IsNull());
4547 ASSERT(!klass.IsTypedefClass()); 4544 ASSERT(!klass.IsTypedefClass());
4548 // Note that if klass is _Closure, the returned type will be _Closure, 4545 // Note that if klass is _Closure, the returned type will be _Closure,
4549 // and not the signature type. 4546 // and not the signature type.
4550 Type& type = Type::ZoneHandle(Z, klass.CanonicalType()); 4547 Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
4551 if (!type.IsNull()) { 4548 if (!type.IsNull()) {
4552 return type; 4549 return type;
4553 } 4550 }
4554 type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()), 4551 type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
4555 klass.token_pos()); 4552 klass.token_pos());
4556 if (klass.is_type_finalized()) { 4553 if (klass.is_type_finalized()) {
4557 type ^= ClassFinalizer::FinalizeType( 4554 type ^= ClassFinalizer::FinalizeType(klass, type);
4558 klass, type, ClassFinalizer::kCanonicalizeWellFormed);
4559 klass.SetCanonicalType(type); 4555 klass.SetCanonicalType(type);
4560 } 4556 }
4561 return type; 4557 return type;
4562 } 4558 }
4563 4559
4564 4560
4565 void FlowGraphBuilder::VisitTypeLiteral(TypeLiteral* node) { 4561 void FlowGraphBuilder::VisitTypeLiteral(TypeLiteral* node) {
4566 const AbstractType& type = T.TranslateType(node->type()); 4562 const AbstractType& type = T.TranslateType(node->type());
4567 if (type.IsMalformed()) H.ReportError("Malformed type literal"); 4563 if (type.IsMalformed()) H.ReportError("Malformed type literal");
4568 4564
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
4917 4913
4918 // Check for malbounded-ness of type. 4914 // Check for malbounded-ness of type.
4919 if (I->type_checks()) { 4915 if (I->type_checks()) {
4920 List<DartType>& kernel_type_arguments = node->arguments()->types(); 4916 List<DartType>& kernel_type_arguments = node->arguments()->types();
4921 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments( 4917 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments(
4922 klass, kernel_type_arguments.raw_array(), 4918 klass, kernel_type_arguments.raw_array(),
4923 kernel_type_arguments.length()); 4919 kernel_type_arguments.length());
4924 4920
4925 AbstractType& type = AbstractType::Handle( 4921 AbstractType& type = AbstractType::Handle(
4926 Z, Type::New(klass, type_arguments, TokenPosition::kNoSource)); 4922 Z, Type::New(klass, type_arguments, TokenPosition::kNoSource));
4927 type = ClassFinalizer::FinalizeType(klass, type, 4923 type = ClassFinalizer::FinalizeType(klass, type);
4928 ClassFinalizer::kCanonicalize);
4929 4924
4930 if (type.IsMalbounded()) { 4925 if (type.IsMalbounded()) {
4931 // Evaluate expressions for correctness. 4926 // Evaluate expressions for correctness.
4932 List<Expression>& positional = node->arguments()->positional(); 4927 List<Expression>& positional = node->arguments()->positional();
4933 List<NamedExpression>& named = node->arguments()->named(); 4928 List<NamedExpression>& named = node->arguments()->named();
4934 for (intptr_t i = 0; i < positional.length(); ++i) { 4929 for (intptr_t i = 0; i < positional.length(); ++i) {
4935 instructions += TranslateExpression(positional[i]); 4930 instructions += TranslateExpression(positional[i]);
4936 instructions += Drop(); 4931 instructions += Drop();
4937 } 4932 }
4938 for (intptr_t i = 0; i < named.length(); ++i) { 4933 for (intptr_t i = 0; i < named.length(); ++i) {
(...skipping 1354 matching lines...) Expand 10 before | Expand all | Expand 10 after
6293 const ContextScope& context_scope = 6288 const ContextScope& context_scope =
6294 ContextScope::Handle(Z, scope->PreserveOuterScope(context_depth_)); 6289 ContextScope::Handle(Z, scope->PreserveOuterScope(context_depth_));
6295 function.set_context_scope(context_scope); 6290 function.set_context_scope(context_scope);
6296 function.set_kernel_function(node); 6291 function.set_kernel_function(node);
6297 KernelReader::SetupFunctionParameters(H, T, dart::Class::Handle(Z), 6292 KernelReader::SetupFunctionParameters(H, T, dart::Class::Handle(Z),
6298 function, node, 6293 function, node,
6299 false, // is_method 6294 false, // is_method
6300 true); // is_closure 6295 true); // is_closure
6301 // Finalize function type. 6296 // Finalize function type.
6302 Type& signature_type = Type::Handle(Z, function.SignatureType()); 6297 Type& signature_type = Type::Handle(Z, function.SignatureType());
6303 signature_type ^= ClassFinalizer::FinalizeType( 6298 signature_type ^=
6304 *active_class_.klass, signature_type, ClassFinalizer::kCanonicalize); 6299 ClassFinalizer::FinalizeType(*active_class_.klass, signature_type);
6305 function.SetSignatureType(signature_type); 6300 function.SetSignatureType(signature_type);
6306 6301
6307 I->AddClosureFunction(function); 6302 I->AddClosureFunction(function);
6308 } 6303 }
6309 break; 6304 break;
6310 } 6305 }
6311 6306
6312 const dart::Class& closure_class = 6307 const dart::Class& closure_class =
6313 dart::Class::ZoneHandle(Z, I->object_store()->closure_class()); 6308 dart::Class::ZoneHandle(Z, I->object_store()->closure_class());
6314 ASSERT(!closure_class.IsNull()); 6309 ASSERT(!closure_class.IsNull());
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
6438 thread->clear_sticky_error(); 6433 thread->clear_sticky_error();
6439 return error.raw(); 6434 return error.raw();
6440 } 6435 }
6441 } 6436 }
6442 6437
6443 6438
6444 } // namespace kernel 6439 } // namespace kernel
6445 } // namespace dart 6440 } // namespace dart
6446 6441
6447 #endif // !defined(DART_PRECOMPILED_RUNTIME) 6442 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_builder.cc ('k') | runtime/vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698