Chromium Code Reviews| Index: src/parsing/parser.h |
| diff --git a/src/parsing/parser.h b/src/parsing/parser.h |
| index d56fdbc2fd728ca9de6d0cfa6906428e32c60780..5b81e86a7e43e3611d03b0537236ddfaef585922 100644 |
| --- a/src/parsing/parser.h |
| +++ b/src/parsing/parser.h |
| @@ -14,6 +14,7 @@ |
| #include "src/parsing/preparse-data.h" |
| #include "src/parsing/preparser.h" |
| #include "src/pending-compilation-error-handler.h" |
| +#include "src/utils.h" |
| namespace v8 { |
| @@ -135,7 +136,7 @@ class Parser; |
| struct ParserFormalParameters : FormalParametersBase { |
| - struct Parameter { |
| + struct Parameter : public ZoneObject { |
| Parameter(const AstRawString* name, Expression* pattern, |
| Expression* initializer, int initializer_end_position, |
| bool is_rest) |
| @@ -149,16 +150,17 @@ struct ParserFormalParameters : FormalParametersBase { |
| Expression* initializer; |
| int initializer_end_position; |
| bool is_rest; |
| + Parameter* next_parameter = nullptr; |
| bool is_simple() const { |
| return pattern->IsVariableProxy() && initializer == nullptr && !is_rest; |
| } |
| + Parameter** next() { return &next_parameter; } |
| + Parameter* const* next() const { return &next_parameter; } |
| }; |
| explicit ParserFormalParameters(DeclarationScope* scope) |
| - : FormalParametersBase(scope), params(4, scope->zone()) {} |
| - ZoneList<Parameter> params; |
|
Toon Verwaest
2016/11/24 15:09:41
Oh my... it didn't use Parameter* ... good thing y
|
| - |
| - const Parameter& at(int i) const { return params[i]; } |
| + : FormalParametersBase(scope) {} |
| + ThreadedList<Parameter> params; |
| }; |
| template <> |
| @@ -1043,34 +1045,39 @@ class V8_EXPORT_PRIVATE Parser : public NON_EXPORTED_BASE(ParserBase<Parser>) { |
| const AstRawString* name = is_simple |
| ? pattern->AsVariableProxy()->raw_name() |
| : ast_value_factory()->empty_string(); |
| - parameters->params.Add( |
| - ParserFormalParameters::Parameter(name, pattern, initializer, |
| - initializer_end_position, is_rest), |
| - parameters->scope->zone()); |
| + auto parameter = |
| + new (parameters->scope->zone()) ParserFormalParameters::Parameter( |
| + name, pattern, initializer, initializer_end_position, is_rest); |
| + |
| + parameters->params.Add(parameter); |
| } |
| - V8_INLINE void DeclareFormalParameter( |
| + V8_INLINE void DeclareFormalParameters( |
| DeclarationScope* scope, |
| - const ParserFormalParameters::Parameter& parameter) { |
| - bool is_duplicate = false; |
| - bool is_simple = classifier()->is_simple_parameter_list(); |
| - auto name = is_simple || parameter.is_rest |
| - ? parameter.name |
| - : ast_value_factory()->empty_string(); |
| - auto mode = is_simple || parameter.is_rest ? VAR : TEMPORARY; |
| - if (!is_simple) scope->SetHasNonSimpleParameters(); |
| - bool is_optional = parameter.initializer != nullptr; |
| - Variable* var = |
| - scope->DeclareParameter(name, mode, is_optional, parameter.is_rest, |
| - &is_duplicate, ast_value_factory()); |
| - if (is_duplicate) { |
| - classifier()->RecordDuplicateFormalParameterError(scanner()->location()); |
| - } |
| - if (is_sloppy(scope->language_mode())) { |
| - // TODO(sigurds) Mark every parameter as maybe assigned. This is a |
| - // conservative approximation necessary to account for parameters |
| - // that are assigned via the arguments array. |
| - var->set_maybe_assigned(); |
| + const ThreadedList<ParserFormalParameters::Parameter>& parameters) { |
| + for (auto parameter : parameters) { |
| + bool is_duplicate = false; |
| + bool is_simple = classifier()->is_simple_parameter_list(); |
| + auto name = is_simple || parameter->is_rest |
| + ? parameter->name |
| + : ast_value_factory()->empty_string(); |
| + auto mode = is_simple || parameter->is_rest ? VAR : TEMPORARY; |
| + if (!is_simple) scope->SetHasNonSimpleParameters(); |
| + bool is_optional = parameter->initializer != nullptr; |
| + Variable* var = |
| + scope->DeclareParameter(name, mode, is_optional, parameter->is_rest, |
| + &is_duplicate, ast_value_factory()); |
| + if (is_duplicate && |
| + classifier()->is_valid_formal_parameter_list_without_duplicates()) { |
| + classifier()->RecordDuplicateFormalParameterError( |
| + scanner()->location()); |
| + } |
| + if (is_sloppy(scope->language_mode())) { |
| + // TODO(sigurds) Mark every parameter as maybe assigned. This is a |
| + // conservative approximation necessary to account for parameters |
| + // that are assigned via the arguments array. |
| + var->set_maybe_assigned(); |
| + } |
| } |
| } |