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 | 6 |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 signature_function, | 878 signature_function, |
879 script_); | 879 script_); |
880 // Record the function signature class in the current library. | 880 // Record the function signature class in the current library. |
881 library_.AddClass(signature_class); | 881 library_.AddClass(signature_class); |
882 } else { | 882 } else { |
883 signature_function.set_signature_class(signature_class); | 883 signature_function.set_signature_class(signature_class); |
884 } | 884 } |
885 ASSERT(signature_function.signature_class() == signature_class.raw()); | 885 ASSERT(signature_function.signature_class() == signature_class.raw()); |
886 Type& signature_type = Type::ZoneHandle(signature_class.SignatureType()); | 886 Type& signature_type = Type::ZoneHandle(signature_class.SignatureType()); |
887 if (!is_top_level_ && !signature_type.IsFinalized()) { | 887 if (!is_top_level_ && !signature_type.IsFinalized()) { |
888 String& errmsg = String::Handle(); | 888 Error& error = Error::Handle(); |
889 signature_type ^= | 889 signature_type ^= |
890 ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, | 890 ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, |
891 signature_type, | 891 signature_type, |
892 &errmsg); | 892 &error); |
893 if (!errmsg.IsNull()) { | 893 if (!error.IsNull()) { |
894 ErrorMsg(errmsg.ToCString()); | 894 ErrorMsg(error.ToErrorCString()); |
895 } | 895 } |
896 } | 896 } |
897 // The type of the parameter is now the signature type. | 897 // The type of the parameter is now the signature type. |
898 parameter.type = &signature_type; | 898 parameter.type = &signature_type; |
899 } | 899 } |
900 } | 900 } |
901 | 901 |
902 if (CurrentToken() == Token::kASSIGN) { | 902 if (CurrentToken() == Token::kASSIGN) { |
903 if (!params->has_named_optional_parameters || | 903 if (!params->has_named_optional_parameters || |
904 !allow_explicit_default_value) { | 904 !allow_explicit_default_value) { |
(...skipping 2924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3829 // Patch the function type now that the signature is known. | 3829 // Patch the function type now that the signature is known. |
3830 // We need to create a new type for proper finalization, since the existing | 3830 // We need to create a new type for proper finalization, since the existing |
3831 // type is already marked as finalized. | 3831 // type is already marked as finalized. |
3832 Type& signature_type = Type::Handle(signature_class.SignatureType()); | 3832 Type& signature_type = Type::Handle(signature_class.SignatureType()); |
3833 const AbstractTypeArguments& signature_type_arguments = | 3833 const AbstractTypeArguments& signature_type_arguments = |
3834 AbstractTypeArguments::Handle(signature_type.arguments()); | 3834 AbstractTypeArguments::Handle(signature_type.arguments()); |
3835 | 3835 |
3836 // Since the signature type is cached by the signature class, it may have | 3836 // Since the signature type is cached by the signature class, it may have |
3837 // been finalized already. | 3837 // been finalized already. |
3838 if (!signature_type.IsFinalized()) { | 3838 if (!signature_type.IsFinalized()) { |
3839 String& errmsg = String::Handle(); | 3839 Error& error = Error::Handle(); |
3840 signature_type ^= | 3840 signature_type ^= |
3841 ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, | 3841 ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, |
3842 signature_type, | 3842 signature_type, |
3843 &errmsg); | 3843 &error); |
3844 if (!errmsg.IsNull()) { | 3844 if (!error.IsNull()) { |
3845 ErrorMsg(errmsg.ToCString()); | 3845 ErrorMsg(error.ToErrorCString()); |
3846 } | 3846 } |
3847 // The call to ClassFinalizer::FinalizeAndCanonicalizeType may have | 3847 // The call to ClassFinalizer::FinalizeAndCanonicalizeType may have |
3848 // extended the vector of type arguments. | 3848 // extended the vector of type arguments. |
3849 ASSERT(signature_type_arguments.IsNull() || | 3849 ASSERT(signature_type_arguments.IsNull() || |
3850 (signature_type_arguments.Length() == | 3850 (signature_type_arguments.Length() == |
3851 signature_class.NumTypeArguments())); | 3851 signature_class.NumTypeArguments())); |
3852 // The signature_class should not have changed. | 3852 // The signature_class should not have changed. |
3853 ASSERT(signature_type.type_class() == signature_class.raw()); | 3853 ASSERT(signature_type.type_class() == signature_class.raw()); |
3854 } | 3854 } |
3855 | 3855 |
(...skipping 1306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5162 new LoadLocalNode(statement_pos, *trace_var)); | 5162 new LoadLocalNode(statement_pos, *trace_var)); |
5163 } | 5163 } |
5164 } else { | 5164 } else { |
5165 statement = ParseExpr(kAllowConst); | 5165 statement = ParseExpr(kAllowConst); |
5166 ExpectSemicolon(); | 5166 ExpectSemicolon(); |
5167 } | 5167 } |
5168 return statement; | 5168 return statement; |
5169 } | 5169 } |
5170 | 5170 |
5171 | 5171 |
| 5172 // Static |
| 5173 RawError* Parser::FormatError(const Script& script, |
| 5174 intptr_t token_index, |
| 5175 const char* message_header, |
| 5176 const char* format, |
| 5177 va_list args) { |
| 5178 const intptr_t kMessageBufferSize = 512; |
| 5179 char message_buffer[kMessageBufferSize]; |
| 5180 FormatMessage(script, token_index, message_header, |
| 5181 message_buffer, kMessageBufferSize, |
| 5182 format, args); |
| 5183 const String& msg = String::Handle(String::New(message_buffer)); |
| 5184 return LanguageError::New(msg); |
| 5185 } |
| 5186 |
| 5187 |
5172 // Static. | 5188 // Static. |
5173 void Parser::FormatMessage(const Script& script, | 5189 void Parser::FormatMessage(const Script& script, |
5174 intptr_t token_index, | 5190 intptr_t token_index, |
5175 const char* message_header, | 5191 const char* message_header, |
5176 char* message_buffer, | 5192 char* message_buffer, |
5177 intptr_t message_buffer_size, | 5193 intptr_t message_buffer_size, |
5178 const char* format, va_list args) { | 5194 const char* format, va_list args) { |
5179 intptr_t msg_len = 0; | 5195 intptr_t msg_len = 0; |
5180 if (!script.IsNull()) { | 5196 if (!script.IsNull()) { |
5181 const String& script_url = String::CheckedHandle(script.url()); | 5197 const String& script_url = String::CheckedHandle(script.url()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5227 // Append the formatted error or warning message. | 5243 // Append the formatted error or warning message. |
5228 msg_len += OS::VSNPrint(message_buffer + msg_len, | 5244 msg_len += OS::VSNPrint(message_buffer + msg_len, |
5229 message_buffer_size - msg_len, | 5245 message_buffer_size - msg_len, |
5230 format, | 5246 format, |
5231 args); | 5247 args); |
5232 } | 5248 } |
5233 } | 5249 } |
5234 | 5250 |
5235 | 5251 |
5236 void Parser::ErrorMsg(intptr_t token_index, const char* format, ...) { | 5252 void Parser::ErrorMsg(intptr_t token_index, const char* format, ...) { |
5237 const intptr_t kMessageBufferSize = 512; | |
5238 char message_buffer[kMessageBufferSize]; | |
5239 va_list args; | 5253 va_list args; |
5240 va_start(args, format); | 5254 va_start(args, format); |
5241 FormatMessage(script_, token_index, "Error", | 5255 const Error& error = Error::Handle( |
5242 message_buffer, kMessageBufferSize, | 5256 FormatError(script_, token_index, "Error", format, args)); |
5243 format, args); | |
5244 va_end(args); | 5257 va_end(args); |
5245 Isolate::Current()->long_jump_base()->Jump(1, message_buffer); | 5258 Isolate::Current()->long_jump_base()->Jump(1, error); |
5246 UNREACHABLE(); | 5259 UNREACHABLE(); |
5247 } | 5260 } |
5248 | 5261 |
5249 | 5262 |
5250 void Parser::ErrorMsg(const char* format, ...) { | 5263 void Parser::ErrorMsg(const char* format, ...) { |
5251 const intptr_t kMessageBufferSize = 512; | |
5252 char message_buffer[kMessageBufferSize]; | |
5253 va_list args; | 5264 va_list args; |
5254 va_start(args, format); | 5265 va_start(args, format); |
5255 FormatMessage(script_, token_index_, "Error", | 5266 const Error& error = Error::Handle( |
5256 message_buffer, kMessageBufferSize, | 5267 FormatError(script_, token_index_, "Error", format, args)); |
5257 format, args); | |
5258 va_end(args); | 5268 va_end(args); |
5259 Isolate::Current()->long_jump_base()->Jump(1, message_buffer); | 5269 Isolate::Current()->long_jump_base()->Jump(1, error); |
5260 UNREACHABLE(); | 5270 UNREACHABLE(); |
5261 } | 5271 } |
5262 | 5272 |
5263 | 5273 |
5264 void Parser::Warning(intptr_t token_index, const char* format, ...) { | 5274 void Parser::Warning(intptr_t token_index, const char* format, ...) { |
5265 const intptr_t kMessageBufferSize = 512; | |
5266 char message_buffer[kMessageBufferSize]; | |
5267 if (FLAG_silent_warnings) return; | 5275 if (FLAG_silent_warnings) return; |
5268 va_list args; | 5276 va_list args; |
5269 va_start(args, format); | 5277 va_start(args, format); |
5270 FormatMessage(script_, token_index, "Warning", | 5278 const Error& error = Error::Handle( |
5271 message_buffer, kMessageBufferSize, | 5279 FormatError(script_, token_index, "Warning", format, args)); |
5272 format, args); | |
5273 va_end(args); | 5280 va_end(args); |
5274 if (FLAG_warning_as_error) { | 5281 if (FLAG_warning_as_error) { |
5275 Isolate::Current()->long_jump_base()->Jump(1, message_buffer); | 5282 Isolate::Current()->long_jump_base()->Jump(1, error); |
5276 UNREACHABLE(); | 5283 UNREACHABLE(); |
5277 } else { | 5284 } else { |
5278 OS::Print(message_buffer); | 5285 OS::Print("%s", error.ToErrorCString()); |
5279 } | 5286 } |
5280 } | 5287 } |
5281 | 5288 |
5282 | 5289 |
5283 void Parser::Warning(const char* format, ...) { | 5290 void Parser::Warning(const char* format, ...) { |
5284 const intptr_t kMessageBufferSize = 512; | |
5285 char message_buffer[kMessageBufferSize]; | |
5286 if (FLAG_silent_warnings) return; | 5291 if (FLAG_silent_warnings) return; |
5287 va_list args; | 5292 va_list args; |
5288 va_start(args, format); | 5293 va_start(args, format); |
5289 FormatMessage(script_, token_index_, "Warning", | 5294 const Error& error = Error::Handle( |
5290 message_buffer, kMessageBufferSize, | 5295 FormatError(script_, token_index_, "Warning", format, args)); |
5291 format, args); | |
5292 va_end(args); | 5296 va_end(args); |
5293 if (FLAG_warning_as_error) { | 5297 if (FLAG_warning_as_error) { |
5294 Isolate::Current()->long_jump_base()->Jump(1, message_buffer); | 5298 Isolate::Current()->long_jump_base()->Jump(1, error); |
5295 UNREACHABLE(); | 5299 UNREACHABLE(); |
5296 } else { | 5300 } else { |
5297 OS::Print(message_buffer); | 5301 OS::Print("%s", error.ToErrorCString()); |
5298 } | 5302 } |
5299 } | 5303 } |
5300 | 5304 |
5301 | 5305 |
5302 void Parser::Unimplemented(const char* msg) { | 5306 void Parser::Unimplemented(const char* msg) { |
5303 ErrorMsg(token_index_, msg); | 5307 ErrorMsg(token_index_, msg); |
5304 } | 5308 } |
5305 | 5309 |
5306 | 5310 |
5307 void Parser::ExpectToken(Token::Kind token_expected) { | 5311 void Parser::ExpectToken(Token::Kind token_expected) { |
(...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6674 } else { | 6678 } else { |
6675 // Check if ident is a type parameter in scope. | 6679 // Check if ident is a type parameter in scope. |
6676 type_parameter = scope_class.LookupTypeParameter(*type_name.ident); | 6680 type_parameter = scope_class.LookupTypeParameter(*type_name.ident); |
6677 if (!type_parameter.IsNull()) { | 6681 if (!type_parameter.IsNull()) { |
6678 if (CurrentToken() == Token::kLT) { | 6682 if (CurrentToken() == Token::kLT) { |
6679 // A type parameter cannot be parameterized. | 6683 // A type parameter cannot be parameterized. |
6680 ErrorMsg(type_pos, "type parameter '%s' cannot be parameterized", | 6684 ErrorMsg(type_pos, "type parameter '%s' cannot be parameterized", |
6681 String::Handle(type_parameter.Name()).ToCString()); | 6685 String::Handle(type_parameter.Name()).ToCString()); |
6682 } | 6686 } |
6683 if (type_resolution == kMustResolve) { | 6687 if (type_resolution == kMustResolve) { |
6684 String& errmsg = String::Handle(); | 6688 Error& error = Error::Handle(); |
6685 type_parameter ^= | 6689 type_parameter ^= |
6686 ClassFinalizer::FinalizeAndCanonicalizeType(scope_class, | 6690 ClassFinalizer::FinalizeAndCanonicalizeType(scope_class, |
6687 type_parameter, | 6691 type_parameter, |
6688 &errmsg); | 6692 &error); |
6689 if (!errmsg.IsNull()) { | 6693 if (!error.IsNull()) { |
6690 ErrorMsg(errmsg.ToCString()); | 6694 ErrorMsg(error.ToErrorCString()); |
6691 } | 6695 } |
6692 } | 6696 } |
6693 return type_parameter.raw(); | 6697 return type_parameter.raw(); |
6694 } | 6698 } |
6695 } | 6699 } |
6696 } | 6700 } |
6697 // Try to resolve the type class. | 6701 // Try to resolve the type class. |
6698 type_class = LookupTypeClass(type_name, type_resolution); | 6702 type_class = LookupTypeClass(type_name, type_resolution); |
6699 } | 6703 } |
6700 AbstractTypeArguments& type_arguments = | 6704 AbstractTypeArguments& type_arguments = |
6701 AbstractTypeArguments::Handle(ParseTypeArguments(type_resolution)); | 6705 AbstractTypeArguments::Handle(ParseTypeArguments(type_resolution)); |
6702 Type& type = Type::Handle( | 6706 Type& type = Type::Handle( |
6703 Type::NewParameterizedType(type_class, type_arguments)); | 6707 Type::NewParameterizedType(type_class, type_arguments)); |
6704 if (type_resolution == kMustResolve) { | 6708 if (type_resolution == kMustResolve) { |
6705 ASSERT(type_class.IsClass()); // Must be resolved. | 6709 ASSERT(type_class.IsClass()); // Must be resolved. |
6706 String& errmsg = String::Handle(); | 6710 Error& error = Error::Handle(); |
6707 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(scope_class, | 6711 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(scope_class, |
6708 type, | 6712 type, |
6709 &errmsg); | 6713 &error); |
6710 if (!errmsg.IsNull()) { | 6714 if (!error.IsNull()) { |
6711 ErrorMsg(errmsg.ToCString()); | 6715 ErrorMsg(error.ToErrorCString()); |
6712 } | 6716 } |
6713 } | 6717 } |
6714 return type.raw(); | 6718 return type.raw(); |
6715 } | 6719 } |
6716 | 6720 |
6717 | 6721 |
6718 void Parser::CheckConstructorCallTypeArguments( | 6722 void Parser::CheckConstructorCallTypeArguments( |
6719 intptr_t pos, Function& constructor, | 6723 intptr_t pos, Function& constructor, |
6720 const AbstractTypeArguments& type_arguments) { | 6724 const AbstractTypeArguments& type_arguments) { |
6721 if (!type_arguments.IsNull()) { | 6725 if (!type_arguments.IsNull()) { |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7253 if (constructor.IsFactory() && | 7257 if (constructor.IsFactory() && |
7254 (constructor.signature_class() != Class::null())) { | 7258 (constructor.signature_class() != Class::null())) { |
7255 signature_class = constructor.signature_class(); | 7259 signature_class = constructor.signature_class(); |
7256 } else { | 7260 } else { |
7257 signature_class = constructor.owner(); | 7261 signature_class = constructor.owner(); |
7258 ASSERT(signature_class.raw() == type_class.raw()); | 7262 ASSERT(signature_class.raw() == type_class.raw()); |
7259 } | 7263 } |
7260 // TODO(regis): Temporary type should be allocated in new gen heap. | 7264 // TODO(regis): Temporary type should be allocated in new gen heap. |
7261 Type& type = Type::Handle( | 7265 Type& type = Type::Handle( |
7262 Type::NewParameterizedType(signature_class, type_arguments)); | 7266 Type::NewParameterizedType(signature_class, type_arguments)); |
7263 String& errmsg = String::Handle(); | 7267 Error& error = Error::Handle(); |
7264 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, | 7268 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, |
7265 type, | 7269 type, |
7266 &errmsg); | 7270 &error); |
7267 if (!errmsg.IsNull()) { | 7271 if (!error.IsNull()) { |
7268 ErrorMsg(errmsg.ToCString()); | 7272 ErrorMsg(error.ToErrorCString()); |
7269 } | 7273 } |
7270 // The type argument vector may have been expanded with the type arguments | 7274 // The type argument vector may have been expanded with the type arguments |
7271 // of the super type when finalizing the type. | 7275 // of the super type when finalizing the type. |
7272 type_arguments = type.arguments(); | 7276 type_arguments = type.arguments(); |
7273 } | 7277 } |
7274 | 7278 |
7275 type_arguments ^= type_arguments.Canonicalize(); | 7279 type_arguments ^= type_arguments.Canonicalize(); |
7276 // Make the constructor call. | 7280 // Make the constructor call. |
7277 AstNode* new_object = NULL; | 7281 AstNode* new_object = NULL; |
7278 if (is_const) { | 7282 if (is_const) { |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7739 } | 7743 } |
7740 | 7744 |
7741 | 7745 |
7742 void Parser::SkipNestedExpr() { | 7746 void Parser::SkipNestedExpr() { |
7743 const bool saved_mode = SetAllowFunctionLiterals(true); | 7747 const bool saved_mode = SetAllowFunctionLiterals(true); |
7744 SkipExpr(); | 7748 SkipExpr(); |
7745 SetAllowFunctionLiterals(saved_mode); | 7749 SetAllowFunctionLiterals(saved_mode); |
7746 } | 7750 } |
7747 | 7751 |
7748 } // namespace dart | 7752 } // namespace dart |
OLD | NEW |