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

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

Issue 2042793002: Fix scope flags for default parameters (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Another propagate call 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 | « no previous file | no next file » | 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 4536 matching lines...) Expand 10 before | Expand all | Expand 10 after
4547 rewriter.Run(); 4547 rewriter.Run();
4548 } 4548 }
4549 4549
4550 4550
4551 Block* Parser::BuildParameterInitializationBlock( 4551 Block* Parser::BuildParameterInitializationBlock(
4552 const ParserFormalParameters& parameters, bool* ok) { 4552 const ParserFormalParameters& parameters, bool* ok) {
4553 DCHECK(!parameters.is_simple); 4553 DCHECK(!parameters.is_simple);
4554 DCHECK(scope_->is_function_scope()); 4554 DCHECK(scope_->is_function_scope());
4555 Block* init_block = 4555 Block* init_block =
4556 factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); 4556 factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition);
4557 ZoneList<Scope*>* param_scopes = new (zone()) ZoneList<Scope*>(0, zone());
4557 for (int i = 0; i < parameters.params.length(); ++i) { 4558 for (int i = 0; i < parameters.params.length(); ++i) {
4558 auto parameter = parameters.params[i]; 4559 auto parameter = parameters.params[i];
4559 if (parameter.is_rest && parameter.pattern->IsVariableProxy()) break; 4560 if (parameter.is_rest && parameter.pattern->IsVariableProxy()) break;
4560 DeclarationDescriptor descriptor; 4561 DeclarationDescriptor descriptor;
4561 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; 4562 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER;
4562 descriptor.parser = this; 4563 descriptor.parser = this;
4563 descriptor.scope = scope_; 4564 descriptor.scope = scope_;
4564 descriptor.hoist_scope = nullptr; 4565 descriptor.hoist_scope = nullptr;
4565 descriptor.mode = LET; 4566 descriptor.mode = LET;
4566 descriptor.declaration_pos = parameter.pattern->position(); 4567 descriptor.declaration_pos = parameter.pattern->position();
(...skipping 21 matching lines...) Expand all
4588 RelocInfo::kNoPosition); 4589 RelocInfo::kNoPosition);
4589 initial_value = factory()->NewConditional( 4590 initial_value = factory()->NewConditional(
4590 condition, parameter.initializer, initial_value, 4591 condition, parameter.initializer, initial_value,
4591 RelocInfo::kNoPosition); 4592 RelocInfo::kNoPosition);
4592 descriptor.initialization_pos = parameter.initializer->position(); 4593 descriptor.initialization_pos = parameter.initializer->position();
4593 initializer_position = parameter.initializer_end_position; 4594 initializer_position = parameter.initializer_end_position;
4594 } 4595 }
4595 4596
4596 Scope* param_scope = scope_; 4597 Scope* param_scope = scope_;
4597 Block* param_block = init_block; 4598 Block* param_block = init_block;
4598 if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { 4599 if (!parameter.is_simple()) {
4599 param_scope = NewScope(scope_, BLOCK_SCOPE); 4600 param_scope = NewScope(scope_, BLOCK_SCOPE);
4600 param_scope->set_is_declaration_scope(); 4601 param_scope->set_is_declaration_scope();
4601 param_scope->set_start_position(descriptor.initialization_pos); 4602 param_scope->set_start_position(descriptor.initialization_pos);
4602 param_scope->set_end_position(parameter.initializer_end_position); 4603 param_scope->set_end_position(parameter.initializer_end_position);
4603 param_scope->RecordEvalCall(); 4604 param_scopes->Add(param_scope, zone());
4605 scope_->PropagateUsageFlagsToScope(param_scope);
adamk 2016/06/06 18:53:36 This is where we have to make the call, so that th
4604 param_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); 4606 param_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition);
4605 param_block->set_scope(param_scope); 4607 param_block->set_scope(param_scope);
4606 descriptor.hoist_scope = scope_; 4608 descriptor.hoist_scope = scope_;
4607 } 4609 }
4608 4610
4609 { 4611 {
4610 BlockState block_state(&scope_, param_scope); 4612 BlockState block_state(&scope_, param_scope);
4611 DeclarationParsingResult::Declaration decl( 4613 DeclarationParsingResult::Declaration decl(
4612 parameter.pattern, initializer_position, initial_value); 4614 parameter.pattern, initializer_position, initial_value);
4613 PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor, 4615 PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor,
4614 &decl, nullptr, CHECK_OK); 4616 &decl, nullptr, CHECK_OK);
4615 } 4617 }
4616 4618
4617 if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { 4619 if (!parameter.is_simple()) {
4618 param_scope = param_scope->FinalizeBlockScope(); 4620 param_scope = param_scope->FinalizeBlockScope();
4619 if (param_scope != nullptr) { 4621 if (param_scope != nullptr) {
4620 CheckConflictingVarDeclarations(param_scope, CHECK_OK); 4622 CheckConflictingVarDeclarations(param_scope, CHECK_OK);
4621 } 4623 }
4622 init_block->statements()->Add(param_block, zone()); 4624 init_block->statements()->Add(param_block, zone());
4623 } 4625 }
4624 } 4626 }
4627 for (Scope* param_scope : *param_scopes) {
4628 scope_->PropagateUsageFlagsToScope(param_scope);
adamk 2016/06/06 18:53:36 This call is now redundant, right?
4629 }
4625 return init_block; 4630 return init_block;
4626 } 4631 }
4627 4632
4628 Block* Parser::BuildRejectPromiseOnException(Block* block) { 4633 Block* Parser::BuildRejectPromiseOnException(Block* block) {
4629 // try { <block> } catch (error) { return Promise.reject(error); } 4634 // try { <block> } catch (error) { return Promise.reject(error); }
4630 Block* try_block = block; 4635 Block* try_block = block;
4631 Scope* catch_scope = NewScope(scope_, CATCH_SCOPE); 4636 Scope* catch_scope = NewScope(scope_, CATCH_SCOPE);
4632 catch_scope->set_is_hidden(); 4637 catch_scope->set_is_hidden();
4633 Variable* catch_variable = 4638 Variable* catch_variable =
4634 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, 4639 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
(...skipping 2325 matching lines...) Expand 10 before | Expand all | Expand 10 after
6960 try_block, target); 6965 try_block, target);
6961 final_loop = target; 6966 final_loop = target;
6962 } 6967 }
6963 6968
6964 return final_loop; 6969 return final_loop;
6965 } 6970 }
6966 6971
6967 6972
6968 } // namespace internal 6973 } // namespace internal
6969 } // namespace v8 6974 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698