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 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 deferred_prefixes_->Add(&LibraryPrefix::ZoneHandle(Z, prefix.raw())); | 303 deferred_prefixes_->Add(&LibraryPrefix::ZoneHandle(Z, prefix.raw())); |
304 } | 304 } |
305 | 305 |
306 | 306 |
307 void ParsedFunction::AllocateVariables() { | 307 void ParsedFunction::AllocateVariables() { |
308 ASSERT(!function().IsIrregexpFunction()); | 308 ASSERT(!function().IsIrregexpFunction()); |
309 LocalScope* scope = node_sequence()->scope(); | 309 LocalScope* scope = node_sequence()->scope(); |
310 const intptr_t num_fixed_params = function().num_fixed_parameters(); | 310 const intptr_t num_fixed_params = function().num_fixed_parameters(); |
311 const intptr_t num_opt_params = function().NumOptionalParameters(); | 311 const intptr_t num_opt_params = function().NumOptionalParameters(); |
312 const intptr_t num_params = num_fixed_params + num_opt_params; | 312 const intptr_t num_params = num_fixed_params + num_opt_params; |
| 313 const intptr_t type_args_slot = function().IsGeneric() ? 1 : 0; |
| 314 |
313 // Compute start indices to parameters and locals, and the number of | 315 // Compute start indices to parameters and locals, and the number of |
314 // parameters to copy. | 316 // parameters to copy. |
315 if (num_opt_params == 0) { | 317 if (num_opt_params == 0) { |
316 // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and | 318 // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and |
317 // local variable j will be at fp[kFirstLocalSlotFromFp - j]. | 319 // local variable j will be at fp[kFirstLocalSlotFromFp - j]. |
318 first_parameter_index_ = kParamEndSlotFromFp + num_params; | 320 first_parameter_index_ = kParamEndSlotFromFp + num_params; |
319 first_stack_local_index_ = kFirstLocalSlotFromFp; | 321 first_stack_local_index_ = kFirstLocalSlotFromFp; |
320 num_copied_params_ = 0; | 322 num_copied_params_ = 0; |
321 } else { | 323 } else { |
322 // Parameter i will be at fp[kFirstLocalSlotFromFp - i] and local variable | 324 // Parameter i will be at fp[kFirstLocalSlotFromFp - i] and local variable |
323 // j will be at fp[kFirstLocalSlotFromFp - num_params - j]. | 325 // j will be at fp[kFirstLocalSlotFromFp - num_params - j]. |
324 first_parameter_index_ = kFirstLocalSlotFromFp; | 326 first_parameter_index_ = kFirstLocalSlotFromFp; |
325 first_stack_local_index_ = first_parameter_index_ - num_params; | 327 first_stack_local_index_ = first_parameter_index_ - num_params; |
326 num_copied_params_ = num_params; | 328 num_copied_params_ = num_params; |
327 } | 329 } |
328 | 330 |
329 // Allocate parameters and local variables, either in the local frame or | 331 // Allocate parameters and local variables, either in the local frame or |
330 // in the context(s). | 332 // in the context(s). |
331 bool found_captured_variables = false; | 333 bool found_captured_variables = false; |
332 int next_free_frame_index = scope->AllocateVariables( | 334 int next_free_frame_index = scope->AllocateVariables( |
333 first_parameter_index_, num_params, first_stack_local_index_, NULL, | 335 first_parameter_index_, num_params, type_args_slot, |
334 &found_captured_variables); | 336 first_stack_local_index_, NULL, &found_captured_variables); |
335 | 337 |
336 // Frame indices are relative to the frame pointer and are decreasing. | 338 // Frame indices are relative to the frame pointer and are decreasing. |
337 ASSERT(next_free_frame_index <= first_stack_local_index_); | 339 ASSERT(next_free_frame_index <= first_stack_local_index_); |
338 num_stack_locals_ = first_stack_local_index_ - next_free_frame_index; | 340 num_stack_locals_ = first_stack_local_index_ - next_free_frame_index; |
339 } | 341 } |
340 | 342 |
341 | 343 |
342 struct CatchParamDesc { | 344 struct CatchParamDesc { |
343 CatchParamDesc() | 345 CatchParamDesc() |
344 : token_pos(TokenPosition::kNoSource), | 346 : token_pos(TokenPosition::kNoSource), |
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1796 params.num_optional_parameters++; | 1798 params.num_optional_parameters++; |
1797 params.has_optional_named_parameters = true; | 1799 params.has_optional_named_parameters = true; |
1798 } | 1800 } |
1799 ASSERT(desc.NamedCount() == params.num_optional_parameters); | 1801 ASSERT(desc.NamedCount() == params.num_optional_parameters); |
1800 | 1802 |
1801 SetupDefaultsForOptionalParams(params); | 1803 SetupDefaultsForOptionalParams(params); |
1802 | 1804 |
1803 // Build local scope for function and populate with the formal parameters. | 1805 // Build local scope for function and populate with the formal parameters. |
1804 OpenFunctionBlock(func); | 1806 OpenFunctionBlock(func); |
1805 AddFormalParamsToScope(¶ms, current_block_->scope); | 1807 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 1808 |
| 1809 if (desc.TypeArgsLen() > 0) { |
| 1810 ASSERT(func.IsGeneric() && !func.HasGenericParent()); |
| 1811 // Insert function type arguments variable to scope. |
| 1812 LocalVariable* type_args_var = new (Z) LocalVariable( |
| 1813 TokenPosition::kNoSource, TokenPosition::kNoSource, |
| 1814 Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type()); |
| 1815 current_block_->scope->AddVariable(type_args_var); |
| 1816 ASSERT(FunctionLevel() == 0); |
| 1817 parsed_function_->set_function_type_arguments(type_args_var); |
| 1818 } |
1806 } | 1819 } |
1807 | 1820 |
1808 | 1821 |
1809 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) { | 1822 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) { |
1810 TRACE_PARSER("ParseNoSuchMethodDispatcher"); | 1823 TRACE_PARSER("ParseNoSuchMethodDispatcher"); |
1811 ASSERT(FLAG_lazy_dispatchers); | 1824 ASSERT(FLAG_lazy_dispatchers); |
1812 ASSERT(func.IsNoSuchMethodDispatcher()); | 1825 ASSERT(func.IsNoSuchMethodDispatcher()); |
1813 TokenPosition token_pos = func.token_pos(); | 1826 TokenPosition token_pos = func.token_pos(); |
1814 ASSERT(func.token_pos() == TokenPosition::kMinSource); | 1827 ASSERT(func.token_pos() == TokenPosition::kMinSource); |
1815 ASSERT(current_class().raw() == func.Owner()); | 1828 ASSERT(current_class().raw() == func.Owner()); |
1816 | 1829 |
1817 ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc())); | 1830 ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc())); |
1818 ASSERT(desc.Count() > 0); | 1831 ASSERT(desc.Count() > 0); |
1819 | 1832 |
1820 // Set up scope for this function. | 1833 // Set up scope for this function. |
1821 BuildDispatcherScope(func, desc); | 1834 BuildDispatcherScope(func, desc); |
1822 | 1835 |
1823 // Receiver is local 0. | 1836 // Receiver is local 0. |
1824 LocalScope* scope = current_block_->scope; | 1837 LocalScope* scope = current_block_->scope; |
1825 ArgumentListNode* func_args = new ArgumentListNode(token_pos); | 1838 ArgumentListNode* func_args = new ArgumentListNode( |
| 1839 token_pos, parsed_function_->function_type_arguments(), |
| 1840 desc.TypeArgsLen()); |
1826 for (intptr_t i = 0; i < desc.Count(); ++i) { | 1841 for (intptr_t i = 0; i < desc.Count(); ++i) { |
1827 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); | 1842 func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); |
1828 } | 1843 } |
1829 | 1844 |
1830 if (desc.NamedCount() > 0) { | 1845 if (desc.NamedCount() > 0) { |
1831 const Array& arg_names = | 1846 const Array& arg_names = |
1832 Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld)); | 1847 Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld)); |
1833 for (intptr_t i = 0; i < arg_names.Length(); ++i) { | 1848 for (intptr_t i = 0; i < arg_names.Length(); ++i) { |
1834 arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i))); | 1849 arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i))); |
1835 } | 1850 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) { | 1906 if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) { |
1892 function_object = receiver; | 1907 function_object = receiver; |
1893 } else { | 1908 } else { |
1894 const String& getter_name = | 1909 const String& getter_name = |
1895 String::ZoneHandle(Z, Field::GetterSymbol(name)); | 1910 String::ZoneHandle(Z, Field::GetterSymbol(name)); |
1896 function_object = | 1911 function_object = |
1897 new (Z) InstanceCallNode(token_pos, receiver, getter_name, no_args); | 1912 new (Z) InstanceCallNode(token_pos, receiver, getter_name, no_args); |
1898 } | 1913 } |
1899 | 1914 |
1900 // Pass arguments 1..n to the closure call. | 1915 // Pass arguments 1..n to the closure call. |
1901 ArgumentListNode* args = new (Z) ArgumentListNode(token_pos); | 1916 ArgumentListNode* args = new (Z) |
| 1917 ArgumentListNode(token_pos, parsed_function_->function_type_arguments(), |
| 1918 desc.TypeArgsLen()); |
1902 const Array& names = | 1919 const Array& names = |
1903 Array::Handle(Z, Array::New(desc.NamedCount(), Heap::kOld)); | 1920 Array::Handle(Z, Array::New(desc.NamedCount(), Heap::kOld)); |
| 1921 |
1904 // Positional parameters. | 1922 // Positional parameters. |
1905 intptr_t i = 1; | 1923 intptr_t i = 1; |
1906 for (; i < desc.PositionalCount(); ++i) { | 1924 for (; i < desc.PositionalCount(); ++i) { |
1907 args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); | 1925 args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); |
1908 } | 1926 } |
1909 // Named parameters. | 1927 // Named parameters. |
1910 for (; i < desc.Count(); i++) { | 1928 for (; i < desc.Count(); i++) { |
1911 args->Add(new (Z) LoadLocalNode(token_pos, scope->VariableAt(i))); | 1929 args->Add(new (Z) LoadLocalNode(token_pos, scope->VariableAt(i))); |
1912 intptr_t index = i - desc.PositionalCount(); | 1930 intptr_t index = i - desc.PositionalCount(); |
1913 names.SetAt(index, String::Handle(Z, desc.NameAt(index))); | 1931 names.SetAt(index, String::Handle(Z, desc.NameAt(index))); |
(...skipping 3777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5691 } | 5709 } |
5692 types.Add(&AbstractType::ZoneHandle(Z, type.raw())); | 5710 types.Add(&AbstractType::ZoneHandle(Z, type.raw())); |
5693 } while (CurrentToken() == Token::kCOMMA); | 5711 } while (CurrentToken() == Token::kCOMMA); |
5694 Token::Kind token = CurrentToken(); | 5712 Token::Kind token = CurrentToken(); |
5695 if ((token == Token::kGT) || (token == Token::kSHR)) { | 5713 if ((token == Token::kGT) || (token == Token::kSHR)) { |
5696 ConsumeRightAngleBracket(); | 5714 ConsumeRightAngleBracket(); |
5697 } else { | 5715 } else { |
5698 ReportError("right angle bracket expected"); | 5716 ReportError("right angle bracket expected"); |
5699 } | 5717 } |
5700 if (finalization != ClassFinalizer::kIgnore) { | 5718 if (finalization != ClassFinalizer::kIgnore) { |
5701 return NewTypeArguments(types); | 5719 TypeArguments& type_args = TypeArguments::Handle(NewTypeArguments(types)); |
| 5720 if (finalization == ClassFinalizer::kCanonicalize) { |
| 5721 type_args = type_args.Canonicalize(); |
| 5722 } |
| 5723 return type_args.raw(); |
5702 } | 5724 } |
5703 } | 5725 } |
5704 return TypeArguments::null(); | 5726 return TypeArguments::null(); |
5705 } | 5727 } |
5706 | 5728 |
5707 | 5729 |
5708 // Parse interface list and add to class cls. | 5730 // Parse interface list and add to class cls. |
5709 void Parser::ParseInterfaceList(const Class& cls) { | 5731 void Parser::ParseInterfaceList(const Class& cls) { |
5710 TRACE_PARSER("ParseInterfaceList"); | 5732 TRACE_PARSER("ParseInterfaceList"); |
5711 ASSERT(CurrentToken() == Token::kIMPLEMENTS); | 5733 ASSERT(CurrentToken() == Token::kIMPLEMENTS); |
(...skipping 6846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12558 } | 12580 } |
12559 *type = type_parameter.raw(); | 12581 *type = type_parameter.raw(); |
12560 return; | 12582 return; |
12561 } | 12583 } |
12562 } | 12584 } |
12563 } | 12585 } |
12564 // Resolve type arguments, if any. | 12586 // Resolve type arguments, if any. |
12565 if (type->arguments() != TypeArguments::null()) { | 12587 if (type->arguments() != TypeArguments::null()) { |
12566 const TypeArguments& arguments = | 12588 const TypeArguments& arguments = |
12567 TypeArguments::Handle(Z, type->arguments()); | 12589 TypeArguments::Handle(Z, type->arguments()); |
12568 const intptr_t num_arguments = arguments.Length(); | 12590 // Already resolved if canonical. |
12569 AbstractType& type_argument = AbstractType::Handle(Z); | 12591 if (!arguments.IsCanonical()) { |
12570 for (intptr_t i = 0; i < num_arguments; i++) { | 12592 const intptr_t num_arguments = arguments.Length(); |
12571 type_argument = arguments.TypeAt(i); | 12593 AbstractType& type_argument = AbstractType::Handle(Z); |
12572 ResolveType(&type_argument); | 12594 for (intptr_t i = 0; i < num_arguments; i++) { |
12573 arguments.SetTypeAt(i, type_argument); | 12595 type_argument = arguments.TypeAt(i); |
| 12596 ResolveType(&type_argument); |
| 12597 arguments.SetTypeAt(i, type_argument); |
| 12598 } |
12574 } | 12599 } |
12575 } | 12600 } |
12576 if (type->IsFunctionType()) { | 12601 if (type->IsFunctionType()) { |
12577 const Function& signature = | 12602 const Function& signature = |
12578 Function::Handle(Z, Type::Cast(*type).signature()); | 12603 Function::Handle(Z, Type::Cast(*type).signature()); |
12579 Type& signature_type = Type::Handle(Z, signature.SignatureType()); | 12604 Type& signature_type = Type::Handle(Z, signature.SignatureType()); |
12580 if (signature_type.raw() != type->raw()) { | 12605 if (signature_type.raw() != type->raw()) { |
12581 ResolveType(&signature_type); | 12606 ResolveType(&signature_type); |
12582 } else { | 12607 } else { |
12583 ResolveSignature(signature); | 12608 ResolveSignature(signature); |
(...skipping 2729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15313 TokenPosition* start, | 15338 TokenPosition* start, |
15314 TokenPosition* end) { | 15339 TokenPosition* end) { |
15315 UNREACHABLE(); | 15340 UNREACHABLE(); |
15316 return false; | 15341 return false; |
15317 } | 15342 } |
15318 | 15343 |
15319 | 15344 |
15320 } // namespace dart | 15345 } // namespace dart |
15321 | 15346 |
15322 #endif // DART_PRECOMPILED_RUNTIME | 15347 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |