| Index: src/preparser.h
|
| diff --git a/src/preparser.h b/src/preparser.h
|
| index d1426e54fe7b7fc3b405ce4367deb342dc6cd9b4..59a9a6108aca239f12537e032eaa14cf4b5a3a74 100644
|
| --- a/src/preparser.h
|
| +++ b/src/preparser.h
|
| @@ -342,6 +342,7 @@ class ParserBase : public Traits {
|
| typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok);
|
| typename Traits::Type::Expression ParseArrayLiteral(bool* ok);
|
| typename Traits::Type::Expression ParseObjectLiteral(bool* ok);
|
| + typename Traits::Type::ExpressionList ParseArguments(bool* ok);
|
|
|
| // Used to detect duplicates in object literals. Each of the values
|
| // kGetterProperty, kSetterProperty and kValueProperty represents
|
| @@ -556,8 +557,12 @@ class PreParserExpression {
|
| class PreParserExpressionList {
|
| public:
|
| // These functions make list->Add(some_expression) work (and do nothing).
|
| + PreParserExpressionList() : length_(0) {}
|
| PreParserExpressionList* operator->() { return this; }
|
| - void Add(PreParserExpression, void*) { }
|
| + void Add(PreParserExpression, void*) { ++length_; }
|
| + int length() const { return length_; }
|
| + private:
|
| + int length_;
|
| };
|
|
|
|
|
| @@ -720,6 +725,9 @@ class PreParserTraits {
|
| static PreParserExpression EmptyLiteral() {
|
| return PreParserExpression::Default();
|
| }
|
| + static PreParserExpressionList NullExpressionList() {
|
| + return PreParserExpressionList();
|
| + }
|
|
|
| // Odd-ball literal creators.
|
| static PreParserExpression GetLiteralTheHole(int position,
|
| @@ -910,8 +918,6 @@ class PreParser : public ParserBase<PreParserTraits> {
|
| kUnknownSourceElements
|
| };
|
|
|
| - typedef int Arguments;
|
| -
|
| // All ParseXXX functions take as the last argument an *ok parameter
|
| // which is set to false if parsing failed; it is unchanged otherwise.
|
| // By making the 'exception handling' explicit, we are forced to check
|
| @@ -955,7 +961,6 @@ class PreParser : public ParserBase<PreParserTraits> {
|
| Expression ParseObjectLiteral(bool* ok);
|
| Expression ParseV8Intrinsic(bool* ok);
|
|
|
| - Arguments ParseArguments(bool* ok);
|
| Expression ParseFunctionLiteral(
|
| Identifier name,
|
| Scanner::Location function_name_location,
|
| @@ -1153,6 +1158,13 @@ ParserBase<Traits>::ParseRegExpLiteral(bool seen_equal, bool* ok) {
|
| #define DUMMY ) // to make indentation work
|
| #undef DUMMY
|
|
|
| +// Used in functions where the return type is not Traits::Type::Expression.
|
| +#define CHECK_OK_CUSTOM(x) ok); \
|
| + if (!*ok) return this->x(); \
|
| + ((void)0
|
| +#define DUMMY ) // to make indentation work
|
| +#undef DUMMY
|
| +
|
| template <class Traits>
|
| typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression(
|
| bool* ok) {
|
| @@ -1370,7 +1382,10 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| number_of_boilerplate_properties++;
|
| }
|
| properties->Add(property, zone());
|
| - if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
|
| + if (peek() != Token::RBRACE) {
|
| + // Need {} because of the CHECK_OK macro.
|
| + Expect(Token::COMMA, CHECK_OK);
|
| + }
|
|
|
| if (fni_ != NULL) {
|
| fni_->Infer();
|
| @@ -1437,7 +1452,10 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| properties->Add(property, zone());
|
|
|
| // TODO(1240767): Consider allowing trailing comma.
|
| - if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
|
| + if (peek() != Token::RBRACE) {
|
| + // Need {} because of the CHECK_OK macro.
|
| + Expect(Token::COMMA, CHECK_OK);
|
| + }
|
|
|
| if (fni_ != NULL) {
|
| fni_->Infer();
|
| @@ -1457,8 +1475,39 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| }
|
|
|
|
|
| +template <class Traits>
|
| +typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments(
|
| + bool* ok) {
|
| + // Arguments ::
|
| + // '(' (AssignmentExpression)*[','] ')'
|
| +
|
| + typename Traits::Type::ExpressionList result =
|
| + this->NewExpressionList(4, zone_);
|
| + Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList));
|
| + bool done = (peek() == Token::RPAREN);
|
| + while (!done) {
|
| + typename Traits::Type::Expression argument =
|
| + this->ParseAssignmentExpression(true,
|
| + CHECK_OK_CUSTOM(NullExpressionList));
|
| + result->Add(argument, zone_);
|
| + if (result->length() > Code::kMaxArguments) {
|
| + ReportMessageAt(scanner()->location(), "too_many_arguments");
|
| + *ok = false;
|
| + return this->NullExpressionList();
|
| + }
|
| + done = (peek() == Token::RPAREN);
|
| + if (!done) {
|
| + // Need {} because of the CHECK_OK_CUSTOM macro.
|
| + Expect(Token::COMMA, CHECK_OK_CUSTOM(NullExpressionList));
|
| + }
|
| + }
|
| + Expect(Token::RPAREN, CHECK_OK_CUSTOM(NullExpressionList));
|
| + return result;
|
| +}
|
| +
|
|
|
| #undef CHECK_OK
|
| +#undef CHECK_OK_CUSTOM
|
|
|
|
|
| template <typename Traits>
|
|
|