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 | 8 #ifndef DART_PRECOMPILED |
9 | 9 |
10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
(...skipping 1606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1617 ASSERT(desc.Count() > 0); | 1617 ASSERT(desc.Count() > 0); |
1618 | 1618 |
1619 // Set up scope for this function. | 1619 // Set up scope for this function. |
1620 BuildDispatcherScope(func, desc); | 1620 BuildDispatcherScope(func, desc); |
1621 | 1621 |
1622 // Receiver is local 0. | 1622 // Receiver is local 0. |
1623 LocalScope* scope = current_block_->scope; | 1623 LocalScope* scope = current_block_->scope; |
1624 ArgumentListNode* no_args = new ArgumentListNode(token_pos); | 1624 ArgumentListNode* no_args = new ArgumentListNode(token_pos); |
1625 LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0)); | 1625 LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0)); |
1626 | 1626 |
1627 const Class& function_impl = Class::Handle(Type::Handle( | 1627 const Class& closure_cls = Class::Handle( |
1628 Isolate::Current()->object_store()->function_impl_type()).type_class()); | 1628 Isolate::Current()->object_store()->closure_class()); |
1629 | 1629 |
1630 const Class& owner = Class::Handle(Z, func.Owner()); | 1630 const Class& owner = Class::Handle(Z, func.Owner()); |
1631 ASSERT(!owner.IsNull()); | 1631 ASSERT(!owner.IsNull()); |
1632 const String& name = String::Handle(Z, func.name()); | 1632 const String& name = String::Handle(Z, func.name()); |
1633 AstNode* function_object = NULL; | 1633 AstNode* function_object = NULL; |
1634 if (owner.raw() == function_impl.raw() && name.Equals(Symbols::Call())) { | 1634 if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) { |
1635 function_object = receiver; | 1635 function_object = receiver; |
1636 } else { | 1636 } else { |
1637 const String& getter_name = String::ZoneHandle(Z, | 1637 const String& getter_name = String::ZoneHandle(Z, |
1638 Symbols::New(String::Handle(Z, Field::GetterSymbol(name)))); | 1638 Symbols::New(String::Handle(Z, Field::GetterSymbol(name)))); |
1639 function_object = new(Z) InstanceCallNode( | 1639 function_object = new(Z) InstanceCallNode( |
1640 token_pos, receiver, getter_name, no_args); | 1640 token_pos, receiver, getter_name, no_args); |
1641 } | 1641 } |
1642 | 1642 |
1643 // Pass arguments 1..n to the closure call. | 1643 // Pass arguments 1..n to the closure call. |
1644 ArgumentListNode* args = new(Z) ArgumentListNode(token_pos); | 1644 ArgumentListNode* args = new(Z) ArgumentListNode(token_pos); |
1645 const Array& names = Array::Handle( | 1645 const Array& names = Array::Handle( |
1646 Z, Array::New(desc.NamedCount(), Heap::kOld)); | 1646 Z, Array::New(desc.NamedCount(), Heap::kOld)); |
1647 // Positional parameters. | 1647 // Positional parameters. |
1648 intptr_t i = 1; | 1648 intptr_t i = 1; |
1649 for (; i < desc.PositionalCount(); ++i) { | 1649 for (; i < desc.PositionalCount(); ++i) { |
1650 args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); | 1650 args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); |
1651 } | 1651 } |
1652 // Named parameters. | 1652 // Named parameters. |
1653 for (; i < desc.Count(); i++) { | 1653 for (; i < desc.Count(); i++) { |
1654 args->Add(new(Z) LoadLocalNode(token_pos, scope->VariableAt(i))); | 1654 args->Add(new(Z) LoadLocalNode(token_pos, scope->VariableAt(i))); |
1655 intptr_t index = i - desc.PositionalCount(); | 1655 intptr_t index = i - desc.PositionalCount(); |
1656 names.SetAt(index, String::Handle(Z, desc.NameAt(index))); | 1656 names.SetAt(index, String::Handle(Z, desc.NameAt(index))); |
1657 } | 1657 } |
1658 args->set_names(names); | 1658 args->set_names(names); |
1659 | 1659 |
1660 AstNode* result = NULL; | 1660 AstNode* result = NULL; |
1661 if (owner.raw() == function_impl.raw() && name.Equals(Symbols::Call())) { | 1661 if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) { |
1662 result = new ClosureCallNode(token_pos, function_object, args); | 1662 result = new ClosureCallNode(token_pos, function_object, args); |
1663 } else { | 1663 } else { |
1664 result = BuildClosureCall(token_pos, function_object, args); | 1664 result = BuildClosureCall(token_pos, function_object, args); |
1665 } | 1665 } |
1666 | 1666 |
1667 ReturnNode* return_node = new ReturnNode(token_pos, result); | 1667 ReturnNode* return_node = new ReturnNode(token_pos, result); |
1668 current_block_->statements->Add(return_node); | 1668 current_block_->statements->Add(return_node); |
1669 return CloseBlock(); | 1669 return CloseBlock(); |
1670 } | 1670 } |
1671 | 1671 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1872 // Add implicit closure object parameter. | 1872 // Add implicit closure object parameter. |
1873 func_params.AddFinalParameter( | 1873 func_params.AddFinalParameter( |
1874 TokenPos(), | 1874 TokenPos(), |
1875 &Symbols::ClosureParameter(), | 1875 &Symbols::ClosureParameter(), |
1876 &Object::dynamic_type()); | 1876 &Object::dynamic_type()); |
1877 | 1877 |
1878 const bool no_explicit_default_values = false; | 1878 const bool no_explicit_default_values = false; |
1879 ParseFormalParameterList(no_explicit_default_values, false, &func_params); | 1879 ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
1880 | 1880 |
1881 // In top-level and mixin functions, the source may be in a different | 1881 // In top-level and mixin functions, the source may be in a different |
1882 // script than the script of the current class. | 1882 // script than the script of the current class. However, we never reparse |
1883 Object& sig_func_owner = Object::Handle(Z, current_class().raw()); | 1883 // signature functions (except typedef signature functions), therefore |
1884 if (current_class().script() != script_.raw()) { | 1884 // we do not need to keep the correct script via a patch class. Use the |
1885 sig_func_owner = PatchClass::New(current_class(), script_); | 1885 // actual current class as owner of the signature function. |
| 1886 const Function& signature_function = Function::Handle(Z, |
| 1887 Function::NewSignatureFunction(current_class(), |
| 1888 Scanner::kNoSourcePos)); |
| 1889 signature_function.set_result_type(result_type); |
| 1890 AddFormalParamsToFunction(&func_params, signature_function); |
| 1891 FunctionType& signature_type = |
| 1892 FunctionType::ZoneHandle(Z, signature_function.SignatureType()); |
| 1893 if (!is_top_level_) { |
| 1894 signature_type ^= ClassFinalizer::FinalizeType( |
| 1895 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
| 1896 signature_function.SetSignatureType(signature_type); |
1886 } | 1897 } |
1887 | |
1888 // The field 'is_static' has no meaning for signature functions. | |
1889 const Function& signature_function = Function::Handle(Z, | |
1890 Function::New(*parameter.name, | |
1891 RawFunction::kSignatureFunction, | |
1892 /* is_static = */ false, | |
1893 /* is_const = */ false, | |
1894 /* is_abstract = */ false, | |
1895 /* is_external = */ false, | |
1896 /* is_native = */ false, | |
1897 sig_func_owner, | |
1898 parameter.name_pos)); | |
1899 signature_function.set_result_type(result_type); | |
1900 signature_function.set_is_debuggable(false); | |
1901 AddFormalParamsToFunction(&func_params, signature_function); | |
1902 const String& signature = | |
1903 String::Handle(Z, signature_function.Signature()); | |
1904 // Lookup the signature class, i.e. the class whose name is the signature. | |
1905 // We only lookup in the current library, but not in its imports, and only | |
1906 // create a new canonical signature class if it does not exist yet. | |
1907 Class& signature_class = | |
1908 Class::ZoneHandle(Z, library_.LookupLocalClass(signature)); | |
1909 if (signature_class.IsNull()) { | |
1910 signature_class = Class::NewSignatureClass(signature, | |
1911 signature_function, | |
1912 script_, | |
1913 parameter.name_pos); | |
1914 // Record the function signature class in the current library, unless | |
1915 // we are currently skipping a formal parameter list, in which case | |
1916 // the signature class could remain unfinalized. | |
1917 if (!params->skipped) { | |
1918 library_.AddClass(signature_class); | |
1919 } | |
1920 } else { | |
1921 signature_function.set_signature_class(signature_class); | |
1922 } | |
1923 ASSERT(signature_function.signature_class() == signature_class.raw()); | |
1924 if (!is_top_level_) { | |
1925 // Finalize types in signature class here, so that the | |
1926 // signature type is not computed twice. | |
1927 ClassFinalizer::FinalizeTypesInClass(signature_class); | |
1928 } | |
1929 const Type& signature_type = | |
1930 Type::ZoneHandle(Z, signature_class.SignatureType()); | |
1931 ASSERT(is_top_level_ || signature_type.IsFinalized()); | 1898 ASSERT(is_top_level_ || signature_type.IsFinalized()); |
1932 // A signature type itself cannot be malformed or malbounded, only its | 1899 // A signature type itself cannot be malformed or malbounded, only its |
1933 // signature function's result type or parameter types may be. | 1900 // signature function's result type or parameter types may be. |
1934 ASSERT(!signature_type.IsMalformed()); | 1901 ASSERT(!signature_type.IsMalformed()); |
1935 ASSERT(!signature_type.IsMalbounded()); | 1902 ASSERT(!signature_type.IsMalbounded()); |
1936 // The type of the parameter is now the signature type. | 1903 // The type of the parameter is now the signature type. |
1937 parameter.type = &signature_type; | 1904 parameter.type = &signature_type; |
1938 } | 1905 } |
1939 } | 1906 } |
1940 | 1907 |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2305 ClosureNode* Parser::CreateImplicitClosureNode(const Function& func, | 2272 ClosureNode* Parser::CreateImplicitClosureNode(const Function& func, |
2306 intptr_t token_pos, | 2273 intptr_t token_pos, |
2307 AstNode* receiver) { | 2274 AstNode* receiver) { |
2308 Function& implicit_closure_function = | 2275 Function& implicit_closure_function = |
2309 Function::ZoneHandle(Z, func.ImplicitClosureFunction()); | 2276 Function::ZoneHandle(Z, func.ImplicitClosureFunction()); |
2310 if (receiver != NULL) { | 2277 if (receiver != NULL) { |
2311 // If we create an implicit instance closure from inside a closure of a | 2278 // If we create an implicit instance closure from inside a closure of a |
2312 // parameterized class, make sure that the receiver is captured as | 2279 // parameterized class, make sure that the receiver is captured as |
2313 // instantiator. | 2280 // instantiator. |
2314 if (current_block_->scope->function_level() > 0) { | 2281 if (current_block_->scope->function_level() > 0) { |
2315 const Class& signature_class = Class::Handle(Z, | 2282 const FunctionType& signature_type = FunctionType::Handle(Z, |
2316 implicit_closure_function.signature_class()); | 2283 implicit_closure_function.SignatureType()); |
2317 if (signature_class.NumTypeParameters() > 0) { | 2284 const Class& scope_class = Class::Handle(Z, signature_type.type_class()); |
| 2285 if (scope_class.IsGeneric()) { |
2318 CaptureInstantiator(); | 2286 CaptureInstantiator(); |
2319 } | 2287 } |
2320 } | 2288 } |
2321 } | 2289 } |
2322 return new ClosureNode(token_pos, implicit_closure_function, receiver, NULL); | 2290 return new ClosureNode(token_pos, implicit_closure_function, receiver, NULL); |
2323 } | 2291 } |
2324 | 2292 |
2325 | 2293 |
2326 AstNode* Parser::ParseSuperFieldAccess(const String& field_name, | 2294 AstNode* Parser::ParseSuperFieldAccess(const String& field_name, |
2327 intptr_t field_pos) { | 2295 intptr_t field_pos) { |
(...skipping 2045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4373 } else { | 4341 } else { |
4374 if (!obj.IsClass()) { | 4342 if (!obj.IsClass()) { |
4375 ReportError(classname_pos, "'%s' is already defined", | 4343 ReportError(classname_pos, "'%s' is already defined", |
4376 class_name.ToCString()); | 4344 class_name.ToCString()); |
4377 } | 4345 } |
4378 cls ^= obj.raw(); | 4346 cls ^= obj.raw(); |
4379 if (is_patch) { | 4347 if (is_patch) { |
4380 // Preserve and reuse the original type parameters and bounds since the | 4348 // Preserve and reuse the original type parameters and bounds since the |
4381 // ones defined in the patch class will not be finalized. | 4349 // ones defined in the patch class will not be finalized. |
4382 orig_type_parameters = cls.type_parameters(); | 4350 orig_type_parameters = cls.type_parameters(); |
4383 // A patch class must be given the same name as the class it is patching, | |
4384 // otherwise the generic signature classes it defines will not match the | |
4385 // patched generic signature classes. Therefore, new signature classes | |
4386 // will be introduced and the original ones will not get finalized. | |
4387 cls = Class::New(class_name, script_, declaration_pos); | 4351 cls = Class::New(class_name, script_, declaration_pos); |
4388 cls.set_library(library_); | 4352 cls.set_library(library_); |
4389 } else { | 4353 } else { |
4390 // Not patching a class, but it has been found. This must be one of the | 4354 // Not patching a class, but it has been found. This must be one of the |
4391 // pre-registered classes from object.cc or a duplicate definition. | 4355 // pre-registered classes from object.cc or a duplicate definition. |
4392 if (!(cls.is_prefinalized() || | 4356 if (!(cls.is_prefinalized() || |
4393 RawObject::IsImplicitFieldClassId(cls.id()))) { | 4357 RawObject::IsImplicitFieldClassId(cls.id()))) { |
4394 ReportError(classname_pos, "class '%s' is already defined", | 4358 ReportError(classname_pos, "class '%s' is already defined", |
4395 class_name.ToCString()); | 4359 class_name.ToCString()); |
4396 } | 4360 } |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4960 | 4924 |
4961 // Lookup alias name and report an error if it is already defined in | 4925 // Lookup alias name and report an error if it is already defined in |
4962 // the library scope. | 4926 // the library scope. |
4963 const Object& obj = | 4927 const Object& obj = |
4964 Object::Handle(Z, library_.LookupLocalObject(*alias_name)); | 4928 Object::Handle(Z, library_.LookupLocalObject(*alias_name)); |
4965 if (!obj.IsNull()) { | 4929 if (!obj.IsNull()) { |
4966 ReportError(alias_name_pos, | 4930 ReportError(alias_name_pos, |
4967 "'%s' is already defined", alias_name->ToCString()); | 4931 "'%s' is already defined", alias_name->ToCString()); |
4968 } | 4932 } |
4969 | 4933 |
4970 // Create the function type alias signature class. It will be linked to its | 4934 // Create the function type alias scope class. It will be linked to its |
4971 // signature function after it has been parsed. The type parameters, in order | 4935 // signature function after it has been parsed. The type parameters, in order |
4972 // to be properly finalized, need to be associated to this signature class as | 4936 // to be properly finalized, need to be associated to this scope class as |
4973 // they are parsed. | 4937 // they are parsed. |
4974 const Class& function_type_alias = Class::Handle(Z, | 4938 const Class& function_type_alias = Class::Handle(Z, |
4975 Class::NewSignatureClass(*alias_name, | 4939 Class::New(*alias_name, script_, declaration_pos)); |
4976 Function::Handle(Z), | 4940 function_type_alias.set_is_synthesized_class(); |
4977 script_, | 4941 function_type_alias.set_is_abstract(); |
4978 declaration_pos)); | 4942 function_type_alias.set_is_prefinalized(); |
4979 library_.AddClass(function_type_alias); | 4943 library_.AddClass(function_type_alias); |
4980 set_current_class(function_type_alias); | 4944 set_current_class(function_type_alias); |
4981 // Parse the type parameters of the function type. | 4945 // Parse the type parameters of the function type. |
4982 ParseTypeParameters(function_type_alias); | 4946 ParseTypeParameters(function_type_alias); |
4983 // At this point, the type parameters have been parsed, so we can resolve the | 4947 // At this point, the type parameters have been parsed, so we can resolve the |
4984 // result type. | 4948 // result type. |
4985 if (!result_type.IsNull()) { | 4949 if (!result_type.IsNull()) { |
4986 ResolveTypeFromClass(function_type_alias, | 4950 ResolveTypeFromClass(function_type_alias, |
4987 ClassFinalizer::kResolveTypeParameters, | 4951 ClassFinalizer::kResolveTypeParameters, |
4988 &result_type); | 4952 &result_type); |
4989 } | 4953 } |
4990 // Parse the formal parameters of the function type. | 4954 // Parse the formal parameters of the function type. |
4991 CheckToken(Token::kLPAREN, "formal parameter list expected"); | 4955 CheckToken(Token::kLPAREN, "formal parameter list expected"); |
4992 ParamList func_params; | 4956 ParamList func_params; |
4993 | 4957 |
4994 // Add implicit closure object parameter. | 4958 // Add implicit closure object parameter. |
4995 func_params.AddFinalParameter( | 4959 func_params.AddFinalParameter( |
4996 TokenPos(), | 4960 TokenPos(), |
4997 &Symbols::ClosureParameter(), | 4961 &Symbols::ClosureParameter(), |
4998 &Object::dynamic_type()); | 4962 &Object::dynamic_type()); |
4999 | 4963 |
5000 const bool no_explicit_default_values = false; | 4964 const bool no_explicit_default_values = false; |
5001 ParseFormalParameterList(no_explicit_default_values, false, &func_params); | 4965 ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
5002 ExpectSemicolon(); | 4966 ExpectSemicolon(); |
5003 // The field 'is_static' has no meaning for signature functions. | 4967 Function& signature_function = |
5004 Function& signature_function = Function::Handle(Z, | 4968 Function::Handle(Z, Function::NewSignatureFunction(function_type_alias, |
5005 Function::New(*alias_name, | 4969 alias_name_pos)); |
5006 RawFunction::kSignatureFunction, | |
5007 /* is_static = */ false, | |
5008 /* is_const = */ false, | |
5009 /* is_abstract = */ false, | |
5010 /* is_external = */ false, | |
5011 /* is_native = */ false, | |
5012 function_type_alias, | |
5013 alias_name_pos)); | |
5014 signature_function.set_result_type(result_type); | 4970 signature_function.set_result_type(result_type); |
5015 signature_function.set_is_debuggable(false); | |
5016 AddFormalParamsToFunction(&func_params, signature_function); | 4971 AddFormalParamsToFunction(&func_params, signature_function); |
5017 | 4972 |
5018 // Patch the signature function in the signature class. | 4973 // Set the signature function in the function type alias class. |
5019 function_type_alias.PatchSignatureFunction(signature_function); | 4974 function_type_alias.set_signature_function(signature_function); |
5020 | 4975 |
5021 const String& signature = String::Handle(Z, | |
5022 signature_function.Signature()); | |
5023 if (FLAG_trace_parser) { | 4976 if (FLAG_trace_parser) { |
5024 OS::Print("TopLevel parsing function type alias '%s'\n", | 4977 OS::Print("TopLevel parsing function type alias '%s'\n", |
5025 signature.ToCString()); | 4978 String::Handle(Z, signature_function.Signature()).ToCString()); |
5026 } | 4979 } |
5027 // Lookup the signature class, i.e. the class whose name is the signature. | |
5028 // We only lookup in the current library, but not in its imports, and only | |
5029 // create a new canonical signature class if it does not exist yet. | |
5030 Class& signature_class = | |
5031 Class::ZoneHandle(Z, library_.LookupLocalClass(signature)); | |
5032 if (signature_class.IsNull()) { | |
5033 signature_class = Class::NewSignatureClass(signature, | |
5034 signature_function, | |
5035 script_, | |
5036 alias_name_pos); | |
5037 // Record the function signature class in the current library. | |
5038 library_.AddClass(signature_class); | |
5039 } else { | |
5040 // Forget the just created signature function and use the existing one. | |
5041 signature_function = signature_class.signature_function(); | |
5042 function_type_alias.PatchSignatureFunction(signature_function); | |
5043 } | |
5044 ASSERT(signature_function.signature_class() == signature_class.raw()); | |
5045 | |
5046 // The alias should not be marked as finalized yet, since it needs to be | 4980 // The alias should not be marked as finalized yet, since it needs to be |
5047 // checked in the class finalizer for illegal self references. | 4981 // checked in the class finalizer for illegal self references. |
5048 ASSERT(!function_type_alias.IsCanonicalSignatureClass()); | |
5049 ASSERT(!function_type_alias.is_finalized()); | 4982 ASSERT(!function_type_alias.is_finalized()); |
5050 pending_classes.Add(function_type_alias, Heap::kOld); | 4983 pending_classes.Add(function_type_alias, Heap::kOld); |
5051 if (FLAG_enable_mirrors && (metadata_pos >= 0)) { | 4984 if (FLAG_enable_mirrors && (metadata_pos >= 0)) { |
5052 library_.AddClassMetadata(function_type_alias, | 4985 library_.AddClassMetadata(function_type_alias, |
5053 tl_owner, | 4986 tl_owner, |
5054 metadata_pos); | 4987 metadata_pos); |
5055 } | 4988 } |
5056 } | 4989 } |
5057 | 4990 |
5058 | 4991 |
(...skipping 1485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6544 is_new_closure = true; | 6477 is_new_closure = true; |
6545 } | 6478 } |
6546 | 6479 |
6547 ParamList closure_params; | 6480 ParamList closure_params; |
6548 AddSyncGenClosureParameters(&closure_params); | 6481 AddSyncGenClosureParameters(&closure_params); |
6549 | 6482 |
6550 if (is_new_closure) { | 6483 if (is_new_closure) { |
6551 // Add the parameters to the newly created closure. | 6484 // Add the parameters to the newly created closure. |
6552 AddFormalParamsToFunction(&closure_params, body); | 6485 AddFormalParamsToFunction(&closure_params, body); |
6553 | 6486 |
6554 // Create and set the signature class of the closure. | 6487 // Finalize function type. |
6555 const String& sig = String::Handle(Z, body.Signature()); | 6488 FunctionType& signature_type = |
6556 Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig)); | 6489 FunctionType::Handle(Z, body.SignatureType()); |
6557 if (sig_cls.IsNull()) { | 6490 signature_type ^= ClassFinalizer::FinalizeType( |
6558 sig_cls = Class::NewSignatureClass(sig, body, script_, body.token_pos()); | 6491 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
6559 library_.AddClass(sig_cls); | 6492 body.SetSignatureType(signature_type); |
6560 } | |
6561 body.set_signature_class(sig_cls); | |
6562 // Finalize types in signature class here, so that the | |
6563 // signature type is not computed twice. | |
6564 ClassFinalizer::FinalizeTypesInClass(sig_cls); | |
6565 const Type& sig_type = Type::Handle(Z, sig_cls.SignatureType()); | |
6566 ASSERT(sig_type.IsFinalized()); | |
6567 ASSERT(AbstractType::Handle(Z, body.result_type()).IsResolved()); | 6493 ASSERT(AbstractType::Handle(Z, body.result_type()).IsResolved()); |
6568 ASSERT(body.NumParameters() == closure_params.parameters->length()); | 6494 ASSERT(body.NumParameters() == closure_params.parameters->length()); |
6569 } | 6495 } |
6570 | 6496 |
6571 OpenFunctionBlock(body); | 6497 OpenFunctionBlock(body); |
6572 AddFormalParamsToScope(&closure_params, current_block_->scope); | 6498 AddFormalParamsToScope(&closure_params, current_block_->scope); |
6573 async_temp_scope_ = current_block_->scope; | 6499 async_temp_scope_ = current_block_->scope; |
6574 return body.raw(); | 6500 return body.raw(); |
6575 } | 6501 } |
6576 | 6502 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6681 closure.set_result_type(Object::dynamic_type()); | 6607 closure.set_result_type(Object::dynamic_type()); |
6682 is_new_closure = true; | 6608 is_new_closure = true; |
6683 } | 6609 } |
6684 // Create the parameter list for the async body closure. | 6610 // Create the parameter list for the async body closure. |
6685 ParamList closure_params; | 6611 ParamList closure_params; |
6686 AddAsyncClosureParameters(&closure_params); | 6612 AddAsyncClosureParameters(&closure_params); |
6687 if (is_new_closure) { | 6613 if (is_new_closure) { |
6688 // Add the parameters to the newly created closure. | 6614 // Add the parameters to the newly created closure. |
6689 AddFormalParamsToFunction(&closure_params, closure); | 6615 AddFormalParamsToFunction(&closure_params, closure); |
6690 | 6616 |
6691 // Create and set the signature class of the closure. | 6617 // Finalize function type. |
6692 const String& sig = String::Handle(Z, closure.Signature()); | 6618 FunctionType& signature_type = |
6693 Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig)); | 6619 FunctionType::Handle(Z, closure.SignatureType()); |
6694 if (sig_cls.IsNull()) { | 6620 signature_type ^= ClassFinalizer::FinalizeType( |
6695 sig_cls = | 6621 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
6696 Class::NewSignatureClass(sig, closure, script_, closure.token_pos()); | 6622 closure.SetSignatureType(signature_type); |
6697 library_.AddClass(sig_cls); | |
6698 } | |
6699 closure.set_signature_class(sig_cls); | |
6700 // Finalize types in signature class here, so that the | |
6701 // signature type is not computed twice. | |
6702 ClassFinalizer::FinalizeTypesInClass(sig_cls); | |
6703 const Type& sig_type = Type::Handle(Z, sig_cls.SignatureType()); | |
6704 ASSERT(sig_type.IsFinalized()); | |
6705 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); | 6623 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); |
6706 ASSERT(closure.NumParameters() == closure_params.parameters->length()); | 6624 ASSERT(closure.NumParameters() == closure_params.parameters->length()); |
6707 } | 6625 } |
6708 OpenFunctionBlock(closure); | 6626 OpenFunctionBlock(closure); |
6709 AddFormalParamsToScope(&closure_params, current_block_->scope); | 6627 AddFormalParamsToScope(&closure_params, current_block_->scope); |
6710 async_temp_scope_ = current_block_->scope; | 6628 async_temp_scope_ = current_block_->scope; |
6711 return closure.raw(); | 6629 return closure.raw(); |
6712 } | 6630 } |
6713 | 6631 |
6714 | 6632 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6816 is_new_closure = true; | 6734 is_new_closure = true; |
6817 } | 6735 } |
6818 | 6736 |
6819 ParamList closure_params; | 6737 ParamList closure_params; |
6820 AddAsyncGenClosureParameters(&closure_params); | 6738 AddAsyncGenClosureParameters(&closure_params); |
6821 | 6739 |
6822 if (is_new_closure) { | 6740 if (is_new_closure) { |
6823 // Add the parameters to the newly created closure. | 6741 // Add the parameters to the newly created closure. |
6824 AddFormalParamsToFunction(&closure_params, closure); | 6742 AddFormalParamsToFunction(&closure_params, closure); |
6825 | 6743 |
6826 // Create and set the signature class of the closure. | 6744 // Finalize function type. |
6827 const String& sig = String::Handle(Z, closure.Signature()); | 6745 FunctionType& signature_type = |
6828 Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig)); | 6746 FunctionType::Handle(Z, closure.SignatureType()); |
6829 if (sig_cls.IsNull()) { | 6747 signature_type ^= ClassFinalizer::FinalizeType( |
6830 sig_cls = | 6748 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
6831 Class::NewSignatureClass(sig, closure, script_, closure.token_pos()); | 6749 closure.SetSignatureType(signature_type); |
6832 library_.AddClass(sig_cls); | |
6833 } | |
6834 closure.set_signature_class(sig_cls); | |
6835 // Finalize types in signature class here, so that the | |
6836 // signature type is not computed twice. | |
6837 ClassFinalizer::FinalizeTypesInClass(sig_cls); | |
6838 const Type& sig_type = Type::Handle(Z, sig_cls.SignatureType()); | |
6839 ASSERT(sig_type.IsFinalized()); | |
6840 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); | 6750 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); |
6841 ASSERT(closure.NumParameters() == closure_params.parameters->length()); | 6751 ASSERT(closure.NumParameters() == closure_params.parameters->length()); |
6842 } | 6752 } |
6843 | 6753 |
6844 OpenFunctionBlock(closure); | 6754 OpenFunctionBlock(closure); |
6845 AddFormalParamsToScope(&closure_params, current_block_->scope); | 6755 AddFormalParamsToScope(&closure_params, current_block_->scope); |
6846 async_temp_scope_ = current_block_->scope; | 6756 async_temp_scope_ = current_block_->scope; |
6847 return closure.raw(); | 6757 return closure.raw(); |
6848 } | 6758 } |
6849 | 6759 |
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7546 } | 7456 } |
7547 } | 7457 } |
7548 CheckToken(Token::kLPAREN); | 7458 CheckToken(Token::kLPAREN); |
7549 | 7459 |
7550 // Check whether we have parsed this closure function before, in a previous | 7460 // Check whether we have parsed this closure function before, in a previous |
7551 // compilation. If so, reuse the function object, else create a new one | 7461 // compilation. If so, reuse the function object, else create a new one |
7552 // and register it in the current class. | 7462 // and register it in the current class. |
7553 // Note that we cannot share the same closure function between the closurized | 7463 // Note that we cannot share the same closure function between the closurized |
7554 // and non-closurized versions of the same parent function. | 7464 // and non-closurized versions of the same parent function. |
7555 Function& function = Function::ZoneHandle(Z); | 7465 Function& function = Function::ZoneHandle(Z); |
7556 bool is_new_closure = false; | |
7557 // TODO(hausner): There could be two different closures at the given | 7466 // TODO(hausner): There could be two different closures at the given |
7558 // function_pos, one enclosed in a closurized function and one enclosed in the | 7467 // function_pos, one enclosed in a closurized function and one enclosed in the |
7559 // non-closurized version of this same function. | 7468 // non-closurized version of this same function. |
7560 function = I->LookupClosureFunction(innermost_function(), function_pos); | 7469 function = I->LookupClosureFunction(innermost_function(), function_pos); |
7561 if (function.IsNull()) { | 7470 if (function.IsNull()) { |
7562 // The function will be registered in the lookup table by the | 7471 // The function will be registered in the lookup table by the |
7563 // EffectGraphVisitor::VisitClosureNode when the newly allocated closure | 7472 // EffectGraphVisitor::VisitClosureNode when the newly allocated closure |
7564 // function has been properly setup. | 7473 // function has been properly setup. |
7565 is_new_closure = true; | |
7566 function = Function::NewClosureFunction(*function_name, | 7474 function = Function::NewClosureFunction(*function_name, |
7567 innermost_function(), | 7475 innermost_function(), |
7568 function_pos); | 7476 function_pos); |
7569 function.set_result_type(result_type); | 7477 function.set_result_type(result_type); |
7570 if (FLAG_enable_mirrors && (metadata_pos >= 0)) { | 7478 if (FLAG_enable_mirrors && (metadata_pos >= 0)) { |
7571 library_.AddFunctionMetadata(function, metadata_pos); | 7479 library_.AddFunctionMetadata(function, metadata_pos); |
7572 } | 7480 } |
7573 } | 7481 } |
7574 | 7482 |
7575 // The function type needs to be finalized at compile time, since the closure | 7483 // The function type needs to be finalized at compile time, since the closure |
7576 // may be type checked at run time when assigned to a function variable, | 7484 // may be type checked at run time when assigned to a function variable, |
7577 // passed as a function argument, or returned as a function result. | 7485 // passed as a function argument, or returned as a function result. |
7578 | 7486 |
7579 LocalVariable* function_variable = NULL; | 7487 LocalVariable* function_variable = NULL; |
7580 Type& function_type = Type::ZoneHandle(Z); | 7488 FunctionType& function_type = FunctionType::ZoneHandle(Z); |
7581 if (variable_name != NULL) { | 7489 if (variable_name != NULL) { |
7582 // Since the function type depends on the signature of the closure function, | 7490 // Since the function type depends on the signature of the closure function, |
7583 // it cannot be determined before the formal parameter list of the closure | 7491 // it cannot be determined before the formal parameter list of the closure |
7584 // function is parsed. Therefore, we set the function type to a new | 7492 // function is parsed. Therefore, we set the function type to a new |
7585 // parameterized type to be patched after the actual type is known. | 7493 // function type to be patched after the actual type is known. |
7586 // We temporarily use the class of the Function interface. | 7494 // We temporarily use the Closure class as scope class. |
7587 const Class& unknown_signature_class = Class::Handle(Z, | 7495 const Class& unknown_scope_class = Class::Handle(Z, |
7588 Type::Handle(Z, Type::Function()).type_class()); | 7496 I->object_store()->closure_class()); |
7589 function_type = Type::New(unknown_signature_class, | 7497 function_type = FunctionType::New(unknown_scope_class, |
7590 TypeArguments::Handle(Z), function_pos); | 7498 TypeArguments::Handle(Z), |
| 7499 function, |
| 7500 function_pos); |
7591 function_type.SetIsFinalized(); // No finalization needed. | 7501 function_type.SetIsFinalized(); // No finalization needed. |
7592 | 7502 |
7593 // Add the function variable to the scope before parsing the function in | 7503 // Add the function variable to the scope before parsing the function in |
7594 // order to allow self reference from inside the function. | 7504 // order to allow self reference from inside the function. |
7595 function_variable = new(Z) LocalVariable(function_pos, | 7505 function_variable = new(Z) LocalVariable(function_pos, |
7596 *variable_name, | 7506 *variable_name, |
7597 function_type); | 7507 function_type); |
7598 function_variable->set_is_final(); | 7508 function_variable->set_is_final(); |
7599 ASSERT(current_block_ != NULL); | 7509 ASSERT(current_block_ != NULL); |
7600 ASSERT(current_block_->scope != NULL); | 7510 ASSERT(current_block_->scope != NULL); |
7601 if (!current_block_->scope->AddVariable(function_variable)) { | 7511 if (!current_block_->scope->AddVariable(function_variable)) { |
7602 LocalVariable* existing_var = | 7512 LocalVariable* existing_var = |
7603 current_block_->scope->LookupVariable(function_variable->name(), | 7513 current_block_->scope->LookupVariable(function_variable->name(), |
7604 true); | 7514 true); |
7605 ASSERT(existing_var != NULL); | 7515 ASSERT(existing_var != NULL); |
7606 // Use before define cases have already been detected and reported above. | 7516 // Use before define cases have already been detected and reported above. |
7607 ASSERT(existing_var->owner() == current_block_->scope); | 7517 ASSERT(existing_var->owner() == current_block_->scope); |
7608 ReportError(function_pos, "identifier '%s' already defined", | 7518 ReportError(function_pos, "identifier '%s' already defined", |
7609 function_variable->name().ToCString()); | 7519 function_variable->name().ToCString()); |
7610 } | 7520 } |
7611 } | 7521 } |
7612 | 7522 |
7613 // Parse the local function. | 7523 // Parse the local function. |
7614 SequenceNode* statements = Parser::ParseFunc(function); | 7524 SequenceNode* statements = Parser::ParseFunc(function); |
7615 INC_STAT(thread(), num_functions_parsed, 1); | 7525 INC_STAT(thread(), num_functions_parsed, 1); |
7616 | 7526 |
7617 // Now that the local function has formal parameters, lookup the signature | 7527 // Now that the local function has formal parameters, lookup the signature |
7618 // class in the current library (but not in its imports) and only create a new | 7528 FunctionType& signature_type = |
7619 // canonical signature class if it does not exist yet. | 7529 FunctionType::ZoneHandle(Z, function.SignatureType()); |
7620 const String& signature = String::Handle(Z, function.Signature()); | 7530 signature_type ^= ClassFinalizer::FinalizeType( |
7621 Class& signature_class = Class::ZoneHandle(Z); | 7531 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
7622 if (!is_new_closure) { | 7532 function.SetSignatureType(signature_type); |
7623 signature_class = function.signature_class(); | |
7624 } | |
7625 if (signature_class.IsNull()) { | |
7626 signature_class = library_.LookupLocalClass(signature); | |
7627 } | |
7628 if (signature_class.IsNull()) { | |
7629 // If we don't have a signature class yet, this must be a closure we | |
7630 // have not parsed before. | |
7631 ASSERT(is_new_closure); | |
7632 signature_class = Class::NewSignatureClass(signature, | |
7633 function, | |
7634 script_, | |
7635 function.token_pos()); | |
7636 // Record the function signature class in the current library. | |
7637 library_.AddClass(signature_class); | |
7638 } else if (is_new_closure) { | |
7639 function.set_signature_class(signature_class); | |
7640 } | |
7641 ASSERT(function.signature_class() == signature_class.raw()); | |
7642 | 7533 |
7643 // Local functions are registered in the enclosing class, but | 7534 // Local functions are registered in the enclosing class, but |
7644 // ignored during class finalization. The enclosing class has | 7535 // ignored during class finalization. The enclosing class has |
7645 // already been finalized. | 7536 // already been finalized. |
7646 ASSERT(current_class().is_finalized()); | 7537 ASSERT(current_class().is_finalized()); |
| 7538 ASSERT(signature_type.IsFinalized()); |
7647 | 7539 |
7648 // Make sure that the instantiator is captured. | 7540 // Make sure that the instantiator is captured. |
7649 if ((signature_class.NumTypeParameters() > 0) && | 7541 if ((current_block_->scope->function_level() > 0) && |
7650 (current_block_->scope->function_level() > 0)) { | 7542 Class::Handle(signature_type.type_class()).IsGeneric()) { |
7651 CaptureInstantiator(); | 7543 CaptureInstantiator(); |
7652 } | 7544 } |
7653 | 7545 |
7654 // Finalize types in signature class here, so that the | |
7655 // signature type is not computed twice. | |
7656 ClassFinalizer::FinalizeTypesInClass(signature_class); | |
7657 const Type& signature_type = Type::Handle(Z, signature_class.SignatureType()); | |
7658 ASSERT(signature_type.IsFinalized()); | |
7659 | |
7660 // A signature type itself cannot be malformed or malbounded, only its | 7546 // A signature type itself cannot be malformed or malbounded, only its |
7661 // signature function's result type or parameter types may be. | 7547 // signature function's result type or parameter types may be. |
7662 ASSERT(!signature_type.IsMalformed()); | 7548 ASSERT(!signature_type.IsMalformed()); |
7663 ASSERT(!signature_type.IsMalbounded()); | 7549 ASSERT(!signature_type.IsMalbounded()); |
7664 | 7550 |
7665 if (variable_name != NULL) { | 7551 if (variable_name != NULL) { |
7666 // Patch the function type of the variable now that the signature is known. | 7552 // Patch the function type of the variable now that the signature is known. |
7667 function_type.set_type_class(signature_class); | 7553 function_type.set_scope_class( |
| 7554 Class::Handle(Z, signature_type.scope_class())); |
7668 function_type.set_arguments( | 7555 function_type.set_arguments( |
7669 TypeArguments::Handle(Z, signature_type.arguments())); | 7556 TypeArguments::Handle(Z, signature_type.arguments())); |
| 7557 ASSERT(function_type.signature() == function.raw()); |
7670 | 7558 |
7671 // The function type was initially marked as instantiated, but it may | 7559 // The function type was initially marked as instantiated, but it may |
7672 // actually be uninstantiated. | 7560 // actually be uninstantiated. |
7673 function_type.ResetIsFinalized(); | 7561 function_type.ResetIsFinalized(); |
7674 | 7562 |
7675 // The function variable type should have been patched above. | 7563 // The function variable type should have been patched above. |
7676 ASSERT((function_variable == NULL) || | 7564 ASSERT((function_variable == NULL) || |
7677 (function_variable->type().raw() == function_type.raw())); | 7565 (function_variable->type().raw() == function_type.raw())); |
7678 } | 7566 } |
7679 | 7567 |
(...skipping 2595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10275 method_name = Library::PrivateCoreLibName( | 10163 method_name = Library::PrivateCoreLibName( |
10276 Symbols::ThrowNewIfNotLoaded()).raw(); | 10164 Symbols::ThrowNewIfNotLoaded()).raw(); |
10277 } | 10165 } |
10278 // Object receiver. | 10166 // Object receiver. |
10279 // If the function is external and dynamic, pass the actual receiver, | 10167 // If the function is external and dynamic, pass the actual receiver, |
10280 // otherwise, pass a class literal of the unresolved method's owner. | 10168 // otherwise, pass a class literal of the unresolved method's owner. |
10281 if ((func != NULL) && !func->IsNull() && | 10169 if ((func != NULL) && !func->IsNull() && |
10282 func->is_external() && !func->is_static()) { | 10170 func->is_external() && !func->is_static()) { |
10283 arguments->Add(LoadReceiver(func->token_pos())); | 10171 arguments->Add(LoadReceiver(func->token_pos())); |
10284 } else { | 10172 } else { |
10285 Type& type = Type::ZoneHandle(Z, | 10173 AbstractType& type = AbstractType::ZoneHandle(Z); |
10286 Type::New(cls, TypeArguments::Handle(Z), call_pos, Heap::kOld)); | 10174 type ^= Type::New(cls, TypeArguments::Handle(Z), call_pos, Heap::kOld); |
10287 type ^= ClassFinalizer::FinalizeType( | 10175 type ^= ClassFinalizer::FinalizeType( |
10288 current_class(), type, ClassFinalizer::kCanonicalize); | 10176 current_class(), type, ClassFinalizer::kCanonicalize); |
10289 arguments->Add(new(Z) LiteralNode(call_pos, type)); | 10177 arguments->Add(new(Z) LiteralNode(call_pos, type)); |
10290 } | 10178 } |
10291 // String memberName. | 10179 // String memberName. |
10292 arguments->Add(new(Z) LiteralNode( | 10180 arguments->Add(new(Z) LiteralNode( |
10293 call_pos, String::ZoneHandle(Z, Symbols::New(function_name)))); | 10181 call_pos, String::ZoneHandle(Z, Symbols::New(function_name)))); |
10294 // Smi invocation_type. | 10182 // Smi invocation_type. |
10295 if (cls.IsTopLevel()) { | 10183 if (cls.IsTopLevel()) { |
10296 ASSERT(im_call == InvocationMirror::kStatic || | 10184 ASSERT(im_call == InvocationMirror::kStatic || |
(...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11854 current_member_->has_static && !current_member_->has_factory; | 11742 current_member_->has_static && !current_member_->has_factory; |
11855 } | 11743 } |
11856 ASSERT(!current_function().IsNull()); | 11744 ASSERT(!current_function().IsNull()); |
11857 return | 11745 return |
11858 current_function().is_static() && !current_function().IsInFactoryScope(); | 11746 current_function().is_static() && !current_function().IsInFactoryScope(); |
11859 } | 11747 } |
11860 | 11748 |
11861 | 11749 |
11862 const AbstractType* Parser::ReceiverType(const Class& cls) { | 11750 const AbstractType* Parser::ReceiverType(const Class& cls) { |
11863 ASSERT(!cls.IsNull()); | 11751 ASSERT(!cls.IsNull()); |
| 11752 ASSERT(!cls.IsTypedefClass()); |
| 11753 // Note that if cls is _Closure, the returned type will be _Closure, |
| 11754 // and not the signature type. |
11864 Type& type = Type::ZoneHandle(Z, cls.CanonicalType()); | 11755 Type& type = Type::ZoneHandle(Z, cls.CanonicalType()); |
11865 if (!type.IsNull()) { | 11756 if (!type.IsNull()) { |
11866 return &type; | 11757 return &type; |
11867 } | 11758 } |
11868 if (cls.IsSignatureClass()) { | 11759 type = Type::New(cls, |
11869 type = cls.SignatureType(); | 11760 TypeArguments::Handle(Z, cls.type_parameters()), cls.token_pos()); |
11870 } else { | |
11871 type = Type::New(cls, | |
11872 TypeArguments::Handle(Z, cls.type_parameters()), cls.token_pos()); | |
11873 } | |
11874 if (cls.is_type_finalized()) { | 11761 if (cls.is_type_finalized()) { |
11875 type ^= ClassFinalizer::FinalizeType( | 11762 type ^= ClassFinalizer::FinalizeType( |
11876 cls, type, ClassFinalizer::kCanonicalizeWellFormed); | 11763 cls, type, ClassFinalizer::kCanonicalizeWellFormed); |
11877 // Note that the receiver type may now be a malbounded type. | 11764 // Note that the receiver type may now be a malbounded type. |
11878 cls.SetCanonicalType(type); | 11765 cls.SetCanonicalType(type); |
11879 } | 11766 } |
11880 return &type; | 11767 return &type; |
11881 } | 11768 } |
11882 | 11769 |
11883 | 11770 |
11884 bool Parser::IsInstantiatorRequired() const { | 11771 bool Parser::IsInstantiatorRequired() const { |
11885 ASSERT(!current_function().IsNull()); | 11772 ASSERT(!current_function().IsNull()); |
11886 if (current_function().is_static() && | 11773 if (current_function().is_static() && |
11887 !current_function().IsInFactoryScope()) { | 11774 !current_function().IsInFactoryScope()) { |
11888 return false; | 11775 return false; |
11889 } | 11776 } |
11890 return current_class().NumTypeParameters() > 0; | 11777 return current_class().IsGeneric(); |
11891 } | 11778 } |
11892 | 11779 |
11893 // We cache computed compile-time constants in a map so we can look them | 11780 // We cache computed compile-time constants in a map so we can look them |
11894 // up when the same code gets compiled again. The map key is a pair | 11781 // up when the same code gets compiled again. The map key is a pair |
11895 // (script url, token position) which is encoded in an array with 2 | 11782 // (script url, token position) which is encoded in an array with 2 |
11896 // elements: | 11783 // elements: |
11897 // - key[0] contains the canonicalized url of the script. | 11784 // - key[0] contains the canonicalized url of the script. |
11898 // - key[1] contains the token position of the constant in the script. | 11785 // - key[1] contains the token position of the constant in the script. |
11899 | 11786 |
11900 // ConstantPosKey allows us to look up a constant in the map without | 11787 // ConstantPosKey allows us to look up a constant in the map without |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12440 return resolved; | 12327 return resolved; |
12441 } | 12328 } |
12442 | 12329 |
12443 | 12330 |
12444 RawAbstractType* Parser::ParseType( | 12331 RawAbstractType* Parser::ParseType( |
12445 ClassFinalizer::FinalizationKind finalization, | 12332 ClassFinalizer::FinalizationKind finalization, |
12446 bool allow_deferred_type, | 12333 bool allow_deferred_type, |
12447 bool consume_unresolved_prefix) { | 12334 bool consume_unresolved_prefix) { |
12448 LibraryPrefix& prefix = LibraryPrefix::Handle(Z); | 12335 LibraryPrefix& prefix = LibraryPrefix::Handle(Z); |
12449 return ParseType(finalization, allow_deferred_type, | 12336 return ParseType(finalization, allow_deferred_type, |
12450 consume_unresolved_prefix, &prefix); | 12337 consume_unresolved_prefix, &prefix); |
12451 } | 12338 } |
12452 | 12339 |
12453 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and | 12340 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and |
12454 // finalize it according to the given type finalization mode. Returns prefix. | 12341 // finalize it according to the given type finalization mode. Returns prefix. |
12455 RawAbstractType* Parser::ParseType( | 12342 RawAbstractType* Parser::ParseType( |
12456 ClassFinalizer::FinalizationKind finalization, | 12343 ClassFinalizer::FinalizationKind finalization, |
12457 bool allow_deferred_type, | 12344 bool allow_deferred_type, |
12458 bool consume_unresolved_prefix, | 12345 bool consume_unresolved_prefix, |
12459 LibraryPrefix* prefix) { | 12346 LibraryPrefix* prefix) { |
12460 TRACE_PARSER("ParseType"); | 12347 TRACE_PARSER("ParseType"); |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13125 | 13012 |
13126 closure = Function::NewClosureFunction(closure_name, | 13013 closure = Function::NewClosureFunction(closure_name, |
13127 innermost_function(), | 13014 innermost_function(), |
13128 token_pos); | 13015 token_pos); |
13129 closure.set_is_generated_body(true); | 13016 closure.set_is_generated_body(true); |
13130 closure.set_is_debuggable(false); | 13017 closure.set_is_debuggable(false); |
13131 closure.set_is_visible(false); | 13018 closure.set_is_visible(false); |
13132 closure.set_result_type(Object::dynamic_type()); | 13019 closure.set_result_type(Object::dynamic_type()); |
13133 AddFormalParamsToFunction(¶ms, closure); | 13020 AddFormalParamsToFunction(¶ms, closure); |
13134 | 13021 |
13135 // Create and set the signature class of the closure. | 13022 // Finalize function type. |
13136 const String& sig = String::Handle(Z, closure.Signature()); | 13023 FunctionType& signature_type = |
13137 Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig)); | 13024 FunctionType::Handle(Z, closure.SignatureType()); |
13138 if (sig_cls.IsNull()) { | 13025 signature_type ^= ClassFinalizer::FinalizeType( |
13139 sig_cls = Class::NewSignatureClass(sig, closure, script_, token_pos); | 13026 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
13140 library_.AddClass(sig_cls); | 13027 closure.SetSignatureType(signature_type); |
13141 } | |
13142 closure.set_signature_class(sig_cls); | |
13143 // Finalize types in signature class here, so that the | |
13144 // signature type is not computed twice. | |
13145 ClassFinalizer::FinalizeTypesInClass(sig_cls); | |
13146 const Type& sig_type = Type::Handle(Z, sig_cls.SignatureType()); | |
13147 ASSERT(sig_type.IsFinalized()); | |
13148 // Finalization would be premature when top-level parsing. | 13028 // Finalization would be premature when top-level parsing. |
13149 ASSERT(!is_top_level_); | 13029 ASSERT(!is_top_level_); |
13150 return closure.raw(); | 13030 return closure.raw(); |
13151 } | 13031 } |
13152 | 13032 |
13153 | 13033 |
13154 static String& BuildConstructorName(const String& type_class_name, | 13034 static String& BuildConstructorName(const String& type_class_name, |
13155 const String* named_constructor) { | 13035 const String* named_constructor) { |
13156 // By convention, the static function implementing a named constructor 'C' | 13036 // By convention, the static function implementing a named constructor 'C' |
13157 // for class 'A' is labeled 'A.C', and the static function implementing the | 13037 // for class 'A' is labeled 'A.C', and the static function implementing the |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14396 const ArgumentListNode& function_args, | 14276 const ArgumentListNode& function_args, |
14397 const LocalVariable* temp_for_last_arg, | 14277 const LocalVariable* temp_for_last_arg, |
14398 bool is_super_invocation) { | 14278 bool is_super_invocation) { |
14399 UNREACHABLE(); | 14279 UNREACHABLE(); |
14400 return NULL; | 14280 return NULL; |
14401 } | 14281 } |
14402 | 14282 |
14403 } // namespace dart | 14283 } // namespace dart |
14404 | 14284 |
14405 #endif // DART_PRECOMPILED | 14285 #endif // DART_PRECOMPILED |
OLD | NEW |