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

Unified Diff: src/preparser.h

Issue 1019283002: [strong] Check constructor returns (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index 17247e88307f93feaf58bf7f9eedd694264b0ede..d53447c92196c232f39bbc293412d61479fa8c4d 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -217,9 +217,13 @@ class ParserBase : public Traits {
void AddProperty() { expected_property_count_++; }
int expected_property_count() { return expected_property_count_; }
+ Scanner::Location return_location() const { return return_location_; }
Scanner::Location super_call_location() const {
return super_call_location_;
}
+ void set_return_location(Scanner::Location location) {
+ return_location_ = location;
+ }
void set_super_call_location(Scanner::Location location) {
super_call_location_ = location;
}
@@ -254,6 +258,9 @@ class ParserBase : public Traits {
// Properties count estimation.
int expected_property_count_;
+ // Location of most recent 'return' statement (invalid if none).
+ Scanner::Location return_location_;
+
// Location of call to the "super" constructor (invalid if none).
Scanner::Location super_call_location_;
@@ -1667,6 +1674,7 @@ ParserBase<Traits>::FunctionState::FunctionState(
: next_materialized_literal_index_(0),
next_handler_index_(0),
expected_property_count_(0),
+ return_location_(Scanner::Location::invalid()),
super_call_location_(Scanner::Location::invalid()),
kind_(kind),
generator_object_variable_(NULL),
@@ -2796,11 +2804,17 @@ ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) {
// new super() is never allowed.
// super() is only allowed in derived constructor
if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) {
- if (is_strong(language_mode()) &&
- function_state->super_call_location().IsValid()) {
- ReportMessageAt(scanner()->location(), "strong_super_call_duplicate");
- *ok = false;
- return this->EmptyExpression();
+ if (is_strong(language_mode())) {
+ if (function_state->super_call_location().IsValid()) {
+ ReportMessageAt(scanner()->location(), "strong_super_call_duplicate");
+ *ok = false;
+ return this->EmptyExpression();
+ } else if (function_state->return_location().IsValid()) {
+ ReportMessageAt(function_state->return_location(),
+ "strong_constructor_return_misplaced");
+ *ok = false;
+ return this->EmptyExpression();
+ }
}
function_state->set_super_call_location(scanner()->location());
return this->SuperReference(scope_, factory());

Powered by Google App Engine
This is Rietveld 408576698