| Index: src/parsing/preparser.h
|
| diff --git a/src/parsing/preparser.h b/src/parsing/preparser.h
|
| index 58a0137e2664545ae6b45169efbd3c67b06294cf..e99dcbed7f984cfd2e60293c06f622aaddad8a89 100644
|
| --- a/src/parsing/preparser.h
|
| +++ b/src/parsing/preparser.h
|
| @@ -5,6 +5,7 @@
|
| #ifndef V8_PARSING_PREPARSER_H
|
| #define V8_PARSING_PREPARSER_H
|
|
|
| +#include "src/ast/ast.h"
|
| #include "src/ast/scopes.h"
|
| #include "src/parsing/parser-base.h"
|
| #include "src/parsing/preparse-data.h"
|
| @@ -126,25 +127,26 @@ class PreParserIdentifier {
|
| class PreParserExpression {
|
| public:
|
| PreParserExpression()
|
| - : code_(TypeField::encode(kEmpty)), identifiers_(nullptr) {}
|
| + : code_(TypeField::encode(kEmpty)), variables_(nullptr) {}
|
|
|
| static PreParserExpression Empty() { return PreParserExpression(); }
|
|
|
| static PreParserExpression Default(
|
| - ZoneList<const AstRawString*>* identifiers = nullptr) {
|
| - return PreParserExpression(TypeField::encode(kExpression), identifiers);
|
| + ZoneList<VariableProxy*>* variables = nullptr) {
|
| + return PreParserExpression(TypeField::encode(kExpression), variables);
|
| }
|
|
|
| static PreParserExpression Spread(PreParserExpression expression) {
|
| return PreParserExpression(TypeField::encode(kSpreadExpression),
|
| - expression.identifiers_);
|
| + expression.variables_);
|
| }
|
|
|
| static PreParserExpression FromIdentifier(PreParserIdentifier id,
|
| + VariableProxy* variable,
|
| Zone* zone) {
|
| PreParserExpression expression(TypeField::encode(kIdentifierExpression) |
|
| IdentifierTypeField::encode(id.type_));
|
| - expression.AddIdentifier(id.string_, zone);
|
| + expression.AddVariable(variable, zone);
|
| return expression;
|
| }
|
|
|
| @@ -154,23 +156,21 @@ class PreParserExpression {
|
| return PreParserExpression(TypeField::encode(kExpression));
|
| }
|
|
|
| - static PreParserExpression Assignment(
|
| - ZoneList<const AstRawString*>* identifiers = nullptr) {
|
| + static PreParserExpression Assignment(ZoneList<VariableProxy*>* variables) {
|
| return PreParserExpression(TypeField::encode(kExpression) |
|
| ExpressionTypeField::encode(kAssignment),
|
| - identifiers);
|
| + variables);
|
| }
|
|
|
| static PreParserExpression ObjectLiteral(
|
| - ZoneList<const AstRawString*>* identifiers = nullptr) {
|
| + ZoneList<VariableProxy*>* variables) {
|
| return PreParserExpression(TypeField::encode(kObjectLiteralExpression),
|
| - identifiers);
|
| + variables);
|
| }
|
|
|
| - static PreParserExpression ArrayLiteral(
|
| - ZoneList<const AstRawString*>* identifiers = nullptr) {
|
| + static PreParserExpression ArrayLiteral(ZoneList<VariableProxy*>* variables) {
|
| return PreParserExpression(TypeField::encode(kArrayLiteralExpression),
|
| - identifiers);
|
| + variables);
|
| }
|
|
|
| static PreParserExpression StringLiteral() {
|
| @@ -347,19 +347,18 @@ class PreParserExpression {
|
| kAssignment
|
| };
|
|
|
| - explicit PreParserExpression(
|
| - uint32_t expression_code,
|
| - ZoneList<const AstRawString*>* identifiers = nullptr)
|
| - : code_(expression_code), identifiers_(identifiers) {}
|
| + explicit PreParserExpression(uint32_t expression_code,
|
| + ZoneList<VariableProxy*>* variables = nullptr)
|
| + : code_(expression_code), variables_(variables) {}
|
|
|
| - void AddIdentifier(const AstRawString* identifier, Zone* zone) {
|
| - if (identifier == nullptr) {
|
| + void AddVariable(VariableProxy* variable, Zone* zone) {
|
| + if (variable == nullptr) {
|
| return;
|
| }
|
| - if (identifiers_ == nullptr) {
|
| - identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone);
|
| + if (variables_ == nullptr) {
|
| + variables_ = new (zone) ZoneList<VariableProxy*>(1, zone);
|
| }
|
| - identifiers_->Add(identifier, zone);
|
| + variables_->Add(variable, zone);
|
| }
|
|
|
| // The first three bits are for the Type.
|
| @@ -382,9 +381,9 @@ class PreParserExpression {
|
| typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField;
|
|
|
| uint32_t code_;
|
| - // If the PreParser is used in the identifier tracking mode,
|
| - // PreParserExpression accumulates identifiers in that expression.
|
| - ZoneList<const AstRawString*>* identifiers_;
|
| + // If the PreParser is used in the variable tracking mode, PreParserExpression
|
| + // accumulates variables in that expression.
|
| + ZoneList<VariableProxy*>* variables_;
|
|
|
| friend class PreParser;
|
| friend class PreParserFactory;
|
| @@ -394,13 +393,13 @@ class PreParserExpression {
|
|
|
|
|
| // The pre-parser doesn't need to build lists of expressions, identifiers, or
|
| -// the like. If the PreParser is used in identifier tracking mode, it needs to
|
| -// build lists of identifiers though.
|
| +// the like. If the PreParser is used in variable tracking mode, it needs to
|
| +// build lists of variables though.
|
| template <typename T>
|
| class PreParserList {
|
| public:
|
| // These functions make list->Add(some_expression) work (and do nothing).
|
| - PreParserList() : length_(0), identifiers_(nullptr) {}
|
| + PreParserList() : length_(0), variables_(nullptr) {}
|
| PreParserList* operator->() { return this; }
|
| void Add(T, Zone* zone);
|
| int length() const { return length_; }
|
| @@ -408,9 +407,9 @@ class PreParserList {
|
| bool IsNull() const { return length_ == -1; }
|
|
|
| private:
|
| - explicit PreParserList(int n) : length_(n), identifiers_(nullptr) {}
|
| + explicit PreParserList(int n) : length_(n), variables_(nullptr) {}
|
| int length_;
|
| - ZoneList<const AstRawString*>* identifiers_;
|
| + ZoneList<VariableProxy*>* variables_;
|
|
|
| friend class PreParser;
|
| friend class PreParserFactory;
|
| @@ -419,14 +418,14 @@ class PreParserList {
|
| template <>
|
| inline void PreParserList<PreParserExpression>::Add(
|
| PreParserExpression expression, Zone* zone) {
|
| - if (expression.identifiers_ != nullptr) {
|
| + if (expression.variables_ != nullptr) {
|
| DCHECK(FLAG_lazy_inner_functions);
|
| DCHECK(zone != nullptr);
|
| - if (identifiers_ == nullptr) {
|
| - identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone);
|
| + if (variables_ == nullptr) {
|
| + variables_ = new (zone) ZoneList<VariableProxy*>(1, zone);
|
| }
|
| - for (auto identifier : (*expression.identifiers_)) {
|
| - identifiers_->Add(identifier, zone);
|
| + for (auto identifier : (*expression.variables_)) {
|
| + variables_->Add(identifier, zone);
|
| }
|
| }
|
| ++length_;
|
| @@ -525,7 +524,8 @@ class PreParserStatement {
|
| class PreParserFactory {
|
| public:
|
| explicit PreParserFactory(AstValueFactory* ast_value_factory)
|
| - : zone_(ast_value_factory->zone()) {}
|
| + : ast_value_factory_(ast_value_factory),
|
| + zone_(ast_value_factory->zone()) {}
|
|
|
| void set_zone(Zone* zone) { zone_ = zone; }
|
|
|
| @@ -534,7 +534,14 @@ class PreParserFactory {
|
| // This is needed for object literal property names. Property names are
|
| // normalized to string literals during object literal parsing.
|
| PreParserExpression expression = PreParserExpression::Default();
|
| - expression.AddIdentifier(identifier.string_, zone_);
|
| + if (identifier.string_ != nullptr) {
|
| + DCHECK(FLAG_lazy_inner_functions);
|
| + AstNodeFactory factory(ast_value_factory_);
|
| + factory.set_zone(zone_);
|
| + VariableProxy* variable =
|
| + factory.NewVariableProxy(identifier.string_, NORMAL_VARIABLE);
|
| + expression.AddVariable(variable, zone_);
|
| + }
|
| return expression;
|
| }
|
| PreParserExpression NewNumberLiteral(double number,
|
| @@ -552,7 +559,7 @@ class PreParserFactory {
|
| PreParserExpression NewArrayLiteral(PreParserExpressionList values,
|
| int first_spread_index, int literal_index,
|
| int pos) {
|
| - return PreParserExpression::ArrayLiteral(values.identifiers_);
|
| + return PreParserExpression::ArrayLiteral(values.variables_);
|
| }
|
| PreParserExpression NewClassLiteralProperty(PreParserExpression key,
|
| PreParserExpression value,
|
| @@ -565,18 +572,18 @@ class PreParserFactory {
|
| PreParserExpression value,
|
| ObjectLiteralProperty::Kind kind,
|
| bool is_computed_name) {
|
| - return PreParserExpression::Default(value.identifiers_);
|
| + return PreParserExpression::Default(value.variables_);
|
| }
|
| PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
|
| PreParserExpression value,
|
| bool is_computed_name) {
|
| - return PreParserExpression::Default(value.identifiers_);
|
| + return PreParserExpression::Default(value.variables_);
|
| }
|
| PreParserExpression NewObjectLiteral(PreParserExpressionList properties,
|
| int literal_index,
|
| int boilerplate_properties,
|
| int pos) {
|
| - return PreParserExpression::ObjectLiteral(properties.identifiers_);
|
| + return PreParserExpression::ObjectLiteral(properties.variables_);
|
| }
|
| PreParserExpression NewVariableProxy(void* variable) {
|
| return PreParserExpression::Default();
|
| @@ -611,8 +618,8 @@ class PreParserFactory {
|
| PreParserExpression left,
|
| PreParserExpression right,
|
| int pos) {
|
| - // For tracking identifiers for parameters with a default value.
|
| - return PreParserExpression::Assignment(left.identifiers_);
|
| + // For tracking variables for parameters with a default value.
|
| + return PreParserExpression::Assignment(left.variables_);
|
| }
|
| PreParserExpression NewYield(PreParserExpression generator_object,
|
| PreParserExpression expression, int pos,
|
| @@ -749,6 +756,7 @@ class PreParserFactory {
|
| }
|
|
|
| private:
|
| + AstValueFactory* ast_value_factory_;
|
| Zone* zone_;
|
| };
|
|
|
| @@ -1211,10 +1219,16 @@ class PreParser : public ParserBase<PreParser> {
|
| V8_INLINE static void CheckAssigningFunctionLiteralToProperty(
|
| PreParserExpression left, PreParserExpression right) {}
|
|
|
| - V8_INLINE static void MarkExpressionAsAssigned(
|
| - PreParserExpression expression) {
|
| + V8_INLINE void MarkExpressionAsAssigned(PreParserExpression expression) {
|
| // TODO(marja): To be able to produce the same errors, the preparser needs
|
| // to start tracking which expressions are variables and which are assigned.
|
| + if (expression.variables_ != nullptr) {
|
| + DCHECK(FLAG_lazy_inner_functions);
|
| + DCHECK(track_unresolved_variables_);
|
| + for (auto variable : *expression.variables_) {
|
| + variable->set_is_assigned();
|
| + }
|
| + }
|
| }
|
|
|
| V8_INLINE bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x,
|
| @@ -1244,6 +1258,7 @@ class PreParser : public ParserBase<PreParser> {
|
| InitializeForEachStatement(PreParserStatement stmt, PreParserExpression each,
|
| PreParserExpression subject,
|
| PreParserStatement body, int each_keyword_pos) {
|
| + MarkExpressionAsAssigned(each);
|
| return stmt;
|
| }
|
|
|
| @@ -1474,9 +1489,9 @@ class PreParser : public ParserBase<PreParser> {
|
| if (track_unresolved_variables_) {
|
| DCHECK(FLAG_lazy_inner_functions);
|
| for (auto parameter : parameters) {
|
| - if (parameter->pattern.identifiers_ != nullptr) {
|
| - for (auto i : *parameter->pattern.identifiers_) {
|
| - scope->DeclareVariableName(i, VAR);
|
| + if (parameter->pattern.variables_ != nullptr) {
|
| + for (auto variable : *parameter->pattern.variables_) {
|
| + scope->DeclareVariableName(variable->raw_name(), VAR);
|
| }
|
| }
|
| }
|
| @@ -1511,7 +1526,7 @@ class PreParser : public ParserBase<PreParser> {
|
|
|
| V8_INLINE PreParserExpression
|
| ExpressionListToExpression(PreParserExpressionList args) {
|
| - return PreParserExpression::Default(args.identifiers_);
|
| + return PreParserExpression::Default(args.variables_);
|
| }
|
|
|
| V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get,
|
|
|