| 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 #ifndef V8_PARSING_PARSER_H_ | 5 #ifndef V8_PARSING_PARSER_H_ |
| 6 #define V8_PARSING_PARSER_H_ | 6 #define V8_PARSING_PARSER_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 kStartPositionIndex, | 210 kStartPositionIndex, |
| 211 kEndPositionIndex, | 211 kEndPositionIndex, |
| 212 kLiteralCountIndex, | 212 kLiteralCountIndex, |
| 213 kPropertyCountIndex, | 213 kPropertyCountIndex, |
| 214 kLanguageModeIndex, | 214 kLanguageModeIndex, |
| 215 kUsesSuperPropertyIndex, | 215 kUsesSuperPropertyIndex, |
| 216 kCallsEvalIndex, | 216 kCallsEvalIndex, |
| 217 kSize | 217 kSize |
| 218 }; | 218 }; |
| 219 | 219 |
| 220 explicit FunctionEntry(Vector<unsigned> backing) | 220 explicit FunctionEntry(Vector<unsigned> backing) : backing_(backing) {} |
| 221 : backing_(backing) { } | |
| 222 | 221 |
| 223 FunctionEntry() : backing_() { } | 222 FunctionEntry() : backing_() {} |
| 224 | 223 |
| 225 int start_pos() { return backing_[kStartPositionIndex]; } | 224 int start_pos() { return backing_[kStartPositionIndex]; } |
| 226 int end_pos() { return backing_[kEndPositionIndex]; } | 225 int end_pos() { return backing_[kEndPositionIndex]; } |
| 227 int literal_count() { return backing_[kLiteralCountIndex]; } | 226 int literal_count() { return backing_[kLiteralCountIndex]; } |
| 228 int property_count() { return backing_[kPropertyCountIndex]; } | 227 int property_count() { return backing_[kPropertyCountIndex]; } |
| 229 LanguageMode language_mode() { | 228 LanguageMode language_mode() { |
| 230 DCHECK(is_valid_language_mode(backing_[kLanguageModeIndex])); | 229 DCHECK(is_valid_language_mode(backing_[kLanguageModeIndex])); |
| 231 return static_cast<LanguageMode>(backing_[kLanguageModeIndex]); | 230 return static_cast<LanguageMode>(backing_[kLanguageModeIndex]); |
| 232 } | 231 } |
| 233 bool uses_super_property() { return backing_[kUsesSuperPropertyIndex]; } | 232 bool uses_super_property() { return backing_[kUsesSuperPropertyIndex]; } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 class BufferedZoneList { | 295 class BufferedZoneList { |
| 297 public: | 296 public: |
| 298 BufferedZoneList() : list_(NULL), last_(NULL) {} | 297 BufferedZoneList() : list_(NULL), last_(NULL) {} |
| 299 | 298 |
| 300 // Adds element at end of list. This element is buffered and can | 299 // Adds element at end of list. This element is buffered and can |
| 301 // be read using last() or removed using RemoveLast until a new Add or until | 300 // be read using last() or removed using RemoveLast until a new Add or until |
| 302 // RemoveLast or GetList has been called. | 301 // RemoveLast or GetList has been called. |
| 303 void Add(T* value, Zone* zone) { | 302 void Add(T* value, Zone* zone) { |
| 304 if (last_ != NULL) { | 303 if (last_ != NULL) { |
| 305 if (list_ == NULL) { | 304 if (list_ == NULL) { |
| 306 list_ = new(zone) ZoneList<T*>(initial_size, zone); | 305 list_ = new (zone) ZoneList<T*>(initial_size, zone); |
| 307 } | 306 } |
| 308 list_->Add(last_, zone); | 307 list_->Add(last_, zone); |
| 309 } | 308 } |
| 310 last_ = value; | 309 last_ = value; |
| 311 } | 310 } |
| 312 | 311 |
| 313 T* last() { | 312 T* last() { |
| 314 DCHECK(last_ != NULL); | 313 DCHECK(last_ != NULL); |
| 315 return last_; | 314 return last_; |
| 316 } | 315 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 345 last_ = NULL; | 344 last_ = NULL; |
| 346 } | 345 } |
| 347 | 346 |
| 348 int length() { | 347 int length() { |
| 349 int length = (list_ == NULL) ? 0 : list_->length(); | 348 int length = (list_ == NULL) ? 0 : list_->length(); |
| 350 return length + ((last_ == NULL) ? 0 : 1); | 349 return length + ((last_ == NULL) ? 0 : 1); |
| 351 } | 350 } |
| 352 | 351 |
| 353 ZoneList<T*>* GetList(Zone* zone) { | 352 ZoneList<T*>* GetList(Zone* zone) { |
| 354 if (list_ == NULL) { | 353 if (list_ == NULL) { |
| 355 list_ = new(zone) ZoneList<T*>(initial_size, zone); | 354 list_ = new (zone) ZoneList<T*>(initial_size, zone); |
| 356 } | 355 } |
| 357 if (last_ != NULL) { | 356 if (last_ != NULL) { |
| 358 list_->Add(last_, zone); | 357 list_->Add(last_, zone); |
| 359 last_ = NULL; | 358 last_ = NULL; |
| 360 } | 359 } |
| 361 return list_; | 360 return list_; |
| 362 } | 361 } |
| 363 | 362 |
| 364 private: | 363 private: |
| 365 ZoneList<T*>* list_; | 364 ZoneList<T*>* list_; |
| 366 T* last_; | 365 T* last_; |
| 367 }; | 366 }; |
| 368 | 367 |
| 369 | 368 |
| 370 // Accumulates RegExp atoms and assertions into lists of terms and alternatives. | 369 // Accumulates RegExp atoms and assertions into lists of terms and alternatives. |
| 371 class RegExpBuilder: public ZoneObject { | 370 class RegExpBuilder : public ZoneObject { |
| 372 public: | 371 public: |
| 373 explicit RegExpBuilder(Zone* zone); | 372 explicit RegExpBuilder(Zone* zone); |
| 374 void AddCharacter(uc16 character); | 373 void AddCharacter(uc16 character); |
| 375 // "Adds" an empty expression. Does nothing except consume a | 374 // "Adds" an empty expression. Does nothing except consume a |
| 376 // following quantifier | 375 // following quantifier |
| 377 void AddEmpty(); | 376 void AddEmpty(); |
| 378 void AddAtom(RegExpTree* tree); | 377 void AddAtom(RegExpTree* tree); |
| 379 void AddAssertion(RegExpTree* tree); | 378 void AddAssertion(RegExpTree* tree); |
| 380 void NewAlternative(); // '|' | 379 void NewAlternative(); // '|' |
| 381 void AddQuantifierToAtom( | 380 void AddQuantifierToAtom(int min, int max, |
| 382 int min, int max, RegExpQuantifier::QuantifierType type); | 381 RegExpQuantifier::QuantifierType type); |
| 383 RegExpTree* ToRegExp(); | 382 RegExpTree* ToRegExp(); |
| 384 | 383 |
| 385 private: | 384 private: |
| 386 void FlushCharacters(); | 385 void FlushCharacters(); |
| 387 void FlushText(); | 386 void FlushText(); |
| 388 void FlushTerms(); | 387 void FlushTerms(); |
| 389 Zone* zone() const { return zone_; } | 388 Zone* zone() const { return zone_; } |
| 390 | 389 |
| 391 Zone* zone_; | 390 Zone* zone_; |
| 392 bool pending_empty_; | 391 bool pending_empty_; |
| 393 ZoneList<uc16>* characters_; | 392 ZoneList<uc16>* characters_; |
| 394 BufferedZoneList<RegExpTree, 2> terms_; | 393 BufferedZoneList<RegExpTree, 2> terms_; |
| 395 BufferedZoneList<RegExpTree, 2> text_; | 394 BufferedZoneList<RegExpTree, 2> text_; |
| 396 BufferedZoneList<RegExpTree, 2> alternatives_; | 395 BufferedZoneList<RegExpTree, 2> alternatives_; |
| 397 #ifdef DEBUG | 396 #ifdef DEBUG |
| 398 enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_; | 397 enum { ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM } last_added_; |
| 399 #define LAST(x) last_added_ = x; | 398 #define LAST(x) last_added_ = x; |
| 400 #else | 399 #else |
| 401 #define LAST(x) | 400 #define LAST(x) |
| 402 #endif | 401 #endif |
| 403 }; | 402 }; |
| 404 | 403 |
| 405 | 404 |
| 406 class RegExpParser BASE_EMBEDDED { | 405 class RegExpParser BASE_EMBEDDED { |
| 407 public: | 406 public: |
| 408 RegExpParser(FlatStringReader* in, Handle<String>* error, bool multiline_mode, | 407 RegExpParser(FlatStringReader* in, Handle<String>* error, bool multiline_mode, |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, | 726 void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, |
| 728 ParseErrorType error_type = kSyntaxError); | 727 ParseErrorType error_type = kSyntaxError); |
| 729 void ReportMessage(MessageTemplate::Template message, const AstRawString* arg, | 728 void ReportMessage(MessageTemplate::Template message, const AstRawString* arg, |
| 730 ParseErrorType error_type = kSyntaxError); | 729 ParseErrorType error_type = kSyntaxError); |
| 731 void ReportMessageAt(Scanner::Location source_location, | 730 void ReportMessageAt(Scanner::Location source_location, |
| 732 MessageTemplate::Template message, | 731 MessageTemplate::Template message, |
| 733 const AstRawString* arg, | 732 const AstRawString* arg, |
| 734 ParseErrorType error_type = kSyntaxError); | 733 ParseErrorType error_type = kSyntaxError); |
| 735 | 734 |
| 736 // "null" return type creators. | 735 // "null" return type creators. |
| 737 static const AstRawString* EmptyIdentifier() { | 736 static const AstRawString* EmptyIdentifier() { return NULL; } |
| 738 return NULL; | 737 static Expression* EmptyExpression() { return NULL; } |
| 739 } | 738 static Literal* EmptyLiteral() { return NULL; } |
| 740 static Expression* EmptyExpression() { | |
| 741 return NULL; | |
| 742 } | |
| 743 static Literal* EmptyLiteral() { | |
| 744 return NULL; | |
| 745 } | |
| 746 static ObjectLiteralProperty* EmptyObjectLiteralProperty() { return NULL; } | 739 static ObjectLiteralProperty* EmptyObjectLiteralProperty() { return NULL; } |
| 747 static FunctionLiteral* EmptyFunctionLiteral() { return NULL; } | 740 static FunctionLiteral* EmptyFunctionLiteral() { return NULL; } |
| 748 | 741 |
| 749 // Used in error return values. | 742 // Used in error return values. |
| 750 static ZoneList<Expression*>* NullExpressionList() { | 743 static ZoneList<Expression*>* NullExpressionList() { return NULL; } |
| 751 return NULL; | |
| 752 } | |
| 753 static const AstRawString* EmptyFormalParameter() { return NULL; } | 744 static const AstRawString* EmptyFormalParameter() { return NULL; } |
| 754 | 745 |
| 755 // Non-NULL empty string. | 746 // Non-NULL empty string. |
| 756 V8_INLINE const AstRawString* EmptyIdentifierString(); | 747 V8_INLINE const AstRawString* EmptyIdentifierString(); |
| 757 | 748 |
| 758 // Odd-ball literal creators. | 749 // Odd-ball literal creators. |
| 759 Literal* GetLiteralTheHole(int position, AstNodeFactory* factory); | 750 Literal* GetLiteralTheHole(int position, AstNodeFactory* factory); |
| 760 | 751 |
| 761 // Producing data during the recursive descent. | 752 // Producing data during the recursive descent. |
| 762 const AstRawString* GetSymbol(Scanner* scanner); | 753 const AstRawString* GetSymbol(Scanner* scanner); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 775 int end_pos, LanguageMode language_mode); | 766 int end_pos, LanguageMode language_mode); |
| 776 Literal* ExpressionFromLiteral(Token::Value token, int pos, Scanner* scanner, | 767 Literal* ExpressionFromLiteral(Token::Value token, int pos, Scanner* scanner, |
| 777 AstNodeFactory* factory); | 768 AstNodeFactory* factory); |
| 778 Expression* ExpressionFromIdentifier(const AstRawString* name, | 769 Expression* ExpressionFromIdentifier(const AstRawString* name, |
| 779 int start_position, int end_position, | 770 int start_position, int end_position, |
| 780 Scope* scope, AstNodeFactory* factory); | 771 Scope* scope, AstNodeFactory* factory); |
| 781 Expression* ExpressionFromString(int pos, Scanner* scanner, | 772 Expression* ExpressionFromString(int pos, Scanner* scanner, |
| 782 AstNodeFactory* factory); | 773 AstNodeFactory* factory); |
| 783 Expression* GetIterator(Expression* iterable, AstNodeFactory* factory); | 774 Expression* GetIterator(Expression* iterable, AstNodeFactory* factory); |
| 784 ZoneList<v8::internal::Expression*>* NewExpressionList(int size, Zone* zone) { | 775 ZoneList<v8::internal::Expression*>* NewExpressionList(int size, Zone* zone) { |
| 785 return new(zone) ZoneList<v8::internal::Expression*>(size, zone); | 776 return new (zone) ZoneList<v8::internal::Expression*>(size, zone); |
| 786 } | 777 } |
| 787 ZoneList<ObjectLiteral::Property*>* NewPropertyList(int size, Zone* zone) { | 778 ZoneList<ObjectLiteral::Property*>* NewPropertyList(int size, Zone* zone) { |
| 788 return new(zone) ZoneList<ObjectLiteral::Property*>(size, zone); | 779 return new (zone) ZoneList<ObjectLiteral::Property*>(size, zone); |
| 789 } | 780 } |
| 790 ZoneList<v8::internal::Statement*>* NewStatementList(int size, Zone* zone) { | 781 ZoneList<v8::internal::Statement*>* NewStatementList(int size, Zone* zone) { |
| 791 return new(zone) ZoneList<v8::internal::Statement*>(size, zone); | 782 return new (zone) ZoneList<v8::internal::Statement*>(size, zone); |
| 792 } | 783 } |
| 793 | 784 |
| 794 V8_INLINE void AddParameterInitializationBlock( | 785 V8_INLINE void AddParameterInitializationBlock( |
| 795 const ParserFormalParameters& parameters, | 786 const ParserFormalParameters& parameters, |
| 796 ZoneList<v8::internal::Statement*>* body, bool* ok); | 787 ZoneList<v8::internal::Statement*>* body, bool* ok); |
| 797 | 788 |
| 798 V8_INLINE Scope* NewScope(Scope* parent_scope, ScopeType scope_type, | 789 V8_INLINE Scope* NewScope(Scope* parent_scope, ScopeType scope_type, |
| 799 FunctionKind kind = kNormalFunction); | 790 FunctionKind kind = kNormalFunction); |
| 800 | 791 |
| 801 V8_INLINE void AddFormalParameter(ParserFormalParameters* parameters, | 792 V8_INLINE void AddFormalParameter(ParserFormalParameters* parameters, |
| 802 Expression* pattern, | 793 Expression* pattern, |
| 803 Expression* initializer, | 794 Expression* initializer, |
| 804 int initializer_end_position, bool is_rest); | 795 int initializer_end_position, bool is_rest); |
| 805 V8_INLINE void DeclareFormalParameter( | 796 V8_INLINE void DeclareFormalParameter( |
| 806 Scope* scope, const ParserFormalParameters::Parameter& parameter, | 797 Scope* scope, const ParserFormalParameters::Parameter& parameter, |
| 807 ExpressionClassifier* classifier); | 798 ExpressionClassifier* classifier); |
| 808 void ParseArrowFunctionFormalParameters(ParserFormalParameters* parameters, | 799 void ParseArrowFunctionFormalParameters(ParserFormalParameters* parameters, |
| 809 Expression* params, | 800 Expression* params, |
| 810 const Scanner::Location& params_loc, | 801 const Scanner::Location& params_loc, |
| 811 bool* ok); | 802 bool* ok); |
| 812 void ParseArrowFunctionFormalParameterList( | 803 void ParseArrowFunctionFormalParameterList( |
| 813 ParserFormalParameters* parameters, Expression* params, | 804 ParserFormalParameters* parameters, Expression* params, |
| 814 const Scanner::Location& params_loc, | 805 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| 815 Scanner::Location* duplicate_loc, bool* ok); | 806 bool* ok); |
| 816 | 807 |
| 817 V8_INLINE DoExpression* ParseDoExpression(bool* ok); | 808 V8_INLINE DoExpression* ParseDoExpression(bool* ok); |
| 818 | 809 |
| 819 void ReindexLiterals(const ParserFormalParameters& parameters); | 810 void ReindexLiterals(const ParserFormalParameters& parameters); |
| 820 | 811 |
| 821 // Temporary glue; these functions will move to ParserBase. | 812 // Temporary glue; these functions will move to ParserBase. |
| 822 Expression* ParseV8Intrinsic(bool* ok); | 813 Expression* ParseV8Intrinsic(bool* ok); |
| 823 FunctionLiteral* ParseFunctionLiteral( | 814 FunctionLiteral* ParseFunctionLiteral( |
| 824 const AstRawString* name, Scanner::Location function_name_location, | 815 const AstRawString* name, Scanner::Location function_name_location, |
| 825 FunctionNameValidity function_name_validity, FunctionKind kind, | 816 FunctionNameValidity function_name_validity, FunctionKind kind, |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 return compile_options_; | 940 return compile_options_; |
| 950 } | 941 } |
| 951 bool consume_cached_parse_data() const { | 942 bool consume_cached_parse_data() const { |
| 952 return compile_options_ == ScriptCompiler::kConsumeParserCache && | 943 return compile_options_ == ScriptCompiler::kConsumeParserCache && |
| 953 cached_parse_data_ != NULL; | 944 cached_parse_data_ != NULL; |
| 954 } | 945 } |
| 955 bool produce_cached_parse_data() const { | 946 bool produce_cached_parse_data() const { |
| 956 return compile_options_ == ScriptCompiler::kProduceParserCache; | 947 return compile_options_ == ScriptCompiler::kProduceParserCache; |
| 957 } | 948 } |
| 958 Scope* DeclarationScope(VariableMode mode) { | 949 Scope* DeclarationScope(VariableMode mode) { |
| 959 return IsLexicalVariableMode(mode) | 950 return IsLexicalVariableMode(mode) ? scope_ : scope_->DeclarationScope(); |
| 960 ? scope_ : scope_->DeclarationScope(); | |
| 961 } | 951 } |
| 962 | 952 |
| 963 // All ParseXXX functions take as the last argument an *ok parameter | 953 // All ParseXXX functions take as the last argument an *ok parameter |
| 964 // which is set to false if parsing failed; it is unchanged otherwise. | 954 // which is set to false if parsing failed; it is unchanged otherwise. |
| 965 // By making the 'exception handling' explicit, we are forced to check | 955 // By making the 'exception handling' explicit, we are forced to check |
| 966 // for failure at the call sites. | 956 // for failure at the call sites. |
| 967 void* ParseStatementList(ZoneList<Statement*>* body, int end_token, bool* ok); | 957 void* ParseStatementList(ZoneList<Statement*>* body, int end_token, bool* ok); |
| 968 Statement* ParseStatementListItem(bool* ok); | 958 Statement* ParseStatementListItem(bool* ok); |
| 969 void* ParseModuleItemList(ZoneList<Statement*>* body, bool* ok); | 959 void* ParseModuleItemList(ZoneList<Statement*>* body, bool* ok); |
| 970 Statement* ParseModuleItem(bool* ok); | 960 Statement* ParseModuleItem(bool* ok); |
| 971 const AstRawString* ParseModuleSpecifier(bool* ok); | 961 const AstRawString* ParseModuleSpecifier(bool* ok); |
| 972 Statement* ParseImportDeclaration(bool* ok); | 962 Statement* ParseImportDeclaration(bool* ok); |
| 973 Statement* ParseExportDeclaration(bool* ok); | 963 Statement* ParseExportDeclaration(bool* ok); |
| 974 Statement* ParseExportDefault(bool* ok); | 964 Statement* ParseExportDefault(bool* ok); |
| 975 void* ParseExportClause(ZoneList<const AstRawString*>* export_names, | 965 void* ParseExportClause(ZoneList<const AstRawString*>* export_names, |
| 976 ZoneList<Scanner::Location>* export_locations, | 966 ZoneList<Scanner::Location>* export_locations, |
| 977 ZoneList<const AstRawString*>* local_names, | 967 ZoneList<const AstRawString*>* local_names, |
| 978 Scanner::Location* reserved_loc, bool* ok); | 968 Scanner::Location* reserved_loc, bool* ok); |
| 979 ZoneList<ImportDeclaration*>* ParseNamedImports(int pos, bool* ok); | 969 ZoneList<ImportDeclaration*>* ParseNamedImports(int pos, bool* ok); |
| 980 Statement* ParseStatement(ZoneList<const AstRawString*>* labels, bool* ok); | 970 Statement* ParseStatement(ZoneList<const AstRawString*>* labels, bool* ok); |
| 981 Statement* ParseSubStatement(ZoneList<const AstRawString*>* labels, bool* ok); | 971 Statement* ParseSubStatement(ZoneList<const AstRawString*>* labels, bool* ok); |
| 982 Statement* ParseStatementAsUnlabelled(ZoneList<const AstRawString*>* labels, | 972 Statement* ParseStatementAsUnlabelled(ZoneList<const AstRawString*>* labels, |
| 983 bool* ok); | 973 bool* ok); |
| 984 Statement* ParseFunctionDeclaration(ZoneList<const AstRawString*>* names, | 974 Statement* ParseFunctionDeclaration(ZoneList<const AstRawString*>* names, |
| 985 bool* ok); | 975 bool* ok); |
| 986 Statement* ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 976 Statement* ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
| 987 bool* ok); | 977 bool* ok); |
| 988 Statement* ParseNativeDeclaration(bool* ok); | 978 Statement* ParseNativeDeclaration(bool* ok); |
| 989 Block* ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); | 979 Block* ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); |
| 990 Block* ParseVariableStatement(VariableDeclarationContext var_context, | 980 Block* ParseVariableStatement(VariableDeclarationContext var_context, |
| 991 ZoneList<const AstRawString*>* names, | 981 ZoneList<const AstRawString*>* names, bool* ok); |
| 992 bool* ok); | |
| 993 DoExpression* ParseDoExpression(bool* ok); | 982 DoExpression* ParseDoExpression(bool* ok); |
| 994 | 983 |
| 995 struct DeclarationDescriptor { | 984 struct DeclarationDescriptor { |
| 996 enum Kind { NORMAL, PARAMETER }; | 985 enum Kind { NORMAL, PARAMETER }; |
| 997 Parser* parser; | 986 Parser* parser; |
| 998 Scope* declaration_scope; | 987 Scope* declaration_scope; |
| 999 Scope* scope; | 988 Scope* scope; |
| 1000 Scope* hoist_scope; | 989 Scope* hoist_scope; |
| 1001 VariableMode mode; | 990 VariableMode mode; |
| 1002 bool is_const; | 991 bool is_const; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 TryStatement* ParseTryStatement(bool* ok); | 1091 TryStatement* ParseTryStatement(bool* ok); |
| 1103 DebuggerStatement* ParseDebuggerStatement(bool* ok); | 1092 DebuggerStatement* ParseDebuggerStatement(bool* ok); |
| 1104 | 1093 |
| 1105 // !%_IsSpecObject(result = iterator.next()) && | 1094 // !%_IsSpecObject(result = iterator.next()) && |
| 1106 // %ThrowIteratorResultNotAnObject(result) | 1095 // %ThrowIteratorResultNotAnObject(result) |
| 1107 Expression* BuildIteratorNextResult(Expression* iterator, Variable* result, | 1096 Expression* BuildIteratorNextResult(Expression* iterator, Variable* result, |
| 1108 int pos); | 1097 int pos); |
| 1109 | 1098 |
| 1110 | 1099 |
| 1111 // Initialize the components of a for-in / for-of statement. | 1100 // Initialize the components of a for-in / for-of statement. |
| 1112 void InitializeForEachStatement(ForEachStatement* stmt, | 1101 void InitializeForEachStatement(ForEachStatement* stmt, Expression* each, |
| 1113 Expression* each, | 1102 Expression* subject, Statement* body); |
| 1114 Expression* subject, | |
| 1115 Statement* body); | |
| 1116 Statement* DesugarLexicalBindingsInForStatement( | 1103 Statement* DesugarLexicalBindingsInForStatement( |
| 1117 Scope* inner_scope, bool is_const, ZoneList<const AstRawString*>* names, | 1104 Scope* inner_scope, bool is_const, ZoneList<const AstRawString*>* names, |
| 1118 ForStatement* loop, Statement* init, Expression* cond, Statement* next, | 1105 ForStatement* loop, Statement* init, Expression* cond, Statement* next, |
| 1119 Statement* body, bool* ok); | 1106 Statement* body, bool* ok); |
| 1120 | 1107 |
| 1121 void RewriteDoExpression(Expression* expr, bool* ok); | 1108 void RewriteDoExpression(Expression* expr, bool* ok); |
| 1122 | 1109 |
| 1123 FunctionLiteral* ParseFunctionLiteral( | 1110 FunctionLiteral* ParseFunctionLiteral( |
| 1124 const AstRawString* name, Scanner::Location function_name_location, | 1111 const AstRawString* name, Scanner::Location function_name_location, |
| 1125 FunctionNameValidity function_name_validity, FunctionKind kind, | 1112 FunctionNameValidity function_name_validity, FunctionKind kind, |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 ZoneList<v8::internal::Expression*>* args, int pos); | 1198 ZoneList<v8::internal::Expression*>* args, int pos); |
| 1212 Expression* SpreadCallNew(Expression* function, | 1199 Expression* SpreadCallNew(Expression* function, |
| 1213 ZoneList<v8::internal::Expression*>* args, int pos); | 1200 ZoneList<v8::internal::Expression*>* args, int pos); |
| 1214 | 1201 |
| 1215 void SetLanguageMode(Scope* scope, LanguageMode mode); | 1202 void SetLanguageMode(Scope* scope, LanguageMode mode); |
| 1216 void RaiseLanguageMode(LanguageMode mode); | 1203 void RaiseLanguageMode(LanguageMode mode); |
| 1217 | 1204 |
| 1218 Scanner scanner_; | 1205 Scanner scanner_; |
| 1219 PreParser* reusable_preparser_; | 1206 PreParser* reusable_preparser_; |
| 1220 Scope* original_scope_; // for ES5 function declarations in sloppy eval | 1207 Scope* original_scope_; // for ES5 function declarations in sloppy eval |
| 1221 Target* target_stack_; // for break, continue statements | 1208 Target* target_stack_; // for break, continue statements |
| 1222 ScriptCompiler::CompileOptions compile_options_; | 1209 ScriptCompiler::CompileOptions compile_options_; |
| 1223 ParseData* cached_parse_data_; | 1210 ParseData* cached_parse_data_; |
| 1224 | 1211 |
| 1225 PendingCompilationErrorHandler pending_error_handler_; | 1212 PendingCompilationErrorHandler pending_error_handler_; |
| 1226 | 1213 |
| 1227 // Other information which will be stored in Parser and moved to Isolate after | 1214 // Other information which will be stored in Parser and moved to Isolate after |
| 1228 // parsing. | 1215 // parsing. |
| 1229 int use_counts_[v8::Isolate::kUseCounterFeatureCount]; | 1216 int use_counts_[v8::Isolate::kUseCounterFeatureCount]; |
| 1230 int total_preparse_skipped_; | 1217 int total_preparse_skipped_; |
| 1231 HistogramTimer* pre_parse_timer_; | 1218 HistogramTimer* pre_parse_timer_; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 | 1255 |
| 1269 | 1256 |
| 1270 void ParserTraits::CheckConflictingVarDeclarations(v8::internal::Scope* scope, | 1257 void ParserTraits::CheckConflictingVarDeclarations(v8::internal::Scope* scope, |
| 1271 bool* ok) { | 1258 bool* ok) { |
| 1272 parser_->CheckConflictingVarDeclarations(scope, ok); | 1259 parser_->CheckConflictingVarDeclarations(scope, ok); |
| 1273 } | 1260 } |
| 1274 | 1261 |
| 1275 | 1262 |
| 1276 // Support for handling complex values (array and object literals) that | 1263 // Support for handling complex values (array and object literals) that |
| 1277 // can be fully handled at compile time. | 1264 // can be fully handled at compile time. |
| 1278 class CompileTimeValue: public AllStatic { | 1265 class CompileTimeValue : public AllStatic { |
| 1279 public: | 1266 public: |
| 1280 enum LiteralType { | 1267 enum LiteralType { |
| 1281 OBJECT_LITERAL_FAST_ELEMENTS, | 1268 OBJECT_LITERAL_FAST_ELEMENTS, |
| 1282 OBJECT_LITERAL_SLOW_ELEMENTS, | 1269 OBJECT_LITERAL_SLOW_ELEMENTS, |
| 1283 ARRAY_LITERAL | 1270 ARRAY_LITERAL |
| 1284 }; | 1271 }; |
| 1285 | 1272 |
| 1286 static bool IsCompileTimeValue(Expression* expression); | 1273 static bool IsCompileTimeValue(Expression* expression); |
| 1287 | 1274 |
| 1288 // Get the value as a compile time value. | 1275 // Get the value as a compile time value. |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 | 1352 |
| 1366 void ParserTraits::DeclareFormalParameter( | 1353 void ParserTraits::DeclareFormalParameter( |
| 1367 Scope* scope, const ParserFormalParameters::Parameter& parameter, | 1354 Scope* scope, const ParserFormalParameters::Parameter& parameter, |
| 1368 ExpressionClassifier* classifier) { | 1355 ExpressionClassifier* classifier) { |
| 1369 bool is_duplicate = false; | 1356 bool is_duplicate = false; |
| 1370 bool is_simple = classifier->is_simple_parameter_list(); | 1357 bool is_simple = classifier->is_simple_parameter_list(); |
| 1371 auto name = parameter.name; | 1358 auto name = parameter.name; |
| 1372 auto mode = is_simple ? VAR : TEMPORARY; | 1359 auto mode = is_simple ? VAR : TEMPORARY; |
| 1373 if (!is_simple) scope->SetHasNonSimpleParameters(); | 1360 if (!is_simple) scope->SetHasNonSimpleParameters(); |
| 1374 bool is_optional = parameter.initializer != nullptr; | 1361 bool is_optional = parameter.initializer != nullptr; |
| 1375 Variable* var = scope->DeclareParameter( | 1362 Variable* var = scope->DeclareParameter(name, mode, is_optional, |
| 1376 name, mode, is_optional, parameter.is_rest, &is_duplicate); | 1363 parameter.is_rest, &is_duplicate); |
| 1377 if (is_duplicate) { | 1364 if (is_duplicate) { |
| 1378 classifier->RecordDuplicateFormalParameterError( | 1365 classifier->RecordDuplicateFormalParameterError( |
| 1379 parser_->scanner()->location()); | 1366 parser_->scanner()->location()); |
| 1380 } | 1367 } |
| 1381 if (is_sloppy(scope->language_mode())) { | 1368 if (is_sloppy(scope->language_mode())) { |
| 1382 // TODO(sigurds) Mark every parameter as maybe assigned. This is a | 1369 // TODO(sigurds) Mark every parameter as maybe assigned. This is a |
| 1383 // conservative approximation necessary to account for parameters | 1370 // conservative approximation necessary to account for parameters |
| 1384 // that are assigned via the arguments array. | 1371 // that are assigned via the arguments array. |
| 1385 var->set_maybe_assigned(); | 1372 var->set_maybe_assigned(); |
| 1386 } | 1373 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1403 | 1390 |
| 1404 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { | 1391 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { |
| 1405 return parser_->ParseDoExpression(ok); | 1392 return parser_->ParseDoExpression(ok); |
| 1406 } | 1393 } |
| 1407 | 1394 |
| 1408 | 1395 |
| 1409 } // namespace internal | 1396 } // namespace internal |
| 1410 } // namespace v8 | 1397 } // namespace v8 |
| 1411 | 1398 |
| 1412 #endif // V8_PARSING_PARSER_H_ | 1399 #endif // V8_PARSING_PARSER_H_ |
| OLD | NEW |