| Index: src/preparser.h
|
| diff --git a/src/preparser.h b/src/preparser.h
|
| index 562d20979dd53b7831412240cb8c16c8fca545e9..57ec6ff65b588d8f35ec85db9acc9932d656ca10 100644
|
| --- a/src/preparser.h
|
| +++ b/src/preparser.h
|
| @@ -81,6 +81,10 @@ namespace internal {
|
| template <typename Traits>
|
| class ParserBase : public Traits {
|
| public:
|
| + // Shorten type names defined by Traits.
|
| + typedef typename Traits::Type::Expression ExpressionT;
|
| + typedef typename Traits::Type::Identifier IdentifierT;
|
| +
|
| ParserBase(Scanner* scanner, uintptr_t stack_limit,
|
| v8::Extension* extension,
|
| typename Traits::Type::Zone* zone,
|
| @@ -363,36 +367,31 @@ class ParserBase : public Traits {
|
| // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or
|
| // "arguments" as identifier even in strict mode (this is needed in cases like
|
| // "var foo = eval;").
|
| - typename Traits::Type::Identifier ParseIdentifier(
|
| + IdentifierT ParseIdentifier(
|
| AllowEvalOrArgumentsAsIdentifier,
|
| bool* ok);
|
| // Parses an identifier or a strict mode future reserved word, and indicate
|
| // whether it is strict mode future reserved.
|
| - typename Traits::Type::Identifier ParseIdentifierOrStrictReservedWord(
|
| + IdentifierT ParseIdentifierOrStrictReservedWord(
|
| bool* is_strict_reserved,
|
| bool* ok);
|
| - typename Traits::Type::Identifier ParseIdentifierName(bool* ok);
|
| + IdentifierT ParseIdentifierName(bool* ok);
|
| // Parses an identifier and determines whether or not it is 'get' or 'set'.
|
| - typename Traits::Type::Identifier ParseIdentifierNameOrGetOrSet(bool* is_get,
|
| - bool* is_set,
|
| - bool* ok);
|
| + IdentifierT ParseIdentifierNameOrGetOrSet(bool* is_get,
|
| + bool* is_set,
|
| + bool* ok);
|
|
|
| - typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal,
|
| - bool* ok);
|
| + ExpressionT ParseRegExpLiteral(bool seen_equal, bool* ok);
|
|
|
| - typename Traits::Type::Expression ParsePrimaryExpression(bool* ok);
|
| - typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok);
|
| - typename Traits::Type::Expression ParseArrayLiteral(bool* ok);
|
| - typename Traits::Type::Expression ParseObjectLiteral(bool* ok);
|
| + ExpressionT ParsePrimaryExpression(bool* ok);
|
| + ExpressionT ParseExpression(bool accept_IN, bool* ok);
|
| + ExpressionT ParseArrayLiteral(bool* ok);
|
| + ExpressionT ParseObjectLiteral(bool* ok);
|
| typename Traits::Type::ExpressionList ParseArguments(bool* ok);
|
| - typename Traits::Type::Expression ParseAssignmentExpression(bool accept_IN,
|
| - bool* ok);
|
| - typename Traits::Type::Expression ParseYieldExpression(bool* ok);
|
| - typename Traits::Type::Expression ParseConditionalExpression(bool accept_IN,
|
| - bool* ok);
|
| - typename Traits::Type::Expression ParseBinaryExpression(int prec,
|
| - bool accept_IN,
|
| - bool* ok);
|
| + ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok);
|
| + ExpressionT ParseYieldExpression(bool* ok);
|
| + ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok);
|
| + ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
|
|
|
| // Used to detect duplicates in object literals. Each of the values
|
| // kGetterProperty, kSetterProperty and kValueProperty represents
|
| @@ -1179,12 +1178,12 @@ void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) {
|
|
|
|
|
| template<class Traits>
|
| -typename Traits::Type::Identifier ParserBase<Traits>::ParseIdentifier(
|
| +typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier(
|
| AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments,
|
| bool* ok) {
|
| Token::Value next = Next();
|
| if (next == Token::IDENTIFIER) {
|
| - typename Traits::Type::Identifier name = this->GetSymbol(scanner());
|
| + IdentifierT name = this->GetSymbol(scanner());
|
| if (allow_eval_or_arguments == kDontAllowEvalOrArguments &&
|
| strict_mode() == STRICT && this->IsEvalOrArguments(name)) {
|
| ReportMessageAt(scanner()->location(), "strict_eval_arguments");
|
| @@ -1204,7 +1203,7 @@ typename Traits::Type::Identifier ParserBase<Traits>::ParseIdentifier(
|
|
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Identifier ParserBase<
|
| +typename ParserBase<Traits>::IdentifierT ParserBase<
|
| Traits>::ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved,
|
| bool* ok) {
|
| Token::Value next = Next();
|
| @@ -1223,8 +1222,8 @@ typename Traits::Type::Identifier ParserBase<
|
|
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Identifier ParserBase<Traits>::ParseIdentifierName(
|
| - bool* ok) {
|
| +typename ParserBase<Traits>::IdentifierT
|
| +ParserBase<Traits>::ParseIdentifierName(bool* ok) {
|
| Token::Value next = Next();
|
| if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD &&
|
| next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) {
|
| @@ -1237,11 +1236,11 @@ typename Traits::Type::Identifier ParserBase<Traits>::ParseIdentifierName(
|
|
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Identifier
|
| +typename ParserBase<Traits>::IdentifierT
|
| ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get,
|
| bool* is_set,
|
| bool* ok) {
|
| - typename Traits::Type::Identifier result = ParseIdentifierName(ok);
|
| + IdentifierT result = ParseIdentifierName(ok);
|
| if (!*ok) return Traits::EmptyIdentifier();
|
| scanner()->IsGetOrSet(is_get, is_set);
|
| return result;
|
| @@ -1249,8 +1248,8 @@ ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get,
|
|
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Expression
|
| -ParserBase<Traits>::ParseRegExpLiteral(bool seen_equal, bool* ok) {
|
| +typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral(
|
| + bool seen_equal, bool* ok) {
|
| int pos = peek_position();
|
| if (!scanner()->ScanRegExpPattern(seen_equal)) {
|
| Next();
|
| @@ -1261,16 +1260,14 @@ ParserBase<Traits>::ParseRegExpLiteral(bool seen_equal, bool* ok) {
|
|
|
| int literal_index = function_state_->NextMaterializedLiteralIndex();
|
|
|
| - typename Traits::Type::Identifier js_pattern =
|
| - this->NextLiteralString(scanner(), TENURED);
|
| + IdentifierT js_pattern = this->NextLiteralString(scanner(), TENURED);
|
| if (!scanner()->ScanRegExpFlags()) {
|
| Next();
|
| ReportMessageAt(scanner()->location(), "invalid_regexp_flags");
|
| *ok = false;
|
| return Traits::EmptyExpression();
|
| }
|
| - typename Traits::Type::Identifier js_flags =
|
| - this->NextLiteralString(scanner(), TENURED);
|
| + IdentifierT js_flags = this->NextLiteralString(scanner(), TENURED);
|
| Next();
|
| return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos);
|
| }
|
| @@ -1282,7 +1279,7 @@ 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.
|
| +// Used in functions where the return type is not ExpressionT.
|
| #define CHECK_OK_CUSTOM(x) ok); \
|
| if (!*ok) return this->x(); \
|
| ((void)0
|
| @@ -1290,8 +1287,8 @@ ParserBase<Traits>::ParseRegExpLiteral(bool seen_equal, bool* ok) {
|
| #undef DUMMY
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression(
|
| - bool* ok) {
|
| +typename ParserBase<Traits>::ExpressionT
|
| +ParserBase<Traits>::ParsePrimaryExpression(bool* ok) {
|
| // PrimaryExpression ::
|
| // 'this'
|
| // 'null'
|
| @@ -1306,7 +1303,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression(
|
| // '(' Expression ')'
|
|
|
| int pos = peek_position();
|
| - typename Traits::Type::Expression result = this->EmptyExpression();
|
| + ExpressionT result = this->EmptyExpression();
|
| Token::Value token = peek();
|
| switch (token) {
|
| case Token::THIS: {
|
| @@ -1327,10 +1324,8 @@ typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression(
|
| case Token::YIELD:
|
| case Token::FUTURE_STRICT_RESERVED_WORD: {
|
| // Using eval or arguments in this context is OK even in strict mode.
|
| - typename Traits::Type::Identifier name =
|
| - ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
|
| - result =
|
| - this->ExpressionFromIdentifier(name, pos, scope_, factory());
|
| + IdentifierT name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
|
| + result = this->ExpressionFromIdentifier(name, pos, scope_, factory());
|
| break;
|
| }
|
|
|
| @@ -1385,19 +1380,17 @@ typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression(
|
|
|
| // Precedence = 1
|
| template <class Traits>
|
| -typename Traits::Type::Expression ParserBase<Traits>::ParseExpression(
|
| +typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| bool accept_IN, bool* ok) {
|
| // Expression ::
|
| // AssignmentExpression
|
| // Expression ',' AssignmentExpression
|
|
|
| - typename Traits::Type::Expression result =
|
| - this->ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| + ExpressionT result = this->ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| while (peek() == Token::COMMA) {
|
| Expect(Token::COMMA, CHECK_OK);
|
| int pos = position();
|
| - typename Traits::Type::Expression right =
|
| - this->ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| + ExpressionT right = this->ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos);
|
| }
|
| return result;
|
| @@ -1405,7 +1398,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseExpression(
|
|
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Expression ParserBase<Traits>::ParseArrayLiteral(
|
| +typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
|
| bool* ok) {
|
| // ArrayLiteral ::
|
| // '[' Expression? (',' Expression?)* ']'
|
| @@ -1415,7 +1408,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseArrayLiteral(
|
| this->NewExpressionList(4, zone_);
|
| Expect(Token::LBRACK, CHECK_OK);
|
| while (peek() != Token::RBRACK) {
|
| - typename Traits::Type::Expression elem = this->EmptyExpression();
|
| + ExpressionT elem = this->EmptyExpression();
|
| if (peek() == Token::COMMA) {
|
| elem = this->GetLiteralTheHole(peek_position(), factory());
|
| } else {
|
| @@ -1436,7 +1429,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseArrayLiteral(
|
|
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| +typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral(
|
| bool* ok) {
|
| // ObjectLiteral ::
|
| // '{' ((
|
| @@ -1468,7 +1461,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| case Token::IDENTIFIER: {
|
| bool is_getter = false;
|
| bool is_setter = false;
|
| - typename Traits::Type::Identifier id =
|
| + IdentifierT id =
|
| ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK);
|
| if (fni_ != NULL) this->PushLiteralName(fni_, id);
|
|
|
| @@ -1490,7 +1483,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| // Validate the property.
|
| PropertyKind type = is_getter ? kGetterProperty : kSetterProperty;
|
| checker.CheckProperty(next, type, CHECK_OK);
|
| - typename Traits::Type::Identifier name = this->GetSymbol(scanner_);
|
| + IdentifierT name = this->GetSymbol(scanner_);
|
| typename Traits::Type::FunctionLiteral value =
|
| this->ParseFunctionLiteral(
|
| name, scanner()->location(),
|
| @@ -1524,7 +1517,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| }
|
| case Token::STRING: {
|
| Consume(Token::STRING);
|
| - typename Traits::Type::Identifier string = this->GetSymbol(scanner_);
|
| + IdentifierT string = this->GetSymbol(scanner_);
|
| if (fni_ != NULL) this->PushLiteralName(fni_, string);
|
| uint32_t index;
|
| if (this->IsArrayIndex(string, &index)) {
|
| @@ -1543,7 +1536,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| default:
|
| if (Token::IsKeyword(next)) {
|
| Consume(next);
|
| - typename Traits::Type::Identifier string = this->GetSymbol(scanner_);
|
| + IdentifierT string = this->GetSymbol(scanner_);
|
| key = factory()->NewLiteral(string, next_pos);
|
| } else {
|
| Token::Value next = Next();
|
| @@ -1557,8 +1550,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseObjectLiteral(
|
| checker.CheckProperty(next, kValueProperty, CHECK_OK);
|
|
|
| Expect(Token::COLON, CHECK_OK);
|
| - typename Traits::Type::Expression value =
|
| - this->ParseAssignmentExpression(true, CHECK_OK);
|
| + ExpressionT value = this->ParseAssignmentExpression(true, CHECK_OK);
|
|
|
| typename Traits::Type::ObjectLiteralProperty property =
|
| factory()->NewObjectLiteralProperty(key, value);
|
| @@ -1610,9 +1602,8 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments(
|
| 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));
|
| + ExpressionT argument = this->ParseAssignmentExpression(
|
| + true, CHECK_OK_CUSTOM(NullExpressionList));
|
| result->Add(argument, zone_);
|
| if (result->length() > Code::kMaxArguments) {
|
| ReportMessageAt(scanner()->location(), "too_many_arguments");
|
| @@ -1631,8 +1622,8 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments(
|
|
|
| // Precedence = 2
|
| template <class Traits>
|
| -typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression(
|
| - bool accept_IN, bool* ok) {
|
| +typename ParserBase<Traits>::ExpressionT
|
| +ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, bool* ok) {
|
| // AssignmentExpression ::
|
| // ConditionalExpression
|
| // YieldExpression
|
| @@ -1645,7 +1636,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression(
|
| }
|
|
|
| if (fni_ != NULL) fni_->Enter();
|
| - typename Traits::Type::Expression expression =
|
| + ExpressionT expression =
|
| this->ParseConditionalExpression(accept_IN, CHECK_OK);
|
|
|
| if (!Token::IsAssignmentOp(peek())) {
|
| @@ -1668,8 +1659,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression(
|
|
|
| Token::Value op = Next(); // Get assignment operator.
|
| int pos = position();
|
| - typename Traits::Type::Expression right =
|
| - this->ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| + ExpressionT right = this->ParseAssignmentExpression(accept_IN, CHECK_OK);
|
|
|
| // TODO(1231235): We try to estimate the set of properties set by
|
| // constructors. We define a new property whenever there is an
|
| @@ -1701,17 +1691,17 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression(
|
| }
|
|
|
| template <class Traits>
|
| -typename Traits::Type::Expression ParserBase<Traits>::ParseYieldExpression(
|
| - bool* ok) {
|
| +typename ParserBase<Traits>::ExpressionT
|
| +ParserBase<Traits>::ParseYieldExpression(bool* ok) {
|
| // YieldExpression ::
|
| // 'yield' '*'? AssignmentExpression
|
| int pos = peek_position();
|
| Expect(Token::YIELD, CHECK_OK);
|
| Yield::Kind kind =
|
| Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND;
|
| - typename Traits::Type::Expression generator_object =
|
| + ExpressionT generator_object =
|
| factory()->NewVariableProxy(function_state_->generator_object_variable());
|
| - typename Traits::Type::Expression expression =
|
| + ExpressionT expression =
|
| ParseAssignmentExpression(false, CHECK_OK);
|
| typename Traits::Type::YieldExpression yield =
|
| factory()->NewYield(generator_object, expression, kind, pos);
|
| @@ -1724,7 +1714,7 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseYieldExpression(
|
|
|
| // Precedence = 3
|
| template <class Traits>
|
| -typename Traits::Type::Expression
|
| +typename ParserBase<Traits>::ExpressionT
|
| ParserBase<Traits>::ParseConditionalExpression(bool accept_IN, bool* ok) {
|
| // ConditionalExpression ::
|
| // LogicalOrExpression
|
| @@ -1732,35 +1722,31 @@ ParserBase<Traits>::ParseConditionalExpression(bool accept_IN, bool* ok) {
|
|
|
| int pos = peek_position();
|
| // We start using the binary expression parser for prec >= 4 only!
|
| - typename Traits::Type::Expression expression =
|
| - this->ParseBinaryExpression(4, accept_IN, CHECK_OK);
|
| + ExpressionT expression = this->ParseBinaryExpression(4, accept_IN, CHECK_OK);
|
| if (peek() != Token::CONDITIONAL) return expression;
|
| Consume(Token::CONDITIONAL);
|
| // In parsing the first assignment expression in conditional
|
| // expressions we always accept the 'in' keyword; see ECMA-262,
|
| // section 11.12, page 58.
|
| - typename Traits::Type::Expression left =
|
| - ParseAssignmentExpression(true, CHECK_OK);
|
| + ExpressionT left = ParseAssignmentExpression(true, CHECK_OK);
|
| Expect(Token::COLON, CHECK_OK);
|
| - typename Traits::Type::Expression right =
|
| - ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| + ExpressionT right = ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| return factory()->NewConditional(expression, left, right, pos);
|
| }
|
|
|
|
|
| // Precedence >= 4
|
| template <class Traits>
|
| -typename Traits::Type::Expression
|
| +typename ParserBase<Traits>::ExpressionT
|
| ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) {
|
| ASSERT(prec >= 4);
|
| - typename Traits::Type::Expression x = this->ParseUnaryExpression(CHECK_OK);
|
| + ExpressionT x = this->ParseUnaryExpression(CHECK_OK);
|
| for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
|
| // prec1 >= 4
|
| while (Precedence(peek(), accept_IN) == prec1) {
|
| Token::Value op = Next();
|
| int pos = position();
|
| - typename Traits::Type::Expression y =
|
| - ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
|
| + ExpressionT y = ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
|
|
|
| if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos,
|
| factory())) {
|
|
|