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 #include "vm/flags.h" | 6 #include "vm/flags.h" |
7 | 7 |
8 #ifndef DART_PRECOMPILED | 8 #ifndef DART_PRECOMPILED |
9 | 9 |
10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 // finalized yet. | 131 // finalized yet. |
132 return a.raw(); | 132 return a.raw(); |
133 } | 133 } |
134 | 134 |
135 | 135 |
136 LocalVariable* ParsedFunction::EnsureExpressionTemp() { | 136 LocalVariable* ParsedFunction::EnsureExpressionTemp() { |
137 if (!has_expression_temp_var()) { | 137 if (!has_expression_temp_var()) { |
138 LocalVariable* temp = | 138 LocalVariable* temp = |
139 new (Z) LocalVariable(function_.token_pos(), | 139 new (Z) LocalVariable(function_.token_pos(), |
140 Symbols::ExprTemp(), | 140 Symbols::ExprTemp(), |
141 Type::ZoneHandle(Type::DynamicType())); | 141 Object::dynamic_type()); |
142 ASSERT(temp != NULL); | 142 ASSERT(temp != NULL); |
143 set_expression_temp_var(temp); | 143 set_expression_temp_var(temp); |
144 } | 144 } |
145 ASSERT(has_expression_temp_var()); | 145 ASSERT(has_expression_temp_var()); |
146 return expression_temp_var(); | 146 return expression_temp_var(); |
147 } | 147 } |
148 | 148 |
149 | 149 |
150 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) { | 150 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) { |
151 if (!has_finally_return_temp_var()) { | 151 if (!has_finally_return_temp_var()) { |
152 LocalVariable* temp = new(Z) LocalVariable( | 152 LocalVariable* temp = new(Z) LocalVariable( |
153 function_.token_pos(), | 153 function_.token_pos(), |
154 String::ZoneHandle(Z, Symbols::New(":finally_ret_val")), | 154 String::ZoneHandle(Z, Symbols::New(":finally_ret_val")), |
155 Type::ZoneHandle(Z, Type::DynamicType())); | 155 Object::dynamic_type()); |
156 ASSERT(temp != NULL); | 156 ASSERT(temp != NULL); |
157 temp->set_is_final(); | 157 temp->set_is_final(); |
158 if (is_async) { | 158 if (is_async) { |
159 temp->set_is_captured(); | 159 temp->set_is_captured(); |
160 } | 160 } |
161 set_finally_return_temp_var(temp); | 161 set_finally_return_temp_var(temp); |
162 } | 162 } |
163 ASSERT(has_finally_return_temp_var()); | 163 ASSERT(has_finally_return_temp_var()); |
164 } | 164 } |
165 | 165 |
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 bool implicitly_final; | 603 bool implicitly_final; |
604 bool skipped; | 604 bool skipped; |
605 ZoneGrowableArray<ParamDesc>* parameters; | 605 ZoneGrowableArray<ParamDesc>* parameters; |
606 }; | 606 }; |
607 | 607 |
608 | 608 |
609 struct MemberDesc { | 609 struct MemberDesc { |
610 MemberDesc() { | 610 MemberDesc() { |
611 Clear(); | 611 Clear(); |
612 } | 612 } |
| 613 |
613 void Clear() { | 614 void Clear() { |
614 has_abstract = false; | 615 has_abstract = false; |
615 has_external = false; | 616 has_external = false; |
616 has_final = false; | 617 has_final = false; |
617 has_const = false; | 618 has_const = false; |
618 has_static = false; | 619 has_static = false; |
619 has_var = false; | 620 has_var = false; |
620 has_factory = false; | 621 has_factory = false; |
621 has_operator = false; | 622 has_operator = false; |
622 has_native = false; | 623 has_native = false; |
623 metadata_pos = -1; | 624 metadata_pos = -1; |
624 operator_token = Token::kILLEGAL; | 625 operator_token = Token::kILLEGAL; |
625 type = NULL; | 626 type = NULL; |
626 name_pos = 0; | 627 name_pos = 0; |
627 name = NULL; | 628 name = NULL; |
628 redirect_name = NULL; | 629 redirect_name = NULL; |
629 dict_name = NULL; | 630 dict_name = NULL; |
630 params.Clear(); | 631 params.Clear(); |
631 kind = RawFunction::kRegularFunction; | 632 kind = RawFunction::kRegularFunction; |
632 field_ = NULL; | 633 field_ = NULL; |
633 } | 634 } |
| 635 |
634 bool IsConstructor() const { | 636 bool IsConstructor() const { |
635 return (kind == RawFunction::kConstructor) && !has_static; | 637 return (kind == RawFunction::kConstructor) && !has_static; |
636 } | 638 } |
637 bool IsFactory() const { | 639 bool IsFactory() const { |
638 return (kind == RawFunction::kConstructor) && has_static; | 640 return (kind == RawFunction::kConstructor) && has_static; |
639 } | 641 } |
640 bool IsFactoryOrConstructor() const { | 642 bool IsFactoryOrConstructor() const { |
641 return (kind == RawFunction::kConstructor); | 643 return (kind == RawFunction::kConstructor); |
642 } | 644 } |
643 bool IsGetter() const { | 645 bool IsGetter() const { |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1351 Function& constructor = Function::ZoneHandle(Z); | 1353 Function& constructor = Function::ZoneHandle(Z); |
1352 TypeArguments& type_args = TypeArguments::ZoneHandle(Z); | 1354 TypeArguments& type_args = TypeArguments::ZoneHandle(Z); |
1353 ParseConstructorClosurization(&constructor, &type_args); | 1355 ParseConstructorClosurization(&constructor, &type_args); |
1354 ASSERT(!constructor.IsNull()); | 1356 ASSERT(!constructor.IsNull()); |
1355 | 1357 |
1356 ParamList params; | 1358 ParamList params; |
1357 // The first parameter of the closure function is the implicit closure | 1359 // The first parameter of the closure function is the implicit closure |
1358 // argument. | 1360 // argument. |
1359 params.AddFinalParameter(token_pos, | 1361 params.AddFinalParameter(token_pos, |
1360 &Symbols::ClosureParameter(), | 1362 &Symbols::ClosureParameter(), |
1361 &Type::ZoneHandle(Z, Type::DynamicType())); | 1363 &Object::dynamic_type()); |
1362 bool params_ok = ParseFormalParameters(constructor, ¶ms); | 1364 bool params_ok = ParseFormalParameters(constructor, ¶ms); |
1363 USE(params_ok); | 1365 USE(params_ok); |
1364 ASSERT(params_ok); | 1366 ASSERT(params_ok); |
1365 // Per language spec, the type of the closure parameters is dynamic. | 1367 // Per language spec, the type of the closure parameters is dynamic. |
1366 // Replace the types parsed from the constructor. | 1368 // Replace the types parsed from the constructor. |
1367 params.EraseParameterTypes(); | 1369 params.EraseParameterTypes(); |
1368 | 1370 |
1369 SetupDefaultsForOptionalParams(params); | 1371 SetupDefaultsForOptionalParams(params); |
1370 ASSERT(func.num_fixed_parameters() == params.num_fixed_parameters); | 1372 ASSERT(func.num_fixed_parameters() == params.num_fixed_parameters); |
1371 ASSERT(func.NumOptionalParameters() == params.num_optional_parameters); | 1373 ASSERT(func.NumOptionalParameters() == params.num_optional_parameters); |
(...skipping 29 matching lines...) Expand all Loading... |
1401 SequenceNode* Parser::ParseImplicitClosure(const Function& func) { | 1403 SequenceNode* Parser::ParseImplicitClosure(const Function& func) { |
1402 TRACE_PARSER("ParseImplicitClosure"); | 1404 TRACE_PARSER("ParseImplicitClosure"); |
1403 intptr_t token_pos = func.token_pos(); | 1405 intptr_t token_pos = func.token_pos(); |
1404 | 1406 |
1405 OpenFunctionBlock(func); | 1407 OpenFunctionBlock(func); |
1406 | 1408 |
1407 ParamList params; | 1409 ParamList params; |
1408 params.AddFinalParameter( | 1410 params.AddFinalParameter( |
1409 token_pos, | 1411 token_pos, |
1410 &Symbols::ClosureParameter(), | 1412 &Symbols::ClosureParameter(), |
1411 &Type::ZoneHandle(Type::DynamicType())); | 1413 &Object::dynamic_type()); |
1412 | 1414 |
1413 const Function& parent = Function::ZoneHandle(func.parent_function()); | 1415 const Function& parent = Function::ZoneHandle(func.parent_function()); |
1414 if (parent.IsImplicitSetterFunction()) { | 1416 if (parent.IsImplicitSetterFunction()) { |
1415 const intptr_t ident_pos = func.token_pos(); | 1417 const intptr_t ident_pos = func.token_pos(); |
1416 ASSERT(IsIdentifier()); | 1418 ASSERT(IsIdentifier()); |
1417 const String& field_name = *CurrentLiteral(); | 1419 const String& field_name = *CurrentLiteral(); |
1418 const Class& field_class = Class::ZoneHandle(Z, parent.Owner()); | 1420 const Class& field_class = Class::ZoneHandle(Z, parent.Owner()); |
1419 const Field& field = | 1421 const Field& field = |
1420 Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name)); | 1422 Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name)); |
1421 const AbstractType& field_type = AbstractType::ZoneHandle(Z, field.type()); | 1423 const AbstractType& field_type = AbstractType::ZoneHandle(Z, field.type()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1499 // Receiver first. | 1501 // Receiver first. |
1500 intptr_t token_pos = func.token_pos(); | 1502 intptr_t token_pos = func.token_pos(); |
1501 params.AddReceiver(ReceiverType(current_class()), token_pos); | 1503 params.AddReceiver(ReceiverType(current_class()), token_pos); |
1502 // Remaining positional parameters. | 1504 // Remaining positional parameters. |
1503 intptr_t i = 1; | 1505 intptr_t i = 1; |
1504 for (; i < desc.PositionalCount(); ++i) { | 1506 for (; i < desc.PositionalCount(); ++i) { |
1505 ParamDesc p; | 1507 ParamDesc p; |
1506 char name[64]; | 1508 char name[64]; |
1507 OS::SNPrint(name, 64, ":p%" Pd, i); | 1509 OS::SNPrint(name, 64, ":p%" Pd, i); |
1508 p.name = &String::ZoneHandle(Z, Symbols::New(name)); | 1510 p.name = &String::ZoneHandle(Z, Symbols::New(name)); |
1509 p.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 1511 p.type = &Object::dynamic_type(); |
1510 params.parameters->Add(p); | 1512 params.parameters->Add(p); |
1511 params.num_fixed_parameters++; | 1513 params.num_fixed_parameters++; |
1512 } | 1514 } |
1513 ASSERT(desc.PositionalCount() == params.num_fixed_parameters); | 1515 ASSERT(desc.PositionalCount() == params.num_fixed_parameters); |
1514 | 1516 |
1515 // Named parameters. | 1517 // Named parameters. |
1516 for (; i < desc.Count(); ++i) { | 1518 for (; i < desc.Count(); ++i) { |
1517 ParamDesc p; | 1519 ParamDesc p; |
1518 intptr_t index = i - desc.PositionalCount(); | 1520 intptr_t index = i - desc.PositionalCount(); |
1519 p.name = &String::ZoneHandle(Z, desc.NameAt(index)); | 1521 p.name = &String::ZoneHandle(Z, desc.NameAt(index)); |
1520 p.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 1522 p.type = &Object::dynamic_type(); |
1521 p.default_value = &Object::null_instance(); | 1523 p.default_value = &Object::null_instance(); |
1522 params.parameters->Add(p); | 1524 params.parameters->Add(p); |
1523 params.num_optional_parameters++; | 1525 params.num_optional_parameters++; |
1524 params.has_optional_named_parameters = true; | 1526 params.has_optional_named_parameters = true; |
1525 } | 1527 } |
1526 ASSERT(desc.NamedCount() == params.num_optional_parameters); | 1528 ASSERT(desc.NamedCount() == params.num_optional_parameters); |
1527 | 1529 |
1528 SetupDefaultsForOptionalParams(params); | 1530 SetupDefaultsForOptionalParams(params); |
1529 | 1531 |
1530 // Build local scope for function and populate with the formal parameters. | 1532 // Build local scope for function and populate with the formal parameters. |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1761 | 1763 |
1762 if (CurrentToken() == Token::kFINAL) { | 1764 if (CurrentToken() == Token::kFINAL) { |
1763 ConsumeToken(); | 1765 ConsumeToken(); |
1764 parameter.is_final = true; | 1766 parameter.is_final = true; |
1765 } else if (CurrentToken() == Token::kVAR) { | 1767 } else if (CurrentToken() == Token::kVAR) { |
1766 ConsumeToken(); | 1768 ConsumeToken(); |
1767 var_seen = true; | 1769 var_seen = true; |
1768 // The parameter type is the 'dynamic' type. | 1770 // The parameter type is the 'dynamic' type. |
1769 // If this is an initializing formal, its type will be set to the type of | 1771 // If this is an initializing formal, its type will be set to the type of |
1770 // the respective field when the constructor is fully parsed. | 1772 // the respective field when the constructor is fully parsed. |
1771 parameter.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 1773 parameter.type = &Object::dynamic_type(); |
1772 } | 1774 } |
1773 if (CurrentToken() == Token::kTHIS) { | 1775 if (CurrentToken() == Token::kTHIS) { |
1774 ConsumeToken(); | 1776 ConsumeToken(); |
1775 ExpectToken(Token::kPERIOD); | 1777 ExpectToken(Token::kPERIOD); |
1776 this_seen = true; | 1778 this_seen = true; |
1777 parameter.is_field_initializer = true; | 1779 parameter.is_field_initializer = true; |
1778 } | 1780 } |
1779 if ((parameter.type == NULL) && (CurrentToken() == Token::kVOID)) { | 1781 if ((parameter.type == NULL) && (CurrentToken() == Token::kVOID)) { |
1780 ConsumeToken(); | 1782 ConsumeToken(); |
1781 // This must later be changed to a closure type if we recognize | 1783 // This must later be changed to a closure type if we recognize |
1782 // a closure/function type parameter. We check this at the end | 1784 // a closure/function type parameter. We check this at the end |
1783 // of ParseFormalParameter. | 1785 // of ParseFormalParameter. |
1784 parameter.type = &Type::ZoneHandle(Z, Type::VoidType()); | 1786 parameter.type = &Object::void_type(); |
1785 } | 1787 } |
1786 if (parameter.type == NULL) { | 1788 if (parameter.type == NULL) { |
1787 // At this point, we must see an identifier for the type or the | 1789 // At this point, we must see an identifier for the type or the |
1788 // function parameter. | 1790 // function parameter. |
1789 if (!IsIdentifier()) { | 1791 if (!IsIdentifier()) { |
1790 ReportError("parameter name or type expected"); | 1792 ReportError("parameter name or type expected"); |
1791 } | 1793 } |
1792 // We have not seen a parameter type yet, so we check if the next | 1794 // We have not seen a parameter type yet, so we check if the next |
1793 // identifier could represent a type before parsing it. | 1795 // identifier could represent a type before parsing it. |
1794 Token::Kind follower = LookaheadToken(1); | 1796 Token::Kind follower = LookaheadToken(1); |
1795 // We have an identifier followed by a 'follower' token. | 1797 // We have an identifier followed by a 'follower' token. |
1796 // We either parse a type or assume that no type is specified. | 1798 // We either parse a type or assume that no type is specified. |
1797 if ((follower == Token::kLT) || // Parameterized type. | 1799 if ((follower == Token::kLT) || // Parameterized type. |
1798 (follower == Token::kPERIOD) || // Qualified class name of type. | 1800 (follower == Token::kPERIOD) || // Qualified class name of type. |
1799 Token::IsIdentifier(follower) || // Parameter name following a type. | 1801 Token::IsIdentifier(follower) || // Parameter name following a type. |
1800 (follower == Token::kTHIS)) { // Field parameter following a type. | 1802 (follower == Token::kTHIS)) { // Field parameter following a type. |
1801 // The types of formal parameters are never ignored, even in unchecked | 1803 // The types of formal parameters are never ignored, even in unchecked |
1802 // mode, because they are part of the function type of closurized | 1804 // mode, because they are part of the function type of closurized |
1803 // functions appearing in type tests with typedefs. | 1805 // functions appearing in type tests with typedefs. |
1804 parameter.has_explicit_type = true; | 1806 parameter.has_explicit_type = true; |
1805 parameter.type = &AbstractType::ZoneHandle(Z, | 1807 parameter.type = &AbstractType::ZoneHandle(Z, |
1806 ParseType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters : | 1808 ParseType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters : |
1807 ClassFinalizer::kCanonicalize)); | 1809 ClassFinalizer::kCanonicalize)); |
1808 } else { | 1810 } else { |
1809 // If this is an initializing formal, its type will be set to the type of | 1811 // If this is an initializing formal, its type will be set to the type of |
1810 // the respective field when the constructor is fully parsed. | 1812 // the respective field when the constructor is fully parsed. |
1811 parameter.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 1813 parameter.type = &Object::dynamic_type(); |
1812 } | 1814 } |
1813 } | 1815 } |
1814 if (!this_seen && (CurrentToken() == Token::kTHIS)) { | 1816 if (!this_seen && (CurrentToken() == Token::kTHIS)) { |
1815 ConsumeToken(); | 1817 ConsumeToken(); |
1816 ExpectToken(Token::kPERIOD); | 1818 ExpectToken(Token::kPERIOD); |
1817 this_seen = true; | 1819 this_seen = true; |
1818 parameter.is_field_initializer = true; | 1820 parameter.is_field_initializer = true; |
1819 } | 1821 } |
1820 | 1822 |
1821 // At this point, we must see an identifier for the parameter name. | 1823 // At this point, we must see an identifier for the parameter name. |
(...skipping 28 matching lines...) Expand all Loading... |
1850 const AbstractType& result_type = | 1852 const AbstractType& result_type = |
1851 AbstractType::Handle(Z, parameter.type->raw()); | 1853 AbstractType::Handle(Z, parameter.type->raw()); |
1852 | 1854 |
1853 // Finish parsing the function type parameter. | 1855 // Finish parsing the function type parameter. |
1854 ParamList func_params; | 1856 ParamList func_params; |
1855 | 1857 |
1856 // Add implicit closure object parameter. | 1858 // Add implicit closure object parameter. |
1857 func_params.AddFinalParameter( | 1859 func_params.AddFinalParameter( |
1858 TokenPos(), | 1860 TokenPos(), |
1859 &Symbols::ClosureParameter(), | 1861 &Symbols::ClosureParameter(), |
1860 &Type::ZoneHandle(Z, Type::DynamicType())); | 1862 &Object::dynamic_type()); |
1861 | 1863 |
1862 const bool no_explicit_default_values = false; | 1864 const bool no_explicit_default_values = false; |
1863 ParseFormalParameterList(no_explicit_default_values, false, &func_params); | 1865 ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
1864 | 1866 |
1865 // In top-level and mixin functions, the source may be in a different | 1867 // In top-level and mixin functions, the source may be in a different |
1866 // script than the script of the current class. | 1868 // script than the script of the current class. |
1867 Object& sig_func_owner = Object::Handle(Z, current_class().raw()); | 1869 Object& sig_func_owner = Object::Handle(Z, current_class().raw()); |
1868 if (current_class().script() != script_.raw()) { | 1870 if (current_class().script() != script_.raw()) { |
1869 sig_func_owner = PatchClass::New(current_class(), script_); | 1871 sig_func_owner = PatchClass::New(current_class(), script_); |
1870 } | 1872 } |
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2923 String::Handle(Z, super_class.Name()).ToCString()); | 2925 String::Handle(Z, super_class.Name()).ToCString()); |
2924 } | 2926 } |
2925 | 2927 |
2926 // Prepare user-defined arguments to be forwarded to super call. | 2928 // Prepare user-defined arguments to be forwarded to super call. |
2927 // The first user-defined argument is at position 2. | 2929 // The first user-defined argument is at position 2. |
2928 forwarding_args = new ArgumentListNode(Scanner::kNoSourcePos); | 2930 forwarding_args = new ArgumentListNode(Scanner::kNoSourcePos); |
2929 for (int i = 2; i < func.NumParameters(); i++) { | 2931 for (int i = 2; i < func.NumParameters(); i++) { |
2930 LocalVariable* param = new LocalVariable( | 2932 LocalVariable* param = new LocalVariable( |
2931 Scanner::kNoSourcePos, | 2933 Scanner::kNoSourcePos, |
2932 String::ZoneHandle(Z, func.ParameterNameAt(i)), | 2934 String::ZoneHandle(Z, func.ParameterNameAt(i)), |
2933 Type::ZoneHandle(Z, Type::DynamicType())); | 2935 Object::dynamic_type()); |
2934 current_block_->scope->InsertParameterAt(i, param); | 2936 current_block_->scope->InsertParameterAt(i, param); |
2935 forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param)); | 2937 forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param)); |
2936 } | 2938 } |
2937 } | 2939 } |
2938 | 2940 |
2939 AstNode* super_call = GenerateSuperConstructorCall( | 2941 AstNode* super_call = GenerateSuperConstructorCall( |
2940 current_class(), | 2942 current_class(), |
2941 Scanner::kNoSourcePos, | 2943 Scanner::kNoSourcePos, |
2942 receiver, | 2944 receiver, |
2943 new LoadLocalNode(Scanner::kNoSourcePos, phase_parameter), | 2945 new LoadLocalNode(Scanner::kNoSourcePos, phase_parameter), |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3308 | 3310 |
3309 ParamList params; | 3311 ParamList params; |
3310 // An instance closure function may capture and access the receiver, but via | 3312 // An instance closure function may capture and access the receiver, but via |
3311 // the context and not via the first formal parameter. | 3313 // the context and not via the first formal parameter. |
3312 if (func.IsClosureFunction()) { | 3314 if (func.IsClosureFunction()) { |
3313 // The first parameter of a closure function is the closure object. | 3315 // The first parameter of a closure function is the closure object. |
3314 ASSERT(!func.is_const()); // Closure functions cannot be const. | 3316 ASSERT(!func.is_const()); // Closure functions cannot be const. |
3315 params.AddFinalParameter( | 3317 params.AddFinalParameter( |
3316 TokenPos(), | 3318 TokenPos(), |
3317 &Symbols::ClosureParameter(), | 3319 &Symbols::ClosureParameter(), |
3318 &Type::ZoneHandle(Z, Type::DynamicType())); | 3320 &Object::dynamic_type()); |
3319 } else if (!func.is_static()) { | 3321 } else if (!func.is_static()) { |
3320 // Static functions do not have a receiver. | 3322 // Static functions do not have a receiver. |
3321 ASSERT(current_class().raw() == func.Owner()); | 3323 ASSERT(current_class().raw() == func.Owner()); |
3322 params.AddReceiver(ReceiverType(current_class()), func.token_pos()); | 3324 params.AddReceiver(ReceiverType(current_class()), func.token_pos()); |
3323 } else if (func.IsFactory()) { | 3325 } else if (func.IsFactory()) { |
3324 // The first parameter of a factory is the TypeArguments vector of | 3326 // The first parameter of a factory is the TypeArguments vector of |
3325 // the type of the instance to be allocated. | 3327 // the type of the instance to be allocated. |
3326 params.AddFinalParameter( | 3328 params.AddFinalParameter( |
3327 TokenPos(), | 3329 TokenPos(), |
3328 &Symbols::TypeArgumentsParameter(), | 3330 &Symbols::TypeArgumentsParameter(), |
3329 &Type::ZoneHandle(Z, Type::DynamicType())); | 3331 &Object::dynamic_type()); |
3330 } | 3332 } |
3331 // Expect the parameter list unless this is a getter function, or the | 3333 // Expect the parameter list unless this is a getter function, or the |
3332 // body closure of an async or generator getter function. | 3334 // body closure of an async or generator getter function. |
3333 ASSERT((CurrentToken() == Token::kLPAREN) || | 3335 ASSERT((CurrentToken() == Token::kLPAREN) || |
3334 func.IsGetterFunction() || | 3336 func.IsGetterFunction() || |
3335 (func.is_generated_body() && | 3337 (func.is_generated_body() && |
3336 Function::Handle(func.parent_function()).IsGetterFunction())); | 3338 Function::Handle(func.parent_function()).IsGetterFunction())); |
3337 const bool allow_explicit_default_values = true; | 3339 const bool allow_explicit_default_values = true; |
3338 if (func.IsGetterFunction()) { | 3340 if (func.IsGetterFunction()) { |
3339 // Populate function scope with the formal parameters. Since in this case | 3341 // Populate function scope with the formal parameters. Since in this case |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3682 method->params.Clear(); | 3684 method->params.Clear(); |
3683 // Static functions do not have a receiver. | 3685 // Static functions do not have a receiver. |
3684 // The first parameter of a factory is the TypeArguments vector of | 3686 // The first parameter of a factory is the TypeArguments vector of |
3685 // the type of the instance to be allocated. | 3687 // the type of the instance to be allocated. |
3686 if (!method->has_static || method->IsConstructor()) { | 3688 if (!method->has_static || method->IsConstructor()) { |
3687 method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos); | 3689 method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos); |
3688 } else if (method->IsFactory()) { | 3690 } else if (method->IsFactory()) { |
3689 method->params.AddFinalParameter( | 3691 method->params.AddFinalParameter( |
3690 formal_param_pos, | 3692 formal_param_pos, |
3691 &Symbols::TypeArgumentsParameter(), | 3693 &Symbols::TypeArgumentsParameter(), |
3692 &Type::ZoneHandle(Z, Type::DynamicType())); | 3694 &Object::dynamic_type()); |
3693 } | 3695 } |
3694 // Constructors have an implicit parameter for the construction phase. | 3696 // Constructors have an implicit parameter for the construction phase. |
3695 if (method->IsConstructor()) { | 3697 if (method->IsConstructor()) { |
3696 method->params.AddFinalParameter( | 3698 method->params.AddFinalParameter( |
3697 TokenPos(), | 3699 TokenPos(), |
3698 &Symbols::PhaseParameter(), | 3700 &Symbols::PhaseParameter(), |
3699 &Type::ZoneHandle(Z, Type::SmiType())); | 3701 &Type::ZoneHandle(Z, Type::SmiType())); |
3700 } | 3702 } |
3701 if (are_implicitly_final) { | 3703 if (are_implicitly_final) { |
3702 method->params.SetImplicitlyFinal(); | 3704 method->params.SetImplicitlyFinal(); |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4149 /* is_external = */ false, | 4151 /* is_external = */ false, |
4150 /* is_native = */ false, | 4152 /* is_native = */ false, |
4151 current_class(), | 4153 current_class(), |
4152 field->name_pos); | 4154 field->name_pos); |
4153 ParamList params; | 4155 ParamList params; |
4154 ASSERT(current_class().raw() == setter.Owner()); | 4156 ASSERT(current_class().raw() == setter.Owner()); |
4155 params.AddReceiver(ReceiverType(current_class()), field->name_pos); | 4157 params.AddReceiver(ReceiverType(current_class()), field->name_pos); |
4156 params.AddFinalParameter(TokenPos(), | 4158 params.AddFinalParameter(TokenPos(), |
4157 &Symbols::Value(), | 4159 &Symbols::Value(), |
4158 field->type); | 4160 field->type); |
4159 setter.set_result_type(Type::Handle(Z, Type::VoidType())); | 4161 setter.set_result_type(Object::void_type()); |
4160 setter.set_is_debuggable(false); | 4162 setter.set_is_debuggable(false); |
4161 if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) { | 4163 if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) { |
4162 setter.set_is_reflectable(false); | 4164 setter.set_is_reflectable(false); |
4163 } | 4165 } |
4164 AddFormalParamsToFunction(¶ms, setter); | 4166 AddFormalParamsToFunction(¶ms, setter); |
4165 members->AddFunction(setter); | 4167 members->AddFunction(setter); |
4166 } | 4168 } |
4167 } | 4169 } |
4168 | 4170 |
4169 if (CurrentToken() != Token::kCOMMA) { | 4171 if (CurrentToken() != Token::kCOMMA) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4253 if (CurrentToken() == Token::kVAR) { | 4255 if (CurrentToken() == Token::kVAR) { |
4254 if (member.has_const) { | 4256 if (member.has_const) { |
4255 ReportError("identifier expected after 'const'"); | 4257 ReportError("identifier expected after 'const'"); |
4256 } | 4258 } |
4257 if (member.has_final) { | 4259 if (member.has_final) { |
4258 ReportError("identifier expected after 'final'"); | 4260 ReportError("identifier expected after 'final'"); |
4259 } | 4261 } |
4260 ConsumeToken(); | 4262 ConsumeToken(); |
4261 member.has_var = true; | 4263 member.has_var = true; |
4262 // The member type is the 'dynamic' type. | 4264 // The member type is the 'dynamic' type. |
4263 member.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 4265 member.type = &Object::dynamic_type(); |
4264 } else if (CurrentToken() == Token::kFACTORY) { | 4266 } else if (CurrentToken() == Token::kFACTORY) { |
4265 ConsumeToken(); | 4267 ConsumeToken(); |
4266 if (member.has_static) { | 4268 if (member.has_static) { |
4267 ReportError("factory method cannot be explicitly marked static"); | 4269 ReportError("factory method cannot be explicitly marked static"); |
4268 } | 4270 } |
4269 member.has_factory = true; | 4271 member.has_factory = true; |
4270 member.has_static = true; | 4272 member.has_static = true; |
4271 // The result type depends on the name of the factory method. | 4273 // The result type depends on the name of the factory method. |
4272 } | 4274 } |
4273 // Optionally parse a type. | 4275 // Optionally parse a type. |
4274 if (CurrentToken() == Token::kVOID) { | 4276 if (CurrentToken() == Token::kVOID) { |
4275 if (member.has_var || member.has_factory) { | 4277 if (member.has_var || member.has_factory) { |
4276 ReportError("void not expected"); | 4278 ReportError("void not expected"); |
4277 } | 4279 } |
4278 ConsumeToken(); | 4280 ConsumeToken(); |
4279 ASSERT(member.type == NULL); | 4281 ASSERT(member.type == NULL); |
4280 member.type = &Type::ZoneHandle(Z, Type::VoidType()); | 4282 member.type = &Object::void_type(); |
4281 } else if (CurrentToken() == Token::kIDENT) { | 4283 } else if (CurrentToken() == Token::kIDENT) { |
4282 // This is either a type name or the name of a method/constructor/field. | 4284 // This is either a type name or the name of a method/constructor/field. |
4283 if ((member.type == NULL) && !member.has_factory) { | 4285 if ((member.type == NULL) && !member.has_factory) { |
4284 // We have not seen a member type yet, so we check if the next | 4286 // We have not seen a member type yet, so we check if the next |
4285 // identifier could represent a type before parsing it. | 4287 // identifier could represent a type before parsing it. |
4286 Token::Kind follower = LookaheadToken(1); | 4288 Token::Kind follower = LookaheadToken(1); |
4287 // We have an identifier followed by a 'follower' token. | 4289 // We have an identifier followed by a 'follower' token. |
4288 // We either parse a type or assume that no type is specified. | 4290 // We either parse a type or assume that no type is specified. |
4289 if ((follower == Token::kLT) || // Parameterized type. | 4291 if ((follower == Token::kLT) || // Parameterized type. |
4290 (follower == Token::kGET) || // Getter following a type. | 4292 (follower == Token::kGET) || // Getter following a type. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4365 (LookaheadToken(1) != Token::kCOMMA) && | 4367 (LookaheadToken(1) != Token::kCOMMA) && |
4366 (LookaheadToken(1) != Token::kSEMICOLON)) { | 4368 (LookaheadToken(1) != Token::kSEMICOLON)) { |
4367 ConsumeToken(); | 4369 ConsumeToken(); |
4368 member.kind = RawFunction::kSetterFunction; | 4370 member.kind = RawFunction::kSetterFunction; |
4369 member.name_pos = this->TokenPos(); | 4371 member.name_pos = this->TokenPos(); |
4370 member.name = ExpectIdentifier("identifier expected"); | 4372 member.name = ExpectIdentifier("identifier expected"); |
4371 CheckToken(Token::kLPAREN); | 4373 CheckToken(Token::kLPAREN); |
4372 // The grammar allows a return type, so member.type is not always NULL here. | 4374 // The grammar allows a return type, so member.type is not always NULL here. |
4373 // If no return type is specified, the return type of the setter is dynamic. | 4375 // If no return type is specified, the return type of the setter is dynamic. |
4374 if (member.type == NULL) { | 4376 if (member.type == NULL) { |
4375 member.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 4377 member.type = &Object::dynamic_type(); |
4376 } | 4378 } |
4377 } else if ((CurrentToken() == Token::kOPERATOR) && !member.has_var && | 4379 } else if ((CurrentToken() == Token::kOPERATOR) && !member.has_var && |
4378 (LookaheadToken(1) != Token::kLPAREN) && | 4380 (LookaheadToken(1) != Token::kLPAREN) && |
4379 (LookaheadToken(1) != Token::kASSIGN) && | 4381 (LookaheadToken(1) != Token::kASSIGN) && |
4380 (LookaheadToken(1) != Token::kCOMMA) && | 4382 (LookaheadToken(1) != Token::kCOMMA) && |
4381 (LookaheadToken(1) != Token::kSEMICOLON)) { | 4383 (LookaheadToken(1) != Token::kSEMICOLON)) { |
4382 ConsumeToken(); | 4384 ConsumeToken(); |
4383 if (!Token::CanBeOverloaded(CurrentToken())) { | 4385 if (!Token::CanBeOverloaded(CurrentToken())) { |
4384 ReportError("invalid operator overloading"); | 4386 ReportError("invalid operator overloading"); |
4385 } | 4387 } |
(...skipping 12 matching lines...) Expand all Loading... |
4398 member.name_pos = TokenPos(); | 4400 member.name_pos = TokenPos(); |
4399 ConsumeToken(); | 4401 ConsumeToken(); |
4400 } else { | 4402 } else { |
4401 ReportError("identifier expected"); | 4403 ReportError("identifier expected"); |
4402 } | 4404 } |
4403 | 4405 |
4404 ASSERT(member.name != NULL); | 4406 ASSERT(member.name != NULL); |
4405 if (CurrentToken() == Token::kLPAREN || member.IsGetter()) { | 4407 if (CurrentToken() == Token::kLPAREN || member.IsGetter()) { |
4406 // Constructor or method. | 4408 // Constructor or method. |
4407 if (member.type == NULL) { | 4409 if (member.type == NULL) { |
4408 member.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 4410 member.type = &Object::dynamic_type(); |
4409 } | 4411 } |
4410 ASSERT(member.IsFactory() == member.has_factory); | 4412 ASSERT(member.IsFactory() == member.has_factory); |
4411 ParseMethodOrConstructor(members, &member); | 4413 ParseMethodOrConstructor(members, &member); |
4412 } else if (CurrentToken() == Token::kSEMICOLON || | 4414 } else if (CurrentToken() == Token::kSEMICOLON || |
4413 CurrentToken() == Token::kCOMMA || | 4415 CurrentToken() == Token::kCOMMA || |
4414 CurrentToken() == Token::kASSIGN) { | 4416 CurrentToken() == Token::kASSIGN) { |
4415 // Field definition. | 4417 // Field definition. |
4416 if (member.has_const) { | 4418 if (member.has_const) { |
4417 // const fields are implicitly final. | 4419 // const fields are implicitly final. |
4418 member.has_final = true; | 4420 member.has_final = true; |
4419 } | 4421 } |
4420 if (member.type == NULL) { | 4422 if (member.type == NULL) { |
4421 if (member.has_final) { | 4423 if (member.has_final) { |
4422 member.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 4424 member.type = &Object::dynamic_type(); |
4423 } else { | 4425 } else { |
4424 ReportError("missing 'var', 'final', 'const' or type" | 4426 ReportError("missing 'var', 'final', 'const' or type" |
4425 " in field declaration"); | 4427 " in field declaration"); |
4426 } | 4428 } |
4427 } | 4429 } |
4428 ParseFieldDefinition(members, &member); | 4430 ParseFieldDefinition(members, &member); |
4429 } else { | 4431 } else { |
4430 UnexpectedToken(); | 4432 UnexpectedToken(); |
4431 } | 4433 } |
4432 current_member_ = NULL; | 4434 current_member_ = NULL; |
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5139 &result_type); | 5141 &result_type); |
5140 } | 5142 } |
5141 // Parse the formal parameters of the function type. | 5143 // Parse the formal parameters of the function type. |
5142 CheckToken(Token::kLPAREN, "formal parameter list expected"); | 5144 CheckToken(Token::kLPAREN, "formal parameter list expected"); |
5143 ParamList func_params; | 5145 ParamList func_params; |
5144 | 5146 |
5145 // Add implicit closure object parameter. | 5147 // Add implicit closure object parameter. |
5146 func_params.AddFinalParameter( | 5148 func_params.AddFinalParameter( |
5147 TokenPos(), | 5149 TokenPos(), |
5148 &Symbols::ClosureParameter(), | 5150 &Symbols::ClosureParameter(), |
5149 &Type::ZoneHandle(Z, Type::DynamicType())); | 5151 &Object::dynamic_type()); |
5150 | 5152 |
5151 const bool no_explicit_default_values = false; | 5153 const bool no_explicit_default_values = false; |
5152 ParseFormalParameterList(no_explicit_default_values, false, &func_params); | 5154 ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
5153 ExpectSemicolon(); | 5155 ExpectSemicolon(); |
5154 // The field 'is_static' has no meaning for signature functions. | 5156 // The field 'is_static' has no meaning for signature functions. |
5155 Function& signature_function = Function::Handle(Z, | 5157 Function& signature_function = Function::Handle(Z, |
5156 Function::New(*alias_name, | 5158 Function::New(*alias_name, |
5157 RawFunction::kSignatureFunction, | 5159 RawFunction::kSignatureFunction, |
5158 /* is_static = */ false, | 5160 /* is_static = */ false, |
5159 /* is_const = */ false, | 5161 /* is_const = */ false, |
(...skipping 1473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6633 } else { | 6635 } else { |
6634 // Create the closure containing the body of this generator function. | 6636 // Create the closure containing the body of this generator function. |
6635 String& generator_name = String::Handle(Z, innermost_function().name()); | 6637 String& generator_name = String::Handle(Z, innermost_function().name()); |
6636 body_closure_name = | 6638 body_closure_name = |
6637 Symbols::NewFormatted("<%s_sync_body>", generator_name.ToCString()); | 6639 Symbols::NewFormatted("<%s_sync_body>", generator_name.ToCString()); |
6638 body_closure_name = Symbols::New(body_closure_name); | 6640 body_closure_name = Symbols::New(body_closure_name); |
6639 body = Function::NewClosureFunction(body_closure_name, | 6641 body = Function::NewClosureFunction(body_closure_name, |
6640 innermost_function(), | 6642 innermost_function(), |
6641 func_pos); | 6643 func_pos); |
6642 body.set_is_generated_body(true); | 6644 body.set_is_generated_body(true); |
6643 body.set_result_type(AbstractType::Handle(Type::DynamicType())); | 6645 body.set_result_type(Object::dynamic_type()); |
6644 is_new_closure = true; | 6646 is_new_closure = true; |
6645 } | 6647 } |
6646 | 6648 |
6647 ParamList closure_params; | 6649 ParamList closure_params; |
6648 AddSyncGenClosureParameters(&closure_params); | 6650 AddSyncGenClosureParameters(&closure_params); |
6649 | 6651 |
6650 if (is_new_closure) { | 6652 if (is_new_closure) { |
6651 // Add the parameters to the newly created closure. | 6653 // Add the parameters to the newly created closure. |
6652 AddFormalParamsToFunction(&closure_params, body); | 6654 AddFormalParamsToFunction(&closure_params, body); |
6653 | 6655 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6771 // Create the closure containing the body of this async function. | 6773 // Create the closure containing the body of this async function. |
6772 const String& async_func_name = | 6774 const String& async_func_name = |
6773 String::Handle(Z, innermost_function().name()); | 6775 String::Handle(Z, innermost_function().name()); |
6774 String& closure_name = String::Handle(Z, | 6776 String& closure_name = String::Handle(Z, |
6775 Symbols::NewFormatted("<%s_async_body>", async_func_name.ToCString())); | 6777 Symbols::NewFormatted("<%s_async_body>", async_func_name.ToCString())); |
6776 closure = Function::NewClosureFunction( | 6778 closure = Function::NewClosureFunction( |
6777 closure_name, | 6779 closure_name, |
6778 innermost_function(), | 6780 innermost_function(), |
6779 async_func_pos); | 6781 async_func_pos); |
6780 closure.set_is_generated_body(true); | 6782 closure.set_is_generated_body(true); |
6781 closure.set_result_type(AbstractType::Handle(Type::DynamicType())); | 6783 closure.set_result_type(Object::dynamic_type()); |
6782 is_new_closure = true; | 6784 is_new_closure = true; |
6783 } | 6785 } |
6784 // Create the parameter list for the async body closure. | 6786 // Create the parameter list for the async body closure. |
6785 ParamList closure_params; | 6787 ParamList closure_params; |
6786 AddAsyncClosureParameters(&closure_params); | 6788 AddAsyncClosureParameters(&closure_params); |
6787 if (is_new_closure) { | 6789 if (is_new_closure) { |
6788 // Add the parameters to the newly created closure. | 6790 // Add the parameters to the newly created closure. |
6789 AddFormalParamsToFunction(&closure_params, closure); | 6791 AddFormalParamsToFunction(&closure_params, closure); |
6790 | 6792 |
6791 // Create and set the signature class of the closure. | 6793 // Create and set the signature class of the closure. |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6905 const String& async_generator_name = | 6907 const String& async_generator_name = |
6906 String::Handle(Z, innermost_function().name()); | 6908 String::Handle(Z, innermost_function().name()); |
6907 String& closure_name = String::Handle(Z, | 6909 String& closure_name = String::Handle(Z, |
6908 Symbols::NewFormatted("<%s_async_gen_body>", | 6910 Symbols::NewFormatted("<%s_async_gen_body>", |
6909 async_generator_name.ToCString())); | 6911 async_generator_name.ToCString())); |
6910 closure = Function::NewClosureFunction( | 6912 closure = Function::NewClosureFunction( |
6911 String::Handle(Z, Symbols::New(closure_name)), | 6913 String::Handle(Z, Symbols::New(closure_name)), |
6912 innermost_function(), | 6914 innermost_function(), |
6913 async_func_pos); | 6915 async_func_pos); |
6914 closure.set_is_generated_body(true); | 6916 closure.set_is_generated_body(true); |
6915 closure.set_result_type(AbstractType::Handle(Type::DynamicType())); | 6917 closure.set_result_type(Object::dynamic_type()); |
6916 is_new_closure = true; | 6918 is_new_closure = true; |
6917 } | 6919 } |
6918 | 6920 |
6919 ParamList closure_params; | 6921 ParamList closure_params; |
6920 AddAsyncGenClosureParameters(&closure_params); | 6922 AddAsyncGenClosureParameters(&closure_params); |
6921 | 6923 |
6922 if (is_new_closure) { | 6924 if (is_new_closure) { |
6923 // Add the parameters to the newly created closure. | 6925 // Add the parameters to the newly created closure. |
6924 AddFormalParamsToFunction(&closure_params, closure); | 6926 AddFormalParamsToFunction(&closure_params, closure); |
6925 | 6927 |
(...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8687 Function::ZoneHandle(Z, stream_iterator_cls.LookupFunction( | 8689 Function::ZoneHandle(Z, stream_iterator_cls.LookupFunction( |
8688 Symbols::StreamIteratorConstructor())); | 8690 Symbols::StreamIteratorConstructor())); |
8689 ASSERT(!iterator_ctor.IsNull()); | 8691 ASSERT(!iterator_ctor.IsNull()); |
8690 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos); | 8692 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos); |
8691 ctor_args->Add(stream_expr); | 8693 ctor_args->Add(stream_expr); |
8692 ConstructorCallNode* ctor_call = | 8694 ConstructorCallNode* ctor_call = |
8693 new (Z) ConstructorCallNode(stream_expr_pos, | 8695 new (Z) ConstructorCallNode(stream_expr_pos, |
8694 TypeArguments::ZoneHandle(Z), | 8696 TypeArguments::ZoneHandle(Z), |
8695 iterator_ctor, | 8697 iterator_ctor, |
8696 ctor_args); | 8698 ctor_args); |
8697 const AbstractType& iterator_type = Type::ZoneHandle(Z, Type::DynamicType()); | 8699 const AbstractType& iterator_type = Object::dynamic_type(); |
8698 LocalVariable* iterator_var = new(Z) LocalVariable( | 8700 LocalVariable* iterator_var = new(Z) LocalVariable( |
8699 stream_expr_pos, Symbols::ForInIter(), iterator_type); | 8701 stream_expr_pos, Symbols::ForInIter(), iterator_type); |
8700 current_block_->scope->AddVariable(iterator_var); | 8702 current_block_->scope->AddVariable(iterator_var); |
8701 AstNode* iterator_init = | 8703 AstNode* iterator_init = |
8702 new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call); | 8704 new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call); |
8703 current_block_->statements->Add(iterator_init); | 8705 current_block_->statements->Add(iterator_init); |
8704 | 8706 |
8705 // We need to ensure that the stream is cancelled after the loop. | 8707 // We need to ensure that the stream is cancelled after the loop. |
8706 // Thus, wrap the loop in a try-finally that calls :for-in-iter.close() | 8708 // Thus, wrap the loop in a try-finally that calls :for-in-iter.close() |
8707 // in the finally clause. It is harmless to call close() if the stream | 8709 // in the finally clause. It is harmless to call close() if the stream |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8952 ExpectToken(Token::kRPAREN); | 8954 ExpectToken(Token::kRPAREN); |
8953 | 8955 |
8954 OpenBlock(); // Implicit block around while loop. | 8956 OpenBlock(); // Implicit block around while loop. |
8955 | 8957 |
8956 // Generate implicit iterator variable and add to scope. | 8958 // Generate implicit iterator variable and add to scope. |
8957 // We could set the type of the implicit iterator variable to Iterator<T> | 8959 // We could set the type of the implicit iterator variable to Iterator<T> |
8958 // where T is the type of the for loop variable. However, the type error | 8960 // where T is the type of the for loop variable. However, the type error |
8959 // would refer to the compiler generated iterator and could confuse the user. | 8961 // would refer to the compiler generated iterator and could confuse the user. |
8960 // It is better to leave the iterator untyped and postpone the type error | 8962 // It is better to leave the iterator untyped and postpone the type error |
8961 // until the loop variable is assigned to. | 8963 // until the loop variable is assigned to. |
8962 const AbstractType& iterator_type = Type::ZoneHandle(Z, Type::DynamicType()); | 8964 const AbstractType& iterator_type = Object::dynamic_type(); |
8963 LocalVariable* iterator_var = new(Z) LocalVariable( | 8965 LocalVariable* iterator_var = new(Z) LocalVariable( |
8964 collection_pos, Symbols::ForInIter(), iterator_type); | 8966 collection_pos, Symbols::ForInIter(), iterator_type); |
8965 current_block_->scope->AddVariable(iterator_var); | 8967 current_block_->scope->AddVariable(iterator_var); |
8966 | 8968 |
8967 // Generate initialization of iterator variable. | 8969 // Generate initialization of iterator variable. |
8968 ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos); | 8970 ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos); |
8969 AstNode* get_iterator = new(Z) InstanceGetterNode( | 8971 AstNode* get_iterator = new(Z) InstanceGetterNode( |
8970 collection_pos, collection_expr, Symbols::Iterator()); | 8972 collection_pos, collection_expr, Symbols::Iterator()); |
8971 AstNode* iterator_init = | 8973 AstNode* iterator_init = |
8972 new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator); | 8974 new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator); |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9381 // closed in the loop that builds the if-then-else nest. | 9383 // closed in the loop that builds the if-then-else nest. |
9382 OpenBlock(); | 9384 OpenBlock(); |
9383 const intptr_t catch_pos = TokenPos(); | 9385 const intptr_t catch_pos = TokenPos(); |
9384 CatchParamDesc exception_param; | 9386 CatchParamDesc exception_param; |
9385 CatchParamDesc stack_trace_param; | 9387 CatchParamDesc stack_trace_param; |
9386 if (IsSymbol(Symbols::On())) { | 9388 if (IsSymbol(Symbols::On())) { |
9387 ConsumeToken(); | 9389 ConsumeToken(); |
9388 exception_param.type = &AbstractType::ZoneHandle(Z, | 9390 exception_param.type = &AbstractType::ZoneHandle(Z, |
9389 ParseType(ClassFinalizer::kCanonicalize)); | 9391 ParseType(ClassFinalizer::kCanonicalize)); |
9390 } else { | 9392 } else { |
9391 exception_param.type = &AbstractType::ZoneHandle(Z, Type::DynamicType()); | 9393 exception_param.type = &Object::dynamic_type(); |
9392 } | 9394 } |
9393 if (CurrentToken() == Token::kCATCH) { | 9395 if (CurrentToken() == Token::kCATCH) { |
9394 ConsumeToken(); // Consume the 'catch'. | 9396 ConsumeToken(); // Consume the 'catch'. |
9395 ExpectToken(Token::kLPAREN); | 9397 ExpectToken(Token::kLPAREN); |
9396 exception_param.token_pos = TokenPos(); | 9398 exception_param.token_pos = TokenPos(); |
9397 exception_param.name = ExpectIdentifier("identifier expected"); | 9399 exception_param.name = ExpectIdentifier("identifier expected"); |
9398 if (CurrentToken() == Token::kCOMMA) { | 9400 if (CurrentToken() == Token::kCOMMA) { |
9399 ConsumeToken(); | 9401 ConsumeToken(); |
9400 stack_trace_param.type = | 9402 stack_trace_param.type = &Object::dynamic_type(); |
9401 &AbstractType::ZoneHandle(Z, Type::DynamicType()); | |
9402 stack_trace_param.token_pos = TokenPos(); | 9403 stack_trace_param.token_pos = TokenPos(); |
9403 stack_trace_param.name = ExpectIdentifier("identifier expected"); | 9404 stack_trace_param.name = ExpectIdentifier("identifier expected"); |
9404 } | 9405 } |
9405 ExpectToken(Token::kRPAREN); | 9406 ExpectToken(Token::kRPAREN); |
9406 } | 9407 } |
9407 | 9408 |
9408 // Create a block containing the catch clause parameters and the | 9409 // Create a block containing the catch clause parameters and the |
9409 // following code: | 9410 // following code: |
9410 // 1) Store exception object and stack trace object into user-defined | 9411 // 1) Store exception object and stack trace object into user-defined |
9411 // variables (as needed). | 9412 // variables (as needed). |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9572 | 9573 |
9573 | 9574 |
9574 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) { | 9575 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) { |
9575 const String& async_saved_try_ctx_name = String::ZoneHandle(Z, | 9576 const String& async_saved_try_ctx_name = String::ZoneHandle(Z, |
9576 Symbols::NewFormatted("%s%d", | 9577 Symbols::NewFormatted("%s%d", |
9577 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), | 9578 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), |
9578 last_used_try_index_ - 1)); | 9579 last_used_try_index_ - 1)); |
9579 LocalVariable* async_saved_try_ctx = new (Z) LocalVariable( | 9580 LocalVariable* async_saved_try_ctx = new (Z) LocalVariable( |
9580 Scanner::kNoSourcePos, | 9581 Scanner::kNoSourcePos, |
9581 async_saved_try_ctx_name, | 9582 async_saved_try_ctx_name, |
9582 Type::ZoneHandle(Z, Type::DynamicType())); | 9583 Object::dynamic_type()); |
9583 ASSERT(async_temp_scope_ != NULL); | 9584 ASSERT(async_temp_scope_ != NULL); |
9584 async_temp_scope_->AddVariable(async_saved_try_ctx); | 9585 async_temp_scope_->AddVariable(async_saved_try_ctx); |
9585 ASSERT(saved_try_context != NULL); | 9586 ASSERT(saved_try_context != NULL); |
9586 current_block_->statements->Add(new(Z) StoreLocalNode( | 9587 current_block_->statements->Add(new(Z) StoreLocalNode( |
9587 Scanner::kNoSourcePos, | 9588 Scanner::kNoSourcePos, |
9588 async_saved_try_ctx, | 9589 async_saved_try_ctx, |
9589 new(Z) LoadLocalNode(Scanner::kNoSourcePos, saved_try_context))); | 9590 new(Z) LoadLocalNode(Scanner::kNoSourcePos, saved_try_context))); |
9590 } | 9591 } |
9591 | 9592 |
9592 | 9593 |
(...skipping 943 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10536 } | 10537 } |
10537 | 10538 |
10538 | 10539 |
10539 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos, | 10540 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos, |
10540 const char* s) { | 10541 const char* s) { |
10541 char name[64]; | 10542 char name[64]; |
10542 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); | 10543 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); |
10543 LocalVariable* temp = new(Z) LocalVariable( | 10544 LocalVariable* temp = new(Z) LocalVariable( |
10544 token_pos, | 10545 token_pos, |
10545 String::ZoneHandle(Z, Symbols::New(name)), | 10546 String::ZoneHandle(Z, Symbols::New(name)), |
10546 Type::ZoneHandle(Z, Type::DynamicType())); | 10547 Object::dynamic_type()); |
10547 temp->set_is_final(); | 10548 temp->set_is_final(); |
10548 current_block_->scope->AddVariable(temp); | 10549 current_block_->scope->AddVariable(temp); |
10549 return temp; | 10550 return temp; |
10550 } | 10551 } |
10551 | 10552 |
10552 | 10553 |
10553 // TODO(srdjan): Implement other optimizations. | 10554 // TODO(srdjan): Implement other optimizations. |
10554 AstNode* Parser::OptimizeBinaryOpNode(intptr_t op_pos, | 10555 AstNode* Parser::OptimizeBinaryOpNode(intptr_t op_pos, |
10555 Token::Kind binary_op, | 10556 Token::Kind binary_op, |
10556 AstNode* lhs, | 10557 AstNode* lhs, |
(...skipping 2614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13171 return closure.raw(); | 13172 return closure.raw(); |
13172 } | 13173 } |
13173 | 13174 |
13174 String& closure_name = String::Handle(Z, ctr.name()); | 13175 String& closure_name = String::Handle(Z, ctr.name()); |
13175 closure_name = Symbols::FromConcat(Symbols::ConstructorClosurePrefix(), | 13176 closure_name = Symbols::FromConcat(Symbols::ConstructorClosurePrefix(), |
13176 closure_name); | 13177 closure_name); |
13177 | 13178 |
13178 ParamList params; | 13179 ParamList params; |
13179 params.AddFinalParameter(token_pos, | 13180 params.AddFinalParameter(token_pos, |
13180 &Symbols::ClosureParameter(), | 13181 &Symbols::ClosureParameter(), |
13181 &Type::ZoneHandle(Z, Type::DynamicType())); | 13182 &Object::dynamic_type()); |
13182 | 13183 |
13183 ParseFormalParameters(ctr, ¶ms); | 13184 ParseFormalParameters(ctr, ¶ms); |
13184 // Per language spec, the type of the closure parameters is dynamic. | 13185 // Per language spec, the type of the closure parameters is dynamic. |
13185 // Replace the types parsed from the constructor. | 13186 // Replace the types parsed from the constructor. |
13186 params.EraseParameterTypes(); | 13187 params.EraseParameterTypes(); |
13187 | 13188 |
13188 closure = Function::NewClosureFunction(closure_name, | 13189 closure = Function::NewClosureFunction(closure_name, |
13189 innermost_function(), | 13190 innermost_function(), |
13190 token_pos); | 13191 token_pos); |
13191 closure.set_is_generated_body(true); | 13192 closure.set_is_generated_body(true); |
13192 closure.set_is_debuggable(false); | 13193 closure.set_is_debuggable(false); |
13193 closure.set_is_visible(false); | 13194 closure.set_is_visible(false); |
13194 closure.set_result_type(AbstractType::Handle(Type::DynamicType())); | 13195 closure.set_result_type(Object::dynamic_type()); |
13195 AddFormalParamsToFunction(¶ms, closure); | 13196 AddFormalParamsToFunction(¶ms, closure); |
13196 | 13197 |
13197 // Create and set the signature class of the closure. | 13198 // Create and set the signature class of the closure. |
13198 const String& sig = String::Handle(Z, closure.Signature()); | 13199 const String& sig = String::Handle(Z, closure.Signature()); |
13199 Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig)); | 13200 Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig)); |
13200 if (sig_cls.IsNull()) { | 13201 if (sig_cls.IsNull()) { |
13201 sig_cls = Class::NewSignatureClass(sig, closure, script_, token_pos); | 13202 sig_cls = Class::NewSignatureClass(sig, closure, script_, token_pos); |
13202 library_.AddClass(sig_cls); | 13203 library_.AddClass(sig_cls); |
13203 } | 13204 } |
13204 closure.set_signature_class(sig_cls); | 13205 closure.set_signature_class(sig_cls); |
(...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14463 const ArgumentListNode& function_args, | 14464 const ArgumentListNode& function_args, |
14464 const LocalVariable* temp_for_last_arg, | 14465 const LocalVariable* temp_for_last_arg, |
14465 bool is_super_invocation) { | 14466 bool is_super_invocation) { |
14466 UNREACHABLE(); | 14467 UNREACHABLE(); |
14467 return NULL; | 14468 return NULL; |
14468 } | 14469 } |
14469 | 14470 |
14470 } // namespace dart | 14471 } // namespace dart |
14471 | 14472 |
14472 #endif // DART_PRECOMPILED | 14473 #endif // DART_PRECOMPILED |
OLD | NEW |