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

Side by Side Diff: src/parsing/parser.cc

Issue 1708193003: Reduce the memory footprint of expression classifiers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Introduce implementation-limit error (too many non-pattern rewrites) Created 4 years, 6 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
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 2500 matching lines...) Expand 10 before | Expand all | Expand 10 after
2511 int pos = peek_position(); 2511 int pos = peek_position();
2512 2512
2513 switch (peek()) { 2513 switch (peek()) {
2514 case Token::FUNCTION: 2514 case Token::FUNCTION:
2515 case Token::LBRACE: 2515 case Token::LBRACE:
2516 UNREACHABLE(); // Always handled by the callers. 2516 UNREACHABLE(); // Always handled by the callers.
2517 case Token::CLASS: 2517 case Token::CLASS:
2518 ReportUnexpectedToken(Next()); 2518 ReportUnexpectedToken(Next());
2519 *ok = false; 2519 *ok = false;
2520 return nullptr; 2520 return nullptr;
2521
2522 default: 2521 default:
2523 break; 2522 break;
2524 } 2523 }
2525 2524
2526 bool starts_with_idenfifier = peek_any_identifier(); 2525 bool starts_with_idenfifier = peek_any_identifier();
2527 Expression* expr = ParseExpression(true, CHECK_OK); 2526 Expression* expr = ParseExpression(true, CHECK_OK);
2528 if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL && 2527 if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL &&
2529 expr->AsVariableProxy() != NULL && 2528 expr->AsVariableProxy() != NULL &&
2530 !expr->AsVariableProxy()->is_this()) { 2529 !expr->AsVariableProxy()->is_this()) {
2531 // Expression is a single identifier, and not, e.g., a parenthesized 2530 // Expression is a single identifier, and not, e.g., a parenthesized
(...skipping 3063 matching lines...) Expand 10 before | Expand all | Expand 10 after
5595 Expression* async_function_await = parser_->factory()->NewCallRuntime( 5594 Expression* async_function_await = parser_->factory()->NewCallRuntime(
5596 Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args, 5595 Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args,
5597 RelocInfo::kNoPosition); 5596 RelocInfo::kNoPosition);
5598 5597
5599 generator_object = 5598 generator_object =
5600 parser_->factory()->NewVariableProxy(generator_object_variable); 5599 parser_->factory()->NewVariableProxy(generator_object_variable);
5601 return parser_->factory()->NewYield(generator_object, async_function_await, 5600 return parser_->factory()->NewYield(generator_object, async_function_await,
5602 pos); 5601 pos);
5603 } 5602 }
5604 5603
5604 ZoneList<Expression*>* ParserTraits::GetNonPatternList() const {
5605 return parser_->function_state_->non_patterns_to_rewrite();
5606 }
5607
5608
5609 ZoneList<typename ParserTraits::Type::ExpressionClassifier::Error>*
5610 ParserTraits::GetReportedErrorList() const {
5611 return parser_->function_state_->GetReportedErrorList();
5612 }
5613
5614
5605 Zone* ParserTraits::zone() const { 5615 Zone* ParserTraits::zone() const {
5606 return parser_->function_state_->scope()->zone(); 5616 return parser_->function_state_->scope()->zone();
5607 } 5617 }
5608 5618
5609 5619
5610 ZoneList<Expression*>* ParserTraits::GetNonPatternList() const {
5611 return parser_->function_state_->non_patterns_to_rewrite();
5612 }
5613
5614
5615 class NonPatternRewriter : public AstExpressionRewriter { 5620 class NonPatternRewriter : public AstExpressionRewriter {
5616 public: 5621 public:
5617 NonPatternRewriter(uintptr_t stack_limit, Parser* parser) 5622 NonPatternRewriter(uintptr_t stack_limit, Parser* parser)
5618 : AstExpressionRewriter(stack_limit), parser_(parser) {} 5623 : AstExpressionRewriter(stack_limit), parser_(parser) {}
5619 ~NonPatternRewriter() override {} 5624 ~NonPatternRewriter() override {}
5620 5625
5621 private: 5626 private:
5622 bool RewriteExpression(Expression* expr) override { 5627 bool RewriteExpression(Expression* expr) override {
5623 if (expr->IsRewritableExpression()) return true; 5628 if (expr->IsRewritableExpression()) return true;
5624 // Rewrite only what could have been a pattern but is not. 5629 // Rewrite only what could have been a pattern but is not.
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
5818 } 5823 }
5819 5824
5820 5825
5821 void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) { 5826 void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) {
5822 DCHECK(expr->IsRewritableExpression()); 5827 DCHECK(expr->IsRewritableExpression());
5823 parser_->function_state_->AddDestructuringAssignment( 5828 parser_->function_state_->AddDestructuringAssignment(
5824 Parser::DestructuringAssignment(expr, parser_->scope_)); 5829 Parser::DestructuringAssignment(expr, parser_->scope_));
5825 } 5830 }
5826 5831
5827 5832
5828 void ParserTraits::QueueNonPatternForRewriting(Expression* expr) { 5833 void ParserTraits::QueueNonPatternForRewriting(Expression* expr, bool* ok) {
5829 DCHECK(expr->IsRewritableExpression()); 5834 DCHECK(expr->IsRewritableExpression());
5830 parser_->function_state_->AddNonPatternForRewriting(expr); 5835 parser_->function_state_->AddNonPatternForRewriting(expr, ok);
5831 } 5836 }
5832 5837
5833 5838
5834 void ParserTraits::SetFunctionNameFromPropertyName( 5839 void ParserTraits::SetFunctionNameFromPropertyName(
5835 ObjectLiteralProperty* property, const AstRawString* name) { 5840 ObjectLiteralProperty* property, const AstRawString* name) {
5836 Expression* value = property->value(); 5841 Expression* value = property->value();
5837 5842
5838 // Computed name setting must happen at runtime. 5843 // Computed name setting must happen at runtime.
5839 if (property->is_computed_name()) return; 5844 if (property->is_computed_name()) return;
5840 5845
(...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after
6912 try_block, target); 6917 try_block, target);
6913 final_loop = target; 6918 final_loop = target;
6914 } 6919 }
6915 6920
6916 return final_loop; 6921 return final_loop;
6917 } 6922 }
6918 6923
6919 6924
6920 } // namespace internal 6925 } // namespace internal
6921 } // namespace v8 6926 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698