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

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

Issue 2949493002: [kernel] Check type for list literals (Closed)
Patch Set: Address comments and fix issue with type_arguments representing dynamic (i.e. being null) Created 3 years, 6 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 | « no previous file | tests/language/language_kernel.status » ('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 "vm/kernel_binary_flowgraph.h" 5 #include "vm/kernel_binary_flowgraph.h"
6 6
7 #include "vm/compiler.h" 7 #include "vm/compiler.h"
8 #include "vm/longjump.h" 8 #include "vm/longjump.h"
9 #include "vm/object_store.h" 9 #include "vm/object_store.h"
10 10
(...skipping 5493 matching lines...) Expand 10 before | Expand all | Expand 10 after
5504 intptr_t length = ReadListLength(); // read list length. 5504 intptr_t length = ReadListLength(); // read list length.
5505 // Note: there will be "length" expressions. 5505 // Note: there will be "length" expressions.
5506 5506
5507 // The type argument for the factory call. 5507 // The type argument for the factory call.
5508 Fragment instructions = TranslateInstantiatedTypeArguments(type_arguments); 5508 Fragment instructions = TranslateInstantiatedTypeArguments(type_arguments);
5509 instructions += PushArgument(); 5509 instructions += PushArgument();
5510 if (length == 0) { 5510 if (length == 0) {
5511 instructions += Constant(Object::empty_array()); 5511 instructions += Constant(Object::empty_array());
5512 } else { 5512 } else {
5513 // The type arguments for CreateArray. 5513 // The type arguments for CreateArray.
5514 instructions += Constant(TypeArguments::ZoneHandle(Z)); 5514 instructions += Constant(type_arguments);
5515 instructions += IntConstant(length); 5515 instructions += IntConstant(length);
5516 instructions += CreateArray(); 5516 instructions += CreateArray();
5517 AbstractType& list_type = AbstractType::ZoneHandle(Z);
5518 if (I->type_checks()) {
5519 if (type_arguments.IsNull()) {
5520 // It was dynamic.
5521 list_type = Object::dynamic_type().raw();
5522 } else {
5523 list_type = type_arguments.TypeAt(0);
5524 }
5525 }
5517 5526
5518 LocalVariable* array = MakeTemporary(); 5527 LocalVariable* array = MakeTemporary();
5519 for (intptr_t i = 0; i < length; ++i) { 5528 for (intptr_t i = 0; i < length; ++i) {
5520 instructions += LoadLocal(array); 5529 instructions += LoadLocal(array);
5521 instructions += IntConstant(i); 5530 instructions += IntConstant(i);
5522 instructions += BuildExpression(); // read ith expression. 5531 instructions += BuildExpression(); // read ith expression.
5532 instructions += CheckAssignableInCheckedMode(
5533 list_type, Symbols::ListLiteralElement());
5523 instructions += StoreIndexed(kArrayCid); 5534 instructions += StoreIndexed(kArrayCid);
5524 instructions += Drop(); 5535 instructions += Drop();
5525 } 5536 }
5526 } 5537 }
5527 instructions += PushArgument(); // The array. 5538 instructions += PushArgument(); // The array.
5528 5539
5529 const dart::Class& factory_class = 5540 const dart::Class& factory_class =
5530 dart::Class::Handle(Z, dart::Library::LookupCoreClass(Symbols::List())); 5541 dart::Class::Handle(Z, dart::Library::LookupCoreClass(Symbols::List()));
5531 const Function& factory_method = Function::ZoneHandle( 5542 const Function& factory_method = Function::ZoneHandle(
5532 Z, factory_class.LookupFactory( 5543 Z, factory_class.LookupFactory(
(...skipping 1365 matching lines...) Expand 10 before | Expand all | Expand 10 after
6898 metadata_values.SetAt(i, value); 6909 metadata_values.SetAt(i, value);
6899 } 6910 }
6900 6911
6901 return metadata_values.raw(); 6912 return metadata_values.raw();
6902 } 6913 }
6903 6914
6904 } // namespace kernel 6915 } // namespace kernel
6905 } // namespace dart 6916 } // namespace dart
6906 6917
6907 #endif // !defined(DART_PRECOMPILED_RUNTIME) 6918 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « no previous file | tests/language/language_kernel.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698