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

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

Issue 2941643002: Check for a passed-in type argument vector in the prolog of generic functions. (Closed)
Patch Set: address review comments Created 3 years, 6 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/object_test.cc ('k') | runtime/vm/runtime_entry.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 1785 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 params.num_optional_parameters++; 1796 params.num_optional_parameters++;
1797 params.has_optional_named_parameters = true; 1797 params.has_optional_named_parameters = true;
1798 } 1798 }
1799 ASSERT(desc.NamedCount() == params.num_optional_parameters); 1799 ASSERT(desc.NamedCount() == params.num_optional_parameters);
1800 1800
1801 SetupDefaultsForOptionalParams(params); 1801 SetupDefaultsForOptionalParams(params);
1802 1802
1803 // Build local scope for function and populate with the formal parameters. 1803 // Build local scope for function and populate with the formal parameters.
1804 OpenFunctionBlock(func); 1804 OpenFunctionBlock(func);
1805 AddFormalParamsToScope(&params, current_block_->scope); 1805 AddFormalParamsToScope(&params, current_block_->scope);
1806
1807 if (desc.TypeArgsLen() > 0) {
1808 ASSERT(func.IsGeneric() && !func.HasGenericParent());
1809 // Insert function type arguments variable to scope.
1810 LocalVariable* type_args_var = new (Z) LocalVariable(
1811 TokenPosition::kNoSource, TokenPosition::kNoSource,
1812 Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type());
1813 current_block_->scope->AddVariable(type_args_var);
1814 ASSERT(FunctionLevel() == 0);
1815 parsed_function_->set_function_type_arguments(type_args_var);
1816 }
1806 } 1817 }
1807 1818
1808 1819
1809 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) { 1820 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) {
1810 TRACE_PARSER("ParseNoSuchMethodDispatcher"); 1821 TRACE_PARSER("ParseNoSuchMethodDispatcher");
1811 ASSERT(FLAG_lazy_dispatchers); 1822 ASSERT(FLAG_lazy_dispatchers);
1812 ASSERT(func.IsNoSuchMethodDispatcher()); 1823 ASSERT(func.IsNoSuchMethodDispatcher());
1813 TokenPosition token_pos = func.token_pos(); 1824 TokenPosition token_pos = func.token_pos();
1814 ASSERT(func.token_pos() == TokenPosition::kMinSource); 1825 ASSERT(func.token_pos() == TokenPosition::kMinSource);
1815 ASSERT(current_class().raw() == func.Owner()); 1826 ASSERT(current_class().raw() == func.Owner());
1816 1827
1817 ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc())); 1828 ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc()));
1818 ASSERT(desc.Count() > 0); 1829 ASSERT(desc.Count() > 0);
1819 1830
1820 // Set up scope for this function. 1831 // Set up scope for this function.
1821 BuildDispatcherScope(func, desc); 1832 BuildDispatcherScope(func, desc);
1822 1833
1823 // Receiver is local 0. 1834 // Receiver is local 0.
1824 LocalScope* scope = current_block_->scope; 1835 LocalScope* scope = current_block_->scope;
1825 ArgumentListNode* func_args = new ArgumentListNode(token_pos); 1836 ArgumentListNode* func_args = new ArgumentListNode(
1837 token_pos, parsed_function_->function_type_arguments(),
1838 desc.TypeArgsLen());
1826 for (intptr_t i = 0; i < desc.Count(); ++i) { 1839 for (intptr_t i = 0; i < desc.Count(); ++i) {
1827 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); 1840 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
1828 } 1841 }
1829 1842
1830 if (desc.NamedCount() > 0) { 1843 if (desc.NamedCount() > 0) {
1831 const Array& arg_names = 1844 const Array& arg_names =
1832 Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld)); 1845 Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld));
1833 for (intptr_t i = 0; i < arg_names.Length(); ++i) { 1846 for (intptr_t i = 0; i < arg_names.Length(); ++i) {
1834 arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i))); 1847 arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i)));
1835 } 1848 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1891 if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) { 1904 if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) {
1892 function_object = receiver; 1905 function_object = receiver;
1893 } else { 1906 } else {
1894 const String& getter_name = 1907 const String& getter_name =
1895 String::ZoneHandle(Z, Field::GetterSymbol(name)); 1908 String::ZoneHandle(Z, Field::GetterSymbol(name));
1896 function_object = 1909 function_object =
1897 new (Z) InstanceCallNode(token_pos, receiver, getter_name, no_args); 1910 new (Z) InstanceCallNode(token_pos, receiver, getter_name, no_args);
1898 } 1911 }
1899 1912
1900 // Pass arguments 1..n to the closure call. 1913 // Pass arguments 1..n to the closure call.
1901 ArgumentListNode* args = new (Z) ArgumentListNode(token_pos); 1914 ArgumentListNode* args = new (Z)
1915 ArgumentListNode(token_pos, parsed_function_->function_type_arguments(),
1916 desc.TypeArgsLen());
1902 const Array& names = 1917 const Array& names =
1903 Array::Handle(Z, Array::New(desc.NamedCount(), Heap::kOld)); 1918 Array::Handle(Z, Array::New(desc.NamedCount(), Heap::kOld));
1919
1904 // Positional parameters. 1920 // Positional parameters.
1905 intptr_t i = 1; 1921 intptr_t i = 1;
1906 for (; i < desc.PositionalCount(); ++i) { 1922 for (; i < desc.PositionalCount(); ++i) {
1907 args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); 1923 args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
1908 } 1924 }
1909 // Named parameters. 1925 // Named parameters.
1910 for (; i < desc.Count(); i++) { 1926 for (; i < desc.Count(); i++) {
1911 args->Add(new (Z) LoadLocalNode(token_pos, scope->VariableAt(i))); 1927 args->Add(new (Z) LoadLocalNode(token_pos, scope->VariableAt(i)));
1912 intptr_t index = i - desc.PositionalCount(); 1928 intptr_t index = i - desc.PositionalCount();
1913 names.SetAt(index, String::Handle(Z, desc.NameAt(index))); 1929 names.SetAt(index, String::Handle(Z, desc.NameAt(index)));
(...skipping 3777 matching lines...) Expand 10 before | Expand all | Expand 10 after
5691 } 5707 }
5692 types.Add(&AbstractType::ZoneHandle(Z, type.raw())); 5708 types.Add(&AbstractType::ZoneHandle(Z, type.raw()));
5693 } while (CurrentToken() == Token::kCOMMA); 5709 } while (CurrentToken() == Token::kCOMMA);
5694 Token::Kind token = CurrentToken(); 5710 Token::Kind token = CurrentToken();
5695 if ((token == Token::kGT) || (token == Token::kSHR)) { 5711 if ((token == Token::kGT) || (token == Token::kSHR)) {
5696 ConsumeRightAngleBracket(); 5712 ConsumeRightAngleBracket();
5697 } else { 5713 } else {
5698 ReportError("right angle bracket expected"); 5714 ReportError("right angle bracket expected");
5699 } 5715 }
5700 if (finalization != ClassFinalizer::kIgnore) { 5716 if (finalization != ClassFinalizer::kIgnore) {
5701 return NewTypeArguments(types); 5717 TypeArguments& type_args = TypeArguments::Handle(NewTypeArguments(types));
5718 if (finalization == ClassFinalizer::kCanonicalize) {
5719 type_args = type_args.Canonicalize();
5720 }
5721 return type_args.raw();
5702 } 5722 }
5703 } 5723 }
5704 return TypeArguments::null(); 5724 return TypeArguments::null();
5705 } 5725 }
5706 5726
5707 5727
5708 // Parse interface list and add to class cls. 5728 // Parse interface list and add to class cls.
5709 void Parser::ParseInterfaceList(const Class& cls) { 5729 void Parser::ParseInterfaceList(const Class& cls) {
5710 TRACE_PARSER("ParseInterfaceList"); 5730 TRACE_PARSER("ParseInterfaceList");
5711 ASSERT(CurrentToken() == Token::kIMPLEMENTS); 5731 ASSERT(CurrentToken() == Token::kIMPLEMENTS);
(...skipping 6846 matching lines...) Expand 10 before | Expand all | Expand 10 after
12558 } 12578 }
12559 *type = type_parameter.raw(); 12579 *type = type_parameter.raw();
12560 return; 12580 return;
12561 } 12581 }
12562 } 12582 }
12563 } 12583 }
12564 // Resolve type arguments, if any. 12584 // Resolve type arguments, if any.
12565 if (type->arguments() != TypeArguments::null()) { 12585 if (type->arguments() != TypeArguments::null()) {
12566 const TypeArguments& arguments = 12586 const TypeArguments& arguments =
12567 TypeArguments::Handle(Z, type->arguments()); 12587 TypeArguments::Handle(Z, type->arguments());
12568 const intptr_t num_arguments = arguments.Length(); 12588 // Already resolved if canonical.
12569 AbstractType& type_argument = AbstractType::Handle(Z); 12589 if (!arguments.IsCanonical()) {
12570 for (intptr_t i = 0; i < num_arguments; i++) { 12590 const intptr_t num_arguments = arguments.Length();
12571 type_argument = arguments.TypeAt(i); 12591 AbstractType& type_argument = AbstractType::Handle(Z);
12572 ResolveType(&type_argument); 12592 for (intptr_t i = 0; i < num_arguments; i++) {
12573 arguments.SetTypeAt(i, type_argument); 12593 type_argument = arguments.TypeAt(i);
12594 ResolveType(&type_argument);
12595 arguments.SetTypeAt(i, type_argument);
12596 }
12574 } 12597 }
12575 } 12598 }
12576 if (type->IsFunctionType()) { 12599 if (type->IsFunctionType()) {
12577 const Function& signature = 12600 const Function& signature =
12578 Function::Handle(Z, Type::Cast(*type).signature()); 12601 Function::Handle(Z, Type::Cast(*type).signature());
12579 Type& signature_type = Type::Handle(Z, signature.SignatureType()); 12602 Type& signature_type = Type::Handle(Z, signature.SignatureType());
12580 if (signature_type.raw() != type->raw()) { 12603 if (signature_type.raw() != type->raw()) {
12581 ResolveType(&signature_type); 12604 ResolveType(&signature_type);
12582 } else { 12605 } else {
12583 ResolveSignature(signature); 12606 ResolveSignature(signature);
(...skipping 2729 matching lines...) Expand 10 before | Expand all | Expand 10 after
15313 TokenPosition* start, 15336 TokenPosition* start,
15314 TokenPosition* end) { 15337 TokenPosition* end) {
15315 UNREACHABLE(); 15338 UNREACHABLE();
15316 return false; 15339 return false;
15317 } 15340 }
15318 15341
15319 15342
15320 } // namespace dart 15343 } // namespace dart
15321 15344
15322 #endif // DART_PRECOMPILED_RUNTIME 15345 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « runtime/vm/object_test.cc ('k') | runtime/vm/runtime_entry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698