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

Unified Diff: src/preparser.h

Issue 1259283002: [es6] Implement proper TDZ for parameters (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Adjust test expectations Created 5 years, 4 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
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index 3bd0953cb627122adaf0691918545a8034469ecb..d240db1b912955a87b75052b7cf6571b005f494f 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -27,6 +27,15 @@ enum FunctionNameValidity {
};
+struct FormalParametersBase {
+ explicit FormalParametersBase(Scope* scope) : scope(scope) {}
+ Scope* scope;
+ bool has_rest = false;
+ bool is_simple = true;
+ int materialized_literals_count = 0;
+};
+
+
// Common base class shared between parser and pre-parser. Traits encapsulate
// the differences between Parser and PreParser:
@@ -1312,18 +1321,13 @@ class PreParserFactory {
};
-struct PreParserFormalParameters {
+struct PreParserFormalParameters : FormalParametersBase {
explicit PreParserFormalParameters(Scope* scope)
- : scope(scope),
- arity(0),
- has_rest(false),
- is_simple(true),
- materialized_literals_count(0) {}
- Scope* scope;
- int arity;
- bool has_rest;
- bool is_simple;
- int materialized_literals_count;
+ : FormalParametersBase(scope) {}
+ int arity = 0;
+
+ int Arity() const { return arity; }
+ PreParserIdentifier at(int i) { return PreParserIdentifier(); } // Dummy
};
@@ -1606,7 +1610,7 @@ class PreParserTraits {
const PreParserFormalParameters& parameters, FunctionKind kind,
FunctionLiteral::FunctionType function_type, bool* ok);
- V8_INLINE void ParseArrowFunctionFormalParameters(
+ V8_INLINE void ParseArrowFunctionFormalParameterList(
PreParserFormalParameters* parameters,
PreParserExpression expression, const Scanner::Location& params_loc,
Scanner::Location* duplicate_loc, bool* ok);
@@ -1637,8 +1641,13 @@ class PreParserTraits {
return !tag.IsNoTemplateTag();
}
- void DeclareFormalParameter(PreParserFormalParameters* parameters,
- PreParserExpression pattern, bool is_rest,
+ void AddFormalParameter(
+ PreParserFormalParameters* parameters, PreParserExpression pattern,
+ bool is_rest) {
+ ++parameters->arity;
+ }
+ void DeclareFormalParameter(Scope* scope, PreParserIdentifier parameter,
+ bool is_simple,
ExpressionClassifier* classifier) {}
void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
@@ -1835,7 +1844,7 @@ PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function,
}
-void PreParserTraits::ParseArrowFunctionFormalParameters(
+void PreParserTraits::ParseArrowFunctionFormalParameterList(
PreParserFormalParameters* parameters,
PreParserExpression params, const Scanner::Location& params_loc,
Scanner::Location* duplicate_loc, bool* ok) {
@@ -2280,12 +2289,15 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
// (...x) => y
Scope* scope =
this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
- FormalParametersT parameters(scope);
+ FormalParametersT formals(scope);
scope->set_start_position(beg_pos);
- ExpressionClassifier args_classifier;
+ ExpressionClassifier formals_classifier;
const bool is_rest = true;
- this->ParseFormalParameter(is_rest, &parameters, &args_classifier,
+ this->ParseFormalParameter(is_rest, &formals, &formals_classifier,
CHECK_OK);
+ Traits::DeclareFormalParameter(
+ formals.scope, formals.at(0), formals.is_simple,
+ &formals_classifier);
if (peek() == Token::COMMA) {
ReportMessageAt(scanner()->peek_location(),
MessageTemplate::kParamAfterRest);
@@ -2293,7 +2305,7 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
return this->EmptyExpression();
}
Expect(Token::RPAREN, CHECK_OK);
- result = this->ParseArrowFunctionLiteral(parameters, args_classifier,
+ result = this->ParseArrowFunctionLiteral(formals, formals_classifier,
CHECK_OK);
} else {
// Heuristically try to detect immediately called functions before
@@ -2845,8 +2857,8 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
scope->set_start_position(lhs_location.beg_pos);
Scanner::Location duplicate_loc = Scanner::Location::invalid();
- this->ParseArrowFunctionFormalParameters(&parameters, expression, loc,
- &duplicate_loc, CHECK_OK);
+ this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc,
+ &duplicate_loc, CHECK_OK);
if (duplicate_loc.IsValid()) {
arrow_formals_classifier.RecordDuplicateFormalParameterError(
duplicate_loc);
@@ -3647,8 +3659,7 @@ void ParserBase<Traits>::ParseFormalParameter(
*ok = false;
return;
}
- ++parameters->arity;
- Traits::DeclareFormalParameter(parameters, pattern, is_rest, classifier);
+ Traits::AddFormalParameter(parameters, pattern, is_rest);
}
@@ -3669,11 +3680,11 @@ void ParserBase<Traits>::ParseFormalParameterList(
// FormalsList[?Yield, ?GeneratorParameter] ,
// FormalParameter[?Yield,?GeneratorParameter]
- DCHECK_EQ(0, parameters->arity);
+ DCHECK_EQ(0, parameters->Arity());
if (peek() != Token::RPAREN) {
do {
- if (parameters->arity > Code::kMaxArguments) {
+ if (parameters->Arity() > Code::kMaxArguments) {
ReportMessage(MessageTemplate::kTooManyParameters);
*ok = false;
return;
@@ -3687,8 +3698,15 @@ void ParserBase<Traits>::ParseFormalParameterList(
ReportMessageAt(scanner()->peek_location(),
MessageTemplate::kParamAfterRest);
*ok = false;
+ return;
}
}
+
+ for (int i = 0; i < parameters->Arity(); ++i) {
+ auto parameter = parameters->at(i);
+ Traits::DeclareFormalParameter(
+ parameters->scope, parameter, parameters->is_simple, classifier);
+ }
}
« src/parser.h ('K') | « src/parser.cc ('k') | test/mjsunit/harmony/destructuring.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698