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_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
9 | 9 |
10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
(...skipping 1539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1550 return CloseBlock(); | 1550 return CloseBlock(); |
1551 } | 1551 } |
1552 | 1552 |
1553 | 1553 |
1554 SequenceNode* Parser::ParseImplicitClosure(const Function& func) { | 1554 SequenceNode* Parser::ParseImplicitClosure(const Function& func) { |
1555 TRACE_PARSER("ParseImplicitClosure"); | 1555 TRACE_PARSER("ParseImplicitClosure"); |
1556 TokenPosition token_pos = func.token_pos(); | 1556 TokenPosition token_pos = func.token_pos(); |
1557 | 1557 |
1558 OpenFunctionBlock(func); | 1558 OpenFunctionBlock(func); |
1559 | 1559 |
| 1560 const Function& parent = Function::Handle(func.parent_function()); |
| 1561 intptr_t type_args_len = 0; // Length of type args vector passed to parent. |
| 1562 LocalVariable* type_args_var = NULL; |
1560 if (FLAG_reify_generic_functions) { | 1563 if (FLAG_reify_generic_functions) { |
1561 // The parent function of an implicit closure is the original function, i.e. | 1564 // The parent function of an implicit closure is the original function, i.e. |
1562 // non-closurized. It is not an enclosing function in the usual sense of a | 1565 // non-closurized. It is not an enclosing function in the usual sense of a |
1563 // parent function. Do not set parent_type_arguments() in parsed_function_. | 1566 // parent function. Do not set parent_type_arguments() in parsed_function_. |
1564 ASSERT(func.IsGeneric() == func.HasGenericParent()); | 1567 ASSERT(func.IsGeneric() == parent.IsGeneric()); |
1565 | 1568 |
1566 if (func.IsGeneric()) { | 1569 if (func.IsGeneric()) { |
| 1570 type_args_len = func.NumTypeParameters(); |
1567 // Insert function type arguments variable to scope. | 1571 // Insert function type arguments variable to scope. |
1568 LocalVariable* function_type_arguments = new (Z) LocalVariable( | 1572 type_args_var = new (Z) LocalVariable( |
1569 TokenPosition::kNoSource, TokenPosition::kNoSource, | 1573 TokenPosition::kNoSource, TokenPosition::kNoSource, |
1570 Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type()); | 1574 Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type()); |
1571 current_block_->scope->AddVariable(function_type_arguments); | 1575 current_block_->scope->AddVariable(type_args_var); |
1572 ASSERT(FunctionLevel() == 0); | 1576 ASSERT(FunctionLevel() == 0); |
1573 parsed_function_->set_function_type_arguments(function_type_arguments); | 1577 parsed_function_->set_function_type_arguments(type_args_var); |
1574 } | 1578 } |
1575 } | 1579 } |
1576 | 1580 |
1577 // TODO(regis): Pass the function type arguments if func is generic. | |
1578 ParamList params; | 1581 ParamList params; |
1579 params.AddFinalParameter(token_pos, &Symbols::ClosureParameter(), | 1582 params.AddFinalParameter(token_pos, &Symbols::ClosureParameter(), |
1580 &Object::dynamic_type()); | 1583 &Object::dynamic_type()); |
1581 | 1584 |
1582 const Function& parent = Function::Handle(func.parent_function()); | |
1583 if (parent.IsImplicitSetterFunction()) { | 1585 if (parent.IsImplicitSetterFunction()) { |
1584 const TokenPosition ident_pos = func.token_pos(); | 1586 const TokenPosition ident_pos = func.token_pos(); |
1585 ASSERT(IsIdentifier()); | 1587 ASSERT(IsIdentifier()); |
1586 params.AddFinalParameter(ident_pos, &Symbols::Value(), | 1588 params.AddFinalParameter(ident_pos, &Symbols::Value(), |
1587 &Object::dynamic_type()); | 1589 &Object::dynamic_type()); |
1588 ASSERT(func.num_fixed_parameters() == 2); // closure, value. | 1590 ASSERT(func.num_fixed_parameters() == 2); // closure, value. |
1589 } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { | 1591 } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { |
1590 // NOTE: For the `kernel -> flowgraph` we don't use the parser. | 1592 // NOTE: For the `kernel -> flowgraph` we don't use the parser. |
1591 if (parent.kernel_function() == NULL) { | 1593 if (parent.kernel_function() == NULL) { |
1592 SkipFunctionPreamble(); | 1594 SkipFunctionPreamble(); |
1593 const bool use_function_type_syntax = false; | 1595 const bool use_function_type_syntax = false; |
1594 const bool allow_explicit_default_values = true; | 1596 const bool allow_explicit_default_values = true; |
1595 const bool evaluate_metadata = false; | 1597 const bool evaluate_metadata = false; |
1596 ParseFormalParameterList(use_function_type_syntax, | 1598 ParseFormalParameterList(use_function_type_syntax, |
1597 allow_explicit_default_values, evaluate_metadata, | 1599 allow_explicit_default_values, evaluate_metadata, |
1598 ¶ms); | 1600 ¶ms); |
1599 FinalizeFormalParameterTypes(¶ms); | 1601 FinalizeFormalParameterTypes(¶ms); |
1600 SetupDefaultsForOptionalParams(params); | 1602 SetupDefaultsForOptionalParams(params); |
1601 } | 1603 } |
1602 } | 1604 } |
1603 | 1605 |
1604 // Populate function scope with the formal parameters. | 1606 // Populate function scope with the formal parameters. |
1605 LocalScope* scope = current_block_->scope; | 1607 LocalScope* scope = current_block_->scope; |
1606 AddFormalParamsToScope(¶ms, scope); | 1608 AddFormalParamsToScope(¶ms, scope); |
1607 | 1609 |
1608 ArgumentListNode* func_args = new ArgumentListNode(token_pos); | 1610 ArgumentListNode* func_args = |
| 1611 new ArgumentListNode(token_pos, type_args_var, type_args_len); |
1609 if (!func.is_static()) { | 1612 if (!func.is_static()) { |
1610 func_args->Add(LoadReceiver(token_pos)); | 1613 func_args->Add(LoadReceiver(token_pos)); |
1611 } | 1614 } |
1612 // Skip implicit parameter at 0. | 1615 // Skip implicit parameter at 0. |
1613 for (intptr_t i = 1; i < func.NumParameters(); ++i) { | 1616 for (intptr_t i = 1; i < func.NumParameters(); ++i) { |
1614 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); | 1617 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); |
1615 } | 1618 } |
1616 | 1619 |
1617 if (func.HasOptionalNamedParameters()) { | 1620 if (func.HasOptionalNamedParameters()) { |
1618 // TODO(srdjan): Must allocate array in old space, since it | 1621 // TODO(srdjan): Must allocate array in old space, since it |
(...skipping 29 matching lines...) Expand all Loading... |
1648 } else if (!parent.is_static()) { | 1651 } else if (!parent.is_static()) { |
1649 ASSERT(Isolate::Current()->HasAttemptedReload()); | 1652 ASSERT(Isolate::Current()->HasAttemptedReload()); |
1650 // If a subsequent reload reintroduces the target in the middle of the | 1653 // If a subsequent reload reintroduces the target in the middle of the |
1651 // Invocation object being constructed, we won't be able to successfully | 1654 // Invocation object being constructed, we won't be able to successfully |
1652 // deopt because the generated AST will change. | 1655 // deopt because the generated AST will change. |
1653 func.SetIsOptimizable(false); | 1656 func.SetIsOptimizable(false); |
1654 | 1657 |
1655 ArgumentListNode* arguments = BuildNoSuchMethodArguments( | 1658 ArgumentListNode* arguments = BuildNoSuchMethodArguments( |
1656 token_pos, func_name, *func_args, NULL, false); | 1659 token_pos, func_name, *func_args, NULL, false); |
1657 const intptr_t kNumArguments = 2; // Receiver, InvocationMirror. | 1660 const intptr_t kNumArguments = 2; // Receiver, InvocationMirror. |
1658 ArgumentsDescriptor args_desc( | 1661 ArgumentsDescriptor args_desc(Array::Handle( |
1659 Array::Handle(Z, ArgumentsDescriptor::New(kNumArguments))); | 1662 Z, ArgumentsDescriptor::New(type_args_len, kNumArguments))); |
1660 Function& no_such_method = | 1663 Function& no_such_method = |
1661 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( | 1664 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( |
1662 owner, Symbols::NoSuchMethod(), args_desc)); | 1665 owner, Symbols::NoSuchMethod(), args_desc)); |
1663 if (no_such_method.IsNull()) { | 1666 if (no_such_method.IsNull()) { |
1664 // If noSuchMethod(i) is not found, call Object:noSuchMethod. | 1667 // If noSuchMethod(i) is not found, call Object:noSuchMethod. |
1665 no_such_method ^= Resolver::ResolveDynamicForReceiverClass( | 1668 no_such_method ^= Resolver::ResolveDynamicForReceiverClass( |
1666 Class::Handle(Z, I->object_store()->object_class()), | 1669 Class::Handle(Z, I->object_store()->object_class()), |
1667 Symbols::NoSuchMethod(), args_desc); | 1670 Symbols::NoSuchMethod(), args_desc); |
1668 } | 1671 } |
1669 call = new StaticCallNode(token_pos, no_such_method, arguments); | 1672 call = new StaticCallNode(token_pos, no_such_method, arguments); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1790 Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld)); | 1793 Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld)); |
1791 for (intptr_t i = 0; i < arg_names.Length(); ++i) { | 1794 for (intptr_t i = 0; i < arg_names.Length(); ++i) { |
1792 arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i))); | 1795 arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i))); |
1793 } | 1796 } |
1794 func_args->set_names(arg_names); | 1797 func_args->set_names(arg_names); |
1795 } | 1798 } |
1796 | 1799 |
1797 const String& func_name = String::ZoneHandle(Z, func.name()); | 1800 const String& func_name = String::ZoneHandle(Z, func.name()); |
1798 ArgumentListNode* arguments = | 1801 ArgumentListNode* arguments = |
1799 BuildNoSuchMethodArguments(token_pos, func_name, *func_args, NULL, false); | 1802 BuildNoSuchMethodArguments(token_pos, func_name, *func_args, NULL, false); |
| 1803 const intptr_t kTypeArgsLen = 0; |
1800 const intptr_t kNumArguments = 2; // Receiver, InvocationMirror. | 1804 const intptr_t kNumArguments = 2; // Receiver, InvocationMirror. |
1801 ArgumentsDescriptor args_desc( | 1805 ArgumentsDescriptor args_desc( |
1802 Array::Handle(Z, ArgumentsDescriptor::New(kNumArguments))); | 1806 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
1803 Function& no_such_method = Function::ZoneHandle( | 1807 Function& no_such_method = Function::ZoneHandle( |
1804 Z, | 1808 Z, |
1805 Resolver::ResolveDynamicForReceiverClass( | 1809 Resolver::ResolveDynamicForReceiverClass( |
1806 Class::Handle(Z, func.Owner()), Symbols::NoSuchMethod(), args_desc)); | 1810 Class::Handle(Z, func.Owner()), Symbols::NoSuchMethod(), args_desc)); |
1807 if (no_such_method.IsNull()) { | 1811 if (no_such_method.IsNull()) { |
1808 // If noSuchMethod(i) is not found, call Object:noSuchMethod. | 1812 // If noSuchMethod(i) is not found, call Object:noSuchMethod. |
1809 no_such_method ^= Resolver::ResolveDynamicForReceiverClass( | 1813 no_such_method ^= Resolver::ResolveDynamicForReceiverClass( |
1810 Class::Handle(Z, I->object_store()->object_class()), | 1814 Class::Handle(Z, I->object_store()->object_class()), |
1811 Symbols::NoSuchMethod(), args_desc); | 1815 Symbols::NoSuchMethod(), args_desc); |
1812 } | 1816 } |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2371 bool resolve_getter, | 2375 bool resolve_getter, |
2372 bool* is_no_such_method) { | 2376 bool* is_no_such_method) { |
2373 const Class& super_class = Class::Handle(Z, current_class().SuperClass()); | 2377 const Class& super_class = Class::Handle(Z, current_class().SuperClass()); |
2374 if (super_class.IsNull()) { | 2378 if (super_class.IsNull()) { |
2375 ReportError(token_pos, "class '%s' does not have a superclass", | 2379 ReportError(token_pos, "class '%s' does not have a superclass", |
2376 String::Handle(Z, current_class().Name()).ToCString()); | 2380 String::Handle(Z, current_class().Name()).ToCString()); |
2377 } | 2381 } |
2378 Function& super_func = Function::Handle( | 2382 Function& super_func = Function::Handle( |
2379 Z, Resolver::ResolveDynamicAnyArgs(Z, super_class, name)); | 2383 Z, Resolver::ResolveDynamicAnyArgs(Z, super_class, name)); |
2380 if (!super_func.IsNull() && | 2384 if (!super_func.IsNull() && |
2381 !super_func.AreValidArguments(arguments->length(), arguments->names(), | 2385 !super_func.AreValidArguments(arguments->type_args_len(), |
| 2386 arguments->length(), arguments->names(), |
2382 NULL)) { | 2387 NULL)) { |
2383 super_func = Function::null(); | 2388 super_func = Function::null(); |
2384 } else if (super_func.IsNull() && resolve_getter) { | 2389 } else if (super_func.IsNull() && resolve_getter) { |
2385 const String& getter_name = | 2390 const String& getter_name = |
2386 String::ZoneHandle(Z, Field::LookupGetterSymbol(name)); | 2391 String::ZoneHandle(Z, Field::LookupGetterSymbol(name)); |
2387 if (!getter_name.IsNull()) { | 2392 if (!getter_name.IsNull()) { |
2388 super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name); | 2393 super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name); |
2389 ASSERT(super_func.IsNull() || | 2394 ASSERT(super_func.IsNull() || |
2390 (super_func.kind() != RawFunction::kImplicitStaticFinalGetter)); | 2395 (super_func.kind() != RawFunction::kImplicitStaticFinalGetter)); |
2391 } | 2396 } |
(...skipping 12 matching lines...) Expand all Loading... |
2404 | 2409 |
2405 StaticCallNode* Parser::BuildInvocationMirrorAllocation( | 2410 StaticCallNode* Parser::BuildInvocationMirrorAllocation( |
2406 TokenPosition call_pos, | 2411 TokenPosition call_pos, |
2407 const String& function_name, | 2412 const String& function_name, |
2408 const ArgumentListNode& function_args, | 2413 const ArgumentListNode& function_args, |
2409 const LocalVariable* temp_for_last_arg, | 2414 const LocalVariable* temp_for_last_arg, |
2410 bool is_super_invocation) { | 2415 bool is_super_invocation) { |
2411 const TokenPosition args_pos = function_args.token_pos(); | 2416 const TokenPosition args_pos = function_args.token_pos(); |
2412 // Build arguments to the call to the static | 2417 // Build arguments to the call to the static |
2413 // InvocationMirror._allocateInvocationMirror method. | 2418 // InvocationMirror._allocateInvocationMirror method. |
| 2419 const intptr_t type_args_len = function_args.type_args_len(); |
| 2420 const intptr_t args_count = |
| 2421 function_args.length() - (type_args_len > 0 ? 1 : 0); |
2414 ArgumentListNode* arguments = new ArgumentListNode(args_pos); | 2422 ArgumentListNode* arguments = new ArgumentListNode(args_pos); |
2415 // The first argument is the original function name. | 2423 // The first argument is the original function name. |
2416 arguments->Add(new LiteralNode(args_pos, function_name)); | 2424 arguments->Add(new LiteralNode(args_pos, function_name)); |
2417 // The second argument is the arguments descriptor of the original function. | 2425 // The second argument is the arguments descriptor of the original function. |
2418 const Array& args_descriptor = Array::ZoneHandle( | 2426 const Array& args_descriptor = Array::ZoneHandle(ArgumentsDescriptor::New( |
2419 ArgumentsDescriptor::New(function_args.length(), function_args.names())); | 2427 type_args_len, args_count, function_args.names())); |
2420 arguments->Add(new LiteralNode(args_pos, args_descriptor)); | 2428 arguments->Add(new LiteralNode(args_pos, args_descriptor)); |
2421 // The third argument is an array containing the original function arguments, | 2429 // The third argument is an array containing the original function arguments, |
2422 // including the receiver. | 2430 // including the function type arguments and the receiver. |
2423 ArrayNode* args_array = | 2431 ArrayNode* args_array = |
2424 new ArrayNode(args_pos, Type::ZoneHandle(Type::ArrayType())); | 2432 new ArrayNode(args_pos, Type::ZoneHandle(Type::ArrayType())); |
2425 for (intptr_t i = 0; i < function_args.length(); i++) { | 2433 for (intptr_t i = 0; i < function_args.length(); i++) { |
2426 AstNode* arg = function_args.NodeAt(i); | 2434 AstNode* arg = function_args.NodeAt(i); |
2427 if ((temp_for_last_arg != NULL) && (i == function_args.length() - 1)) { | 2435 if ((temp_for_last_arg != NULL) && (i == function_args.length() - 1)) { |
2428 LetNode* store_arg = new LetNode(arg->token_pos()); | 2436 LetNode* store_arg = new LetNode(arg->token_pos()); |
2429 store_arg->AddNode( | 2437 store_arg->AddNode( |
2430 new StoreLocalNode(arg->token_pos(), temp_for_last_arg, arg)); | 2438 new StoreLocalNode(arg->token_pos(), temp_for_last_arg, arg)); |
2431 store_arg->AddNode( | 2439 store_arg->AddNode( |
2432 new LoadLocalNode(arg->token_pos(), temp_for_last_arg)); | 2440 new LoadLocalNode(arg->token_pos(), temp_for_last_arg)); |
(...skipping 15 matching lines...) Expand all Loading... |
2448 return new StaticCallNode(call_pos, allocation_function, arguments); | 2456 return new StaticCallNode(call_pos, allocation_function, arguments); |
2449 } | 2457 } |
2450 | 2458 |
2451 | 2459 |
2452 ArgumentListNode* Parser::BuildNoSuchMethodArguments( | 2460 ArgumentListNode* Parser::BuildNoSuchMethodArguments( |
2453 TokenPosition call_pos, | 2461 TokenPosition call_pos, |
2454 const String& function_name, | 2462 const String& function_name, |
2455 const ArgumentListNode& function_args, | 2463 const ArgumentListNode& function_args, |
2456 const LocalVariable* temp_for_last_arg, | 2464 const LocalVariable* temp_for_last_arg, |
2457 bool is_super_invocation) { | 2465 bool is_super_invocation) { |
2458 ASSERT(function_args.length() >= 1); // The receiver is the first argument. | 2466 const intptr_t receiver_idx = function_args.type_args_len() > 0 ? 1 : 0; |
| 2467 ASSERT(function_args.length() > receiver_idx); |
2459 const TokenPosition args_pos = function_args.token_pos(); | 2468 const TokenPosition args_pos = function_args.token_pos(); |
2460 ArgumentListNode* arguments = new ArgumentListNode(args_pos); | 2469 ArgumentListNode* arguments = new ArgumentListNode(args_pos); |
2461 arguments->Add(function_args.NodeAt(0)); | 2470 arguments->Add(function_args.NodeAt(receiver_idx)); |
2462 // The second argument is the invocation mirror. | 2471 // The second argument is the invocation mirror. |
2463 arguments->Add( | 2472 arguments->Add( |
2464 BuildInvocationMirrorAllocation(call_pos, function_name, function_args, | 2473 BuildInvocationMirrorAllocation(call_pos, function_name, function_args, |
2465 temp_for_last_arg, is_super_invocation)); | 2474 temp_for_last_arg, is_super_invocation)); |
2466 return arguments; | 2475 return arguments; |
2467 } | 2476 } |
2468 | 2477 |
2469 | 2478 |
2470 AstNode* Parser::ParseSuperCall(const String& function_name) { | 2479 AstNode* Parser::ParseSuperCall(const String& function_name, |
| 2480 const TypeArguments& func_type_args) { |
2471 TRACE_PARSER("ParseSuperCall"); | 2481 TRACE_PARSER("ParseSuperCall"); |
2472 ASSERT(CurrentToken() == Token::kLPAREN); | 2482 ASSERT(CurrentToken() == Token::kLPAREN); |
2473 const TokenPosition supercall_pos = TokenPos(); | 2483 const TokenPosition supercall_pos = TokenPos(); |
2474 | 2484 |
2475 // 'this' parameter is the first argument to super call. | 2485 // 'this' parameter is the first argument to super call (after the type args). |
2476 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); | 2486 ArgumentListNode* arguments = |
| 2487 new ArgumentListNode(supercall_pos, func_type_args); |
2477 AstNode* receiver = LoadReceiver(supercall_pos); | 2488 AstNode* receiver = LoadReceiver(supercall_pos); |
2478 arguments->Add(receiver); | 2489 arguments->Add(receiver); |
2479 ParseActualParameters(arguments, kAllowConst); | 2490 ParseActualParameters(arguments, Object::null_type_arguments(), kAllowConst); |
2480 | 2491 |
2481 const bool kResolveGetter = true; | 2492 const bool kResolveGetter = true; |
2482 bool is_no_such_method = false; | 2493 bool is_no_such_method = false; |
2483 const Function& super_function = Function::ZoneHandle( | 2494 const Function& super_function = Function::ZoneHandle( |
2484 Z, GetSuperFunction(supercall_pos, function_name, arguments, | 2495 Z, GetSuperFunction(supercall_pos, function_name, arguments, |
2485 kResolveGetter, &is_no_such_method)); | 2496 kResolveGetter, &is_no_such_method)); |
2486 if (super_function.IsGetterFunction() || | 2497 if (super_function.IsGetterFunction() || |
2487 super_function.IsImplicitGetterFunction()) { | 2498 super_function.IsImplicitGetterFunction()) { |
2488 const Class& super_class = | 2499 const Class& super_class = |
2489 Class::ZoneHandle(Z, current_class().SuperClass()); | 2500 Class::ZoneHandle(Z, current_class().SuperClass()); |
2490 AstNode* closure = new StaticGetterNode( | 2501 AstNode* closure = new StaticGetterNode( |
2491 supercall_pos, LoadReceiver(supercall_pos), super_class, function_name); | 2502 supercall_pos, LoadReceiver(supercall_pos), super_class, function_name); |
2492 // 'this' is not passed as parameter to the closure. | 2503 // 'this' is not passed as parameter to the closure. |
2493 ArgumentListNode* closure_arguments = new ArgumentListNode(supercall_pos); | 2504 ArgumentListNode* closure_arguments = |
| 2505 new ArgumentListNode(supercall_pos, func_type_args); |
2494 for (int i = 1; i < arguments->length(); i++) { | 2506 for (int i = 1; i < arguments->length(); i++) { |
2495 closure_arguments->Add(arguments->NodeAt(i)); | 2507 closure_arguments->Add(arguments->NodeAt(i)); |
2496 } | 2508 } |
2497 return BuildClosureCall(supercall_pos, closure, closure_arguments); | 2509 return BuildClosureCall(supercall_pos, closure, closure_arguments); |
2498 } | 2510 } |
2499 if (is_no_such_method) { | 2511 if (is_no_such_method) { |
2500 arguments = BuildNoSuchMethodArguments(supercall_pos, function_name, | 2512 arguments = BuildNoSuchMethodArguments(supercall_pos, function_name, |
2501 *arguments, NULL, true); | 2513 *arguments, NULL, true); |
2502 } | 2514 } |
2503 return new StaticCallNode(supercall_pos, super_function, arguments); | 2515 return new StaticCallNode(supercall_pos, super_function, arguments); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2698 } | 2710 } |
2699 ReportError(supercall_pos, | 2711 ReportError(supercall_pos, |
2700 "unresolved implicit call to super constructor '%s()'", | 2712 "unresolved implicit call to super constructor '%s()'", |
2701 String::Handle(Z, super_class.Name()).ToCString()); | 2713 String::Handle(Z, super_class.Name()).ToCString()); |
2702 } | 2714 } |
2703 if (current_function().is_const() && !super_ctor.is_const()) { | 2715 if (current_function().is_const() && !super_ctor.is_const()) { |
2704 ReportError(supercall_pos, "implicit call to non-const super constructor"); | 2716 ReportError(supercall_pos, "implicit call to non-const super constructor"); |
2705 } | 2717 } |
2706 | 2718 |
2707 String& error_message = String::Handle(Z); | 2719 String& error_message = String::Handle(Z); |
2708 if (!super_ctor.AreValidArguments(arguments->length(), arguments->names(), | 2720 if (!super_ctor.AreValidArguments(arguments->type_args_len(), |
| 2721 arguments->length(), arguments->names(), |
2709 &error_message)) { | 2722 &error_message)) { |
2710 ReportError(supercall_pos, | 2723 ReportError(supercall_pos, |
2711 "invalid arguments passed to super constructor '%s()': %s", | 2724 "invalid arguments passed to super constructor '%s()': %s", |
2712 String::Handle(Z, super_class.Name()).ToCString(), | 2725 String::Handle(Z, super_class.Name()).ToCString(), |
2713 error_message.ToCString()); | 2726 error_message.ToCString()); |
2714 } | 2727 } |
2715 return new StaticCallNode(supercall_pos, super_ctor, arguments); | 2728 return new StaticCallNode(supercall_pos, super_ctor, arguments); |
2716 } | 2729 } |
2717 | 2730 |
2718 | 2731 |
(...skipping 14 matching lines...) Expand all Loading... |
2733 } | 2746 } |
2734 CheckToken(Token::kLPAREN, "parameter list expected"); | 2747 CheckToken(Token::kLPAREN, "parameter list expected"); |
2735 | 2748 |
2736 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); | 2749 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); |
2737 // 'this' parameter is the first argument to super class constructor. | 2750 // 'this' parameter is the first argument to super class constructor. |
2738 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver); | 2751 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver); |
2739 arguments->Add(implicit_argument); | 2752 arguments->Add(implicit_argument); |
2740 | 2753 |
2741 // 'this' parameter must not be accessible to the other super call arguments. | 2754 // 'this' parameter must not be accessible to the other super call arguments. |
2742 receiver->set_invisible(true); | 2755 receiver->set_invisible(true); |
2743 ParseActualParameters(arguments, kAllowConst); | 2756 ParseActualParameters(arguments, Object::null_type_arguments(), kAllowConst); |
2744 receiver->set_invisible(false); | 2757 receiver->set_invisible(false); |
2745 | 2758 |
2746 // Resolve the constructor. | 2759 // Resolve the constructor. |
2747 const Function& super_ctor = | 2760 const Function& super_ctor = |
2748 Function::ZoneHandle(Z, super_class.LookupConstructor(ctor_name)); | 2761 Function::ZoneHandle(Z, super_class.LookupConstructor(ctor_name)); |
2749 if (super_ctor.IsNull()) { | 2762 if (super_ctor.IsNull()) { |
2750 if (super_class.LookupFactory(ctor_name) != Function::null()) { | 2763 if (super_class.LookupFactory(ctor_name) != Function::null()) { |
2751 ReportError(supercall_pos, | 2764 ReportError(supercall_pos, |
2752 "super class constructor '%s' " | 2765 "super class constructor '%s' " |
2753 "must not be a factory constructor", | 2766 "must not be a factory constructor", |
2754 ctor_name.ToCString()); | 2767 ctor_name.ToCString()); |
2755 } | 2768 } |
2756 ReportError(supercall_pos, "super class constructor '%s' not found", | 2769 ReportError(supercall_pos, "super class constructor '%s' not found", |
2757 ctor_name.ToCString()); | 2770 ctor_name.ToCString()); |
2758 } | 2771 } |
2759 if (current_function().is_const() && !super_ctor.is_const()) { | 2772 if (current_function().is_const() && !super_ctor.is_const()) { |
2760 ReportError(supercall_pos, "super constructor must be const"); | 2773 ReportError(supercall_pos, "super constructor must be const"); |
2761 } | 2774 } |
2762 String& error_message = String::Handle(Z); | 2775 String& error_message = String::Handle(Z); |
2763 if (!super_ctor.AreValidArguments(arguments->length(), arguments->names(), | 2776 if (!super_ctor.AreValidArguments(arguments->type_args_len(), |
| 2777 arguments->length(), arguments->names(), |
2764 &error_message)) { | 2778 &error_message)) { |
2765 ReportError(supercall_pos, | 2779 ReportError(supercall_pos, |
2766 "invalid arguments passed to super class constructor '%s': %s", | 2780 "invalid arguments passed to super class constructor '%s': %s", |
2767 ctor_name.ToCString(), error_message.ToCString()); | 2781 ctor_name.ToCString(), error_message.ToCString()); |
2768 } | 2782 } |
2769 return new StaticCallNode(supercall_pos, super_ctor, arguments); | 2783 return new StaticCallNode(supercall_pos, super_ctor, arguments); |
2770 } | 2784 } |
2771 | 2785 |
2772 | 2786 |
2773 AstNode* Parser::ParseInitializer(const Class& cls, | 2787 AstNode* Parser::ParseInitializer(const Class& cls, |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3125 } | 3139 } |
3126 ctor_name = Symbols::FromConcatAll(T, pieces); | 3140 ctor_name = Symbols::FromConcatAll(T, pieces); |
3127 CheckToken(Token::kLPAREN, "parameter list expected"); | 3141 CheckToken(Token::kLPAREN, "parameter list expected"); |
3128 | 3142 |
3129 ArgumentListNode* arguments = new ArgumentListNode(call_pos); | 3143 ArgumentListNode* arguments = new ArgumentListNode(call_pos); |
3130 // 'this' parameter is the first argument to constructor. | 3144 // 'this' parameter is the first argument to constructor. |
3131 AstNode* implicit_argument = new LoadLocalNode(call_pos, receiver); | 3145 AstNode* implicit_argument = new LoadLocalNode(call_pos, receiver); |
3132 arguments->Add(implicit_argument); | 3146 arguments->Add(implicit_argument); |
3133 | 3147 |
3134 receiver->set_invisible(true); | 3148 receiver->set_invisible(true); |
3135 ParseActualParameters(arguments, kAllowConst); | 3149 ParseActualParameters(arguments, Object::null_type_arguments(), kAllowConst); |
3136 receiver->set_invisible(false); | 3150 receiver->set_invisible(false); |
3137 // Resolve the constructor. | 3151 // Resolve the constructor. |
3138 const Function& redirect_ctor = | 3152 const Function& redirect_ctor = |
3139 Function::ZoneHandle(Z, cls.LookupConstructor(ctor_name)); | 3153 Function::ZoneHandle(Z, cls.LookupConstructor(ctor_name)); |
3140 if (redirect_ctor.IsNull()) { | 3154 if (redirect_ctor.IsNull()) { |
3141 if (cls.LookupFactory(ctor_name) != Function::null()) { | 3155 if (cls.LookupFactory(ctor_name) != Function::null()) { |
3142 ReportError(call_pos, | 3156 ReportError(call_pos, |
3143 "redirection constructor '%s' must not be a factory", | 3157 "redirection constructor '%s' must not be a factory", |
3144 String::Handle(Z, String::ScrubName(ctor_name)).ToCString()); | 3158 String::Handle(Z, String::ScrubName(ctor_name)).ToCString()); |
3145 } | 3159 } |
3146 ReportError(call_pos, "constructor '%s' not found", | 3160 ReportError(call_pos, "constructor '%s' not found", |
3147 String::Handle(Z, String::ScrubName(ctor_name)).ToCString()); | 3161 String::Handle(Z, String::ScrubName(ctor_name)).ToCString()); |
3148 } | 3162 } |
3149 if (current_function().is_const() && !redirect_ctor.is_const()) { | 3163 if (current_function().is_const() && !redirect_ctor.is_const()) { |
3150 ReportError(call_pos, "redirection constructor '%s' must be const", | 3164 ReportError(call_pos, "redirection constructor '%s' must be const", |
3151 String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString()); | 3165 String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString()); |
3152 } | 3166 } |
3153 String& error_message = String::Handle(Z); | 3167 String& error_message = String::Handle(Z); |
3154 if (!redirect_ctor.AreValidArguments(arguments->length(), arguments->names(), | 3168 if (!redirect_ctor.AreValidArguments(arguments->type_args_len(), |
| 3169 arguments->length(), arguments->names(), |
3155 &error_message)) { | 3170 &error_message)) { |
3156 ReportError(call_pos, "invalid arguments passed to constructor '%s': %s", | 3171 ReportError(call_pos, "invalid arguments passed to constructor '%s': %s", |
3157 String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString(), | 3172 String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString(), |
3158 error_message.ToCString()); | 3173 error_message.ToCString()); |
3159 } | 3174 } |
3160 current_block_->statements->Add( | 3175 current_block_->statements->Add( |
3161 new StaticCallNode(call_pos, redirect_ctor, arguments)); | 3176 new StaticCallNode(call_pos, redirect_ctor, arguments)); |
3162 } | 3177 } |
3163 | 3178 |
3164 | 3179 |
(...skipping 6446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9611 return CloseBlock(); | 9626 return CloseBlock(); |
9612 } | 9627 } |
9613 | 9628 |
9614 | 9629 |
9615 // Calling VM-internal helpers, uses implementation core library. | 9630 // Calling VM-internal helpers, uses implementation core library. |
9616 AstNode* Parser::MakeStaticCall(const String& cls_name, | 9631 AstNode* Parser::MakeStaticCall(const String& cls_name, |
9617 const String& func_name, | 9632 const String& func_name, |
9618 ArgumentListNode* arguments) { | 9633 ArgumentListNode* arguments) { |
9619 const Class& cls = Class::Handle(Z, Library::LookupCoreClass(cls_name)); | 9634 const Class& cls = Class::Handle(Z, Library::LookupCoreClass(cls_name)); |
9620 ASSERT(!cls.IsNull()); | 9635 ASSERT(!cls.IsNull()); |
| 9636 const intptr_t kTypeArgsLen = 0; // Not passing type args to generic func. |
9621 const Function& func = Function::ZoneHandle( | 9637 const Function& func = Function::ZoneHandle( |
9622 Z, Resolver::ResolveStatic(cls, func_name, arguments->length(), | 9638 Z, Resolver::ResolveStatic(cls, func_name, kTypeArgsLen, |
9623 arguments->names())); | 9639 arguments->length(), arguments->names())); |
9624 ASSERT(!func.IsNull()); | 9640 ASSERT(!func.IsNull()); |
9625 return new (Z) StaticCallNode(arguments->token_pos(), func, arguments); | 9641 return new (Z) StaticCallNode(arguments->token_pos(), func, arguments); |
9626 } | 9642 } |
9627 | 9643 |
9628 | 9644 |
9629 AstNode* Parser::ParseAssertStatement(bool is_const) { | 9645 AstNode* Parser::ParseAssertStatement(bool is_const) { |
9630 TRACE_PARSER("ParseAssertStatement"); | 9646 TRACE_PARSER("ParseAssertStatement"); |
9631 ConsumeToken(); // Consume assert keyword. | 9647 ConsumeToken(); // Consume assert keyword. |
9632 ExpectToken(Token::kLPAREN); | 9648 ExpectToken(Token::kLPAREN); |
9633 const TokenPosition condition_pos = TokenPos(); | 9649 const TokenPosition condition_pos = TokenPos(); |
(...skipping 1985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11619 expr = let_expr; | 11635 expr = let_expr; |
11620 } else { | 11636 } else { |
11621 expr = ParsePostfixExpr(); | 11637 expr = ParsePostfixExpr(); |
11622 } | 11638 } |
11623 return expr; | 11639 return expr; |
11624 } | 11640 } |
11625 | 11641 |
11626 | 11642 |
11627 ArgumentListNode* Parser::ParseActualParameters( | 11643 ArgumentListNode* Parser::ParseActualParameters( |
11628 ArgumentListNode* implicit_arguments, | 11644 ArgumentListNode* implicit_arguments, |
| 11645 const TypeArguments& func_type_args, |
11629 bool require_const) { | 11646 bool require_const) { |
11630 TRACE_PARSER("ParseActualParameters"); | 11647 TRACE_PARSER("ParseActualParameters"); |
11631 ASSERT(CurrentToken() == Token::kLPAREN); | 11648 ASSERT(CurrentToken() == Token::kLPAREN); |
11632 const bool saved_mode = SetAllowFunctionLiterals(true); | 11649 const bool saved_mode = SetAllowFunctionLiterals(true); |
11633 ArgumentListNode* arguments; | 11650 ArgumentListNode* arguments; |
11634 if (implicit_arguments == NULL) { | 11651 if (implicit_arguments == NULL) { |
11635 arguments = new (Z) ArgumentListNode(TokenPos()); | 11652 // TODO(regis): When require_const is true, do we need to check that |
| 11653 // func_type_args are null or instantiated? |
| 11654 arguments = new (Z) ArgumentListNode(TokenPos(), func_type_args); |
11636 } else { | 11655 } else { |
| 11656 // If implicit arguments are provided, they include type arguments (if any). |
| 11657 ASSERT(func_type_args.IsNull()); |
11637 arguments = implicit_arguments; | 11658 arguments = implicit_arguments; |
11638 } | 11659 } |
11639 const GrowableObjectArray& names = | 11660 const GrowableObjectArray& names = |
11640 GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld)); | 11661 GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld)); |
11641 bool named_argument_seen = false; | 11662 bool named_argument_seen = false; |
11642 if (LookaheadToken(1) != Token::kRPAREN) { | 11663 if (LookaheadToken(1) != Token::kRPAREN) { |
11643 String& arg_name = String::Handle(Z); | 11664 String& arg_name = String::Handle(Z); |
11644 do { | 11665 do { |
11645 ASSERT((CurrentToken() == Token::kLPAREN) || | 11666 ASSERT((CurrentToken() == Token::kLPAREN) || |
11646 (CurrentToken() == Token::kCOMMA)); | 11667 (CurrentToken() == Token::kCOMMA)); |
(...skipping 30 matching lines...) Expand all Loading... |
11677 if (named_argument_seen) { | 11698 if (named_argument_seen) { |
11678 arguments->set_names(Array::Handle(Z, Array::MakeArray(names))); | 11699 arguments->set_names(Array::Handle(Z, Array::MakeArray(names))); |
11679 } | 11700 } |
11680 return arguments; | 11701 return arguments; |
11681 } | 11702 } |
11682 | 11703 |
11683 | 11704 |
11684 AstNode* Parser::ParseStaticCall(const Class& cls, | 11705 AstNode* Parser::ParseStaticCall(const Class& cls, |
11685 const String& func_name, | 11706 const String& func_name, |
11686 TokenPosition ident_pos, | 11707 TokenPosition ident_pos, |
| 11708 const TypeArguments& func_type_args, |
11687 const LibraryPrefix* prefix) { | 11709 const LibraryPrefix* prefix) { |
11688 TRACE_PARSER("ParseStaticCall"); | 11710 TRACE_PARSER("ParseStaticCall"); |
11689 const TokenPosition call_pos = TokenPos(); | 11711 const TokenPosition call_pos = TokenPos(); |
11690 ASSERT(CurrentToken() == Token::kLPAREN); | 11712 ASSERT(CurrentToken() == Token::kLPAREN); |
11691 ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst); | 11713 ArgumentListNode* arguments = |
| 11714 ParseActualParameters(NULL, func_type_args, kAllowConst); |
11692 const int num_arguments = arguments->length(); | 11715 const int num_arguments = arguments->length(); |
11693 const Function& func = Function::ZoneHandle( | 11716 const Function& func = Function::ZoneHandle( |
11694 Z, Resolver::ResolveStatic(cls, func_name, num_arguments, | 11717 Z, Resolver::ResolveStatic(cls, func_name, func_type_args.Length(), |
11695 arguments->names())); | 11718 num_arguments, arguments->names())); |
11696 if (func.IsNull()) { | 11719 if (func.IsNull()) { |
11697 // Check if there is a static field of the same name, it could be a closure | 11720 // Check if there is a static field of the same name, it could be a closure |
11698 // and so we try and invoke the closure. | 11721 // and so we try and invoke the closure. |
11699 AstNode* closure = NULL; | 11722 AstNode* closure = NULL; |
11700 const Field& field = Field::ZoneHandle(Z, cls.LookupStaticField(func_name)); | 11723 const Field& field = Field::ZoneHandle(Z, cls.LookupStaticField(func_name)); |
11701 Function& func = Function::ZoneHandle(Z); | 11724 Function& func = Function::ZoneHandle(Z); |
11702 if (field.IsNull()) { | 11725 if (field.IsNull()) { |
11703 // No field, check if we have an explicit getter function. | 11726 // No field, check if we have an explicit getter function. |
11704 const String& getter_name = | 11727 const String& getter_name = |
11705 String::ZoneHandle(Z, Field::LookupGetterSymbol(func_name)); | 11728 String::ZoneHandle(Z, Field::LookupGetterSymbol(func_name)); |
11706 if (!getter_name.IsNull()) { | 11729 if (!getter_name.IsNull()) { |
| 11730 const int kTypeArgsLen = 0; // no type arguments. |
11707 const int kNumArguments = 0; // no arguments. | 11731 const int kNumArguments = 0; // no arguments. |
11708 func = Resolver::ResolveStatic(cls, getter_name, kNumArguments, | 11732 func = Resolver::ResolveStatic(cls, getter_name, kTypeArgsLen, |
11709 Object::empty_array()); | 11733 kNumArguments, Object::empty_array()); |
11710 if (!func.IsNull()) { | 11734 if (!func.IsNull()) { |
11711 ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter); | 11735 ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter); |
11712 closure = new (Z) StaticGetterNode( | 11736 closure = new (Z) StaticGetterNode( |
11713 call_pos, NULL, Class::ZoneHandle(Z, cls.raw()), func_name); | 11737 call_pos, NULL, Class::ZoneHandle(Z, cls.raw()), func_name); |
11714 return BuildClosureCall(call_pos, closure, arguments); | 11738 return BuildClosureCall(call_pos, closure, arguments); |
11715 } | 11739 } |
11716 } | 11740 } |
11717 } else { | 11741 } else { |
11718 closure = GenerateStaticFieldLookup(field, call_pos); | 11742 closure = GenerateStaticFieldLookup(field, call_pos); |
11719 return BuildClosureCall(call_pos, closure, arguments); | 11743 return BuildClosureCall(call_pos, closure, arguments); |
11720 } | 11744 } |
11721 // Could not resolve static method: throw a NoSuchMethodError. | 11745 // Could not resolve static method: throw a NoSuchMethodError. |
11722 return ThrowNoSuchMethodError(ident_pos, cls, func_name, arguments, | 11746 return ThrowNoSuchMethodError(ident_pos, cls, func_name, arguments, |
11723 InvocationMirror::kStatic, | 11747 InvocationMirror::kStatic, |
11724 InvocationMirror::kMethod, | 11748 InvocationMirror::kMethod, |
11725 NULL, // No existing function. | 11749 NULL, // No existing function. |
11726 prefix); | 11750 prefix); |
11727 } else if (cls.IsTopLevel() && (cls.library() == Library::CoreLibrary()) && | 11751 } else if (cls.IsTopLevel() && (cls.library() == Library::CoreLibrary()) && |
11728 (func.name() == Symbols::Identical().raw())) { | 11752 (func.name() == Symbols::Identical().raw()) && |
| 11753 func_type_args.IsNull()) { |
11729 // This is the predefined toplevel function identical(a,b). | 11754 // This is the predefined toplevel function identical(a,b). |
11730 // Create a comparison node instead of a static call to the function. | 11755 // Create a comparison node instead of a static call to the function. |
11731 ASSERT(num_arguments == 2); | 11756 ASSERT(num_arguments == 2); |
11732 | 11757 |
11733 // If both arguments are constant expressions of type string, | 11758 // If both arguments are constant expressions of type string, |
11734 // evaluate and canonicalize them. | 11759 // evaluate and canonicalize them. |
11735 // This guarantees that identical("ab", "a"+"b") is true. | 11760 // This guarantees that identical("ab", "a"+"b") is true. |
11736 // An alternative way to guarantee this would be to introduce | 11761 // An alternative way to guarantee this would be to introduce |
11737 // an AST node that canonicalizes a value. | 11762 // an AST node that canonicalizes a value. |
11738 AstNode* arg0 = arguments->NodeAt(0); | 11763 AstNode* arg0 = arguments->NodeAt(0); |
(...skipping 13 matching lines...) Expand all Loading... |
11752 return new (Z) ComparisonNode(ident_pos, Token::kEQ_STRICT, | 11777 return new (Z) ComparisonNode(ident_pos, Token::kEQ_STRICT, |
11753 arguments->NodeAt(0), arguments->NodeAt(1)); | 11778 arguments->NodeAt(0), arguments->NodeAt(1)); |
11754 } | 11779 } |
11755 return new (Z) StaticCallNode(ident_pos, func, arguments); | 11780 return new (Z) StaticCallNode(ident_pos, func, arguments); |
11756 } | 11781 } |
11757 | 11782 |
11758 | 11783 |
11759 AstNode* Parser::ParseInstanceCall(AstNode* receiver, | 11784 AstNode* Parser::ParseInstanceCall(AstNode* receiver, |
11760 const String& func_name, | 11785 const String& func_name, |
11761 TokenPosition ident_pos, | 11786 TokenPosition ident_pos, |
| 11787 const TypeArguments& func_type_args, |
11762 bool is_conditional) { | 11788 bool is_conditional) { |
11763 TRACE_PARSER("ParseInstanceCall"); | 11789 TRACE_PARSER("ParseInstanceCall"); |
11764 CheckToken(Token::kLPAREN); | 11790 CheckToken(Token::kLPAREN); |
11765 ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst); | 11791 ArgumentListNode* arguments = |
| 11792 ParseActualParameters(NULL, func_type_args, kAllowConst); |
11766 return new (Z) InstanceCallNode(ident_pos, receiver, func_name, arguments, | 11793 return new (Z) InstanceCallNode(ident_pos, receiver, func_name, arguments, |
11767 is_conditional); | 11794 is_conditional); |
11768 } | 11795 } |
11769 | 11796 |
11770 | 11797 |
11771 AstNode* Parser::ParseClosureCall(AstNode* closure) { | 11798 AstNode* Parser::ParseClosureCall(AstNode* closure, |
| 11799 const TypeArguments& func_type_args) { |
11772 TRACE_PARSER("ParseClosureCall"); | 11800 TRACE_PARSER("ParseClosureCall"); |
11773 const TokenPosition call_pos = TokenPos(); | 11801 const TokenPosition call_pos = TokenPos(); |
11774 ASSERT(CurrentToken() == Token::kLPAREN); | 11802 ASSERT(CurrentToken() == Token::kLPAREN); |
11775 ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst); | 11803 ArgumentListNode* arguments = |
| 11804 ParseActualParameters(NULL, func_type_args, kAllowConst); |
11776 return BuildClosureCall(call_pos, closure, arguments); | 11805 return BuildClosureCall(call_pos, closure, arguments); |
11777 } | 11806 } |
11778 | 11807 |
11779 | 11808 |
11780 AstNode* Parser::GenerateStaticFieldLookup(const Field& field, | 11809 AstNode* Parser::GenerateStaticFieldLookup(const Field& field, |
11781 TokenPosition ident_pos) { | 11810 TokenPosition ident_pos) { |
11782 // If the static field has an initializer, initialize the field at compile | 11811 // If the static field has an initializer, initialize the field at compile |
11783 // time, which is only possible if the field is const. | 11812 // time, which is only possible if the field is const. |
11784 AstNode* initializing_getter = RunStaticFieldInitializer(field, ident_pos); | 11813 AstNode* initializing_getter = RunStaticFieldInitializer(field, ident_pos); |
11785 if (initializing_getter != NULL) { | 11814 if (initializing_getter != NULL) { |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11965 // super calls handled in ParseSuperCall(). | 11994 // super calls handled in ParseSuperCall(). |
11966 ASSERT(!primary_node->IsSuper()); | 11995 ASSERT(!primary_node->IsSuper()); |
11967 left = LoadFieldIfUnresolved(left); | 11996 left = LoadFieldIfUnresolved(left); |
11968 } | 11997 } |
11969 } | 11998 } |
11970 const TokenPosition ident_pos = TokenPos(); | 11999 const TokenPosition ident_pos = TokenPos(); |
11971 String* ident = ExpectIdentifier("identifier expected"); | 12000 String* ident = ExpectIdentifier("identifier expected"); |
11972 if (IsArgumentPart()) { | 12001 if (IsArgumentPart()) { |
11973 // Identifier followed by optional type arguments and opening paren: | 12002 // Identifier followed by optional type arguments and opening paren: |
11974 // method call. | 12003 // method call. |
| 12004 TypeArguments& func_type_args = TypeArguments::ZoneHandle(Z); |
11975 if (CurrentToken() == Token::kLT) { | 12005 if (CurrentToken() == Token::kLT) { |
11976 // Type arguments. | 12006 // Type arguments. |
11977 if (!FLAG_generic_method_syntax) { | 12007 if (!FLAG_generic_method_syntax) { |
11978 ReportError("generic type arguments not supported."); | 12008 ReportError("generic type arguments not supported."); |
11979 } | 12009 } |
11980 // TODO(regis): Pass type arguments in generic call. | 12010 func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize); |
11981 // For now, resolve type arguments and ignore. | 12011 if (!FLAG_reify_generic_functions) { |
11982 ParseTypeArguments(ClassFinalizer::kCanonicalize); | 12012 func_type_args = TypeArguments::null(); |
| 12013 } |
11983 } | 12014 } |
11984 PrimaryNode* primary_node = left->AsPrimaryNode(); | 12015 PrimaryNode* primary_node = left->AsPrimaryNode(); |
11985 if ((primary_node != NULL) && primary_node->primary().IsClass()) { | 12016 if ((primary_node != NULL) && primary_node->primary().IsClass()) { |
11986 // Static method call prefixed with class name. | 12017 // Static method call prefixed with class name. |
11987 const Class& cls = Class::Cast(primary_node->primary()); | 12018 const Class& cls = Class::Cast(primary_node->primary()); |
11988 selector = | 12019 selector = ParseStaticCall(cls, *ident, ident_pos, func_type_args, |
11989 ParseStaticCall(cls, *ident, ident_pos, primary_node->prefix()); | 12020 primary_node->prefix()); |
11990 } else { | 12021 } else { |
11991 if ((primary_node != NULL) && primary_node->is_deferred_reference()) { | 12022 if ((primary_node != NULL) && primary_node->is_deferred_reference()) { |
11992 const Class& cls = Class::Handle(library_.toplevel_class()); | 12023 const Class& cls = Class::Handle(library_.toplevel_class()); |
11993 selector = | 12024 selector = ParseStaticCall(cls, *ident, ident_pos, func_type_args, |
11994 ParseStaticCall(cls, *ident, ident_pos, primary_node->prefix()); | 12025 primary_node->prefix()); |
11995 } else { | 12026 } else { |
11996 selector = | 12027 selector = ParseInstanceCall(left, *ident, ident_pos, |
11997 ParseInstanceCall(left, *ident, ident_pos, is_conditional); | 12028 func_type_args, is_conditional); |
11998 } | 12029 } |
11999 } | 12030 } |
12000 } else { | 12031 } else { |
12001 // Field access. | 12032 // Field access. |
12002 Class& cls = Class::Handle(Z); | 12033 Class& cls = Class::Handle(Z); |
12003 bool is_deferred = false; | 12034 bool is_deferred = false; |
12004 if (left->IsPrimaryNode()) { | 12035 if (left->IsPrimaryNode()) { |
12005 PrimaryNode* primary_node = left->AsPrimaryNode(); | 12036 PrimaryNode* primary_node = left->AsPrimaryNode(); |
12006 is_deferred = primary_node->is_deferred_reference(); | 12037 is_deferred = primary_node->is_deferred_reference(); |
12007 if (primary_node->primary().IsClass()) { | 12038 if (primary_node->primary().IsClass()) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12056 primary_node->is_deferred_reference()); | 12087 primary_node->is_deferred_reference()); |
12057 } else if (primary_node->primary().IsTypeParameter()) { | 12088 } else if (primary_node->primary().IsTypeParameter()) { |
12058 array = LoadTypeParameter(primary_node); | 12089 array = LoadTypeParameter(primary_node); |
12059 } else { | 12090 } else { |
12060 UNREACHABLE(); // Internal parser error. | 12091 UNREACHABLE(); // Internal parser error. |
12061 } | 12092 } |
12062 } | 12093 } |
12063 selector = new (Z) | 12094 selector = new (Z) |
12064 LoadIndexedNode(bracket_pos, array, index, Class::ZoneHandle(Z)); | 12095 LoadIndexedNode(bracket_pos, array, index, Class::ZoneHandle(Z)); |
12065 } else if (IsArgumentPart()) { | 12096 } else if (IsArgumentPart()) { |
| 12097 TypeArguments& func_type_args = TypeArguments::ZoneHandle(Z); |
12066 if (CurrentToken() == Token::kLT) { | 12098 if (CurrentToken() == Token::kLT) { |
12067 // Type arguments. | 12099 // Type arguments. |
12068 if (!FLAG_generic_method_syntax) { | 12100 if (!FLAG_generic_method_syntax) { |
12069 ReportError("generic type arguments not supported."); | 12101 ReportError("generic type arguments not supported."); |
12070 } | 12102 } |
12071 // TODO(regis): Pass type arguments in generic call. | 12103 func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize); |
12072 // For now, resolve type arguments and ignore. | 12104 if (!FLAG_reify_generic_functions) { |
12073 ParseTypeArguments(ClassFinalizer::kCanonicalize); | 12105 func_type_args = TypeArguments::null(); |
| 12106 } |
12074 } | 12107 } |
12075 if (left->IsPrimaryNode()) { | 12108 if (left->IsPrimaryNode()) { |
12076 PrimaryNode* primary_node = left->AsPrimaryNode(); | 12109 PrimaryNode* primary_node = left->AsPrimaryNode(); |
12077 const TokenPosition primary_pos = primary_node->token_pos(); | 12110 const TokenPosition primary_pos = primary_node->token_pos(); |
12078 if (primary_node->primary().IsFunction()) { | 12111 if (primary_node->primary().IsFunction()) { |
12079 const Function& func = Function::Cast(primary_node->primary()); | 12112 const Function& func = Function::Cast(primary_node->primary()); |
12080 const String& func_name = String::ZoneHandle(Z, func.name()); | 12113 const String& func_name = String::ZoneHandle(Z, func.name()); |
12081 if (func.is_static()) { | 12114 if (func.is_static()) { |
12082 // Parse static function call. | 12115 // Parse static function call. |
12083 Class& cls = Class::Handle(Z, func.Owner()); | 12116 Class& cls = Class::Handle(Z, func.Owner()); |
12084 selector = ParseStaticCall(cls, func_name, primary_pos); | 12117 selector = |
| 12118 ParseStaticCall(cls, func_name, primary_pos, func_type_args); |
12085 } else { | 12119 } else { |
12086 // Dynamic function call on implicit "this" parameter. | 12120 // Dynamic function call on implicit "this" parameter. |
12087 if (current_function().is_static()) { | 12121 if (current_function().is_static()) { |
12088 ReportError(primary_pos, | 12122 ReportError(primary_pos, |
12089 "cannot access instance method '%s' " | 12123 "cannot access instance method '%s' " |
12090 "from static function", | 12124 "from static function", |
12091 func_name.ToCString()); | 12125 func_name.ToCString()); |
12092 } | 12126 } |
12093 selector = | 12127 selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name, |
12094 ParseInstanceCall(LoadReceiver(primary_pos), func_name, | 12128 primary_pos, func_type_args, |
12095 primary_pos, false /* is_conditional */); | 12129 false /* is_conditional */); |
12096 } | 12130 } |
12097 } else if (primary_node->primary().IsString()) { | 12131 } else if (primary_node->primary().IsString()) { |
12098 // Primary is an unresolved name. | 12132 // Primary is an unresolved name. |
12099 if (primary_node->IsSuper()) { | 12133 if (primary_node->IsSuper()) { |
12100 ReportError(primary_pos, "illegal use of super"); | 12134 ReportError(primary_pos, "illegal use of super"); |
12101 } | 12135 } |
12102 const String& name = | 12136 const String& name = |
12103 String::Cast(Object::ZoneHandle(primary_node->primary().raw())); | 12137 String::Cast(Object::ZoneHandle(primary_node->primary().raw())); |
12104 if (primary_node->is_deferred_reference()) { | 12138 if (primary_node->is_deferred_reference()) { |
12105 // The static call will be converted to throwing a NSM error. | 12139 // The static call will be converted to throwing a NSM error. |
12106 const Class& cls = Class::Handle(library_.toplevel_class()); | 12140 const Class& cls = Class::Handle(library_.toplevel_class()); |
12107 selector = | 12141 selector = ParseStaticCall(cls, name, primary_pos, func_type_args, |
12108 ParseStaticCall(cls, name, primary_pos, primary_node->prefix()); | 12142 primary_node->prefix()); |
12109 } else if (current_function().is_static()) { | 12143 } else if (current_function().is_static()) { |
12110 // The static call will be converted to throwing a NSM error. | 12144 // The static call will be converted to throwing a NSM error. |
12111 selector = ParseStaticCall(current_class(), name, primary_pos); | 12145 selector = ParseStaticCall(current_class(), name, primary_pos, |
| 12146 func_type_args); |
12112 } else { | 12147 } else { |
12113 // Treat as call to unresolved (instance) method. | 12148 // Treat as call to unresolved (instance) method. |
12114 selector = | 12149 selector = |
12115 ParseInstanceCall(LoadReceiver(primary_pos), name, primary_pos, | 12150 ParseInstanceCall(LoadReceiver(primary_pos), name, primary_pos, |
12116 false /* is_conditional */); | 12151 func_type_args, false /* is_conditional */); |
12117 } | 12152 } |
12118 } else if (primary_node->primary().IsTypeParameter()) { | 12153 } else if (primary_node->primary().IsTypeParameter()) { |
| 12154 // TODO(regis): What about the parsed type arguments? |
12119 selector = LoadTypeParameter(primary_node); | 12155 selector = LoadTypeParameter(primary_node); |
12120 } else if (primary_node->primary().IsClass()) { | 12156 } else if (primary_node->primary().IsClass()) { |
| 12157 // TODO(regis): What about the parsed type arguments? |
12121 const Class& type_class = Class::Cast(primary_node->primary()); | 12158 const Class& type_class = Class::Cast(primary_node->primary()); |
12122 AbstractType& type = Type::ZoneHandle( | 12159 AbstractType& type = Type::ZoneHandle( |
12123 Z, Type::New(type_class, Object::null_type_arguments(), | 12160 Z, Type::New(type_class, Object::null_type_arguments(), |
12124 primary_pos, Heap::kOld)); | 12161 primary_pos, Heap::kOld)); |
12125 type ^= CanonicalizeType(type); | 12162 type ^= CanonicalizeType(type); |
12126 // Type may be malbounded, but not malformed. | 12163 // Type may be malbounded, but not malformed. |
12127 ASSERT(!type.IsMalformed()); | 12164 ASSERT(!type.IsMalformed()); |
12128 selector = new (Z) TypeNode(primary_pos, type, | 12165 selector = new (Z) TypeNode(primary_pos, type, |
12129 primary_node->is_deferred_reference()); | 12166 primary_node->is_deferred_reference()); |
12130 } else { | 12167 } else { |
12131 UNREACHABLE(); // Internal parser error. | 12168 UNREACHABLE(); // Internal parser error. |
12132 } | 12169 } |
12133 } else { | 12170 } else { |
12134 // Left is not a primary node; this must be a closure call. | 12171 // Left is not a primary node; this must be a closure call. |
12135 AstNode* closure = left; | 12172 AstNode* closure = left; |
12136 selector = ParseClosureCall(closure); | 12173 selector = ParseClosureCall(closure, func_type_args); |
12137 } | 12174 } |
12138 } else { | 12175 } else { |
12139 // No (more) selectors to parse. | 12176 // No (more) selectors to parse. |
12140 left = LoadFieldIfUnresolved(left); | 12177 left = LoadFieldIfUnresolved(left); |
12141 if (left->IsPrimaryNode()) { | 12178 if (left->IsPrimaryNode()) { |
12142 PrimaryNode* primary_node = left->AsPrimaryNode(); | 12179 PrimaryNode* primary_node = left->AsPrimaryNode(); |
12143 const TokenPosition primary_pos = primary->token_pos(); | 12180 const TokenPosition primary_pos = primary->token_pos(); |
12144 if (primary_node->primary().IsFunction()) { | 12181 if (primary_node->primary().IsFunction()) { |
12145 // Treat as implicit closure. | 12182 // Treat as implicit closure. |
12146 left = LoadClosure(primary_node); | 12183 left = LoadClosure(primary_node); |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12676 StaticGetterNode(field_ref_pos, NULL, field_owner, field_name); | 12713 StaticGetterNode(field_ref_pos, NULL, field_owner, field_name); |
12677 } | 12714 } |
12678 } else if (value.raw() == Object::sentinel().raw()) { | 12715 } else if (value.raw() == Object::sentinel().raw()) { |
12679 // This field has not been referenced yet and thus the value has | 12716 // This field has not been referenced yet and thus the value has |
12680 // not been evaluated. If the field is const, call the static getter method | 12717 // not been evaluated. If the field is const, call the static getter method |
12681 // to evaluate the expression and canonicalize the value. | 12718 // to evaluate the expression and canonicalize the value. |
12682 if (field.is_const()) { | 12719 if (field.is_const()) { |
12683 NoReloadScope no_reload_scope(isolate(), thread()); | 12720 NoReloadScope no_reload_scope(isolate(), thread()); |
12684 NoOOBMessageScope no_msg_scope(thread()); | 12721 NoOOBMessageScope no_msg_scope(thread()); |
12685 field.SetStaticValue(Object::transition_sentinel()); | 12722 field.SetStaticValue(Object::transition_sentinel()); |
12686 const int kNumArguments = 0; // no arguments. | 12723 const int kTypeArgsLen = 0; // No type argument vector. |
| 12724 const int kNumArguments = 0; // No arguments. |
12687 const Function& func = Function::Handle( | 12725 const Function& func = Function::Handle( |
12688 Z, Resolver::ResolveStatic(field_owner, getter_name, kNumArguments, | 12726 Z, Resolver::ResolveStatic(field_owner, getter_name, kTypeArgsLen, |
12689 Object::empty_array())); | 12727 kNumArguments, Object::empty_array())); |
12690 ASSERT(!func.IsNull()); | 12728 ASSERT(!func.IsNull()); |
12691 ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter); | 12729 ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter); |
12692 Object& const_value = Object::Handle(Z); | 12730 Object& const_value = Object::Handle(Z); |
12693 const_value = DartEntry::InvokeFunction(func, Object::empty_array()); | 12731 const_value = DartEntry::InvokeFunction(func, Object::empty_array()); |
12694 if (const_value.IsError()) { | 12732 if (const_value.IsError()) { |
12695 const Error& error = Error::Cast(const_value); | 12733 const Error& error = Error::Cast(const_value); |
12696 if (error.IsUnhandledException()) { | 12734 if (error.IsUnhandledException()) { |
12697 // An exception may not occur in every parse attempt, i.e., the | 12735 // An exception may not occur in every parse attempt, i.e., the |
12698 // generated AST is not deterministic. Therefore mark the function as | 12736 // generated AST is not deterministic. Therefore mark the function as |
12699 // not optimizable. | 12737 // not optimizable. |
(...skipping 30 matching lines...) Expand all Loading... |
12730 } | 12768 } |
12731 | 12769 |
12732 | 12770 |
12733 RawObject* Parser::EvaluateConstConstructorCall( | 12771 RawObject* Parser::EvaluateConstConstructorCall( |
12734 const Class& type_class, | 12772 const Class& type_class, |
12735 const TypeArguments& type_arguments, | 12773 const TypeArguments& type_arguments, |
12736 const Function& constructor, | 12774 const Function& constructor, |
12737 ArgumentListNode* arguments) { | 12775 ArgumentListNode* arguments) { |
12738 NoReloadScope no_reload_scope(isolate(), thread()); | 12776 NoReloadScope no_reload_scope(isolate(), thread()); |
12739 NoOOBMessageScope no_msg_scope(thread()); | 12777 NoOOBMessageScope no_msg_scope(thread()); |
| 12778 // Factories and constructors are not generic functions. |
| 12779 const int kTypeArgsLen = 0; |
12740 // Factories have one extra argument: the type arguments. | 12780 // Factories have one extra argument: the type arguments. |
12741 // Constructors have 1 extra arguments: receiver. | 12781 // Constructors have one extra arguments: receiver. |
12742 const int kNumExtraArgs = 1; | 12782 const int kNumExtraArgs = 1; |
12743 const int num_arguments = arguments->length() + kNumExtraArgs; | 12783 const int num_arguments = arguments->length() + kNumExtraArgs; |
12744 const Array& arg_values = | 12784 const Array& arg_values = |
12745 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); | 12785 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); |
12746 Instance& instance = Instance::Handle(Z); | 12786 Instance& instance = Instance::Handle(Z); |
12747 if (!constructor.IsFactory()) { | 12787 if (!constructor.IsFactory()) { |
12748 instance = Instance::New(type_class, Heap::kOld); | 12788 instance = Instance::New(type_class, Heap::kOld); |
12749 if (!type_arguments.IsNull()) { | 12789 if (!type_arguments.IsNull()) { |
12750 if (!type_arguments.IsInstantiated()) { | 12790 if (!type_arguments.IsInstantiated()) { |
12751 ReportError("type must be constant in const constructor"); | 12791 ReportError("type must be constant in const constructor"); |
12752 } | 12792 } |
12753 instance.SetTypeArguments( | 12793 instance.SetTypeArguments( |
12754 TypeArguments::Handle(Z, type_arguments.Canonicalize())); | 12794 TypeArguments::Handle(Z, type_arguments.Canonicalize())); |
12755 } | 12795 } |
12756 arg_values.SetAt(0, instance); | 12796 arg_values.SetAt(0, instance); |
12757 } else { | 12797 } else { |
12758 // Prepend type_arguments to list of arguments to factory. | 12798 // Prepend type_arguments to list of arguments to factory. |
12759 ASSERT(type_arguments.IsZoneHandle()); | 12799 ASSERT(type_arguments.IsZoneHandle()); |
12760 arg_values.SetAt(0, type_arguments); | 12800 arg_values.SetAt(0, type_arguments); |
12761 } | 12801 } |
12762 for (int i = 0; i < arguments->length(); i++) { | 12802 for (int i = 0; i < arguments->length(); i++) { |
12763 AstNode* arg = arguments->NodeAt(i); | 12803 AstNode* arg = arguments->NodeAt(i); |
12764 // Arguments have been evaluated to a literal value already. | 12804 // Arguments have been evaluated to a literal value already. |
12765 ASSERT(arg->IsLiteralNode()); | 12805 ASSERT(arg->IsLiteralNode()); |
12766 arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal()); | 12806 arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal()); |
12767 } | 12807 } |
12768 const Array& args_descriptor = Array::Handle( | 12808 const Array& args_descriptor = |
12769 Z, ArgumentsDescriptor::New(num_arguments, arguments->names())); | 12809 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, num_arguments, |
| 12810 arguments->names())); |
12770 const Object& result = Object::Handle( | 12811 const Object& result = Object::Handle( |
12771 Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); | 12812 Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); |
12772 if (result.IsError()) { | 12813 if (result.IsError()) { |
12773 // An exception may not occur in every parse attempt, i.e., the | 12814 // An exception may not occur in every parse attempt, i.e., the |
12774 // generated AST is not deterministic. Therefore mark the function as | 12815 // generated AST is not deterministic. Therefore mark the function as |
12775 // not optimizable. | 12816 // not optimizable. |
12776 current_function().SetIsOptimizable(false); | 12817 current_function().SetIsOptimizable(false); |
12777 if (result.IsUnhandledException()) { | 12818 if (result.IsUnhandledException()) { |
12778 return result.raw(); | 12819 return result.raw(); |
12779 } else { | 12820 } else { |
(...skipping 1283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14063 ConsumeToken(); | 14104 ConsumeToken(); |
14064 named_constructor = ExpectIdentifier("name of constructor expected"); | 14105 named_constructor = ExpectIdentifier("name of constructor expected"); |
14065 } | 14106 } |
14066 | 14107 |
14067 // Parse constructor parameters. | 14108 // Parse constructor parameters. |
14068 TokenPosition call_pos = TokenPos(); | 14109 TokenPosition call_pos = TokenPos(); |
14069 ArgumentListNode* arguments = NULL; | 14110 ArgumentListNode* arguments = NULL; |
14070 if (!is_tearoff_expression) { | 14111 if (!is_tearoff_expression) { |
14071 CheckToken(Token::kLPAREN); | 14112 CheckToken(Token::kLPAREN); |
14072 call_pos = TokenPos(); | 14113 call_pos = TokenPos(); |
14073 arguments = ParseActualParameters(NULL, is_const); | 14114 arguments = |
| 14115 ParseActualParameters(NULL, TypeArguments::ZoneHandle(Z), is_const); |
14074 } else { | 14116 } else { |
14075 // Allocate dummy node with no arguments so we don't have to deal | 14117 // Allocate dummy node with no arguments so we don't have to deal |
14076 // with the NULL corner case below. | 14118 // with the NULL corner case below. |
14077 arguments = new (Z) ArgumentListNode(TokenPos()); | 14119 arguments = new (Z) ArgumentListNode(TokenPos()); |
14078 } | 14120 } |
14079 | 14121 |
14080 // Parsing is complete, so we can return a throw in case of a malformed or | 14122 // Parsing is complete, so we can return a throw in case of a malformed or |
14081 // malbounded type or report a compile-time error if the constructor is const. | 14123 // malbounded type or report a compile-time error if the constructor is const. |
14082 if (type.IsMalformedOrMalbounded()) { | 14124 if (type.IsMalformedOrMalbounded()) { |
14083 if (is_const) { | 14125 if (is_const) { |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14242 if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) { | 14284 if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) { |
14243 CaptureAllInstantiators(); | 14285 CaptureAllInstantiators(); |
14244 } | 14286 } |
14245 SequenceNode* tearoff_body = CloseBlock(); | 14287 SequenceNode* tearoff_body = CloseBlock(); |
14246 ClosureNode* closure_obj = | 14288 ClosureNode* closure_obj = |
14247 new (Z) ClosureNode(new_pos, tearoff_func, NULL, tearoff_body->scope()); | 14289 new (Z) ClosureNode(new_pos, tearoff_func, NULL, tearoff_body->scope()); |
14248 return closure_obj; | 14290 return closure_obj; |
14249 } | 14291 } |
14250 | 14292 |
14251 ASSERT(!is_tearoff_expression); | 14293 ASSERT(!is_tearoff_expression); |
| 14294 const int kTypeArgsLen = 0; |
14252 String& error_message = String::Handle(Z); | 14295 String& error_message = String::Handle(Z); |
14253 if (!constructor.AreValidArguments(arguments_length, arguments->names(), | 14296 if (!constructor.AreValidArguments(kTypeArgsLen, arguments_length, |
14254 &error_message)) { | 14297 arguments->names(), &error_message)) { |
14255 const String& external_constructor_name = | 14298 const String& external_constructor_name = |
14256 (named_constructor ? constructor_name : type_class_name); | 14299 (named_constructor ? constructor_name : type_class_name); |
14257 if (is_const) { | 14300 if (is_const) { |
14258 ReportError(call_pos, | 14301 ReportError(call_pos, |
14259 "invalid arguments passed to constructor '%s' " | 14302 "invalid arguments passed to constructor '%s' " |
14260 "for class '%s': %s", | 14303 "for class '%s': %s", |
14261 external_constructor_name.ToCString(), | 14304 external_constructor_name.ToCString(), |
14262 String::Handle(Z, type_class.Name()).ToCString(), | 14305 String::Handle(Z, type_class.Name()).ToCString(), |
14263 error_message.ToCString()); | 14306 error_message.ToCString()); |
14264 } | 14307 } |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14650 if (current_class().SuperClass() == Class::null()) { | 14693 if (current_class().SuperClass() == Class::null()) { |
14651 ReportError("class '%s' does not have a superclass", | 14694 ReportError("class '%s' does not have a superclass", |
14652 String::Handle(Z, current_class().Name()).ToCString()); | 14695 String::Handle(Z, current_class().Name()).ToCString()); |
14653 } | 14696 } |
14654 const TokenPosition super_pos = TokenPos(); | 14697 const TokenPosition super_pos = TokenPos(); |
14655 ConsumeToken(); | 14698 ConsumeToken(); |
14656 if (CurrentToken() == Token::kPERIOD) { | 14699 if (CurrentToken() == Token::kPERIOD) { |
14657 ConsumeToken(); | 14700 ConsumeToken(); |
14658 const TokenPosition ident_pos = TokenPos(); | 14701 const TokenPosition ident_pos = TokenPos(); |
14659 const String& ident = *ExpectIdentifier("identifier expected"); | 14702 const String& ident = *ExpectIdentifier("identifier expected"); |
14660 if (CurrentToken() == Token::kLPAREN) { | 14703 if (IsArgumentPart()) { |
14661 primary = ParseSuperCall(ident); | 14704 TypeArguments& func_type_args = TypeArguments::ZoneHandle(Z); |
| 14705 if (CurrentToken() == Token::kLT) { |
| 14706 // Type arguments. |
| 14707 if (!FLAG_generic_method_syntax) { |
| 14708 ReportError("generic type arguments not supported."); |
| 14709 } |
| 14710 func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize); |
| 14711 if (!FLAG_reify_generic_functions) { |
| 14712 func_type_args = TypeArguments::null(); |
| 14713 } |
| 14714 } |
| 14715 primary = ParseSuperCall(ident, func_type_args); |
14662 } else { | 14716 } else { |
14663 primary = ParseSuperFieldAccess(ident, ident_pos); | 14717 primary = ParseSuperFieldAccess(ident, ident_pos); |
14664 } | 14718 } |
14665 } else if ((CurrentToken() == Token::kLBRACK) || | 14719 } else if ((CurrentToken() == Token::kLBRACK) || |
14666 Token::CanBeOverloaded(CurrentToken()) || | 14720 Token::CanBeOverloaded(CurrentToken()) || |
14667 (CurrentToken() == Token::kNE)) { | 14721 (CurrentToken() == Token::kNE)) { |
14668 primary = ParseSuperOperator(); | 14722 primary = ParseSuperOperator(); |
14669 } else if (CurrentToken() == Token::kQM_PERIOD) { | 14723 } else if (CurrentToken() == Token::kQM_PERIOD) { |
14670 ReportError("super call or super getter may not use ?."); | 14724 ReportError("super call or super getter may not use ?."); |
14671 } else { | 14725 } else { |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15197 const ArgumentListNode& function_args, | 15251 const ArgumentListNode& function_args, |
15198 const LocalVariable* temp_for_last_arg, | 15252 const LocalVariable* temp_for_last_arg, |
15199 bool is_super_invocation) { | 15253 bool is_super_invocation) { |
15200 UNREACHABLE(); | 15254 UNREACHABLE(); |
15201 return NULL; | 15255 return NULL; |
15202 } | 15256 } |
15203 | 15257 |
15204 } // namespace dart | 15258 } // namespace dart |
15205 | 15259 |
15206 #endif // DART_PRECOMPILED_RUNTIME | 15260 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |