| 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 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 INC_STAT(isolate, num_functions_compiled, 1); | 883 INC_STAT(isolate, num_functions_compiled, 1); |
| 884 VMTagScope tagScope(thread, VMTag::kCompileParseFunctionTagId, | 884 VMTagScope tagScope(thread, VMTag::kCompileParseFunctionTagId, |
| 885 FLAG_profile_vm); | 885 FLAG_profile_vm); |
| 886 | 886 |
| 887 ASSERT(thread->long_jump_base()->IsSafeToJump()); | 887 ASSERT(thread->long_jump_base()->IsSafeToJump()); |
| 888 ASSERT(parsed_function != NULL); | 888 ASSERT(parsed_function != NULL); |
| 889 const Function& func = parsed_function->function(); | 889 const Function& func = parsed_function->function(); |
| 890 const Script& script = Script::Handle(zone, func.script()); | 890 const Script& script = Script::Handle(zone, func.script()); |
| 891 Parser parser(script, parsed_function, func.token_pos()); | 891 Parser parser(script, parsed_function, func.token_pos()); |
| 892 SequenceNode* node_sequence = NULL; | 892 SequenceNode* node_sequence = NULL; |
| 893 ZoneGrowableArray<const Instance*>* default_parameter_values = | |
| 894 new ZoneGrowableArray<const Instance*>(zone, 2); | |
| 895 switch (func.kind()) { | 893 switch (func.kind()) { |
| 896 case RawFunction::kClosureFunction: | 894 case RawFunction::kClosureFunction: |
| 897 if (func.IsImplicitClosureFunction()) { | 895 if (func.IsImplicitClosureFunction()) { |
| 898 node_sequence = | 896 node_sequence = |
| 899 parser.ParseImplicitClosure(func, default_parameter_values); | 897 parser.ParseImplicitClosure(func); |
| 900 break; | 898 break; |
| 901 } | 899 } |
| 902 if (func.IsConstructorClosureFunction()) { | 900 if (func.IsConstructorClosureFunction()) { |
| 903 node_sequence = | 901 node_sequence = |
| 904 parser.ParseConstructorClosure(func, default_parameter_values); | 902 parser.ParseConstructorClosure(func); |
| 905 break; | 903 break; |
| 906 } | 904 } |
| 907 // Fall-through: Handle non-implicit closures. | 905 // Fall-through: Handle non-implicit closures. |
| 908 case RawFunction::kRegularFunction: | 906 case RawFunction::kRegularFunction: |
| 909 case RawFunction::kGetterFunction: | 907 case RawFunction::kGetterFunction: |
| 910 case RawFunction::kSetterFunction: | 908 case RawFunction::kSetterFunction: |
| 911 case RawFunction::kConstructor: | 909 case RawFunction::kConstructor: |
| 912 // The call to a redirecting factory is redirected. | 910 // The call to a redirecting factory is redirected. |
| 913 ASSERT(!func.IsRedirectingFactory()); | 911 ASSERT(!func.IsRedirectingFactory()); |
| 914 if (!func.IsImplicitConstructor()) { | 912 if (!func.IsImplicitConstructor()) { |
| 915 parser.SkipFunctionPreamble(); | 913 parser.SkipFunctionPreamble(); |
| 916 } | 914 } |
| 917 node_sequence = parser.ParseFunc(func, default_parameter_values); | 915 node_sequence = parser.ParseFunc(func); |
| 918 break; | 916 break; |
| 919 case RawFunction::kImplicitGetter: | 917 case RawFunction::kImplicitGetter: |
| 920 ASSERT(!func.is_static()); | 918 ASSERT(!func.is_static()); |
| 921 node_sequence = parser.ParseInstanceGetter(func); | 919 node_sequence = parser.ParseInstanceGetter(func); |
| 922 break; | 920 break; |
| 923 case RawFunction::kImplicitSetter: | 921 case RawFunction::kImplicitSetter: |
| 924 ASSERT(!func.is_static()); | 922 ASSERT(!func.is_static()); |
| 925 node_sequence = parser.ParseInstanceSetter(func); | 923 node_sequence = parser.ParseInstanceSetter(func); |
| 926 break; | 924 break; |
| 927 case RawFunction::kImplicitStaticFinalGetter: | 925 case RawFunction::kImplicitStaticFinalGetter: |
| 928 node_sequence = parser.ParseStaticFinalGetter(func); | 926 node_sequence = parser.ParseStaticFinalGetter(func); |
| 929 INC_STAT(isolate, num_implicit_final_getters, 1); | 927 INC_STAT(isolate, num_implicit_final_getters, 1); |
| 930 break; | 928 break; |
| 931 case RawFunction::kMethodExtractor: | 929 case RawFunction::kMethodExtractor: |
| 932 node_sequence = parser.ParseMethodExtractor(func); | 930 node_sequence = parser.ParseMethodExtractor(func); |
| 933 break; | 931 break; |
| 934 case RawFunction::kNoSuchMethodDispatcher: | 932 case RawFunction::kNoSuchMethodDispatcher: |
| 935 node_sequence = | 933 node_sequence = |
| 936 parser.ParseNoSuchMethodDispatcher(func, default_parameter_values); | 934 parser.ParseNoSuchMethodDispatcher(func); |
| 937 break; | 935 break; |
| 938 case RawFunction::kInvokeFieldDispatcher: | 936 case RawFunction::kInvokeFieldDispatcher: |
| 939 node_sequence = | 937 node_sequence = |
| 940 parser.ParseInvokeFieldDispatcher(func, default_parameter_values); | 938 parser.ParseInvokeFieldDispatcher(func); |
| 941 break; | 939 break; |
| 942 case RawFunction::kIrregexpFunction: | 940 case RawFunction::kIrregexpFunction: |
| 943 UNREACHABLE(); // Irregexp functions have their own parser. | 941 UNREACHABLE(); // Irregexp functions have their own parser. |
| 944 default: | 942 default: |
| 945 UNREACHABLE(); | 943 UNREACHABLE(); |
| 946 } | 944 } |
| 947 | 945 |
| 948 if (parsed_function->has_expression_temp_var()) { | 946 if (parsed_function->has_expression_temp_var()) { |
| 949 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var()); | 947 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var()); |
| 950 } | 948 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 967 instantiator = parser.LookupTypeArgumentsParameter(node_sequence->scope(), | 965 instantiator = parser.LookupTypeArgumentsParameter(node_sequence->scope(), |
| 968 kTestOnly); | 966 kTestOnly); |
| 969 } else { | 967 } else { |
| 970 instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly); | 968 instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly); |
| 971 } | 969 } |
| 972 if (!parser.current_function().IsLocalFunction() || | 970 if (!parser.current_function().IsLocalFunction() || |
| 973 ((instantiator != NULL) && instantiator->is_captured())) { | 971 ((instantiator != NULL) && instantiator->is_captured())) { |
| 974 parsed_function->set_instantiator(instantiator); | 972 parsed_function->set_instantiator(instantiator); |
| 975 } | 973 } |
| 976 } | 974 } |
| 977 | |
| 978 parsed_function->set_default_parameter_values(default_parameter_values); | |
| 979 } | 975 } |
| 980 | 976 |
| 981 | 977 |
| 982 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) { | 978 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) { |
| 983 Thread* thread = Thread::Current(); | 979 Thread* thread = Thread::Current(); |
| 984 Isolate* isolate = thread->isolate(); | 980 Isolate* isolate = thread->isolate(); |
| 985 StackZone stack_zone(thread); | 981 StackZone stack_zone(thread); |
| 986 Zone* zone = stack_zone.GetZone(); | 982 Zone* zone = stack_zone.GetZone(); |
| 987 LongJumpScope jump; | 983 LongJumpScope jump; |
| 988 if (setjmp(*jump.Set()) == 0) { | 984 if (setjmp(*jump.Set()) == 0) { |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1327 | 1323 |
| 1328 EnsureExpressionTemp(); | 1324 EnsureExpressionTemp(); |
| 1329 StoreInstanceFieldNode* store_field = | 1325 StoreInstanceFieldNode* store_field = |
| 1330 new StoreInstanceFieldNode(ident_pos, receiver, field, value); | 1326 new StoreInstanceFieldNode(ident_pos, receiver, field, value); |
| 1331 current_block_->statements->Add(store_field); | 1327 current_block_->statements->Add(store_field); |
| 1332 current_block_->statements->Add(new ReturnNode(Scanner::kNoSourcePos)); | 1328 current_block_->statements->Add(new ReturnNode(Scanner::kNoSourcePos)); |
| 1333 return CloseBlock(); | 1329 return CloseBlock(); |
| 1334 } | 1330 } |
| 1335 | 1331 |
| 1336 | 1332 |
| 1337 SequenceNode* Parser::ParseConstructorClosure( | 1333 SequenceNode* Parser::ParseConstructorClosure(const Function& func) { |
| 1338 const Function& func, | |
| 1339 ZoneGrowableArray<const Instance*>* default_values) { | |
| 1340 TRACE_PARSER("ParseConstructorClosure"); | 1334 TRACE_PARSER("ParseConstructorClosure"); |
| 1341 const intptr_t token_pos = func.token_pos(); | 1335 const intptr_t token_pos = func.token_pos(); |
| 1342 | 1336 |
| 1343 Function& constructor = Function::ZoneHandle(Z); | 1337 Function& constructor = Function::ZoneHandle(Z); |
| 1344 TypeArguments& type_args = TypeArguments::ZoneHandle(Z); | 1338 TypeArguments& type_args = TypeArguments::ZoneHandle(Z); |
| 1345 ParseConstructorClosurization(&constructor, &type_args); | 1339 ParseConstructorClosurization(&constructor, &type_args); |
| 1346 ASSERT(!constructor.IsNull()); | 1340 ASSERT(!constructor.IsNull()); |
| 1347 | 1341 |
| 1348 ParamList params; | 1342 ParamList params; |
| 1349 // The first parameter of the closure function is the implicit closure | 1343 // The first parameter of the closure function is the implicit closure |
| 1350 // argument. | 1344 // argument. |
| 1351 params.AddFinalParameter(token_pos, | 1345 params.AddFinalParameter(token_pos, |
| 1352 &Symbols::ClosureParameter(), | 1346 &Symbols::ClosureParameter(), |
| 1353 &Type::ZoneHandle(Z, Type::DynamicType())); | 1347 &Type::ZoneHandle(Z, Type::DynamicType())); |
| 1354 bool params_ok = ParseFormalParameters(constructor, ¶ms); | 1348 bool params_ok = ParseFormalParameters(constructor, ¶ms); |
| 1355 USE(params_ok); | 1349 USE(params_ok); |
| 1356 ASSERT(params_ok); | 1350 ASSERT(params_ok); |
| 1357 // Per language spec, the type of the closure parameters is dynamic. | 1351 // Per language spec, the type of the closure parameters is dynamic. |
| 1358 // Replace the types parsed from the constructor. | 1352 // Replace the types parsed from the constructor. |
| 1359 params.EraseParameterTypes(); | 1353 params.EraseParameterTypes(); |
| 1360 | 1354 |
| 1361 SetupDefaultsForOptionalParams(params, default_values); | 1355 SetupDefaultsForOptionalParams(params); |
| 1362 ASSERT(func.num_fixed_parameters() == params.num_fixed_parameters); | 1356 ASSERT(func.num_fixed_parameters() == params.num_fixed_parameters); |
| 1363 ASSERT(func.NumOptionalParameters() == params.num_optional_parameters); | 1357 ASSERT(func.NumOptionalParameters() == params.num_optional_parameters); |
| 1364 | 1358 |
| 1365 OpenFunctionBlock(func); | 1359 OpenFunctionBlock(func); |
| 1366 LocalScope* scope = current_block_->scope; | 1360 LocalScope* scope = current_block_->scope; |
| 1367 AddFormalParamsToScope(¶ms, scope); | 1361 AddFormalParamsToScope(¶ms, scope); |
| 1368 | 1362 |
| 1369 ArgumentListNode* ctor_args = new ArgumentListNode(token_pos); | 1363 ArgumentListNode* ctor_args = new ArgumentListNode(token_pos); |
| 1370 // Skip implicit closure parameter at 0. | 1364 // Skip implicit closure parameter at 0. |
| 1371 for (intptr_t i = 1; i < func.NumParameters(); i++) { | 1365 for (intptr_t i = 1; i < func.NumParameters(); i++) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1383 } | 1377 } |
| 1384 | 1378 |
| 1385 AstNode* new_object = | 1379 AstNode* new_object = |
| 1386 CreateConstructorCallNode(token_pos, type_args, constructor, ctor_args); | 1380 CreateConstructorCallNode(token_pos, type_args, constructor, ctor_args); |
| 1387 ReturnNode* return_node = new ReturnNode(token_pos, new_object); | 1381 ReturnNode* return_node = new ReturnNode(token_pos, new_object); |
| 1388 current_block_->statements->Add(return_node); | 1382 current_block_->statements->Add(return_node); |
| 1389 return CloseBlock(); | 1383 return CloseBlock(); |
| 1390 } | 1384 } |
| 1391 | 1385 |
| 1392 | 1386 |
| 1393 SequenceNode* Parser::ParseImplicitClosure( | 1387 SequenceNode* Parser::ParseImplicitClosure(const Function& func) { |
| 1394 const Function& func, ZoneGrowableArray<const Instance*>* default_values) { | |
| 1395 TRACE_PARSER("ParseImplicitClosure"); | 1388 TRACE_PARSER("ParseImplicitClosure"); |
| 1396 intptr_t token_pos = func.token_pos(); | 1389 intptr_t token_pos = func.token_pos(); |
| 1397 | 1390 |
| 1398 OpenFunctionBlock(func); | 1391 OpenFunctionBlock(func); |
| 1399 | 1392 |
| 1400 ParamList params; | 1393 ParamList params; |
| 1401 params.AddFinalParameter( | 1394 params.AddFinalParameter( |
| 1402 token_pos, | 1395 token_pos, |
| 1403 &Symbols::ClosureParameter(), | 1396 &Symbols::ClosureParameter(), |
| 1404 &Type::ZoneHandle(Type::DynamicType())); | 1397 &Type::ZoneHandle(Type::DynamicType())); |
| 1405 | 1398 |
| 1406 const Function& parent = Function::ZoneHandle(func.parent_function()); | 1399 const Function& parent = Function::ZoneHandle(func.parent_function()); |
| 1407 if (parent.IsImplicitSetterFunction()) { | 1400 if (parent.IsImplicitSetterFunction()) { |
| 1408 const intptr_t ident_pos = func.token_pos(); | 1401 const intptr_t ident_pos = func.token_pos(); |
| 1409 ASSERT(IsIdentifier()); | 1402 ASSERT(IsIdentifier()); |
| 1410 const String& field_name = *CurrentLiteral(); | 1403 const String& field_name = *CurrentLiteral(); |
| 1411 const Class& field_class = Class::ZoneHandle(Z, parent.Owner()); | 1404 const Class& field_class = Class::ZoneHandle(Z, parent.Owner()); |
| 1412 const Field& field = | 1405 const Field& field = |
| 1413 Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name)); | 1406 Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name)); |
| 1414 const AbstractType& field_type = AbstractType::ZoneHandle(Z, field.type()); | 1407 const AbstractType& field_type = AbstractType::ZoneHandle(Z, field.type()); |
| 1415 params.AddFinalParameter(ident_pos, | 1408 params.AddFinalParameter(ident_pos, |
| 1416 &Symbols::Value(), | 1409 &Symbols::Value(), |
| 1417 &field_type); | 1410 &field_type); |
| 1418 ASSERT(func.num_fixed_parameters() == 2); // closure, value. | 1411 ASSERT(func.num_fixed_parameters() == 2); // closure, value. |
| 1419 } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { | 1412 } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { |
| 1420 const bool allow_explicit_default_values = true; | 1413 const bool allow_explicit_default_values = true; |
| 1421 SkipFunctionPreamble(); | 1414 SkipFunctionPreamble(); |
| 1422 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 1415 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
| 1423 SetupDefaultsForOptionalParams(params, default_values); | 1416 SetupDefaultsForOptionalParams(params); |
| 1424 } | 1417 } |
| 1425 | 1418 |
| 1426 // Populate function scope with the formal parameters. | 1419 // Populate function scope with the formal parameters. |
| 1427 LocalScope* scope = current_block_->scope; | 1420 LocalScope* scope = current_block_->scope; |
| 1428 AddFormalParamsToScope(¶ms, scope); | 1421 AddFormalParamsToScope(¶ms, scope); |
| 1429 | 1422 |
| 1430 ArgumentListNode* func_args = new ArgumentListNode(token_pos); | 1423 ArgumentListNode* func_args = new ArgumentListNode(token_pos); |
| 1431 if (!func.is_static()) { | 1424 if (!func.is_static()) { |
| 1432 func_args->Add(LoadReceiver(token_pos)); | 1425 func_args->Add(LoadReceiver(token_pos)); |
| 1433 } | 1426 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1478 Function::ZoneHandle(Z, func.extracted_method_closure()), | 1471 Function::ZoneHandle(Z, func.extracted_method_closure()), |
| 1479 load_receiver, | 1472 load_receiver, |
| 1480 NULL); | 1473 NULL); |
| 1481 | 1474 |
| 1482 ReturnNode* return_node = new ReturnNode(Scanner::kNoSourcePos, closure); | 1475 ReturnNode* return_node = new ReturnNode(Scanner::kNoSourcePos, closure); |
| 1483 current_block_->statements->Add(return_node); | 1476 current_block_->statements->Add(return_node); |
| 1484 return CloseBlock(); | 1477 return CloseBlock(); |
| 1485 } | 1478 } |
| 1486 | 1479 |
| 1487 | 1480 |
| 1488 void Parser::BuildDispatcherScope( | 1481 void Parser::BuildDispatcherScope(const Function& func, |
| 1489 const Function& func, | 1482 const ArgumentsDescriptor& desc) { |
| 1490 const ArgumentsDescriptor& desc, | |
| 1491 ZoneGrowableArray<const Instance*>* default_values) { | |
| 1492 ParamList params; | 1483 ParamList params; |
| 1493 // Receiver first. | 1484 // Receiver first. |
| 1494 intptr_t token_pos = func.token_pos(); | 1485 intptr_t token_pos = func.token_pos(); |
| 1495 params.AddReceiver(ReceiverType(current_class()), token_pos); | 1486 params.AddReceiver(ReceiverType(current_class()), token_pos); |
| 1496 // Remaining positional parameters. | 1487 // Remaining positional parameters. |
| 1497 intptr_t i = 1; | 1488 intptr_t i = 1; |
| 1498 for (; i < desc.PositionalCount(); ++i) { | 1489 for (; i < desc.PositionalCount(); ++i) { |
| 1499 ParamDesc p; | 1490 ParamDesc p; |
| 1500 char name[64]; | 1491 char name[64]; |
| 1501 OS::SNPrint(name, 64, ":p%" Pd, i); | 1492 OS::SNPrint(name, 64, ":p%" Pd, i); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1512 intptr_t index = i - desc.PositionalCount(); | 1503 intptr_t index = i - desc.PositionalCount(); |
| 1513 p.name = &String::ZoneHandle(Z, desc.NameAt(index)); | 1504 p.name = &String::ZoneHandle(Z, desc.NameAt(index)); |
| 1514 p.type = &Type::ZoneHandle(Z, Type::DynamicType()); | 1505 p.type = &Type::ZoneHandle(Z, Type::DynamicType()); |
| 1515 p.default_value = &Object::null_instance(); | 1506 p.default_value = &Object::null_instance(); |
| 1516 params.parameters->Add(p); | 1507 params.parameters->Add(p); |
| 1517 params.num_optional_parameters++; | 1508 params.num_optional_parameters++; |
| 1518 params.has_optional_named_parameters = true; | 1509 params.has_optional_named_parameters = true; |
| 1519 } | 1510 } |
| 1520 ASSERT(desc.NamedCount() == params.num_optional_parameters); | 1511 ASSERT(desc.NamedCount() == params.num_optional_parameters); |
| 1521 | 1512 |
| 1522 SetupDefaultsForOptionalParams(params, default_values); | 1513 SetupDefaultsForOptionalParams(params); |
| 1523 | 1514 |
| 1524 // Build local scope for function and populate with the formal parameters. | 1515 // Build local scope for function and populate with the formal parameters. |
| 1525 OpenFunctionBlock(func); | 1516 OpenFunctionBlock(func); |
| 1526 AddFormalParamsToScope(¶ms, current_block_->scope); | 1517 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 1527 } | 1518 } |
| 1528 | 1519 |
| 1529 SequenceNode* Parser::ParseNoSuchMethodDispatcher( | 1520 |
| 1530 const Function& func, | 1521 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) { |
| 1531 ZoneGrowableArray<const Instance*>* default_values) { | |
| 1532 TRACE_PARSER("ParseNoSuchMethodDispatcher"); | 1522 TRACE_PARSER("ParseNoSuchMethodDispatcher"); |
| 1533 ASSERT(FLAG_lazy_dispatchers); | 1523 ASSERT(FLAG_lazy_dispatchers); |
| 1534 | |
| 1535 ASSERT(func.IsNoSuchMethodDispatcher()); | 1524 ASSERT(func.IsNoSuchMethodDispatcher()); |
| 1536 intptr_t token_pos = func.token_pos(); | 1525 intptr_t token_pos = func.token_pos(); |
| 1537 ASSERT(func.token_pos() == 0); | 1526 ASSERT(func.token_pos() == 0); |
| 1538 ASSERT(current_class().raw() == func.Owner()); | 1527 ASSERT(current_class().raw() == func.Owner()); |
| 1539 | 1528 |
| 1540 ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc())); | 1529 ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc())); |
| 1541 ASSERT(desc.Count() > 0); | 1530 ASSERT(desc.Count() > 0); |
| 1542 | 1531 |
| 1543 // Set up scope for this function. | 1532 // Set up scope for this function. |
| 1544 BuildDispatcherScope(func, desc, default_values); | 1533 BuildDispatcherScope(func, desc); |
| 1545 | 1534 |
| 1546 // Receiver is local 0. | 1535 // Receiver is local 0. |
| 1547 LocalScope* scope = current_block_->scope; | 1536 LocalScope* scope = current_block_->scope; |
| 1548 ArgumentListNode* func_args = new ArgumentListNode(token_pos); | 1537 ArgumentListNode* func_args = new ArgumentListNode(token_pos); |
| 1549 for (intptr_t i = 0; i < desc.Count(); ++i) { | 1538 for (intptr_t i = 0; i < desc.Count(); ++i) { |
| 1550 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); | 1539 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); |
| 1551 } | 1540 } |
| 1552 | 1541 |
| 1553 if (desc.NamedCount() > 0) { | 1542 if (desc.NamedCount() > 0) { |
| 1554 const Array& arg_names = | 1543 const Array& arg_names = |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1578 } | 1567 } |
| 1579 StaticCallNode* call = | 1568 StaticCallNode* call = |
| 1580 new StaticCallNode(token_pos, no_such_method, arguments); | 1569 new StaticCallNode(token_pos, no_such_method, arguments); |
| 1581 | 1570 |
| 1582 ReturnNode* return_node = new ReturnNode(token_pos, call); | 1571 ReturnNode* return_node = new ReturnNode(token_pos, call); |
| 1583 current_block_->statements->Add(return_node); | 1572 current_block_->statements->Add(return_node); |
| 1584 return CloseBlock(); | 1573 return CloseBlock(); |
| 1585 } | 1574 } |
| 1586 | 1575 |
| 1587 | 1576 |
| 1588 SequenceNode* Parser::ParseInvokeFieldDispatcher( | 1577 SequenceNode* Parser::ParseInvokeFieldDispatcher(const Function& func) { |
| 1589 const Function& func, | |
| 1590 ZoneGrowableArray<const Instance*>* default_values) { | |
| 1591 TRACE_PARSER("ParseInvokeFieldDispatcher"); | 1578 TRACE_PARSER("ParseInvokeFieldDispatcher"); |
| 1592 ASSERT(FLAG_lazy_dispatchers); | 1579 ASSERT(FLAG_lazy_dispatchers); |
| 1593 | |
| 1594 ASSERT(func.IsInvokeFieldDispatcher()); | 1580 ASSERT(func.IsInvokeFieldDispatcher()); |
| 1595 intptr_t token_pos = func.token_pos(); | 1581 intptr_t token_pos = func.token_pos(); |
| 1596 ASSERT(func.token_pos() == 0); | 1582 ASSERT(func.token_pos() == 0); |
| 1597 ASSERT(current_class().raw() == func.Owner()); | 1583 ASSERT(current_class().raw() == func.Owner()); |
| 1598 | 1584 |
| 1599 const Array& args_desc = Array::Handle(Z, func.saved_args_desc()); | 1585 const Array& args_desc = Array::Handle(Z, func.saved_args_desc()); |
| 1600 ArgumentsDescriptor desc(args_desc); | 1586 ArgumentsDescriptor desc(args_desc); |
| 1601 ASSERT(desc.Count() > 0); | 1587 ASSERT(desc.Count() > 0); |
| 1602 | 1588 |
| 1603 // Set up scope for this function. | 1589 // Set up scope for this function. |
| 1604 BuildDispatcherScope(func, desc, default_values); | 1590 BuildDispatcherScope(func, desc); |
| 1605 | 1591 |
| 1606 // Receiver is local 0. | 1592 // Receiver is local 0. |
| 1607 LocalScope* scope = current_block_->scope; | 1593 LocalScope* scope = current_block_->scope; |
| 1608 ArgumentListNode* no_args = new ArgumentListNode(token_pos); | 1594 ArgumentListNode* no_args = new ArgumentListNode(token_pos); |
| 1609 LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0)); | 1595 LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0)); |
| 1610 | 1596 |
| 1611 const Class& function_impl = Class::Handle(Type::Handle( | 1597 const Class& function_impl = Class::Handle(Type::Handle( |
| 1612 Isolate::Current()->object_store()->function_impl_type()).type_class()); | 1598 Isolate::Current()->object_store()->function_impl_type()).type_class()); |
| 1613 | 1599 |
| 1614 const Class& owner = Class::Handle(Z, func.Owner()); | 1600 const Class& owner = Class::Handle(Z, func.Owner()); |
| (...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2904 } | 2890 } |
| 2905 } | 2891 } |
| 2906 ASSERT(!unregister_pending_function_); | 2892 ASSERT(!unregister_pending_function_); |
| 2907 pending_functions.Add(current_function()); | 2893 pending_functions.Add(current_function()); |
| 2908 unregister_pending_function_ = true; | 2894 unregister_pending_function_ = true; |
| 2909 } | 2895 } |
| 2910 | 2896 |
| 2911 | 2897 |
| 2912 // Parser is at the opening parenthesis of the formal parameter declaration | 2898 // Parser is at the opening parenthesis of the formal parameter declaration |
| 2913 // of function. Parse the formal parameters, initializers and code. | 2899 // of function. Parse the formal parameters, initializers and code. |
| 2914 SequenceNode* Parser::ParseConstructor( | 2900 SequenceNode* Parser::ParseConstructor(const Function& func) { |
| 2915 const Function& func, | |
| 2916 ZoneGrowableArray<const Instance*>* default_parameter_values) { | |
| 2917 TRACE_PARSER("ParseConstructor"); | 2901 TRACE_PARSER("ParseConstructor"); |
| 2918 ASSERT(func.IsGenerativeConstructor()); | 2902 ASSERT(func.IsGenerativeConstructor()); |
| 2919 ASSERT(!func.IsFactory()); | 2903 ASSERT(!func.IsFactory()); |
| 2920 ASSERT(!func.is_static()); | 2904 ASSERT(!func.is_static()); |
| 2921 ASSERT(!func.IsLocalFunction()); | 2905 ASSERT(!func.IsLocalFunction()); |
| 2922 const Class& cls = Class::Handle(Z, func.Owner()); | 2906 const Class& cls = Class::Handle(Z, func.Owner()); |
| 2923 ASSERT(!cls.IsNull()); | 2907 ASSERT(!cls.IsNull()); |
| 2924 | 2908 |
| 2925 CheckRecursiveInvocation(); | 2909 CheckRecursiveInvocation(); |
| 2926 | 2910 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2948 params.AddFinalParameter( | 2932 params.AddFinalParameter( |
| 2949 TokenPos(), | 2933 TokenPos(), |
| 2950 &Symbols::PhaseParameter(), | 2934 &Symbols::PhaseParameter(), |
| 2951 &Type::ZoneHandle(Z, Type::SmiType())); | 2935 &Type::ZoneHandle(Z, Type::SmiType())); |
| 2952 | 2936 |
| 2953 if (func.is_const()) { | 2937 if (func.is_const()) { |
| 2954 params.SetImplicitlyFinal(); | 2938 params.SetImplicitlyFinal(); |
| 2955 } | 2939 } |
| 2956 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 2940 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
| 2957 | 2941 |
| 2958 SetupDefaultsForOptionalParams(params, default_parameter_values); | 2942 SetupDefaultsForOptionalParams(params); |
| 2959 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 2943 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
| 2960 ASSERT(func.NumParameters() == params.parameters->length()); | 2944 ASSERT(func.NumParameters() == params.parameters->length()); |
| 2961 | 2945 |
| 2962 // Now populate function scope with the formal parameters. | 2946 // Now populate function scope with the formal parameters. |
| 2963 AddFormalParamsToScope(¶ms, current_block_->scope); | 2947 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 2964 | 2948 |
| 2965 const bool is_redirecting_constructor = | 2949 const bool is_redirecting_constructor = |
| 2966 (CurrentToken() == Token::kCOLON) && | 2950 (CurrentToken() == Token::kCOLON) && |
| 2967 ((LookaheadToken(1) == Token::kTHIS) && | 2951 ((LookaheadToken(1) == Token::kTHIS) && |
| 2968 ((LookaheadToken(2) == Token::kLPAREN) || | 2952 ((LookaheadToken(2) == Token::kLPAREN) || |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3214 } | 3198 } |
| 3215 current_block_->statements->Add(new ReturnNode(func.end_token_pos())); | 3199 current_block_->statements->Add(new ReturnNode(func.end_token_pos())); |
| 3216 SequenceNode* statements = CloseBlock(); | 3200 SequenceNode* statements = CloseBlock(); |
| 3217 return statements; | 3201 return statements; |
| 3218 } | 3202 } |
| 3219 | 3203 |
| 3220 | 3204 |
| 3221 // Parser is at the opening parenthesis of the formal parameter | 3205 // Parser is at the opening parenthesis of the formal parameter |
| 3222 // declaration of the function or constructor. | 3206 // declaration of the function or constructor. |
| 3223 // Parse the formal parameters and code. | 3207 // Parse the formal parameters and code. |
| 3224 SequenceNode* Parser::ParseFunc( | 3208 SequenceNode* Parser::ParseFunc(const Function& func) { |
| 3225 const Function& func, | |
| 3226 ZoneGrowableArray<const Instance*>* default_parameter_values) { | |
| 3227 TRACE_PARSER("ParseFunc"); | 3209 TRACE_PARSER("ParseFunc"); |
| 3228 Function& saved_innermost_function = | 3210 Function& saved_innermost_function = |
| 3229 Function::Handle(Z, innermost_function().raw()); | 3211 Function::Handle(Z, innermost_function().raw()); |
| 3230 innermost_function_ = func.raw(); | 3212 innermost_function_ = func.raw(); |
| 3231 | 3213 |
| 3232 // Save current try index. Try index starts at zero for each function. | 3214 // Save current try index. Try index starts at zero for each function. |
| 3233 intptr_t saved_try_index = last_used_try_index_; | 3215 intptr_t saved_try_index = last_used_try_index_; |
| 3234 last_used_try_index_ = 0; | 3216 last_used_try_index_ = 0; |
| 3235 | 3217 |
| 3236 // In case of nested async functions we also need to save the scope where | 3218 // In case of nested async functions we also need to save the scope where |
| 3237 // temporaries are added. | 3219 // temporaries are added. |
| 3238 LocalScope* saved_async_temp_scope = async_temp_scope_; | 3220 LocalScope* saved_async_temp_scope = async_temp_scope_; |
| 3239 | 3221 |
| 3240 if (func.IsGenerativeConstructor()) { | 3222 if (func.IsGenerativeConstructor()) { |
| 3241 SequenceNode* statements = ParseConstructor(func, default_parameter_values); | 3223 SequenceNode* statements = ParseConstructor(func); |
| 3242 innermost_function_ = saved_innermost_function.raw(); | 3224 innermost_function_ = saved_innermost_function.raw(); |
| 3243 last_used_try_index_ = saved_try_index; | 3225 last_used_try_index_ = saved_try_index; |
| 3244 return statements; | 3226 return statements; |
| 3245 } | 3227 } |
| 3246 | 3228 |
| 3247 ASSERT(!func.IsGenerativeConstructor()); | 3229 ASSERT(!func.IsGenerativeConstructor()); |
| 3248 OpenFunctionBlock(func); // Build local scope for function. | 3230 OpenFunctionBlock(func); // Build local scope for function. |
| 3249 | 3231 |
| 3250 ParamList params; | 3232 ParamList params; |
| 3251 // An instance closure function may capture and access the receiver, but via | 3233 // An instance closure function may capture and access the receiver, but via |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3275 func.IsGetterFunction() || | 3257 func.IsGetterFunction() || |
| 3276 (func.is_generated_body() && | 3258 (func.is_generated_body() && |
| 3277 Function::Handle(func.parent_function()).IsGetterFunction())); | 3259 Function::Handle(func.parent_function()).IsGetterFunction())); |
| 3278 const bool allow_explicit_default_values = true; | 3260 const bool allow_explicit_default_values = true; |
| 3279 if (func.IsGetterFunction()) { | 3261 if (func.IsGetterFunction()) { |
| 3280 // Populate function scope with the formal parameters. Since in this case | 3262 // Populate function scope with the formal parameters. Since in this case |
| 3281 // we are compiling a getter this will at most populate the receiver. | 3263 // we are compiling a getter this will at most populate the receiver. |
| 3282 AddFormalParamsToScope(¶ms, current_block_->scope); | 3264 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 3283 } else if (func.IsAsyncClosure()) { | 3265 } else if (func.IsAsyncClosure()) { |
| 3284 AddAsyncClosureParameters(¶ms); | 3266 AddAsyncClosureParameters(¶ms); |
| 3285 SetupDefaultsForOptionalParams(params, default_parameter_values); | 3267 SetupDefaultsForOptionalParams(params); |
| 3286 AddFormalParamsToScope(¶ms, current_block_->scope); | 3268 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 3287 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3269 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
| 3288 ASSERT(func.NumParameters() == params.parameters->length()); | 3270 ASSERT(func.NumParameters() == params.parameters->length()); |
| 3289 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { | 3271 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { |
| 3290 // Parse and discard any formal parameters. They are accessed as | 3272 // Parse and discard any formal parameters. They are accessed as |
| 3291 // context variables. | 3273 // context variables. |
| 3292 ParamList discarded_params; | 3274 ParamList discarded_params; |
| 3293 ParseFormalParameterList(allow_explicit_default_values, | 3275 ParseFormalParameterList(allow_explicit_default_values, |
| 3294 false, | 3276 false, |
| 3295 &discarded_params); | 3277 &discarded_params); |
| 3296 } | 3278 } |
| 3297 } else if (func.IsSyncGenClosure()) { | 3279 } else if (func.IsSyncGenClosure()) { |
| 3298 AddSyncGenClosureParameters(¶ms); | 3280 AddSyncGenClosureParameters(¶ms); |
| 3299 SetupDefaultsForOptionalParams(params, default_parameter_values); | 3281 SetupDefaultsForOptionalParams(params); |
| 3300 AddFormalParamsToScope(¶ms, current_block_->scope); | 3282 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 3301 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3283 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
| 3302 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { | 3284 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { |
| 3303 // Parse and discard any formal parameters. They are accessed as | 3285 // Parse and discard any formal parameters. They are accessed as |
| 3304 // context variables. | 3286 // context variables. |
| 3305 ParamList discarded_params; | 3287 ParamList discarded_params; |
| 3306 ParseFormalParameterList(allow_explicit_default_values, | 3288 ParseFormalParameterList(allow_explicit_default_values, |
| 3307 false, | 3289 false, |
| 3308 &discarded_params); | 3290 &discarded_params); |
| 3309 } | 3291 } |
| 3310 } else if (func.IsAsyncGenClosure()) { | 3292 } else if (func.IsAsyncGenClosure()) { |
| 3311 AddAsyncGenClosureParameters(¶ms); | 3293 AddAsyncGenClosureParameters(¶ms); |
| 3312 SetupDefaultsForOptionalParams(params, default_parameter_values); | 3294 SetupDefaultsForOptionalParams(params); |
| 3313 AddFormalParamsToScope(¶ms, current_block_->scope); | 3295 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 3314 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3296 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
| 3315 ASSERT(func.NumParameters() == params.parameters->length()); | 3297 ASSERT(func.NumParameters() == params.parameters->length()); |
| 3316 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { | 3298 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { |
| 3317 // Parse and discard any formal parameters. They are accessed as | 3299 // Parse and discard any formal parameters. They are accessed as |
| 3318 // context variables. | 3300 // context variables. |
| 3319 ParamList discarded_params; | 3301 ParamList discarded_params; |
| 3320 ParseFormalParameterList(allow_explicit_default_values, | 3302 ParseFormalParameterList(allow_explicit_default_values, |
| 3321 false, | 3303 false, |
| 3322 &discarded_params); | 3304 &discarded_params); |
| 3323 } | 3305 } |
| 3324 } else { | 3306 } else { |
| 3325 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 3307 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
| 3326 | 3308 |
| 3327 // The number of parameters and their type are not yet set in local | 3309 // The number of parameters and their type are not yet set in local |
| 3328 // functions, since they are not 'top-level' parsed. | 3310 // functions, since they are not 'top-level' parsed. |
| 3329 if (func.IsLocalFunction()) { | 3311 if (func.IsLocalFunction()) { |
| 3330 AddFormalParamsToFunction(¶ms, func); | 3312 AddFormalParamsToFunction(¶ms, func); |
| 3331 } | 3313 } |
| 3332 SetupDefaultsForOptionalParams(params, default_parameter_values); | 3314 SetupDefaultsForOptionalParams(params); |
| 3333 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3315 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
| 3334 ASSERT(func.NumParameters() == params.parameters->length()); | 3316 ASSERT(func.NumParameters() == params.parameters->length()); |
| 3335 | 3317 |
| 3336 // Check whether the function has any field initializer formal parameters, | 3318 // Check whether the function has any field initializer formal parameters, |
| 3337 // which are not allowed in non-constructor functions. | 3319 // which are not allowed in non-constructor functions. |
| 3338 if (params.has_field_initializer) { | 3320 if (params.has_field_initializer) { |
| 3339 for (int i = 0; i < params.parameters->length(); i++) { | 3321 for (int i = 0; i < params.parameters->length(); i++) { |
| 3340 ParamDesc& param = (*params.parameters)[i]; | 3322 ParamDesc& param = (*params.parameters)[i]; |
| 3341 if (param.is_field_initializer) { | 3323 if (param.is_field_initializer) { |
| 3342 ReportError(param.name_pos, | 3324 ReportError(param.name_pos, |
| (...skipping 3881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7224 ASSERT(new_body->scope() != NULL); | 7206 ASSERT(new_body->scope() != NULL); |
| 7225 new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); | 7207 new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); |
| 7226 new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); | 7208 new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); |
| 7227 new_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false); | 7209 new_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false); |
| 7228 new_body->scope()->RecursivelyCaptureAllVariables(); | 7210 new_body->scope()->RecursivelyCaptureAllVariables(); |
| 7229 return new_body; | 7211 return new_body; |
| 7230 } | 7212 } |
| 7231 | 7213 |
| 7232 | 7214 |
| 7233 // Set up default values for all optional parameters to the function. | 7215 // Set up default values for all optional parameters to the function. |
| 7234 void Parser::SetupDefaultsForOptionalParams( | 7216 void Parser::SetupDefaultsForOptionalParams(const ParamList& params) { |
| 7235 const ParamList& params, | 7217 if ((current_function().raw() == innermost_function().raw()) && |
| 7236 ZoneGrowableArray<const Instance*>* default_values) { | 7218 (params.num_optional_parameters > 0)) { |
| 7237 if (params.num_optional_parameters > 0) { | 7219 ZoneGrowableArray<const Instance*>* default_values = |
| 7220 new ZoneGrowableArray<const Instance*>(zone(), |
| 7221 params.num_optional_parameters); |
| 7238 // Build array of default parameter values. | 7222 // Build array of default parameter values. |
| 7239 const ZoneGrowableArray<ParamDesc>& parameters = *params.parameters; | 7223 const ZoneGrowableArray<ParamDesc>& parameters = *params.parameters; |
| 7240 const int first_opt_param_offset = params.num_fixed_parameters; | 7224 const int first_opt_param_offset = params.num_fixed_parameters; |
| 7241 for (int i = 0; i < params.num_optional_parameters; i++) { | 7225 for (int i = 0; i < params.num_optional_parameters; i++) { |
| 7242 const Instance* default_value = | 7226 const Instance* default_value = |
| 7243 parameters[i + first_opt_param_offset].default_value; | 7227 parameters[i + first_opt_param_offset].default_value; |
| 7244 default_values->Add(default_value); | 7228 default_values->Add(default_value); |
| 7245 } | 7229 } |
| 7230 parsed_function()->set_default_parameter_values(default_values); |
| 7246 } | 7231 } |
| 7247 } | 7232 } |
| 7248 | 7233 |
| 7249 | 7234 |
| 7250 // Populate the parameter type array and parameter name array of the function | 7235 // Populate the parameter type array and parameter name array of the function |
| 7251 // with the formal parameter types and names. | 7236 // with the formal parameter types and names. |
| 7252 void Parser::AddFormalParamsToFunction(const ParamList* params, | 7237 void Parser::AddFormalParamsToFunction(const ParamList* params, |
| 7253 const Function& func) { | 7238 const Function& func) { |
| 7254 ASSERT((params != NULL) && (params->parameters != NULL)); | 7239 ASSERT((params != NULL) && (params->parameters != NULL)); |
| 7255 ASSERT((params->num_optional_parameters > 0) == | 7240 ASSERT((params->num_optional_parameters > 0) == |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7671 } else { | 7656 } else { |
| 7672 ReportError(function_pos, | 7657 ReportError(function_pos, |
| 7673 "'%s' from outer scope has already been used, " | 7658 "'%s' from outer scope has already been used, " |
| 7674 "cannot redefine", | 7659 "cannot redefine", |
| 7675 function_variable->name().ToCString()); | 7660 function_variable->name().ToCString()); |
| 7676 } | 7661 } |
| 7677 } | 7662 } |
| 7678 } | 7663 } |
| 7679 | 7664 |
| 7680 // Parse the local function. | 7665 // Parse the local function. |
| 7681 ZoneGrowableArray<const Instance*>* default_parameter_values = | 7666 SequenceNode* statements = Parser::ParseFunc(function); |
| 7682 new ZoneGrowableArray<const Instance*>(Z, 2); | |
| 7683 SequenceNode* statements = Parser::ParseFunc(function, | |
| 7684 default_parameter_values); | |
| 7685 | 7667 |
| 7686 // Now that the local function has formal parameters, lookup the signature | 7668 // Now that the local function has formal parameters, lookup the signature |
| 7687 // class in the current library (but not in its imports) and only create a new | 7669 // class in the current library (but not in its imports) and only create a new |
| 7688 // canonical signature class if it does not exist yet. | 7670 // canonical signature class if it does not exist yet. |
| 7689 const String& signature = String::Handle(Z, function.Signature()); | 7671 const String& signature = String::Handle(Z, function.Signature()); |
| 7690 Class& signature_class = Class::ZoneHandle(Z); | 7672 Class& signature_class = Class::ZoneHandle(Z); |
| 7691 if (!is_new_closure) { | 7673 if (!is_new_closure) { |
| 7692 signature_class = function.signature_class(); | 7674 signature_class = function.signature_class(); |
| 7693 } | 7675 } |
| 7694 if (signature_class.IsNull()) { | 7676 if (signature_class.IsNull()) { |
| (...skipping 6485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14180 void Parser::SkipQualIdent() { | 14162 void Parser::SkipQualIdent() { |
| 14181 ASSERT(IsIdentifier()); | 14163 ASSERT(IsIdentifier()); |
| 14182 ConsumeToken(); | 14164 ConsumeToken(); |
| 14183 if (CurrentToken() == Token::kPERIOD) { | 14165 if (CurrentToken() == Token::kPERIOD) { |
| 14184 ConsumeToken(); // Consume the kPERIOD token. | 14166 ConsumeToken(); // Consume the kPERIOD token. |
| 14185 ExpectIdentifier("identifier expected after '.'"); | 14167 ExpectIdentifier("identifier expected after '.'"); |
| 14186 } | 14168 } |
| 14187 } | 14169 } |
| 14188 | 14170 |
| 14189 } // namespace dart | 14171 } // namespace dart |
| OLD | NEW |