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

Unified Diff: src/preparser.h

Issue 200473003: Make invalid LHSs a parse-time (reference) error (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Comment Created 6 years, 9 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/parser.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 8c0e06732055c3ef6d310a5cdcfa902f71c5fffa..bbae5ff27e5273e96c8410ada4479e0d55f3e863 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -342,13 +342,16 @@ class ParserBase : public Traits {
bool is_generator() const { return function_state_->is_generator(); }
// Report syntax errors.
- void ReportMessage(const char* message, Vector<const char*> args) {
+ void ReportMessage(const char* message, Vector<const char*> args,
+ bool is_reference_error = false) {
Scanner::Location source_location = scanner()->location();
- Traits::ReportMessageAt(source_location, message, args);
+ Traits::ReportMessageAt(source_location, message, args, is_reference_error);
}
- void ReportMessageAt(Scanner::Location location, const char* message) {
- Traits::ReportMessageAt(location, message, Vector<const char*>::empty());
+ void ReportMessageAt(Scanner::Location location, const char* message,
+ bool is_reference_error = false) {
+ Traits::ReportMessageAt(location, message, Vector<const char*>::empty(),
+ is_reference_error);
}
void ReportUnexpectedToken(Token::Value token);
@@ -789,12 +792,10 @@ class PreParserTraits {
static void CheckAssigningFunctionLiteralToProperty(
PreParserExpression left, PreParserExpression right) {}
-
- static PreParserExpression ValidateAssignmentLeftHandSide(
- PreParserExpression expression) {
- // Parser generates a runtime error here if the left hand side is not valid.
- // PreParser doesn't have to.
- return expression;
+ // Determine whether the expression is a valid assignment left-hand side.
+ static bool IsValidLeftHandSide(PreParserExpression expression) {
+ // TODO(marja): check properly; for now, leave it to parser.
+ return true;
}
static PreParserExpression MarkExpressionAsLValue(
@@ -812,14 +813,17 @@ class PreParserTraits {
// Reporting errors.
void ReportMessageAt(Scanner::Location location,
const char* message,
- Vector<const char*> args);
+ Vector<const char*> args,
+ bool is_reference_error = false);
void ReportMessageAt(Scanner::Location location,
const char* type,
- const char* name_opt);
+ const char* name_opt,
+ bool is_reference_error = false);
void ReportMessageAt(int start_pos,
int end_pos,
const char* type,
- const char* name_opt);
+ const char* name_opt,
+ bool is_reference_error = false);
// "null" return type creators.
static PreParserIdentifier EmptyIdentifier() {
@@ -1606,6 +1610,8 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression(
// YieldExpression
// LeftHandSideExpression AssignmentOperator AssignmentExpression
+ Scanner::Location lhs_location = scanner()->peek_location();
+
if (peek() == Token::YIELD && is_generator()) {
return this->ParseYieldExpression(ok);
}
@@ -1620,12 +1626,11 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression(
return expression;
}
- // Signal a reference error if the expression is an invalid left-hand
- // side expression. We could report this as a syntax error here but
- // for compatibility with JSC we choose to report the error at
- // runtime.
- // TODO(ES5): Should change parsing for spec conformance.
- expression = this->ValidateAssignmentLeftHandSide(expression);
+ if (!IsValidLeftHandSide(expression)) {
+ this->ReportMessageAt(lhs_location, "invalid_lhs_in_assignment", true);
+ *ok = false;
+ return this->EmptyExpression();
+ }
if (strict_mode() == STRICT) {
// Assignment to eval or arguments is disallowed in strict mode.
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698