Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index 3730a4577cf6f1e70440637b575f8547d96892a0..bf25e7311eda35a0692579c86b754ab804b3ac2c 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -788,6 +788,20 @@ void Parser::ReportMessageAt(Scanner::Location source_location, |
| } |
| +void Parser::ReportMessageAt(Scanner::Location source_location, |
| + const char* type, |
| + Vector<Handle<String> > args) { |
| + MessageLocation location(script_, |
| + source_location.beg_pos, source_location.end_pos); |
|
Mads Ager (chromium)
2011/01/17 09:29:13
I find one argument per line more readable.
Lasse Reichstein
2011/01/17 09:34:08
Fixed here and above.
|
| + Handle<JSArray> array = Factory::NewJSArray(args.length()); |
| + for (int i = 0; i < args.length(); i++) { |
| + SetElement(array, i, args[i]); |
| + } |
| + Handle<Object> result = Factory::NewSyntaxError(type, array); |
| + Top::Throw(*result, &location); |
| +} |
| + |
| + |
| // Base class containing common code for the different finder classes used by |
| // the parser. |
| class ParserFinder { |
| @@ -1693,12 +1707,16 @@ Statement* Parser::ParseContinueStatement(bool* ok) { |
| IterationStatement* target = NULL; |
| target = LookupContinueTarget(label, CHECK_OK); |
| if (target == NULL) { |
| - // Illegal continue statement. To be consistent with KJS we delay |
| - // reporting of the syntax error until runtime. |
| - Handle<String> error_type = Factory::illegal_continue_symbol(); |
| - if (!label.is_null()) error_type = Factory::unknown_label_symbol(); |
| - Expression* throw_error = NewThrowSyntaxError(error_type, label); |
| - return new ExpressionStatement(throw_error); |
| + // Illegal continue statement. |
| + const char* message = "illegal_continue"; |
| + Vector<Handle<String> > args; |
| + if (!label.is_null()) { |
| + message = "unknown_label"; |
| + args = Vector<Handle<String> >(&label, 1); |
| + } |
| + ReportMessageAt(scanner().location(), message, args); |
| + *ok = false; |
| + return NULL; |
| } |
| ExpectSemicolon(CHECK_OK); |
| return new ContinueStatement(target); |
| @@ -1724,12 +1742,16 @@ Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) { |
| BreakableStatement* target = NULL; |
| target = LookupBreakTarget(label, CHECK_OK); |
| if (target == NULL) { |
| - // Illegal break statement. To be consistent with KJS we delay |
| - // reporting of the syntax error until runtime. |
| - Handle<String> error_type = Factory::illegal_break_symbol(); |
| - if (!label.is_null()) error_type = Factory::unknown_label_symbol(); |
| - Expression* throw_error = NewThrowSyntaxError(error_type, label); |
| - return new ExpressionStatement(throw_error); |
| + // Illegal break statement. |
| + const char* message = "illegal_break"; |
| + Vector<Handle<String> > args; |
| + if (!label.is_null()) { |
| + message = "unknown_label"; |
| + args = Vector<Handle<String> >(&label, 1); |
| + } |
| + ReportMessageAt(scanner().location(), message, args); |
| + *ok = false; |
| + return NULL; |
| } |
| ExpectSemicolon(CHECK_OK); |
| return new BreakStatement(target); |