OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/parser.h" | 5 #include "vm/parser.h" |
6 | 6 |
7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
9 #include "vm/ast_transformer.h" | 9 #include "vm/ast_transformer.h" |
10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
(...skipping 3107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3118 ParamDesc& param = (*params.parameters)[i]; | 3118 ParamDesc& param = (*params.parameters)[i]; |
3119 if (param.is_field_initializer) { | 3119 if (param.is_field_initializer) { |
3120 ReportError(param.name_pos, | 3120 ReportError(param.name_pos, |
3121 "field initializer only allowed in constructors"); | 3121 "field initializer only allowed in constructors"); |
3122 } | 3122 } |
3123 } | 3123 } |
3124 } | 3124 } |
3125 // Populate function scope with the formal parameters. | 3125 // Populate function scope with the formal parameters. |
3126 AddFormalParamsToScope(¶ms, current_block_->scope); | 3126 AddFormalParamsToScope(¶ms, current_block_->scope); |
3127 | 3127 |
3128 if (FLAG_enable_type_checks && | 3128 if (I->TypeChecksEnabled() && |
3129 (current_block_->scope->function_level() > 0)) { | 3129 (current_block_->scope->function_level() > 0)) { |
3130 // We are parsing, but not compiling, a local function. | 3130 // We are parsing, but not compiling, a local function. |
3131 // The instantiator may be required at run time for generic type checks. | 3131 // The instantiator may be required at run time for generic type checks. |
3132 if (IsInstantiatorRequired()) { | 3132 if (IsInstantiatorRequired()) { |
3133 // Make sure that the receiver of the enclosing instance function | 3133 // Make sure that the receiver of the enclosing instance function |
3134 // (or implicit first parameter of an enclosing factory) is marked as | 3134 // (or implicit first parameter of an enclosing factory) is marked as |
3135 // captured if type checks are enabled, because they may access it to | 3135 // captured if type checks are enabled, because they may access it to |
3136 // instantiate types. | 3136 // instantiate types. |
3137 CaptureInstantiator(); | 3137 CaptureInstantiator(); |
3138 } | 3138 } |
(...skipping 3415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6554 | 6554 |
6555 // Returns ast nodes of the variable initialization. Variables without an | 6555 // Returns ast nodes of the variable initialization. Variables without an |
6556 // explicit initializer are initialized to null. If several variables are | 6556 // explicit initializer are initialized to null. If several variables are |
6557 // declared, the individual initializers are collected in a sequence node. | 6557 // declared, the individual initializers are collected in a sequence node. |
6558 AstNode* Parser::ParseVariableDeclarationList() { | 6558 AstNode* Parser::ParseVariableDeclarationList() { |
6559 TRACE_PARSER("ParseVariableDeclarationList"); | 6559 TRACE_PARSER("ParseVariableDeclarationList"); |
6560 SkipMetadata(); | 6560 SkipMetadata(); |
6561 bool is_final = (CurrentToken() == Token::kFINAL); | 6561 bool is_final = (CurrentToken() == Token::kFINAL); |
6562 bool is_const = (CurrentToken() == Token::kCONST); | 6562 bool is_const = (CurrentToken() == Token::kCONST); |
6563 const AbstractType& type = AbstractType::ZoneHandle(Z, | 6563 const AbstractType& type = AbstractType::ZoneHandle(Z, |
6564 ParseConstFinalVarOrType(FLAG_enable_type_checks ? | 6564 ParseConstFinalVarOrType(I->TypeChecksEnabled() ? |
6565 ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore)); | 6565 ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore)); |
6566 if (!IsIdentifier()) { | 6566 if (!IsIdentifier()) { |
6567 ReportError("identifier expected"); | 6567 ReportError("identifier expected"); |
6568 } | 6568 } |
6569 | 6569 |
6570 SequenceNode* preamble = NULL; | 6570 SequenceNode* preamble = NULL; |
6571 AstNode* initializers = | 6571 AstNode* initializers = |
6572 ParseVariableDeclaration(type, is_final, is_const, &preamble); | 6572 ParseVariableDeclaration(type, is_final, is_const, &preamble); |
6573 ASSERT(initializers != NULL); | 6573 ASSERT(initializers != NULL); |
6574 if (preamble != NULL) { | 6574 if (preamble != NULL) { |
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7542 ReportError("Loop variable cannot be 'const'"); | 7542 ReportError("Loop variable cannot be 'const'"); |
7543 } | 7543 } |
7544 bool new_loop_var = false; | 7544 bool new_loop_var = false; |
7545 AbstractType& loop_var_type = AbstractType::ZoneHandle(Z); | 7545 AbstractType& loop_var_type = AbstractType::ZoneHandle(Z); |
7546 if (LookaheadToken(1) != Token::kIN) { | 7546 if (LookaheadToken(1) != Token::kIN) { |
7547 // Declaration of a new loop variable. | 7547 // Declaration of a new loop variable. |
7548 // Delay creation of the local variable until we know its actual | 7548 // Delay creation of the local variable until we know its actual |
7549 // position, which is inside the loop body. | 7549 // position, which is inside the loop body. |
7550 new_loop_var = true; | 7550 new_loop_var = true; |
7551 loop_var_type = ParseConstFinalVarOrType( | 7551 loop_var_type = ParseConstFinalVarOrType( |
7552 FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize : | 7552 I->TypeChecksEnabled() ? ClassFinalizer::kCanonicalize : |
7553 ClassFinalizer::kIgnore); | 7553 ClassFinalizer::kIgnore); |
7554 } | 7554 } |
7555 intptr_t loop_var_pos = TokenPos(); | 7555 intptr_t loop_var_pos = TokenPos(); |
7556 const String* loop_var_name = ExpectIdentifier("variable name expected"); | 7556 const String* loop_var_name = ExpectIdentifier("variable name expected"); |
7557 | 7557 |
7558 // Parse stream expression. | 7558 // Parse stream expression. |
7559 ExpectToken(Token::kIN); | 7559 ExpectToken(Token::kIN); |
7560 const intptr_t stream_pos = TokenPos(); | 7560 const intptr_t stream_pos = TokenPos(); |
7561 AstNode* stream_expr = | 7561 AstNode* stream_expr = |
7562 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); | 7562 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); |
7563 ExpectToken(Token::kRPAREN); | 7563 ExpectToken(Token::kRPAREN); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7685 AbstractType& loop_var_type = AbstractType::ZoneHandle(Z); | 7685 AbstractType& loop_var_type = AbstractType::ZoneHandle(Z); |
7686 if (LookaheadToken(1) == Token::kIN) { | 7686 if (LookaheadToken(1) == Token::kIN) { |
7687 loop_var_pos = TokenPos(); | 7687 loop_var_pos = TokenPos(); |
7688 loop_var_name = ExpectIdentifier("variable name expected"); | 7688 loop_var_name = ExpectIdentifier("variable name expected"); |
7689 } else { | 7689 } else { |
7690 // The case without a type is handled above, so require a type here. | 7690 // The case without a type is handled above, so require a type here. |
7691 // Delay creation of the local variable until we know its actual | 7691 // Delay creation of the local variable until we know its actual |
7692 // position, which is inside the loop body. | 7692 // position, which is inside the loop body. |
7693 new_loop_var = true; | 7693 new_loop_var = true; |
7694 loop_var_type = ParseConstFinalVarOrType( | 7694 loop_var_type = ParseConstFinalVarOrType( |
7695 FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize : | 7695 I->TypeChecksEnabled() ? ClassFinalizer::kCanonicalize : |
7696 ClassFinalizer::kIgnore); | 7696 ClassFinalizer::kIgnore); |
7697 loop_var_name = ExpectIdentifier("variable name expected"); | 7697 loop_var_name = ExpectIdentifier("variable name expected"); |
7698 } | 7698 } |
7699 ExpectToken(Token::kIN); | 7699 ExpectToken(Token::kIN); |
7700 const intptr_t collection_pos = TokenPos(); | 7700 const intptr_t collection_pos = TokenPos(); |
7701 AstNode* collection_expr = | 7701 AstNode* collection_expr = |
7702 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); | 7702 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); |
7703 ExpectToken(Token::kRPAREN); | 7703 ExpectToken(Token::kRPAREN); |
7704 | 7704 |
7705 OpenBlock(); // Implicit block around while loop. | 7705 OpenBlock(); // Implicit block around while loop. |
7706 | 7706 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7904 } | 7904 } |
7905 return condition; | 7905 return condition; |
7906 } | 7906 } |
7907 | 7907 |
7908 | 7908 |
7909 AstNode* Parser::ParseAssertStatement() { | 7909 AstNode* Parser::ParseAssertStatement() { |
7910 TRACE_PARSER("ParseAssertStatement"); | 7910 TRACE_PARSER("ParseAssertStatement"); |
7911 ConsumeToken(); // Consume assert keyword. | 7911 ConsumeToken(); // Consume assert keyword. |
7912 ExpectToken(Token::kLPAREN); | 7912 ExpectToken(Token::kLPAREN); |
7913 const intptr_t condition_pos = TokenPos(); | 7913 const intptr_t condition_pos = TokenPos(); |
7914 if (!FLAG_enable_asserts && !FLAG_enable_type_checks) { | 7914 if (!I->AssertsEnabled() && !I->TypeChecksEnabled()) { |
7915 SkipExpr(); | 7915 SkipExpr(); |
7916 ExpectToken(Token::kRPAREN); | 7916 ExpectToken(Token::kRPAREN); |
7917 return NULL; | 7917 return NULL; |
7918 } | 7918 } |
7919 AstNode* condition = ParseExpr(kAllowConst, kConsumeCascades); | 7919 AstNode* condition = ParseExpr(kAllowConst, kConsumeCascades); |
7920 const intptr_t condition_end = TokenPos(); | 7920 const intptr_t condition_end = TokenPos(); |
7921 ExpectToken(Token::kRPAREN); | 7921 ExpectToken(Token::kRPAREN); |
7922 condition = InsertClosureCallNodes(condition); | 7922 condition = InsertClosureCallNodes(condition); |
7923 condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition); | 7923 condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition); |
7924 AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end); | 7924 AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end); |
(...skipping 2889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10814 ASSERT(!element_type.IsMalformed()); // Would be mapped to dynamic. | 10814 ASSERT(!element_type.IsMalformed()); // Would be mapped to dynamic. |
10815 ASSERT(!element_type.IsMalbounded()); // No declared bound in List. | 10815 ASSERT(!element_type.IsMalbounded()); // No declared bound in List. |
10816 if (element_type.IsDynamicType()) { | 10816 if (element_type.IsDynamicType()) { |
10817 list_type_arguments = TypeArguments::null(); | 10817 list_type_arguments = TypeArguments::null(); |
10818 } else if (is_const && !element_type.IsInstantiated()) { | 10818 } else if (is_const && !element_type.IsInstantiated()) { |
10819 ReportError(type_pos, | 10819 ReportError(type_pos, |
10820 "the type argument of a constant list literal cannot " | 10820 "the type argument of a constant list literal cannot " |
10821 "include a type variable"); | 10821 "include a type variable"); |
10822 } | 10822 } |
10823 } else { | 10823 } else { |
10824 if (FLAG_error_on_bad_type) { | 10824 if (I->ErrorOnBadTypeEnabled()) { |
10825 ReportError(type_pos, | 10825 ReportError(type_pos, |
10826 "a list literal takes one type argument specifying " | 10826 "a list literal takes one type argument specifying " |
10827 "the element type"); | 10827 "the element type"); |
10828 } | 10828 } |
10829 // Ignore type arguments. | 10829 // Ignore type arguments. |
10830 list_type_arguments = TypeArguments::null(); | 10830 list_type_arguments = TypeArguments::null(); |
10831 } | 10831 } |
10832 } | 10832 } |
10833 ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1)); | 10833 ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1)); |
10834 const Class& array_class = Class::Handle(Z, I->object_store()->array_class()); | 10834 const Class& array_class = Class::Handle(Z, I->object_store()->array_class()); |
10835 Type& type = Type::ZoneHandle(Z, | 10835 Type& type = Type::ZoneHandle(Z, |
10836 Type::New(array_class, list_type_arguments, type_pos)); | 10836 Type::New(array_class, list_type_arguments, type_pos)); |
10837 type ^= ClassFinalizer::FinalizeType( | 10837 type ^= ClassFinalizer::FinalizeType( |
10838 current_class(), type, ClassFinalizer::kCanonicalize); | 10838 current_class(), type, ClassFinalizer::kCanonicalize); |
10839 GrowableArray<AstNode*> element_list; | 10839 GrowableArray<AstNode*> element_list; |
10840 // Parse the list elements. Note: there may be an optional extra | 10840 // Parse the list elements. Note: there may be an optional extra |
10841 // comma after the last element. | 10841 // comma after the last element. |
10842 if (!is_empty_literal) { | 10842 if (!is_empty_literal) { |
10843 const bool saved_mode = SetAllowFunctionLiterals(true); | 10843 const bool saved_mode = SetAllowFunctionLiterals(true); |
10844 while (CurrentToken() != Token::kRBRACK) { | 10844 while (CurrentToken() != Token::kRBRACK) { |
10845 const intptr_t element_pos = TokenPos(); | 10845 const intptr_t element_pos = TokenPos(); |
10846 AstNode* element = ParseExpr(is_const, kConsumeCascades); | 10846 AstNode* element = ParseExpr(is_const, kConsumeCascades); |
10847 if (FLAG_enable_type_checks && | 10847 if (I->TypeChecksEnabled() && |
10848 !is_const && | 10848 !is_const && |
10849 !element_type.IsDynamicType()) { | 10849 !element_type.IsDynamicType()) { |
10850 element = new(Z) AssignableNode(element_pos, | 10850 element = new(Z) AssignableNode(element_pos, |
10851 element, | 10851 element, |
10852 element_type, | 10852 element_type, |
10853 Symbols::ListLiteralElement()); | 10853 Symbols::ListLiteralElement()); |
10854 } | 10854 } |
10855 element_list.Add(element); | 10855 element_list.Add(element); |
10856 if (CurrentToken() == Token::kCOMMA) { | 10856 if (CurrentToken() == Token::kCOMMA) { |
10857 ConsumeToken(); | 10857 ConsumeToken(); |
(...skipping 10 matching lines...) Expand all Loading... |
10868 Array& const_list = | 10868 Array& const_list = |
10869 Array::ZoneHandle(Z, Array::New(element_list.length(), Heap::kOld)); | 10869 Array::ZoneHandle(Z, Array::New(element_list.length(), Heap::kOld)); |
10870 const_list.SetTypeArguments( | 10870 const_list.SetTypeArguments( |
10871 TypeArguments::Handle(Z, list_type_arguments.Canonicalize())); | 10871 TypeArguments::Handle(Z, list_type_arguments.Canonicalize())); |
10872 Error& malformed_error = Error::Handle(Z); | 10872 Error& malformed_error = Error::Handle(Z); |
10873 for (int i = 0; i < element_list.length(); i++) { | 10873 for (int i = 0; i < element_list.length(); i++) { |
10874 AstNode* elem = element_list[i]; | 10874 AstNode* elem = element_list[i]; |
10875 // Arguments have been evaluated to a literal value already. | 10875 // Arguments have been evaluated to a literal value already. |
10876 ASSERT(elem->IsLiteralNode()); | 10876 ASSERT(elem->IsLiteralNode()); |
10877 ASSERT(!is_top_level_); // We cannot check unresolved types. | 10877 ASSERT(!is_top_level_); // We cannot check unresolved types. |
10878 if (FLAG_enable_type_checks && | 10878 if (I->TypeChecksEnabled() && |
10879 !element_type.IsDynamicType() && | 10879 !element_type.IsDynamicType() && |
10880 (!elem->AsLiteralNode()->literal().IsNull() && | 10880 (!elem->AsLiteralNode()->literal().IsNull() && |
10881 !elem->AsLiteralNode()->literal().IsInstanceOf( | 10881 !elem->AsLiteralNode()->literal().IsInstanceOf( |
10882 element_type, | 10882 element_type, |
10883 TypeArguments::Handle(Z), | 10883 TypeArguments::Handle(Z), |
10884 &malformed_error))) { | 10884 &malformed_error))) { |
10885 // If the failure is due to a malformed type error, display it instead. | 10885 // If the failure is due to a malformed type error, display it instead. |
10886 if (!malformed_error.IsNull()) { | 10886 if (!malformed_error.IsNull()) { |
10887 ReportError(malformed_error); | 10887 ReportError(malformed_error); |
10888 } else { | 10888 } else { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11011 // No declared bounds in Map. | 11011 // No declared bounds in Map. |
11012 ASSERT(!key_type.IsMalbounded() && !value_type.IsMalbounded()); | 11012 ASSERT(!key_type.IsMalbounded() && !value_type.IsMalbounded()); |
11013 if (key_type.IsDynamicType() && value_type.IsDynamicType()) { | 11013 if (key_type.IsDynamicType() && value_type.IsDynamicType()) { |
11014 map_type_arguments = TypeArguments::null(); | 11014 map_type_arguments = TypeArguments::null(); |
11015 } else if (is_const && !type_arguments.IsInstantiated()) { | 11015 } else if (is_const && !type_arguments.IsInstantiated()) { |
11016 ReportError(type_pos, | 11016 ReportError(type_pos, |
11017 "the type arguments of a constant map literal cannot " | 11017 "the type arguments of a constant map literal cannot " |
11018 "include a type variable"); | 11018 "include a type variable"); |
11019 } | 11019 } |
11020 } else { | 11020 } else { |
11021 if (FLAG_error_on_bad_type) { | 11021 if (I->ErrorOnBadTypeEnabled()) { |
11022 ReportError(type_pos, | 11022 ReportError(type_pos, |
11023 "a map literal takes two type arguments specifying " | 11023 "a map literal takes two type arguments specifying " |
11024 "the key type and the value type"); | 11024 "the key type and the value type"); |
11025 } | 11025 } |
11026 // Ignore type arguments. | 11026 // Ignore type arguments. |
11027 map_type_arguments = TypeArguments::null(); | 11027 map_type_arguments = TypeArguments::null(); |
11028 } | 11028 } |
11029 } | 11029 } |
11030 ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2)); | 11030 ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2)); |
11031 map_type_arguments ^= map_type_arguments.Canonicalize(); | 11031 map_type_arguments ^= map_type_arguments.Canonicalize(); |
11032 | 11032 |
11033 GrowableArray<AstNode*> kv_pairs_list; | 11033 GrowableArray<AstNode*> kv_pairs_list; |
11034 // Parse the map entries. Note: there may be an optional extra | 11034 // Parse the map entries. Note: there may be an optional extra |
11035 // comma after the last entry. | 11035 // comma after the last entry. |
11036 while (CurrentToken() != Token::kRBRACE) { | 11036 while (CurrentToken() != Token::kRBRACE) { |
11037 const bool saved_mode = SetAllowFunctionLiterals(true); | 11037 const bool saved_mode = SetAllowFunctionLiterals(true); |
11038 const intptr_t key_pos = TokenPos(); | 11038 const intptr_t key_pos = TokenPos(); |
11039 AstNode* key = ParseExpr(is_const, kConsumeCascades); | 11039 AstNode* key = ParseExpr(is_const, kConsumeCascades); |
11040 if (FLAG_enable_type_checks && | 11040 if (I->TypeChecksEnabled() && |
11041 !is_const && | 11041 !is_const && |
11042 !key_type.IsDynamicType()) { | 11042 !key_type.IsDynamicType()) { |
11043 key = new(Z) AssignableNode( | 11043 key = new(Z) AssignableNode( |
11044 key_pos, key, key_type, Symbols::ListLiteralElement()); | 11044 key_pos, key, key_type, Symbols::ListLiteralElement()); |
11045 } | 11045 } |
11046 if (is_const) { | 11046 if (is_const) { |
11047 ASSERT(key->IsLiteralNode()); | 11047 ASSERT(key->IsLiteralNode()); |
11048 const Instance& key_value = key->AsLiteralNode()->literal(); | 11048 const Instance& key_value = key->AsLiteralNode()->literal(); |
11049 if (key_value.IsDouble()) { | 11049 if (key_value.IsDouble()) { |
11050 ReportError(key_pos, "key value must not be of type double"); | 11050 ReportError(key_pos, "key value must not be of type double"); |
11051 } | 11051 } |
11052 if (!key_value.IsInteger() && | 11052 if (!key_value.IsInteger() && |
11053 !key_value.IsString() && | 11053 !key_value.IsString() && |
11054 (key_value.clazz() != I->object_store()->symbol_class()) && | 11054 (key_value.clazz() != I->object_store()->symbol_class()) && |
11055 ImplementsEqualOperator(key_value)) { | 11055 ImplementsEqualOperator(key_value)) { |
11056 ReportError(key_pos, "key value must not implement operator =="); | 11056 ReportError(key_pos, "key value must not implement operator =="); |
11057 } | 11057 } |
11058 } | 11058 } |
11059 ExpectToken(Token::kCOLON); | 11059 ExpectToken(Token::kCOLON); |
11060 const intptr_t value_pos = TokenPos(); | 11060 const intptr_t value_pos = TokenPos(); |
11061 AstNode* value = ParseExpr(is_const, kConsumeCascades); | 11061 AstNode* value = ParseExpr(is_const, kConsumeCascades); |
11062 SetAllowFunctionLiterals(saved_mode); | 11062 SetAllowFunctionLiterals(saved_mode); |
11063 if (FLAG_enable_type_checks && | 11063 if (I->TypeChecksEnabled() && |
11064 !is_const && | 11064 !is_const && |
11065 !value_type.IsDynamicType()) { | 11065 !value_type.IsDynamicType()) { |
11066 value = new(Z) AssignableNode( | 11066 value = new(Z) AssignableNode( |
11067 value_pos, value, value_type, Symbols::ListLiteralElement()); | 11067 value_pos, value, value_type, Symbols::ListLiteralElement()); |
11068 } | 11068 } |
11069 AddKeyValuePair(&kv_pairs_list, is_const, key, value); | 11069 AddKeyValuePair(&kv_pairs_list, is_const, key, value); |
11070 | 11070 |
11071 if (CurrentToken() == Token::kCOMMA) { | 11071 if (CurrentToken() == Token::kCOMMA) { |
11072 ConsumeToken(); | 11072 ConsumeToken(); |
11073 } else if (CurrentToken() != Token::kRBRACE) { | 11073 } else if (CurrentToken() != Token::kRBRACE) { |
(...skipping 11 matching lines...) Expand all Loading... |
11085 // First, create the canonicalized key-value pair array. | 11085 // First, create the canonicalized key-value pair array. |
11086 Array& key_value_array = | 11086 Array& key_value_array = |
11087 Array::ZoneHandle(Z, Array::New(kv_pairs_list.length(), Heap::kOld)); | 11087 Array::ZoneHandle(Z, Array::New(kv_pairs_list.length(), Heap::kOld)); |
11088 AbstractType& arg_type = Type::Handle(Z); | 11088 AbstractType& arg_type = Type::Handle(Z); |
11089 Error& malformed_error = Error::Handle(Z); | 11089 Error& malformed_error = Error::Handle(Z); |
11090 for (int i = 0; i < kv_pairs_list.length(); i++) { | 11090 for (int i = 0; i < kv_pairs_list.length(); i++) { |
11091 AstNode* arg = kv_pairs_list[i]; | 11091 AstNode* arg = kv_pairs_list[i]; |
11092 // Arguments have been evaluated to a literal value already. | 11092 // Arguments have been evaluated to a literal value already. |
11093 ASSERT(arg->IsLiteralNode()); | 11093 ASSERT(arg->IsLiteralNode()); |
11094 ASSERT(!is_top_level_); // We cannot check unresolved types. | 11094 ASSERT(!is_top_level_); // We cannot check unresolved types. |
11095 if (FLAG_enable_type_checks) { | 11095 if (I->TypeChecksEnabled()) { |
11096 if ((i % 2) == 0) { | 11096 if ((i % 2) == 0) { |
11097 // Check key type. | 11097 // Check key type. |
11098 arg_type = key_type.raw(); | 11098 arg_type = key_type.raw(); |
11099 } else { | 11099 } else { |
11100 // Check value type. | 11100 // Check value type. |
11101 arg_type = value_type.raw(); | 11101 arg_type = value_type.raw(); |
11102 } | 11102 } |
11103 if (!arg_type.IsDynamicType() && | 11103 if (!arg_type.IsDynamicType() && |
11104 (!arg->AsLiteralNode()->literal().IsNull() && | 11104 (!arg->AsLiteralNode()->literal().IsNull() && |
11105 !arg->AsLiteralNode()->literal().IsInstanceOf( | 11105 !arg->AsLiteralNode()->literal().IsInstanceOf( |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11410 "redirecting factory type '%s' cannot be instantiated", | 11410 "redirecting factory type '%s' cannot be instantiated", |
11411 String::Handle(Z, redirect_type.UserVisibleName()).ToCString()); | 11411 String::Handle(Z, redirect_type.UserVisibleName()).ToCString()); |
11412 } | 11412 } |
11413 } | 11413 } |
11414 if (redirect_type.IsMalformedOrMalbounded()) { | 11414 if (redirect_type.IsMalformedOrMalbounded()) { |
11415 if (is_const) { | 11415 if (is_const) { |
11416 ReportError(Error::Handle(Z, redirect_type.error())); | 11416 ReportError(Error::Handle(Z, redirect_type.error())); |
11417 } | 11417 } |
11418 return ThrowTypeError(redirect_type.token_pos(), redirect_type); | 11418 return ThrowTypeError(redirect_type.token_pos(), redirect_type); |
11419 } | 11419 } |
11420 if (FLAG_enable_type_checks && !redirect_type.IsSubtypeOf(type, NULL)) { | 11420 if (I->TypeChecksEnabled() && !redirect_type.IsSubtypeOf(type, NULL)) { |
11421 // Additional type checking of the result is necessary. | 11421 // Additional type checking of the result is necessary. |
11422 type_bound = type.raw(); | 11422 type_bound = type.raw(); |
11423 } | 11423 } |
11424 type = redirect_type.raw(); | 11424 type = redirect_type.raw(); |
11425 type_class = type.type_class(); | 11425 type_class = type.type_class(); |
11426 type_class_name = type_class.Name(); | 11426 type_class_name = type_class.Name(); |
11427 type_arguments = type.arguments(); | 11427 type_arguments = type.arguments(); |
11428 constructor = constructor.RedirectionTarget(); | 11428 constructor = constructor.RedirectionTarget(); |
11429 constructor_name = constructor.name(); | 11429 constructor_name = constructor.name(); |
11430 ASSERT(!constructor.IsNull()); | 11430 ASSERT(!constructor.IsNull()); |
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12232 void Parser::SkipQualIdent() { | 12232 void Parser::SkipQualIdent() { |
12233 ASSERT(IsIdentifier()); | 12233 ASSERT(IsIdentifier()); |
12234 ConsumeToken(); | 12234 ConsumeToken(); |
12235 if (CurrentToken() == Token::kPERIOD) { | 12235 if (CurrentToken() == Token::kPERIOD) { |
12236 ConsumeToken(); // Consume the kPERIOD token. | 12236 ConsumeToken(); // Consume the kPERIOD token. |
12237 ExpectIdentifier("identifier expected after '.'"); | 12237 ExpectIdentifier("identifier expected after '.'"); |
12238 } | 12238 } |
12239 } | 12239 } |
12240 | 12240 |
12241 } // namespace dart | 12241 } // namespace dart |
OLD | NEW |