| 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 "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
| 8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
| 9 #include "vm/bootstrap.h" | 9 #include "vm/bootstrap.h" |
| 10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
| (...skipping 5210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5221 // with the formal parameter types and names. | 5221 // with the formal parameter types and names. |
| 5222 void Parser::AddFormalParamsToFunction(const ParamList* params, | 5222 void Parser::AddFormalParamsToFunction(const ParamList* params, |
| 5223 const Function& func) { | 5223 const Function& func) { |
| 5224 ASSERT((params != NULL) && (params->parameters != NULL)); | 5224 ASSERT((params != NULL) && (params->parameters != NULL)); |
| 5225 ASSERT((params->num_optional_parameters > 0) == | 5225 ASSERT((params->num_optional_parameters > 0) == |
| 5226 (params->has_optional_positional_parameters || | 5226 (params->has_optional_positional_parameters || |
| 5227 params->has_optional_named_parameters)); | 5227 params->has_optional_named_parameters)); |
| 5228 if (!Utils::IsInt(16, params->num_fixed_parameters) || | 5228 if (!Utils::IsInt(16, params->num_fixed_parameters) || |
| 5229 !Utils::IsInt(16, params->num_optional_parameters)) { | 5229 !Utils::IsInt(16, params->num_optional_parameters)) { |
| 5230 const Script& script = Script::Handle(Class::Handle(func.Owner()).script()); | 5230 const Script& script = Script::Handle(Class::Handle(func.Owner()).script()); |
| 5231 const Error& error = Error::Handle(FormatErrorMsg( | 5231 const Error& error = Error::Handle(LanguageError::NewFormatted( |
| 5232 script, func.token_pos(), "Error", "too many formal parameters")); | 5232 Error::Handle(), script, func.token_pos(), |
| 5233 LanguageError::kError, Heap::kNew, |
| 5234 "too many formal parameters")); |
| 5233 ErrorMsg(error); | 5235 ErrorMsg(error); |
| 5234 } | 5236 } |
| 5235 func.set_num_fixed_parameters(params->num_fixed_parameters); | 5237 func.set_num_fixed_parameters(params->num_fixed_parameters); |
| 5236 func.SetNumOptionalParameters(params->num_optional_parameters, | 5238 func.SetNumOptionalParameters(params->num_optional_parameters, |
| 5237 params->has_optional_positional_parameters); | 5239 params->has_optional_positional_parameters); |
| 5238 const int num_parameters = params->parameters->length(); | 5240 const int num_parameters = params->parameters->length(); |
| 5239 ASSERT(num_parameters == func.NumParameters()); | 5241 ASSERT(num_parameters == func.NumParameters()); |
| 5240 func.set_parameter_types(Array::Handle(Array::New(num_parameters, | 5242 func.set_parameter_types(Array::Handle(Array::New(num_parameters, |
| 5241 Heap::kOld))); | 5243 Heap::kOld))); |
| 5242 func.set_parameter_names(Array::Handle(Array::New(num_parameters, | 5244 func.set_parameter_names(Array::Handle(Array::New(num_parameters, |
| (...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7226 new LoadLocalNode(statement_pos, excp_var), | 7228 new LoadLocalNode(statement_pos, excp_var), |
| 7227 new LoadLocalNode(statement_pos, trace_var)); | 7229 new LoadLocalNode(statement_pos, trace_var)); |
| 7228 } else { | 7230 } else { |
| 7229 statement = ParseExpr(kAllowConst, kConsumeCascades); | 7231 statement = ParseExpr(kAllowConst, kConsumeCascades); |
| 7230 ExpectSemicolon(); | 7232 ExpectSemicolon(); |
| 7231 } | 7233 } |
| 7232 return statement; | 7234 return statement; |
| 7233 } | 7235 } |
| 7234 | 7236 |
| 7235 | 7237 |
| 7236 RawError* Parser::FormatErrorWithAppend(const Error& prev_error, | |
| 7237 const Script& script, | |
| 7238 intptr_t token_pos, | |
| 7239 const char* message_header, | |
| 7240 const char* format, | |
| 7241 va_list args) { | |
| 7242 const String& msg1 = String::Handle(String::New(prev_error.ToErrorCString())); | |
| 7243 const String& msg2 = String::Handle( | |
| 7244 FormatMessage(script, token_pos, message_header, format, args)); | |
| 7245 return LanguageError::New(String::Handle(String::Concat(msg1, msg2))); | |
| 7246 } | |
| 7247 | |
| 7248 | |
| 7249 RawError* Parser::FormatError(const Script& script, | |
| 7250 intptr_t token_pos, | |
| 7251 const char* message_header, | |
| 7252 const char* format, | |
| 7253 va_list args) { | |
| 7254 const String& msg = String::Handle( | |
| 7255 FormatMessage(script, token_pos, message_header, format, args)); | |
| 7256 return LanguageError::New(msg); | |
| 7257 } | |
| 7258 | |
| 7259 | |
| 7260 RawError* Parser::FormatErrorMsg(const Script& script, | |
| 7261 intptr_t token_pos, | |
| 7262 const char* message_header, | |
| 7263 const char* format, ...) { | |
| 7264 va_list args; | |
| 7265 va_start(args, format); | |
| 7266 const Error& error = Error::Handle( | |
| 7267 FormatError(script, token_pos, message_header, format, args)); | |
| 7268 va_end(args); | |
| 7269 return error.raw(); | |
| 7270 } | |
| 7271 | |
| 7272 | |
| 7273 RawString* Parser::FormatMessage(const Script& script, | |
| 7274 intptr_t token_pos, | |
| 7275 const char* message_header, | |
| 7276 const char* format, va_list args) { | |
| 7277 String& result = String::Handle(); | |
| 7278 const String& msg = String::Handle(String::NewFormattedV(format, args)); | |
| 7279 if (!script.IsNull()) { | |
| 7280 const String& script_url = String::Handle(script.url()); | |
| 7281 if (token_pos >= 0) { | |
| 7282 intptr_t line, column; | |
| 7283 script.GetTokenLocation(token_pos, &line, &column); | |
| 7284 // Only report the line position if we have the original source. We still | |
| 7285 // need to get a valid column so that we can report the ^ mark below the | |
| 7286 // snippet. | |
| 7287 if (script.HasSource()) { | |
| 7288 result = String::NewFormatted("'%s': %s: line %" Pd " pos %" Pd ": ", | |
| 7289 script_url.ToCString(), | |
| 7290 message_header, | |
| 7291 line, | |
| 7292 column); | |
| 7293 } else { | |
| 7294 result = String::NewFormatted("'%s': %s: line %" Pd ": ", | |
| 7295 script_url.ToCString(), | |
| 7296 message_header, | |
| 7297 line); | |
| 7298 } | |
| 7299 // Append the formatted error or warning message. | |
| 7300 result = String::Concat(result, msg); | |
| 7301 const String& new_line = String::Handle(String::New("\n")); | |
| 7302 // Append the source line. | |
| 7303 const String& script_line = String::Handle(script.GetLine(line)); | |
| 7304 ASSERT(!script_line.IsNull()); | |
| 7305 result = String::Concat(result, new_line); | |
| 7306 result = String::Concat(result, script_line); | |
| 7307 result = String::Concat(result, new_line); | |
| 7308 // Append the column marker. | |
| 7309 const String& column_line = String::Handle( | |
| 7310 String::NewFormatted("%*s\n", static_cast<int>(column), "^")); | |
| 7311 result = String::Concat(result, column_line); | |
| 7312 } else { | |
| 7313 // Token position is unknown. | |
| 7314 result = String::NewFormatted("'%s': %s: ", | |
| 7315 script_url.ToCString(), | |
| 7316 message_header); | |
| 7317 result = String::Concat(result, msg); | |
| 7318 } | |
| 7319 } else { | |
| 7320 // Script is unknown. | |
| 7321 // Append the formatted error or warning message. | |
| 7322 result = msg.raw(); | |
| 7323 } | |
| 7324 return result.raw(); | |
| 7325 } | |
| 7326 | |
| 7327 | |
| 7328 void Parser::PrintMessage(const Script& script, | |
| 7329 intptr_t token_pos, | |
| 7330 const char* message_header, | |
| 7331 const char* format, ...) { | |
| 7332 va_list args; | |
| 7333 va_start(args, format); | |
| 7334 const String& buf = String::Handle( | |
| 7335 FormatMessage(script, token_pos, message_header, format, args)); | |
| 7336 va_end(args); | |
| 7337 OS::Print("%s", buf.ToCString()); | |
| 7338 } | |
| 7339 | |
| 7340 | |
| 7341 void Parser::ErrorMsg(intptr_t token_pos, const char* format, ...) const { | 7238 void Parser::ErrorMsg(intptr_t token_pos, const char* format, ...) const { |
| 7342 va_list args; | 7239 va_list args; |
| 7343 va_start(args, format); | 7240 va_start(args, format); |
| 7344 const Error& error = Error::Handle( | 7241 const Error& error = Error::Handle(LanguageError::NewFormattedV( |
| 7345 FormatError(script_, token_pos, "Error", format, args)); | 7242 Error::Handle(), script_, token_pos, |
| 7243 LanguageError::kError, Heap::kNew, format, args)); |
| 7346 va_end(args); | 7244 va_end(args); |
| 7347 isolate()->long_jump_base()->Jump(1, error); | 7245 isolate()->long_jump_base()->Jump(1, error); |
| 7348 UNREACHABLE(); | 7246 UNREACHABLE(); |
| 7349 } | 7247 } |
| 7350 | 7248 |
| 7351 | 7249 |
| 7352 void Parser::ErrorMsg(const char* format, ...) { | 7250 void Parser::ErrorMsg(const char* format, ...) { |
| 7353 va_list args; | 7251 va_list args; |
| 7354 va_start(args, format); | 7252 va_start(args, format); |
| 7355 const Error& error = Error::Handle( | 7253 const Error& error = Error::Handle(LanguageError::NewFormattedV( |
| 7356 FormatError(script_, TokenPos(), "Error", format, args)); | 7254 Error::Handle(), script_, TokenPos(), |
| 7255 LanguageError::kError, Heap::kNew, format, args)); |
| 7357 va_end(args); | 7256 va_end(args); |
| 7358 isolate()->long_jump_base()->Jump(1, error); | 7257 isolate()->long_jump_base()->Jump(1, error); |
| 7359 UNREACHABLE(); | 7258 UNREACHABLE(); |
| 7360 } | 7259 } |
| 7361 | 7260 |
| 7362 | 7261 |
| 7363 void Parser::ErrorMsg(const Error& error) { | 7262 void Parser::ErrorMsg(const Error& error) { |
| 7364 Isolate::Current()->long_jump_base()->Jump(1, error); | 7263 Isolate::Current()->long_jump_base()->Jump(1, error); |
| 7365 UNREACHABLE(); | 7264 UNREACHABLE(); |
| 7366 } | 7265 } |
| 7367 | 7266 |
| 7368 | 7267 |
| 7369 void Parser::AppendErrorMsg( | 7268 void Parser::AppendErrorMsg( |
| 7370 const Error& prev_error, intptr_t token_pos, const char* format, ...) { | 7269 const Error& prev_error, intptr_t token_pos, const char* format, ...) { |
| 7371 va_list args; | 7270 va_list args; |
| 7372 va_start(args, format); | 7271 va_start(args, format); |
| 7373 const Error& error = Error::Handle(FormatErrorWithAppend( | 7272 const Error& error = Error::Handle( |
| 7374 prev_error, script_, token_pos, "Error", format, args)); | 7273 LanguageError::NewFormattedV( |
| 7274 prev_error, script_, token_pos, |
| 7275 LanguageError::kError, Heap::kNew, |
| 7276 format, args)); |
| 7375 va_end(args); | 7277 va_end(args); |
| 7376 isolate()->long_jump_base()->Jump(1, error); | 7278 isolate()->long_jump_base()->Jump(1, error); |
| 7377 UNREACHABLE(); | 7279 UNREACHABLE(); |
| 7378 } | 7280 } |
| 7379 | 7281 |
| 7380 | 7282 |
| 7381 void Parser::Warning(intptr_t token_pos, const char* format, ...) { | 7283 void Parser::Warning(intptr_t token_pos, const char* format, ...) { |
| 7382 if (FLAG_silent_warnings) return; | 7284 if (FLAG_silent_warnings) return; |
| 7383 va_list args; | 7285 va_list args; |
| 7384 va_start(args, format); | 7286 va_start(args, format); |
| 7385 const Error& error = Error::Handle( | 7287 const Error& error = Error::Handle( |
| 7386 FormatError(script_, token_pos, "Warning", format, args)); | 7288 LanguageError::NewFormattedV( |
| 7289 Error::Handle(), script_, token_pos, |
| 7290 LanguageError::kWarning, Heap::kNew, |
| 7291 format, args)); |
| 7387 va_end(args); | 7292 va_end(args); |
| 7388 if (FLAG_warning_as_error) { | 7293 if (FLAG_warning_as_error) { |
| 7389 isolate()->long_jump_base()->Jump(1, error); | 7294 isolate()->long_jump_base()->Jump(1, error); |
| 7390 UNREACHABLE(); | 7295 UNREACHABLE(); |
| 7391 } else { | 7296 } else { |
| 7392 OS::Print("%s", error.ToErrorCString()); | 7297 OS::Print("%s", error.ToErrorCString()); |
| 7393 } | 7298 } |
| 7394 } | 7299 } |
| 7395 | 7300 |
| 7396 | 7301 |
| 7397 void Parser::Warning(const char* format, ...) { | 7302 void Parser::Warning(const char* format, ...) { |
| 7398 if (FLAG_silent_warnings) return; | 7303 if (FLAG_silent_warnings) return; |
| 7399 va_list args; | 7304 va_list args; |
| 7400 va_start(args, format); | 7305 va_start(args, format); |
| 7401 const Error& error = Error::Handle( | 7306 const Error& error = Error::Handle( |
| 7402 FormatError(script_, TokenPos(), "Warning", format, args)); | 7307 LanguageError::NewFormattedV( |
| 7308 Error::Handle(), script_, TokenPos(), |
| 7309 LanguageError::kWarning, Heap::kNew, |
| 7310 format, args)); |
| 7403 va_end(args); | 7311 va_end(args); |
| 7404 if (FLAG_warning_as_error) { | 7312 if (FLAG_warning_as_error) { |
| 7405 isolate()->long_jump_base()->Jump(1, error); | 7313 isolate()->long_jump_base()->Jump(1, error); |
| 7406 UNREACHABLE(); | 7314 UNREACHABLE(); |
| 7407 } else { | 7315 } else { |
| 7408 OS::Print("%s", error.ToErrorCString()); | 7316 OS::Print("%s", error.ToErrorCString()); |
| 7409 } | 7317 } |
| 7410 } | 7318 } |
| 7411 | 7319 |
| 7412 | 7320 |
| (...skipping 3378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10791 void Parser::SkipQualIdent() { | 10699 void Parser::SkipQualIdent() { |
| 10792 ASSERT(IsIdentifier()); | 10700 ASSERT(IsIdentifier()); |
| 10793 ConsumeToken(); | 10701 ConsumeToken(); |
| 10794 if (CurrentToken() == Token::kPERIOD) { | 10702 if (CurrentToken() == Token::kPERIOD) { |
| 10795 ConsumeToken(); // Consume the kPERIOD token. | 10703 ConsumeToken(); // Consume the kPERIOD token. |
| 10796 ExpectIdentifier("identifier expected after '.'"); | 10704 ExpectIdentifier("identifier expected after '.'"); |
| 10797 } | 10705 } |
| 10798 } | 10706 } |
| 10799 | 10707 |
| 10800 } // namespace dart | 10708 } // namespace dart |
| OLD | NEW |