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

Side by Side Diff: src/preparser.h

Issue 1060913005: [strong] Stricter check for referring to other classes inside methods. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: . Created 5 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_PREPARSER_H 5 #ifndef V8_PREPARSER_H
6 #define V8_PREPARSER_H 6 #define V8_PREPARSER_H
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 DCHECK(is_generator()); 231 DCHECK(is_generator());
232 generator_object_variable_ = variable; 232 generator_object_variable_ = variable;
233 } 233 }
234 typename Traits::Type::GeneratorVariable* generator_object_variable() 234 typename Traits::Type::GeneratorVariable* generator_object_variable()
235 const { 235 const {
236 return generator_object_variable_; 236 return generator_object_variable_;
237 } 237 }
238 238
239 typename Traits::Type::Factory* factory() { return factory_; } 239 typename Traits::Type::Factory* factory() { return factory_; }
240 240
241 void set_consecutive_class_declaration_batch_start(int position) {
242 consecutive_class_declaration_batch_start_ = position;
243 }
244
245 int consecutive_class_declaration_batch_start() const {
246 return consecutive_class_declaration_batch_start_;
247 }
248
241 private: 249 private:
242 // Used to assign an index to each literal that needs materialization in 250 // Used to assign an index to each literal that needs materialization in
243 // the function. Includes regexp literals, and boilerplate for object and 251 // the function. Includes regexp literals, and boilerplate for object and
244 // array literals. 252 // array literals.
245 int next_materialized_literal_index_; 253 int next_materialized_literal_index_;
246 254
247 // Used to assign a per-function index to try and catch handlers. 255 // Used to assign a per-function index to try and catch handlers.
248 int next_handler_index_; 256 int next_handler_index_;
249 257
250 // Properties count estimation. 258 // Properties count estimation.
251 int expected_property_count_; 259 int expected_property_count_;
252 260
253 // Location of most recent 'return' statement (invalid if none). 261 // Location of most recent 'return' statement (invalid if none).
254 Scanner::Location return_location_; 262 Scanner::Location return_location_;
255 263
256 // Location of call to the "super" constructor (invalid if none). 264 // Location of call to the "super" constructor (invalid if none).
257 Scanner::Location super_call_location_; 265 Scanner::Location super_call_location_;
258 266
259 FunctionKind kind_; 267 FunctionKind kind_;
260 // For generators, this variable may hold the generator object. It variable 268 // For generators, this variable may hold the generator object. It variable
261 // is used by yield expressions and return statements. It is not necessary 269 // is used by yield expressions and return statements. It is not necessary
262 // for generator functions to have this variable set. 270 // for generator functions to have this variable set.
263 Variable* generator_object_variable_; 271 Variable* generator_object_variable_;
264 272
265 FunctionState** function_state_stack_; 273 FunctionState** function_state_stack_;
266 FunctionState* outer_function_state_; 274 FunctionState* outer_function_state_;
267 Scope** scope_stack_; 275 Scope** scope_stack_;
268 Scope* outer_scope_; 276 Scope* outer_scope_;
269 typename Traits::Type::Factory* factory_; 277 typename Traits::Type::Factory* factory_;
278 // For tracking which classes are declared consecutively. Needed for strong
279 // mode.
280 int consecutive_class_declaration_batch_start_;
270 281
271 friend class ParserTraits; 282 friend class ParserTraits;
272 friend class Checkpoint; 283 friend class Checkpoint;
273 }; 284 };
274 285
275 // Annoyingly, arrow functions first parse as comma expressions, then when we 286 // Annoyingly, arrow functions first parse as comma expressions, then when we
276 // see the => we have to go back and reinterpret the arguments as being formal 287 // see the => we have to go back and reinterpret the arguments as being formal
277 // parameters. To do so we need to reset some of the parser state back to 288 // parameters. To do so we need to reset some of the parser state back to
278 // what it was before the arguments were first seen. 289 // what it was before the arguments were first seen.
279 class Checkpoint BASE_EMBEDDED { 290 class Checkpoint BASE_EMBEDDED {
(...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after
1625 // success (even if parsing failed, the pre-parse data successfully 1636 // success (even if parsing failed, the pre-parse data successfully
1626 // captured the syntax error), and false if a stack-overflow happened 1637 // captured the syntax error), and false if a stack-overflow happened
1627 // during parsing. 1638 // during parsing.
1628 PreParseResult PreParseProgram(int* materialized_literals = 0) { 1639 PreParseResult PreParseProgram(int* materialized_literals = 0) {
1629 Scope* scope = NewScope(scope_, SCRIPT_SCOPE); 1640 Scope* scope = NewScope(scope_, SCRIPT_SCOPE);
1630 PreParserFactory factory(NULL); 1641 PreParserFactory factory(NULL);
1631 FunctionState top_scope(&function_state_, &scope_, scope, kNormalFunction, 1642 FunctionState top_scope(&function_state_, &scope_, scope, kNormalFunction,
1632 &factory); 1643 &factory);
1633 bool ok = true; 1644 bool ok = true;
1634 int start_position = scanner()->peek_location().beg_pos; 1645 int start_position = scanner()->peek_location().beg_pos;
1646 top_scope.set_consecutive_class_declaration_batch_start(start_position);
1635 ParseStatementList(Token::EOS, &ok); 1647 ParseStatementList(Token::EOS, &ok);
1636 if (stack_overflow()) return kPreParseStackOverflow; 1648 if (stack_overflow()) return kPreParseStackOverflow;
1637 if (!ok) { 1649 if (!ok) {
1638 ReportUnexpectedToken(scanner()->current_token()); 1650 ReportUnexpectedToken(scanner()->current_token());
1639 } else if (is_strict(scope_->language_mode())) { 1651 } else if (is_strict(scope_->language_mode())) {
1640 CheckStrictOctalLiteral(start_position, scanner()->location().end_pos, 1652 CheckStrictOctalLiteral(start_position, scanner()->location().end_pos,
1641 &ok); 1653 &ok);
1642 } 1654 }
1643 if (materialized_literals) { 1655 if (materialized_literals) {
1644 *materialized_literals = function_state_->materialized_literal_count(); 1656 *materialized_literals = function_state_->materialized_literal_count();
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1777 next_handler_index_(0), 1789 next_handler_index_(0),
1778 expected_property_count_(0), 1790 expected_property_count_(0),
1779 return_location_(Scanner::Location::invalid()), 1791 return_location_(Scanner::Location::invalid()),
1780 super_call_location_(Scanner::Location::invalid()), 1792 super_call_location_(Scanner::Location::invalid()),
1781 kind_(kind), 1793 kind_(kind),
1782 generator_object_variable_(NULL), 1794 generator_object_variable_(NULL),
1783 function_state_stack_(function_state_stack), 1795 function_state_stack_(function_state_stack),
1784 outer_function_state_(*function_state_stack), 1796 outer_function_state_(*function_state_stack),
1785 scope_stack_(scope_stack), 1797 scope_stack_(scope_stack),
1786 outer_scope_(*scope_stack), 1798 outer_scope_(*scope_stack),
1787 factory_(factory) { 1799 factory_(factory),
1800 consecutive_class_declaration_batch_start_(scope->start_position()) {
1788 *scope_stack_ = scope; 1801 *scope_stack_ = scope;
1789 *function_state_stack = this; 1802 *function_state_stack = this;
1790 } 1803 }
1791 1804
1792 1805
1793 template <class Traits> 1806 template <class Traits>
1794 ParserBase<Traits>::FunctionState::~FunctionState() { 1807 ParserBase<Traits>::FunctionState::~FunctionState() {
1795 *scope_stack_ = outer_scope_; 1808 *scope_stack_ = outer_scope_;
1796 *function_state_stack_ = outer_function_state_; 1809 *function_state_stack_ = outer_function_state_;
1797 } 1810 }
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after
3085 } 3098 }
3086 if (num_parameters > Code::kMaxArguments) { 3099 if (num_parameters > Code::kMaxArguments) {
3087 ReportMessageAt(Scanner::Location(params_ast->position(), position()), 3100 ReportMessageAt(Scanner::Location(params_ast->position(), position()),
3088 "too_many_parameters"); 3101 "too_many_parameters");
3089 *ok = false; 3102 *ok = false;
3090 return this->EmptyExpression(); 3103 return this->EmptyExpression();
3091 } 3104 }
3092 3105
3093 Expect(Token::ARROW, CHECK_OK); 3106 Expect(Token::ARROW, CHECK_OK);
3094 3107
3108 function_state.set_consecutive_class_declaration_batch_start(
3109 scanner()->location().beg_pos);
3095 if (peek() == Token::LBRACE) { 3110 if (peek() == Token::LBRACE) {
3096 // Multiple statement body 3111 // Multiple statement body
3097 Consume(Token::LBRACE); 3112 Consume(Token::LBRACE);
3098 bool is_lazily_parsed = 3113 bool is_lazily_parsed =
3099 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); 3114 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation());
3100 if (is_lazily_parsed) { 3115 if (is_lazily_parsed) {
3101 body = this->NewStatementList(0, zone()); 3116 body = this->NewStatementList(0, zone());
3102 this->SkipLazyFunctionBody(this->EmptyIdentifier(), 3117 this->SkipLazyFunctionBody(this->EmptyIdentifier(),
3103 &materialized_literal_count, 3118 &materialized_literal_count,
3104 &expected_property_count, CHECK_OK); 3119 &expected_property_count, CHECK_OK);
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 *ok = false; 3356 *ok = false;
3342 return; 3357 return;
3343 } 3358 }
3344 has_seen_constructor_ = true; 3359 has_seen_constructor_ = true;
3345 return; 3360 return;
3346 } 3361 }
3347 } 3362 }
3348 } } // v8::internal 3363 } } // v8::internal
3349 3364
3350 #endif // V8_PREPARSER_H 3365 #endif // V8_PREPARSER_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698