[parser] Add default constructor for PreParserExpression

In a few places in the parser base, we were forced to initialize
variables of type ExpressionT even if it's not necessary, as they
are assigned to later on before their use.  This was required
because, for the case of the preparser, ExpressionT is
PreParserExpression which had no default constructor.

This patch adds a default constructor, equivalent to EmptyExpression
for this class, and gets rid of the unnecessary initializations.

R=adamk@chromium.org, littledan@chromium.org
BUG=
LOG=N

Review-Url: https://codereview.chromium.org/2162763003
Cr-Commit-Position: refs/heads/master@{#37884}
This commit is contained in:
nikolaos 2016-07-20 00:34:45 -07:00 committed by Commit bot
parent 3e8f49ab59
commit 6ce36869bc
2 changed files with 11 additions and 8 deletions

View File

@ -1702,7 +1702,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
// AssignmentExpression
// Expression ',' AssignmentExpression
ExpressionT result = this->EmptyExpression();
ExpressionT result;
{
ExpressionClassifier binding_classifier(this);
result = this->ParseAssignmentExpression(accept_IN, &binding_classifier,
@ -1773,7 +1773,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
int first_spread_index = -1;
Expect(Token::LBRACK, CHECK_OK);
while (peek() != Token::RBRACK) {
ExpressionT elem = this->EmptyExpression();
ExpressionT elem;
if (peek() == Token::COMMA) {
elem = this->GetLiteralTheHole(peek_position(), factory());
} else if (peek() == Token::ELLIPSIS) {
@ -1905,7 +1905,6 @@ ParserBase<Traits>::ParsePropertyDefinition(
ExpressionClassifier* classifier, IdentifierT* name, bool* ok) {
DCHECK(!in_class || IsStaticMethod(method_kind) ||
has_seen_constructor != nullptr);
ExpressionT value = this->EmptyExpression();
bool is_get = false;
bool is_set = false;
bool is_await = false;
@ -1945,7 +1944,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
}
Consume(Token::COLON);
int beg_pos = peek_position();
value = this->ParseAssignmentExpression(
ExpressionT value = this->ParseAssignmentExpression(
true, classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
CheckDestructuringElement(value, classifier, beg_pos,
scanner()->location().end_pos);
@ -1987,6 +1986,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
*name, next_beg_pos, next_end_pos, scope(), factory());
CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos);
ExpressionT value;
if (peek() == Token::ASSIGN) {
Consume(Token::ASSIGN);
ExpressionClassifier rhs_classifier(this);
@ -2049,7 +2049,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
: FunctionKind::kBaseConstructor;
}
value = this->ParseFunctionLiteral(
ExpressionT value = this->ParseFunctionLiteral(
*name, scanner()->location(), kSkipFunctionNameCheck, kind,
kNoSourcePosition, FunctionLiteral::kAccessorOrMethod, language_mode(),
CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
@ -2459,6 +2459,7 @@ ParserBase<Traits>::ParseYieldExpression(bool accept_IN,
Expect(Token::YIELD, CHECK_OK);
ExpressionT generator_object =
factory()->NewVariableProxy(function_state_->generator_object_variable());
// The following initialization is necessary.
ExpressionT expression = Traits::EmptyExpression();
bool delegating = false; // yield*
if (!scanner()->HasAnyLineTerminatorBeforeNext()) {
@ -2961,7 +2962,7 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression(
ArrowFormalParametersUnexpectedToken(classifier);
Consume(Token::NEW);
int new_pos = position();
ExpressionT result = this->EmptyExpression();
ExpressionT result;
if (peek() == Token::SUPER) {
const bool is_new = true;
result = ParseSuperExpression(is_new, classifier, CHECK_OK);
@ -3010,7 +3011,7 @@ ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier,
// caller.
// Parse the initial primary or function expression.
ExpressionT result = this->EmptyExpression();
ExpressionT result;
if (peek() == Token::FUNCTION) {
BindingPatternUnexpectedToken(classifier);
ArrowFormalParametersUnexpectedToken(classifier);

View File

@ -117,8 +117,10 @@ class PreParserIdentifier {
class PreParserExpression {
public:
PreParserExpression() : code_(TypeField::encode(kExpression)) {}
static PreParserExpression Default() {
return PreParserExpression(TypeField::encode(kExpression));
return PreParserExpression();
}
static PreParserExpression Spread(PreParserExpression expression) {