Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: src/preparser.h

Issue 1195163007: Revert of [destructuring] Implement parameter pattern matching. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pattern-rewriter.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index b66053b94697a7d82a59969e1f06a6cd4fd1b3fc..ce2c6c429239742a3cca7c4438f377a14c348111 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -70,8 +70,6 @@
typedef typename Traits::Type::FunctionLiteral FunctionLiteralT;
typedef typename Traits::Type::Literal LiteralT;
typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT;
- typedef typename Traits::Type::FormalParameterParsingState
- FormalParameterParsingStateT;
ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit,
v8::Extension* extension, AstValueFactory* ast_value_factory,
@@ -559,7 +557,7 @@
ExpressionT expr, bool* ok) {
if (classifier->is_valid_binding_pattern()) {
// A simple arrow formal parameter: IDENTIFIER => BODY.
- if (!this->IsIdentifier(expr)) {
+ if (!allow_harmony_destructuring() && !this->IsIdentifier(expr)) {
Traits::ReportMessageAt(scanner()->location(),
MessageTemplate::kUnexpectedToken,
Token::String(scanner()->current_token()));
@@ -648,9 +646,9 @@
ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok);
ExpressionT ParseMemberExpressionContinuation(
ExpressionT expression, ExpressionClassifier* classifier, bool* ok);
- ExpressionT ParseArrowFunctionLiteral(
- const FormalParameterParsingStateT& parsing_state,
- const ExpressionClassifier& classifier, bool* ok);
+ ExpressionT ParseArrowFunctionLiteral(Scope* function_scope, bool has_rest,
+ const ExpressionClassifier& classifier,
+ bool* ok);
ExpressionT ParseTemplateLiteral(ExpressionT tag, int start,
ExpressionClassifier* classifier, bool* ok);
void AddTemplateExpression(ExpressionT);
@@ -662,10 +660,9 @@
ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier,
bool* ok);
- void ParseFormalParameter(bool is_rest,
- FormalParameterParsingStateT* parsing_result,
+ void ParseFormalParameter(Scope* scope, bool is_rest,
ExpressionClassifier* classifier, bool* ok);
- int ParseFormalParameterList(FormalParameterParsingStateT* parsing_state,
+ int ParseFormalParameterList(Scope* scope, bool* has_rest,
ExpressionClassifier* classifier, bool* ok);
void CheckArityRestrictions(
int param_count, FunctionLiteral::ArityRestriction arity_restriction,
@@ -1257,15 +1254,6 @@
};
-struct PreParserFormalParameterParsingState {
- explicit PreParserFormalParameterParsingState(Scope* scope)
- : scope(scope), has_rest(false), is_simple_parameter_list(true) {}
- Scope* scope;
- bool has_rest;
- bool is_simple_parameter_list;
-};
-
-
class PreParser;
class PreParserTraits {
@@ -1292,7 +1280,6 @@
typedef PreParserExpressionList PropertyList;
typedef PreParserIdentifier FormalParameter;
typedef PreParserStatementList StatementList;
- typedef PreParserFormalParameterParsingState FormalParameterParsingState;
// For constructing objects returned by the traversing functions.
typedef PreParserFactory Factory;
@@ -1531,23 +1518,19 @@
return PreParserExpressionList();
}
- static void AddParameterInitializationBlock(
- const PreParserFormalParameterParsingState& formal_parameters,
- PreParserStatementList list, bool* ok) {}
-
V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
int* expected_property_count, bool* ok) {
UNREACHABLE();
}
- V8_INLINE PreParserStatementList ParseEagerFunctionBody(
- PreParserIdentifier function_name, int pos,
- const PreParserFormalParameterParsingState& formal_parameters,
- Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok);
+ V8_INLINE PreParserStatementList
+ ParseEagerFunctionBody(PreParserIdentifier function_name, int pos,
+ Variable* fvar, Token::Value fvar_init_op,
+ FunctionKind kind, bool* ok);
V8_INLINE void ParseArrowFunctionFormalParameters(
- PreParserFormalParameterParsingState* parsing_state,
- PreParserExpression expression, const Scanner::Location& params_loc,
+ Scope* scope, PreParserExpression expression,
+ const Scanner::Location& params_loc, bool* has_rest,
Scanner::Location* duplicate_loc, bool* ok);
struct TemplateLiteralState {};
@@ -1574,7 +1557,7 @@
return !tag.IsNoTemplateTag();
}
- void DeclareFormalParameter(void* parsing_state, PreParserExpression pattern,
+ void DeclareFormalParameter(Scope* scope, PreParserExpression pattern,
ExpressionClassifier* classifier, bool is_rest) {}
void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
@@ -1725,7 +1708,6 @@
int* expected_property_count, bool* ok);
V8_INLINE PreParserStatementList
ParseEagerFunctionBody(PreParserIdentifier function_name, int pos,
- const FormalParameterParsingStateT& formal_parameters,
Variable* fvar, Token::Value fvar_init_op,
FunctionKind kind, bool* ok);
@@ -1771,8 +1753,8 @@
void PreParserTraits::ParseArrowFunctionFormalParameters(
- PreParserFormalParameterParsingState* parsing_state,
- PreParserExpression params, const Scanner::Location& params_loc,
+ Scope* scope, PreParserExpression params,
+ const Scanner::Location& params_loc, bool* has_rest,
Scanner::Location* duplicate_loc, bool* ok) {
// TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter
// lists that are too long.
@@ -1780,9 +1762,8 @@
PreParserStatementList PreParser::ParseEagerFunctionBody(
- PreParserIdentifier function_name, int pos,
- const PreParserFormalParameterParsingState& formal_parameters,
- Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
+ PreParserIdentifier function_name, int pos, Variable* fvar,
+ Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
ParseStatementList(Token::RBRACE, ok);
@@ -1794,11 +1775,10 @@
PreParserStatementList PreParserTraits::ParseEagerFunctionBody(
- PreParserIdentifier function_name, int pos,
- const PreParserFormalParameterParsingState& formal_parameters,
- Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
- return pre_parser_->ParseEagerFunctionBody(
- function_name, pos, formal_parameters, fvar, fvar_init_op, kind, ok);
+ PreParserIdentifier function_name, int pos, Variable* fvar,
+ Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
+ return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar,
+ fvar_init_op, kind, ok);
}
@@ -2182,22 +2162,20 @@
}
Scope* scope =
this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
- FormalParameterParsingStateT parsing_state(scope);
scope->set_start_position(beg_pos);
ExpressionClassifier args_classifier;
- result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier,
- CHECK_OK);
+ bool has_rest = false;
+ result = this->ParseArrowFunctionLiteral(scope, has_rest,
+ args_classifier, CHECK_OK);
} else if (allow_harmony_arrow_functions() &&
allow_harmony_rest_params() && Check(Token::ELLIPSIS)) {
// (...x) => y
Scope* scope =
this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
- FormalParameterParsingStateT parsing_state(scope);
scope->set_start_position(beg_pos);
ExpressionClassifier args_classifier;
- const bool is_rest = true;
- this->ParseFormalParameter(is_rest, &parsing_state, &args_classifier,
- CHECK_OK);
+ const bool has_rest = true;
+ this->ParseFormalParameter(scope, has_rest, &args_classifier, CHECK_OK);
if (peek() == Token::COMMA) {
ReportMessageAt(scanner()->peek_location(),
MessageTemplate::kParamAfterRest);
@@ -2205,8 +2183,8 @@
return this->EmptyExpression();
}
Expect(Token::RPAREN, CHECK_OK);
- result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier,
- CHECK_OK);
+ result = this->ParseArrowFunctionLiteral(scope, has_rest,
+ args_classifier, CHECK_OK);
} else {
// Heuristically try to detect immediately called functions before
// seeing the call parentheses.
@@ -2546,11 +2524,6 @@
DCHECK(!*is_computed_name);
DCHECK(!is_static);
- if (classifier->duplicate_finder() != nullptr &&
- scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) {
- classifier->RecordDuplicateFormalParameterError(scanner()->location());
- }
-
ExpressionT lhs = this->ExpressionFromIdentifier(
name, next_beg_pos, next_end_pos, scope_, factory());
if (peek() == Token::ASSIGN) {
@@ -2734,7 +2707,7 @@
if (fni_ != NULL) fni_->Enter();
ParserBase<Traits>::Checkpoint checkpoint(this);
- ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder());
+ ExpressionClassifier arrow_formals_classifier;
if (peek() != Token::LPAREN) {
// The expression we are going to read is not a parenthesized arrow function
// formal parameter list.
@@ -2753,15 +2726,15 @@
this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
scope->set_start_position(lhs_location.beg_pos);
Scanner::Location duplicate_loc = Scanner::Location::invalid();
- FormalParameterParsingStateT parsing_state(scope);
- this->ParseArrowFunctionFormalParameters(&parsing_state, expression, loc,
+ bool has_rest = false;
+ this->ParseArrowFunctionFormalParameters(scope, expression, loc, &has_rest,
&duplicate_loc, CHECK_OK);
if (duplicate_loc.IsValid()) {
arrow_formals_classifier.RecordDuplicateFormalParameterError(
duplicate_loc);
}
expression = this->ParseArrowFunctionLiteral(
- parsing_state, arrow_formals_classifier, CHECK_OK);
+ scope, has_rest, arrow_formals_classifier, CHECK_OK);
return expression;
}
@@ -3524,9 +3497,9 @@
template <class Traits>
-void ParserBase<Traits>::ParseFormalParameter(
- bool is_rest, FormalParameterParsingStateT* parsing_state,
- ExpressionClassifier* classifier, bool* ok) {
+void ParserBase<Traits>::ParseFormalParameter(Scope* scope, bool is_rest,
+ ExpressionClassifier* classifier,
+ bool* ok) {
// FormalParameter[Yield,GeneratorParameter] :
// BindingElement[?Yield, ?GeneratorParameter]
@@ -3543,24 +3516,13 @@
return;
}
- if (parsing_state->is_simple_parameter_list) {
- parsing_state->is_simple_parameter_list =
- !is_rest && Traits::IsIdentifier(pattern);
- }
- parsing_state->has_rest = is_rest;
- if (is_rest && !Traits::IsIdentifier(pattern)) {
- ReportUnexpectedToken(next);
- *ok = false;
- return;
- }
- Traits::DeclareFormalParameter(parsing_state, pattern, classifier, is_rest);
+ Traits::DeclareFormalParameter(scope, pattern, classifier, is_rest);
}
template <class Traits>
int ParserBase<Traits>::ParseFormalParameterList(
- FormalParameterParsingStateT* parsing_state,
- ExpressionClassifier* classifier, bool* ok) {
+ Scope* scope, bool* is_rest, ExpressionClassifier* classifier, bool* ok) {
// FormalParameters[Yield,GeneratorParameter] :
// [empty]
// FormalParameterList[?Yield, ?GeneratorParameter]
@@ -3584,12 +3546,12 @@
*ok = false;
return -1;
}
- bool is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS);
- ParseFormalParameter(is_rest, parsing_state, classifier, ok);
+ *is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS);
+ ParseFormalParameter(scope, *is_rest, classifier, ok);
if (!*ok) return -1;
- } while (!parsing_state->has_rest && Check(Token::COMMA));
-
- if (parsing_state->has_rest && peek() == Token::COMMA) {
+ } while (!*is_rest && Check(Token::COMMA));
+
+ if (*is_rest && peek() == Token::COMMA) {
ReportMessageAt(scanner()->peek_location(),
MessageTemplate::kParamAfterRest);
*ok = false;
@@ -3634,8 +3596,8 @@
template <class Traits>
typename ParserBase<Traits>::ExpressionT
ParserBase<Traits>::ParseArrowFunctionLiteral(
- const FormalParameterParsingStateT& formal_parameters,
- const ExpressionClassifier& formals_classifier, bool* ok) {
+ Scope* scope, bool has_rest, const ExpressionClassifier& formals_classifier,
+ bool* ok) {
if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) {
// ASI inserts `;` after arrow parameters if a line terminator is found.
// `=> ...` is never a valid expression, so report as syntax error.
@@ -3646,16 +3608,15 @@
}
typename Traits::Type::StatementList body;
- int num_parameters = formal_parameters.scope->num_parameters();
+ int num_parameters = scope->num_parameters();
int materialized_literal_count = -1;
int expected_property_count = -1;
Scanner::Location super_loc;
{
typename Traits::Type::Factory function_factory(ast_value_factory());
- FunctionState function_state(&function_state_, &scope_,
- formal_parameters.scope, kArrowFunction,
- &function_factory);
+ FunctionState function_state(&function_state_, &scope_, scope,
+ kArrowFunction, &function_factory);
Expect(Token::ARROW, CHECK_OK);
@@ -3670,8 +3631,8 @@
&expected_property_count, CHECK_OK);
} else {
body = this->ParseEagerFunctionBody(
- this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters,
- NULL, Token::INIT_VAR, kArrowFunction, CHECK_OK);
+ this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL,
+ Token::INIT_VAR, kArrowFunction, CHECK_OK);
materialized_literal_count =
function_state.materialized_literal_count();
expected_property_count = function_state.expected_property_count();
@@ -3685,14 +3646,13 @@
ParseAssignmentExpression(true, &classifier, CHECK_OK);
ValidateExpression(&classifier, CHECK_OK);
body = this->NewStatementList(1, zone());
- this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK);
body->Add(factory()->NewReturnStatement(expression, pos), zone());
materialized_literal_count = function_state.materialized_literal_count();
expected_property_count = function_state.expected_property_count();
}
super_loc = function_state.super_location();
- formal_parameters.scope->set_end_position(scanner()->location().end_pos);
+ scope->set_end_position(scanner()->location().end_pos);
// Arrow function formal parameters are parsed as StrictFormalParameterList,
// which is not the same as "parameters of a strict function"; it only means
@@ -3704,23 +3664,21 @@
// Validate strict mode.
if (is_strict(language_mode())) {
- CheckStrictOctalLiteral(formal_parameters.scope->start_position(),
+ CheckStrictOctalLiteral(scope->start_position(),
scanner()->location().end_pos, CHECK_OK);
- this->CheckConflictingVarDeclarations(formal_parameters.scope, CHECK_OK);
+ this->CheckConflictingVarDeclarations(scope, CHECK_OK);
}
}
FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
- this->EmptyIdentifierString(), ast_value_factory(),
- formal_parameters.scope, body, materialized_literal_count,
- expected_property_count, num_parameters,
+ this->EmptyIdentifierString(), ast_value_factory(), scope, body,
+ materialized_literal_count, expected_property_count, num_parameters,
FunctionLiteral::kNoDuplicateParameters,
FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction,
- formal_parameters.scope->start_position());
-
- function_literal->set_function_token_position(
- formal_parameters.scope->start_position());
+ scope->start_position());
+
+ function_literal->set_function_token_position(scope->start_position());
if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
« no previous file with comments | « src/pattern-rewriter.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698