Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: runtime/vm/parser.cc

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

Powered by Google App Engine
This is Rietveld 408576698