OLD | NEW |
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 4945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4956 } | 4956 } |
4957 | 4957 |
4958 dart::Class& klass = dart::Class::ZoneHandle( | 4958 dart::Class& klass = dart::Class::ZoneHandle( |
4959 Z, H.LookupClassByKernelClass(node->target()->EnclosingName())); | 4959 Z, H.LookupClassByKernelClass(node->target()->EnclosingName())); |
4960 | 4960 |
4961 Fragment instructions; | 4961 Fragment instructions; |
4962 | 4962 |
4963 // Check for malbounded-ness of type. | 4963 // Check for malbounded-ness of type. |
4964 if (I->type_checks()) { | 4964 if (I->type_checks()) { |
4965 List<DartType>& kernel_type_arguments = node->arguments()->types(); | 4965 List<DartType>& kernel_type_arguments = node->arguments()->types(); |
4966 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments( | 4966 const TypeArguments& type_arguments = T.TranslateTypeArguments( |
4967 klass, kernel_type_arguments.raw_array(), | 4967 kernel_type_arguments.raw_array(), kernel_type_arguments.length()); |
4968 kernel_type_arguments.length()); | |
4969 | 4968 |
4970 AbstractType& type = AbstractType::Handle( | 4969 AbstractType& type = AbstractType::Handle( |
4971 Z, Type::New(klass, type_arguments, TokenPosition::kNoSource)); | 4970 Z, Type::New(klass, type_arguments, TokenPosition::kNoSource)); |
4972 type = ClassFinalizer::FinalizeType(klass, type); | 4971 type = ClassFinalizer::FinalizeType(klass, type); |
4973 | 4972 |
4974 if (type.IsMalbounded()) { | 4973 if (type.IsMalbounded()) { |
4975 // Evaluate expressions for correctness. | 4974 // Evaluate expressions for correctness. |
4976 List<Expression>& positional = node->arguments()->positional(); | 4975 List<Expression>& positional = node->arguments()->positional(); |
4977 List<NamedExpression>& named = node->arguments()->named(); | 4976 List<NamedExpression>& named = node->arguments()->named(); |
4978 for (intptr_t i = 0; i < positional.length(); ++i) { | 4977 for (intptr_t i = 0; i < positional.length(); ++i) { |
(...skipping 1465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6444 return NULL; | 6443 return NULL; |
6445 } | 6444 } |
6446 | 6445 |
6447 Thread* thread = Thread::Current(); | 6446 Thread* thread = Thread::Current(); |
6448 Zone* zone_ = thread->zone(); | 6447 Zone* zone_ = thread->zone(); |
6449 TranslationHelper translation_helper(thread); | 6448 TranslationHelper translation_helper(thread); |
6450 DartTypeTranslator type_translator(&translation_helper, NULL, true); | 6449 DartTypeTranslator type_translator(&translation_helper, NULL, true); |
6451 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, | 6450 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, |
6452 &translation_helper, &type_translator); | 6451 &translation_helper, &type_translator); |
6453 | 6452 |
6454 | 6453 const intptr_t positional_count = |
6455 intptr_t param_count = function_node->positional_parameters().length() + | 6454 function_node->positional_parameters().length(); |
6456 function_node->named_parameters().length(); | 6455 const intptr_t param_count = |
| 6456 positional_count + function_node->named_parameters().length(); |
6457 const Array& param_descriptor = Array::Handle( | 6457 const Array& param_descriptor = Array::Handle( |
6458 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld)); | 6458 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld)); |
6459 for (intptr_t i = 0; i < param_count; ++i) { | 6459 for (intptr_t i = 0; i < param_count; ++i) { |
| 6460 const intptr_t entry_start = i * Parser::kParameterEntrySize; |
| 6461 |
6460 VariableDeclaration* variable; | 6462 VariableDeclaration* variable; |
6461 if (i < function_node->positional_parameters().length()) { | 6463 if (i < positional_count) { |
6462 variable = function_node->positional_parameters()[i]; | 6464 variable = function_node->positional_parameters()[i]; |
6463 } else { | 6465 } else { |
6464 variable = function_node->named_parameters()[i]; | 6466 variable = function_node->named_parameters()[i - positional_count]; |
6465 } | 6467 } |
6466 | 6468 |
6467 param_descriptor.SetAt( | 6469 param_descriptor.SetAt( |
6468 i + Parser::kParameterIsFinalOffset, | 6470 entry_start + Parser::kParameterIsFinalOffset, |
6469 variable->IsFinal() ? Bool::True() : Bool::False()); | 6471 variable->IsFinal() ? Bool::True() : Bool::False()); |
6470 | 6472 |
6471 if (variable->initializer() != NULL) { | 6473 if (variable->initializer() != NULL) { |
6472 param_descriptor.SetAt( | 6474 param_descriptor.SetAt( |
6473 i + Parser::kParameterDefaultValueOffset, | 6475 entry_start + Parser::kParameterDefaultValueOffset, |
6474 constant_evaluator.EvaluateExpression(variable->initializer())); | 6476 constant_evaluator.EvaluateExpression(variable->initializer())); |
6475 } else { | 6477 } else { |
6476 param_descriptor.SetAt(i + Parser::kParameterDefaultValueOffset, | 6478 param_descriptor.SetAt( |
6477 Object::null_instance()); | 6479 entry_start + Parser::kParameterDefaultValueOffset, |
| 6480 Object::null_instance()); |
6478 } | 6481 } |
6479 | 6482 |
6480 param_descriptor.SetAt(i + Parser::kParameterMetadataOffset, | 6483 param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset, |
6481 /* Issue(28434): Missing parameter metadata. */ | 6484 /* Issue(28434): Missing parameter metadata. */ |
6482 Object::null_instance()); | 6485 Object::null_instance()); |
6483 } | 6486 } |
6484 return param_descriptor.raw(); | 6487 return param_descriptor.raw(); |
6485 } else { | 6488 } else { |
6486 Thread* thread = Thread::Current(); | 6489 Thread* thread = Thread::Current(); |
6487 Error& error = Error::Handle(); | 6490 Error& error = Error::Handle(); |
6488 error = thread->sticky_error(); | 6491 error = thread->sticky_error(); |
6489 thread->clear_sticky_error(); | 6492 thread->clear_sticky_error(); |
6490 return error.raw(); | 6493 return error.raw(); |
6491 } | 6494 } |
6492 } | 6495 } |
6493 | 6496 |
6494 | 6497 |
6495 } // namespace kernel | 6498 } // namespace kernel |
6496 } // namespace dart | 6499 } // namespace dart |
6497 | 6500 |
6498 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6501 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |