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

Side by Side Diff: src/parsing/parser-base.h

Issue 1708193003: Reduce the memory footprint of expression classifiers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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_PARSING_PARSER_BASE_H 5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H 6 #define V8_PARSING_PARSER_BASE_H
7 7
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/hashmap.h" 10 #include "src/hashmap.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 const List<DestructuringAssignment>& destructuring_assignments_to_rewrite() 241 const ZoneList<DestructuringAssignment>&
242 const { 242 destructuring_assignments_to_rewrite() const {
243 return destructuring_assignments_to_rewrite_; 243 return destructuring_assignments_to_rewrite_;
244 } 244 }
245 245
246 List<ExpressionT>& expressions_in_tail_position() { 246 ZoneList<typename ExpressionClassifier::Error>* GetReportedErrorList() {
247 return &reported_errors_;
248 }
249
250 ZoneList<ExpressionT>& expressions_in_tail_position() {
247 return expressions_in_tail_position_; 251 return expressions_in_tail_position_;
248 } 252 }
249 void AddExpressionInTailPosition(ExpressionT expression) { 253 void AddExpressionInTailPosition(ExpressionT expression) {
250 if (collect_expressions_in_tail_position_) { 254 if (collect_expressions_in_tail_position_) {
251 expressions_in_tail_position_.Add(expression); 255 expressions_in_tail_position_.Add(expression, scope()->zone());
252 } 256 }
253 } 257 }
254 258
255 bool collect_expressions_in_tail_position() const { 259 bool collect_expressions_in_tail_position() const {
256 return collect_expressions_in_tail_position_; 260 return collect_expressions_in_tail_position_;
257 } 261 }
258 void set_collect_expressions_in_tail_position(bool collect) { 262 void set_collect_expressions_in_tail_position(bool collect) {
259 collect_expressions_in_tail_position_ = collect; 263 collect_expressions_in_tail_position_ = collect;
260 } 264 }
261 265
262 ZoneList<ExpressionT>* non_patterns_to_rewrite() { 266 ZoneList<ExpressionT>* non_patterns_to_rewrite() {
263 return &non_patterns_to_rewrite_; 267 return &non_patterns_to_rewrite_;
264 } 268 }
265 269
266 private: 270 private:
267 void AddDestructuringAssignment(DestructuringAssignment pair) { 271 void AddDestructuringAssignment(DestructuringAssignment pair) {
268 destructuring_assignments_to_rewrite_.Add(pair); 272 destructuring_assignments_to_rewrite_.Add(pair, scope()->zone());
269 } 273 }
270 274
271 V8_INLINE Scope* scope() { return *scope_stack_; } 275 V8_INLINE Scope* scope() { return *scope_stack_; }
272 276
273 void AddNonPatternForRewriting(ExpressionT expr) { 277 void AddNonPatternForRewriting(ExpressionT expr) {
274 non_patterns_to_rewrite_.Add(expr, (*scope_stack_)->zone()); 278 non_patterns_to_rewrite_.Add(expr, scope()->zone());
275 } 279 }
276 280
277 // Used to assign an index to each literal that needs materialization in 281 // Used to assign an index to each literal that needs materialization in
278 // the function. Includes regexp literals, and boilerplate for object and 282 // the function. Includes regexp literals, and boilerplate for object and
279 // array literals. 283 // array literals.
280 int next_materialized_literal_index_; 284 int next_materialized_literal_index_;
281 285
282 // Properties count estimation. 286 // Properties count estimation.
283 int expected_property_count_; 287 int expected_property_count_;
284 288
(...skipping 10 matching lines...) Expand all
295 // For generators, this variable may hold the generator object. It variable 299 // For generators, this variable may hold the generator object. It variable
296 // is used by yield expressions and return statements. It is not necessary 300 // is used by yield expressions and return statements. It is not necessary
297 // for generator functions to have this variable set. 301 // for generator functions to have this variable set.
298 Variable* generator_object_variable_; 302 Variable* generator_object_variable_;
299 303
300 FunctionState** function_state_stack_; 304 FunctionState** function_state_stack_;
301 FunctionState* outer_function_state_; 305 FunctionState* outer_function_state_;
302 Scope** scope_stack_; 306 Scope** scope_stack_;
303 Scope* outer_scope_; 307 Scope* outer_scope_;
304 308
305 List<DestructuringAssignment> destructuring_assignments_to_rewrite_; 309 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_;
306 List<ExpressionT> expressions_in_tail_position_; 310 ZoneList<ExpressionT> non_patterns_to_rewrite_;
311 ZoneList<typename ExpressionClassifier::Error> reported_errors_;
312 ZoneList<ExpressionT> expressions_in_tail_position_;
307 bool collect_expressions_in_tail_position_; 313 bool collect_expressions_in_tail_position_;
308 ZoneList<ExpressionT> non_patterns_to_rewrite_;
309 314
310 typename Traits::Type::Factory* factory_; 315 typename Traits::Type::Factory* factory_;
311 316
312 friend class ParserTraits; 317 friend class ParserTraits;
313 friend class PreParserTraits; 318 friend class PreParserTraits;
314 friend class Checkpoint; 319 friend class Checkpoint;
315 }; 320 };
316 321
317 // Annoyingly, arrow functions first parse as comma expressions, then when we 322 // Annoyingly, arrow functions first parse as comma expressions, then when we
318 // see the => we have to go back and reinterpret the arguments as being formal 323 // see the => we have to go back and reinterpret the arguments as being formal
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 expected_property_count_(0), 965 expected_property_count_(0),
961 this_location_(Scanner::Location::invalid()), 966 this_location_(Scanner::Location::invalid()),
962 return_location_(Scanner::Location::invalid()), 967 return_location_(Scanner::Location::invalid()),
963 super_location_(Scanner::Location::invalid()), 968 super_location_(Scanner::Location::invalid()),
964 kind_(kind), 969 kind_(kind),
965 generator_object_variable_(NULL), 970 generator_object_variable_(NULL),
966 function_state_stack_(function_state_stack), 971 function_state_stack_(function_state_stack),
967 outer_function_state_(*function_state_stack), 972 outer_function_state_(*function_state_stack),
968 scope_stack_(scope_stack), 973 scope_stack_(scope_stack),
969 outer_scope_(*scope_stack), 974 outer_scope_(*scope_stack),
975 destructuring_assignments_to_rewrite_(16, scope->zone()),
976 non_patterns_to_rewrite_(0, scope->zone()),
977 reported_errors_(16, scope->zone()),
978 expressions_in_tail_position_(4, scope->zone()),
970 collect_expressions_in_tail_position_(true), 979 collect_expressions_in_tail_position_(true),
971 non_patterns_to_rewrite_(0, scope->zone()),
972 factory_(factory) { 980 factory_(factory) {
973 *scope_stack_ = scope; 981 *scope_stack_ = scope;
974 *function_state_stack = this; 982 *function_state_stack = this;
975 } 983 }
976 984
977 985
978 template <class Traits> 986 template <class Traits>
979 ParserBase<Traits>::FunctionState::~FunctionState() { 987 ParserBase<Traits>::FunctionState::~FunctionState() {
980 *scope_stack_ = outer_scope_; 988 *scope_stack_ = outer_scope_;
981 *function_state_stack_ = outer_function_state_; 989 *function_state_stack_ = outer_function_state_;
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 if (peek() == Token::ELLIPSIS) { 1467 if (peek() == Token::ELLIPSIS) {
1460 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only 1468 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only
1461 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a 1469 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a
1462 // valid expression or binding pattern. 1470 // valid expression or binding pattern.
1463 ExpressionUnexpectedToken(classifier); 1471 ExpressionUnexpectedToken(classifier);
1464 BindingPatternUnexpectedToken(classifier); 1472 BindingPatternUnexpectedToken(classifier);
1465 Consume(Token::ELLIPSIS); 1473 Consume(Token::ELLIPSIS);
1466 seen_rest = is_rest = true; 1474 seen_rest = is_rest = true;
1467 } 1475 }
1468 int pos = position(), expr_pos = peek_position(); 1476 int pos = position(), expr_pos = peek_position();
1477 ExpressionClassifier binding_classifier(this);
1469 ExpressionT right = this->ParseAssignmentExpression( 1478 ExpressionT right = this->ParseAssignmentExpression(
1470 accept_IN, &binding_classifier, CHECK_OK); 1479 accept_IN, &binding_classifier, CHECK_OK);
1471 classifier->Accumulate(&binding_classifier, 1480 classifier->Accumulate(&binding_classifier,
1472 ExpressionClassifier::AllProductions); 1481 ExpressionClassifier::AllProductions);
1473 if (is_rest) { 1482 if (is_rest) {
1474 if (!this->IsIdentifier(right) && !IsValidPattern(right)) { 1483 if (!this->IsIdentifier(right) && !IsValidPattern(right)) {
1475 classifier->RecordArrowFormalParametersError( 1484 classifier->RecordArrowFormalParametersError(
1476 Scanner::Location(pos, scanner()->location().end_pos), 1485 Scanner::Location(pos, scanner()->location().end_pos),
1477 MessageTemplate::kInvalidRestParameter); 1486 MessageTemplate::kInvalidRestParameter);
1478 } 1487 }
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 ParserBase<Traits>::Checkpoint checkpoint(this); 1980 ParserBase<Traits>::Checkpoint checkpoint(this);
1972 ExpressionClassifier arrow_formals_classifier(this, 1981 ExpressionClassifier arrow_formals_classifier(this,
1973 classifier->duplicate_finder()); 1982 classifier->duplicate_finder());
1974 bool parenthesized_formals = peek() == Token::LPAREN; 1983 bool parenthesized_formals = peek() == Token::LPAREN;
1975 if (!parenthesized_formals) { 1984 if (!parenthesized_formals) {
1976 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); 1985 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier);
1977 } 1986 }
1978 ExpressionT expression = this->ParseConditionalExpression( 1987 ExpressionT expression = this->ParseConditionalExpression(
1979 accept_IN, &arrow_formals_classifier, CHECK_OK); 1988 accept_IN, &arrow_formals_classifier, CHECK_OK);
1980 if (peek() == Token::ARROW) { 1989 if (peek() == Token::ARROW) {
1981 classifier->RecordPatternError(scanner()->peek_location(), 1990 typename ExpressionClassifier::Error e1 =
1982 MessageTemplate::kUnexpectedToken, 1991 ExpressionClassifier::BindingPatternError(
caitp (gmail) 2016/02/18 17:04:09 A thought I had on this duplication: A BindingPat
nickie 2016/02/19 08:56:31 I'm sorry, I'm not confident enough to talk about
1983 Token::String(Token::ARROW)); 1992 scanner()->peek_location(), MessageTemplate::kUnexpectedToken,
1993 Token::String(Token::ARROW));
1994 typename ExpressionClassifier::Error e2 =
1995 ExpressionClassifier::AssignmentPatternError(
1996 scanner()->peek_location(), MessageTemplate::kUnexpectedToken,
1997 Token::String(Token::ARROW));
1984 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, 1998 ValidateArrowFormalParameters(&arrow_formals_classifier, expression,
1985 parenthesized_formals, CHECK_OK); 1999 parenthesized_formals, CHECK_OK);
1986 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos); 2000 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos);
1987 Scope* scope = 2001 Scope* scope =
1988 this->NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction); 2002 this->NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction);
1989 // Because the arrow's parameters were parsed in the outer scope, any 2003 // Because the arrow's parameters were parsed in the outer scope, any
1990 // usage flags that might have been triggered there need to be copied 2004 // usage flags that might have been triggered there need to be copied
1991 // to the arrow scope. 2005 // to the arrow scope.
1992 scope_->PropagateUsageFlagsToScope(scope); 2006 scope_->PropagateUsageFlagsToScope(scope);
1993 FormalParametersT parameters(scope); 2007 FormalParametersT parameters(scope);
1994 if (!arrow_formals_classifier.is_simple_parameter_list()) { 2008 if (!arrow_formals_classifier.is_simple_parameter_list()) {
1995 scope->SetHasNonSimpleParameters(); 2009 scope->SetHasNonSimpleParameters();
1996 parameters.is_simple = false; 2010 parameters.is_simple = false;
1997 } 2011 }
1998 2012
1999 checkpoint.Restore(&parameters.materialized_literals_count); 2013 checkpoint.Restore(&parameters.materialized_literals_count);
2000 2014
2001 scope->set_start_position(lhs_beg_pos); 2015 scope->set_start_position(lhs_beg_pos);
2002 Scanner::Location duplicate_loc = Scanner::Location::invalid(); 2016 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2003 this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc, 2017 this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc,
2004 &duplicate_loc, CHECK_OK); 2018 &duplicate_loc, CHECK_OK);
2005 if (duplicate_loc.IsValid()) { 2019 if (duplicate_loc.IsValid()) {
2006 arrow_formals_classifier.RecordDuplicateFormalParameterError( 2020 arrow_formals_classifier.RecordDuplicateFormalParameterError(
2007 duplicate_loc); 2021 duplicate_loc);
2008 } 2022 }
2009 expression = this->ParseArrowFunctionLiteral( 2023 expression = this->ParseArrowFunctionLiteral(
2010 accept_IN, parameters, arrow_formals_classifier, CHECK_OK); 2024 accept_IN, parameters, arrow_formals_classifier, CHECK_OK);
2025 arrow_formals_classifier.Discard();
2026 classifier->RecordBindingPatternError(e1);
2027 classifier->RecordAssignmentPatternError(e2);
2011 2028
2012 if (fni_ != nullptr) fni_->Infer(); 2029 if (fni_ != nullptr) fni_->Infer();
2013 2030
2014 return expression; 2031 return expression;
2015 } 2032 }
2016 2033
2017 if (this->IsValidReferenceExpression(expression)) { 2034 if (this->IsValidReferenceExpression(expression)) {
2018 arrow_formals_classifier.ForgiveAssignmentPatternError(); 2035 arrow_formals_classifier.ForgiveAssignmentPatternError();
2019 } 2036 }
2020 2037
(...skipping 1341 matching lines...) Expand 10 before | Expand all | Expand 10 after
3362 has_seen_constructor_ = true; 3379 has_seen_constructor_ = true;
3363 return; 3380 return;
3364 } 3381 }
3365 } 3382 }
3366 3383
3367 3384
3368 } // namespace internal 3385 } // namespace internal
3369 } // namespace v8 3386 } // namespace v8
3370 3387
3371 #endif // V8_PARSING_PARSER_BASE_H 3388 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698