| OLD | NEW | 
|---|
| 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/parser.h" | 5 #include "src/parser.h" | 
| 6 | 6 | 
| 7 #include "src/api.h" | 7 #include "src/api.h" | 
| 8 #include "src/ast.h" | 8 #include "src/ast.h" | 
| 9 #include "src/ast-literal-reindexer.h" | 9 #include "src/ast-literal-reindexer.h" | 
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" | 
| (...skipping 4070 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4081     DCHECK(parser_->allow_harmony_default_parameters()); | 4081     DCHECK(parser_->allow_harmony_default_parameters()); | 
| 4082     DCHECK(!assignment->is_compound()); | 4082     DCHECK(!assignment->is_compound()); | 
| 4083     initializer = assignment->value(); | 4083     initializer = assignment->value(); | 
| 4084     expr = assignment->target(); | 4084     expr = assignment->target(); | 
| 4085 | 4085 | 
| 4086     // TODO(adamk): Only call this if necessary. | 4086     // TODO(adamk): Only call this if necessary. | 
| 4087     RewriteParameterInitializerScope(parser_->stack_limit(), initializer, | 4087     RewriteParameterInitializerScope(parser_->stack_limit(), initializer, | 
| 4088                                      parser_->scope_, parameters->scope); | 4088                                      parser_->scope_, parameters->scope); | 
| 4089   } | 4089   } | 
| 4090 | 4090 | 
| 4091   AddFormalParameter(parameters, expr, initializer, is_rest); | 4091   // TODO(adamk): params_loc.end_pos is not the correct initializer position, | 
|  | 4092   // but it should be conservative enough to trigger hole checks for variables | 
|  | 4093   // referenced in the initializer (if any). | 
|  | 4094   AddFormalParameter(parameters, expr, initializer, params_loc.end_pos, | 
|  | 4095                      is_rest); | 
| 4092 } | 4096 } | 
| 4093 | 4097 | 
| 4094 | 4098 | 
| 4095 DoExpression* Parser::ParseDoExpression(bool* ok) { | 4099 DoExpression* Parser::ParseDoExpression(bool* ok) { | 
| 4096   // AssignmentExpression :: | 4100   // AssignmentExpression :: | 
| 4097   //     do '{' StatementList '}' | 4101   //     do '{' StatementList '}' | 
| 4098   int pos = peek_position(); | 4102   int pos = peek_position(); | 
| 4099 | 4103 | 
| 4100   Expect(Token::DO, CHECK_OK); | 4104   Expect(Token::DO, CHECK_OK); | 
| 4101   Variable* result = | 4105   Variable* result = | 
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4543     DeclarationDescriptor descriptor; | 4547     DeclarationDescriptor descriptor; | 
| 4544     descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; | 4548     descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; | 
| 4545     descriptor.parser = this; | 4549     descriptor.parser = this; | 
| 4546     descriptor.declaration_scope = scope_; | 4550     descriptor.declaration_scope = scope_; | 
| 4547     descriptor.scope = scope_; | 4551     descriptor.scope = scope_; | 
| 4548     descriptor.hoist_scope = nullptr; | 4552     descriptor.hoist_scope = nullptr; | 
| 4549     descriptor.mode = LET; | 4553     descriptor.mode = LET; | 
| 4550     descriptor.is_const = false; | 4554     descriptor.is_const = false; | 
| 4551     descriptor.needs_init = true; | 4555     descriptor.needs_init = true; | 
| 4552     descriptor.declaration_pos = parameter.pattern->position(); | 4556     descriptor.declaration_pos = parameter.pattern->position(); | 
|  | 4557     // The position that will be used by the AssignmentExpression | 
|  | 4558     // which copies from the temp parameter to the pattern. | 
|  | 4559     // | 
|  | 4560     // TODO(adamk): Should this be RelocInfo::kNoPosition, since | 
|  | 4561     // it's just copying from a temp var to the real param var? | 
| 4553     descriptor.initialization_pos = parameter.pattern->position(); | 4562     descriptor.initialization_pos = parameter.pattern->position(); | 
|  | 4563     // The initializer position which will end up in, | 
|  | 4564     // Variable::initializer_position(), used for hole check elimination. | 
|  | 4565     int initializer_position = parameter.pattern->position(); | 
| 4554     Expression* initial_value = | 4566     Expression* initial_value = | 
| 4555         factory()->NewVariableProxy(parameters.scope->parameter(i)); | 4567         factory()->NewVariableProxy(parameters.scope->parameter(i)); | 
| 4556     if (parameter.initializer != nullptr) { | 4568     if (parameter.initializer != nullptr) { | 
| 4557       // IS_UNDEFINED($param) ? initializer : $param | 4569       // IS_UNDEFINED($param) ? initializer : $param | 
| 4558       DCHECK(!parameter.is_rest); | 4570       DCHECK(!parameter.is_rest); | 
| 4559       auto condition = factory()->NewCompareOperation( | 4571       auto condition = factory()->NewCompareOperation( | 
| 4560           Token::EQ_STRICT, | 4572           Token::EQ_STRICT, | 
| 4561           factory()->NewVariableProxy(parameters.scope->parameter(i)), | 4573           factory()->NewVariableProxy(parameters.scope->parameter(i)), | 
| 4562           factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), | 4574           factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), | 
| 4563           RelocInfo::kNoPosition); | 4575           RelocInfo::kNoPosition); | 
| 4564       initial_value = factory()->NewConditional( | 4576       initial_value = factory()->NewConditional( | 
| 4565           condition, parameter.initializer, initial_value, | 4577           condition, parameter.initializer, initial_value, | 
| 4566           RelocInfo::kNoPosition); | 4578           RelocInfo::kNoPosition); | 
| 4567       descriptor.initialization_pos = parameter.initializer->position(); | 4579       descriptor.initialization_pos = parameter.initializer->position(); | 
|  | 4580       initializer_position = parameter.initializer_end_position; | 
| 4568     } else if (parameter.is_rest) { | 4581     } else if (parameter.is_rest) { | 
| 4569       // $rest = []; | 4582       // $rest = []; | 
| 4570       // for (var $argument_index = $rest_index; | 4583       // for (var $argument_index = $rest_index; | 
| 4571       //      $argument_index < %_ArgumentsLength(); | 4584       //      $argument_index < %_ArgumentsLength(); | 
| 4572       //      ++$argument_index) { | 4585       //      ++$argument_index) { | 
| 4573       //   %AppendElement($rest, %_Arguments($argument_index)); | 4586       //   %AppendElement($rest, %_Arguments($argument_index)); | 
| 4574       // } | 4587       // } | 
| 4575       // let <param> = $rest; | 4588       // let <param> = $rest; | 
| 4576       DCHECK(parameter.pattern->IsVariableProxy()); | 4589       DCHECK(parameter.pattern->IsVariableProxy()); | 
| 4577       DCHECK_EQ(i, parameters.params.length() - 1); | 4590       DCHECK_EQ(i, parameters.params.length() - 1); | 
| 4578 | 4591 | 
| 4579       int pos = parameter.pattern->position(); |  | 
| 4580       Variable* temp_var = parameters.scope->parameter(i); | 4592       Variable* temp_var = parameters.scope->parameter(i); | 
| 4581       auto empty_values = new (zone()) ZoneList<Expression*>(0, zone()); | 4593       auto empty_values = new (zone()) ZoneList<Expression*>(0, zone()); | 
| 4582       auto empty_array = factory()->NewArrayLiteral( | 4594       auto empty_array = factory()->NewArrayLiteral( | 
| 4583           empty_values, parameters.rest_array_literal_index, | 4595           empty_values, parameters.rest_array_literal_index, | 
| 4584           is_strong(language_mode()), RelocInfo::kNoPosition); | 4596           is_strong(language_mode()), RelocInfo::kNoPosition); | 
| 4585 | 4597 | 
| 4586       auto init_array = factory()->NewAssignment( | 4598       auto init_array = factory()->NewAssignment( | 
| 4587           Token::INIT, factory()->NewVariableProxy(temp_var), empty_array, | 4599           Token::INIT, factory()->NewVariableProxy(temp_var), empty_array, | 
| 4588           RelocInfo::kNoPosition); | 4600           RelocInfo::kNoPosition); | 
| 4589 | 4601 | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4633                                     RelocInfo::kNoPosition), | 4645                                     RelocInfo::kNoPosition), | 
| 4634           RelocInfo::kNoPosition); | 4646           RelocInfo::kNoPosition); | 
| 4635 | 4647 | 
| 4636       loop->Initialize(init, cond, next, body); | 4648       loop->Initialize(init, cond, next, body); | 
| 4637 | 4649 | 
| 4638       init_block->statements()->Add( | 4650       init_block->statements()->Add( | 
| 4639           factory()->NewExpressionStatement(init_array, RelocInfo::kNoPosition), | 4651           factory()->NewExpressionStatement(init_array, RelocInfo::kNoPosition), | 
| 4640           zone()); | 4652           zone()); | 
| 4641 | 4653 | 
| 4642       init_block->statements()->Add(loop, zone()); | 4654       init_block->statements()->Add(loop, zone()); | 
| 4643 |  | 
| 4644       descriptor.initialization_pos = pos; |  | 
| 4645     } | 4655     } | 
| 4646 | 4656 | 
| 4647     Scope* param_scope = scope_; | 4657     Scope* param_scope = scope_; | 
| 4648     Block* param_block = init_block; | 4658     Block* param_block = init_block; | 
| 4649     if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { | 4659     if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { | 
| 4650       param_scope = NewScope(scope_, BLOCK_SCOPE); | 4660       param_scope = NewScope(scope_, BLOCK_SCOPE); | 
| 4651       param_scope->set_is_declaration_scope(); | 4661       param_scope->set_is_declaration_scope(); | 
| 4652       param_scope->set_start_position(parameter.pattern->position()); | 4662       param_scope->set_start_position(parameter.pattern->position()); | 
| 4653       param_scope->set_end_position(RelocInfo::kNoPosition); | 4663       param_scope->set_end_position(RelocInfo::kNoPosition); | 
| 4654       param_scope->RecordEvalCall(); | 4664       param_scope->RecordEvalCall(); | 
| 4655       param_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); | 4665       param_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); | 
| 4656       param_block->set_scope(param_scope); | 4666       param_block->set_scope(param_scope); | 
| 4657       descriptor.hoist_scope = scope_; | 4667       descriptor.hoist_scope = scope_; | 
| 4658     } | 4668     } | 
| 4659 | 4669 | 
| 4660     { | 4670     { | 
| 4661       BlockState block_state(&scope_, param_scope); | 4671       BlockState block_state(&scope_, param_scope); | 
| 4662       DeclarationParsingResult::Declaration decl( | 4672       DeclarationParsingResult::Declaration decl( | 
| 4663           parameter.pattern, parameter.pattern->position(), initial_value); | 4673           parameter.pattern, initializer_position, initial_value); | 
| 4664       PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor, | 4674       PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor, | 
| 4665                                                      &decl, nullptr, CHECK_OK); | 4675                                                      &decl, nullptr, CHECK_OK); | 
| 4666     } | 4676     } | 
| 4667 | 4677 | 
| 4668     if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { | 4678     if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { | 
| 4669       param_scope = param_scope->FinalizeBlockScope(); | 4679       param_scope = param_scope->FinalizeBlockScope(); | 
| 4670       if (param_scope != nullptr) { | 4680       if (param_scope != nullptr) { | 
| 4671         CheckConflictingVarDeclarations(param_scope, CHECK_OK); | 4681         CheckConflictingVarDeclarations(param_scope, CHECK_OK); | 
| 4672       } | 4682       } | 
| 4673       init_block->statements()->Add(param_block, zone()); | 4683       init_block->statements()->Add(param_block, zone()); | 
| (...skipping 1782 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6456 } | 6466 } | 
| 6457 | 6467 | 
| 6458 | 6468 | 
| 6459 void Parser::RaiseLanguageMode(LanguageMode mode) { | 6469 void Parser::RaiseLanguageMode(LanguageMode mode) { | 
| 6460   SetLanguageMode(scope_, | 6470   SetLanguageMode(scope_, | 
| 6461                   static_cast<LanguageMode>(scope_->language_mode() | mode)); | 6471                   static_cast<LanguageMode>(scope_->language_mode() | mode)); | 
| 6462 } | 6472 } | 
| 6463 | 6473 | 
| 6464 }  // namespace internal | 6474 }  // namespace internal | 
| 6465 }  // namespace v8 | 6475 }  // namespace v8 | 
| OLD | NEW | 
|---|