5#ifndef V8_PARSING_EXPRESSION_SCOPE_H_
6#define V8_PARSING_EXPRESSION_SCOPE_H_
19template <
typename Types>
20class ExpressionParsingScope;
21template <
typename Types>
22class AccumulationScope;
23template <
typename Types>
24class ArrowHeadParsingScope;
25template <
typename Types>
26class ParameterDeclarationParsingScope;
27template <
typename Types>
28class VariableDeclarationParsingScope;
43template <
typename Types>
60 bool passed_through_with =
false;
62 scope = scope->outer_scope()) {
63 if (scope->is_with_scope()) {
64 passed_through_with =
true;
65 }
else if (scope->is_catch_scope()) {
66 Variable* masking_var = scope->LookupLocal(name);
71 if (masking_var !=
nullptr) {
73 if (passed_through_with)
break;
74 result->BindTo(masking_var);
80 if (passed_through_with) {
94 ScopedList<std::pair<VariableProxy*, int>>* variable_list) {
103 for (
auto& proxy_initializer_pair : *variable_list) {
105 this->
parser()->scope()->AddUnresolved(proxy);
157 if (scope ==
nullptr)
return;
169 }
while (scope !=
nullptr);
190 parser_->parameters_->set_strict_parameter_error(loc, message);
193 parser_->next_arrow_function_info_.strict_parameter_error_location = loc;
194 parser_->next_arrow_function_info_.strict_parameter_error_message =
231 return variable_index;
257 parser_->ReportMessageAt(loc, message);
271 parser->expression_scope_ =
this;
286 bool has_error()
const {
return parser_->has_error(); }
351template <
typename Types>
376 this->
parser()->scope(), &was_added,
pos);
379 this->
parser()->ReportMessage(MessageTemplate::kTooManyVariables);
383 if (this->
parser()->IsLet(name)) {
384 this->
parser()->ReportMessageAt(
386 MessageTemplate::kLetInLexicalBinding);
389 if (this->
parser()->loop_nesting_depth() > 0) {
424template <
typename Types>
444 name,
kind, mode, Variable::DefaultInitializationFlag(mode),
445 this->
parser()->scope(), &was_added,
pos);
468template <
typename Types>
497 scope = scope->
parent()) {
501 scope->AsArrowHeadParsingScope()->RecordDeclarationError(loc, message);
514 }
else if (
V8_LIKELY(expression->IsProperty())) {
519 const bool early_error =
false;
520 return this->
parser()->RewriteInvalidReferenceExpression(
521 expression, beg_pos, end_pos, MessageTemplate::kInvalidLhsInFor,
539 if (expression->is_parenthesized()) {
541 MessageTemplate::kInvalidDestructuringTarget);
544 variable_initializer_pair.first->set_is_assigned();
566 this->
parser()->scope()->AddUnresolved(variable);
580 if (len == 0)
return 0;
586 for (
int i =
end;
i >= first_variable_index &&
650 bool verified_ =
false;
668template <
typename Types>
691 if (
scope_ ==
nullptr)
return;
707 if (
scope_ ==
nullptr)
return;
709 scope_->ValidateExpression();
718 if (
scope_ ==
nullptr)
return;
744template <
typename Types>
763 parser->next_arrow_function_info_.ClearStrictParameterError();
773 this->
parser()->next_arrow_function_info_.ClearStrictParameterError();
792 for (
auto& proxy_initializer_pair : *this->
variable_list()) {
794 int initializer_position = proxy_initializer_pair.second;
800 &was_added, initializer_position);
803 MessageTemplate::kParamDupe);
808 if (!this->has_error()) {
AccumulationScope(ExpressionScope< Types > *scope)
Scanner::Location locations_[2]
void ValidateExpression()
ExpressionParsingScope< Types > * scope_
static const int kNumberOfErrors
MessageTemplate messages_[2]
AccumulationScope(const AccumulationScope &)=delete
AccumulationScope & operator=(const AccumulationScope &)=delete
void copy_back(int entry)
typename Types::Impl ParserT
DeclarationScope * ValidateAndCreateScope()
ArrowHeadParsingScope(const ArrowHeadParsingScope &)=delete
typename Types::Impl ParserT
ArrowHeadParsingScope(ParserT *parser, FunctionKind kind, int function_literal_id)
ArrowHeadParsingScope & operator=(const ArrowHeadParsingScope &)=delete
int function_literal_id() const
Scanner::Location declaration_error_location
void RecordDeclarationError(const Scanner::Location &loc, MessageTemplate message)
void RecordNonSimpleParameter()
MessageTemplate declaration_error_message
bool has_simple_parameter_list_
FunctionKind kind() const
void ValidateExpression()
typename ExpressionScope< Types >::ScopeType ScopeType
void SetHasNonSimpleParameters()
void ValidateExpression()
MessageTemplate messages_[kNumberOfErrors]
void Record(int index, const Scanner::Location &loc, MessageTemplate message)
void ClearExpressionError()
ScopedList< std::pair< VariableProxy *, int > > variable_list_
void RecordExpressionError(const Scanner::Location &loc, MessageTemplate message)
typename Types::Expression ExpressionT
ExpressionParsingScope(const ExpressionParsingScope &)=delete
Scanner::Location locations_[kNumberOfErrors]
int SetInitializers(int first_variable_index, int position)
ExpressionT ValidateAndRewriteReference(ExpressionT expression, int beg_pos, int end_pos)
void Report(int index) const
void TrackVariable(VariableProxy *variable)
~ExpressionParsingScope()
bool is_valid(int index) const
void MarkIdentifierAsAssigned()
typename ExpressionScopeT::ScopeType ScopeType
typename Types::Impl ParserT
bool has_async_arrow_in_scope_chain_
void RecordAsyncArrowParametersError(const Scanner::Location &loc, MessageTemplate message)
ScopedList< std::pair< VariableProxy *, int > > * variable_list()
ExpressionParsingScope & operator=(const ExpressionParsingScope &)=delete
void RecordPatternError(const Scanner::Location &loc, MessageTemplate message)
void ValidatePattern(ExpressionT expression, int begin, int end)
ExpressionParsingScope(ParserT *parser, ScopeType type=ExpressionScopeT::kExpression)
ArrowHeadParsingScope< Types > * AsArrowHeadParsingScope()
void RecordStrictModeParameterError(const Scanner::Location &loc, MessageTemplate message)
void MarkIdentifierAsAssigned()
bool IsVariableDeclaration() const
bool has_possible_parameter_in_scope_chain_
Variable * Declare(const AstRawString *name, int pos=kNoSourcePosition)
void Report(const Scanner::Location &loc, MessageTemplate message) const
bool IsCertainlyPattern() const
bool IsVarDeclaration() const
void RecordDeclarationError(const Scanner::Location &loc, MessageTemplate message)
void RecordExpressionError(const Scanner::Location &loc, MessageTemplate message)
void MergeVariableList(ScopedList< std::pair< VariableProxy *, int > > *variable_list)
bool IsCertainlyDeclaration() const
ParameterDeclarationParsingScope< Types > * AsParameterDeclarationParsingScope()
ExpressionParsingScope< Types > * AsExpressionParsingScope()
ExpressionScope & operator=(const ExpressionScope &)=delete
int SetInitializers(int variable_index, int peek_position)
ExpressionScope(ParserT *parser, ScopeType type)
typename Types::Expression ExpressionT
ExpressionScope(const ExpressionScope &)=delete
ExpressionScope * parent() const
void RecordParameterInitializerError(const Scanner::Location &loc, MessageTemplate message)
void RecordAsyncArrowParametersError(const Scanner::Location &loc, MessageTemplate message)
bool CanBeArrowParameterDeclaration() const
void ValidateAsExpression()
VariableDeclarationParsingScope< Types > * AsVariableDeclarationParsingScope()
bool CanBeDeclaration() const
void RecordNonSimpleParameter()
bool CanBeParameterDeclaration() const
@ kMaybeArrowParameterDeclaration
@ kMaybeAsyncArrowParameterDeclaration
bool IsAsyncArrowHeadParsingScope() const
void RecordPatternError(const Scanner::Location &loc, MessageTemplate message)
bool CanBeExpression() const
bool IsCertainlyParameterDeclaration() const
typename Types::Impl ParserT
void ValidateAsPattern(ExpressionT expression, int begin, int end)
VariableProxy * NewVariable(const AstRawString *name, int pos=kNoSourcePosition)
bool IsLexicalDeclaration() const
bool IsArrowHeadParsingScope() const
bool has_possible_arrow_parameter_in_scope_chain() const
ExpressionScope< Types > * parent_
bool has_possible_arrow_parameter_in_scope_chain_
Variable * Declare(const AstRawString *name, int pos)
Scanner::Location duplicate_loc_
typename ExpressionScopeT::ScopeType ScopeType
ParameterDeclarationParsingScope(ParserT *parser)
const Scanner::Location & duplicate_location() const
bool has_duplicate() const
typename Types::Impl ParserT
ParameterDeclarationParsingScope(const ParameterDeclarationParsingScope &)=delete
ParameterDeclarationParsingScope & operator=(const ParameterDeclarationParsingScope &)=delete
bool is_declaration_scope() const
typename Types::Impl ParserT
VariableDeclarationParsingScope(const VariableDeclarationParsingScope &)=delete
typename ExpressionScopeT::ScopeType ScopeType
static const int kMaxNumFunctionLocals
ZonePtrList< const AstRawString > * names_
VariableDeclarationParsingScope & operator=(const VariableDeclarationParsingScope &)=delete
Variable * Declare(const AstRawString *name, int pos)
VariableDeclarationParsingScope(ParserT *parser, VariableMode mode, ZonePtrList< const AstRawString > *names)
Scanner::Location location()
ZoneVector< RpoNumber > & result
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
constexpr int kNoSourcePosition
bool IsLexicalVariableMode(VariableMode mode)
bool is_strict(LanguageMode language_mode)
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
static Location invalid()
#define V8_LIKELY(condition)