Commit 934e58d3 authored by marja@chromium.org's avatar marja@chromium.org

(Pre)Parser unification: use shorter type names.

R=mstarzinger@chromium.org
BUG=

Review URL: https://codereview.chromium.org/203493002

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