Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: src/parsing/parser.h

Issue 1309813007: [es6] implement destructuring assignment (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add explicit placeholder RewritableExpression for rewriting Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 876 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 V8_INLINE ZoneList<v8::internal::Expression*>* PrepareSpreadArguments( 887 V8_INLINE ZoneList<v8::internal::Expression*>* PrepareSpreadArguments(
888 ZoneList<v8::internal::Expression*>* list); 888 ZoneList<v8::internal::Expression*>* list);
889 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {} 889 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {}
890 V8_INLINE Expression* SpreadCall(Expression* function, 890 V8_INLINE Expression* SpreadCall(Expression* function,
891 ZoneList<v8::internal::Expression*>* args, 891 ZoneList<v8::internal::Expression*>* args,
892 int pos); 892 int pos);
893 V8_INLINE Expression* SpreadCallNew(Expression* function, 893 V8_INLINE Expression* SpreadCallNew(Expression* function,
894 ZoneList<v8::internal::Expression*>* args, 894 ZoneList<v8::internal::Expression*>* args,
895 int pos); 895 int pos);
896 896
897 // Rewrite all DestructuringAssignments in the current FunctionState.
898 V8_INLINE void RewriteDestructuringAssignments();
899
900 V8_INLINE void QueueDestructuringAssignmentForRewriting(
901 Expression* assignment);
902
897 private: 903 private:
898 Parser* parser_; 904 Parser* parser_;
899 }; 905 };
900 906
901 907
902 class Parser : public ParserBase<ParserTraits> { 908 class Parser : public ParserBase<ParserTraits> {
903 public: 909 public:
904 explicit Parser(ParseInfo* info); 910 explicit Parser(ParseInfo* info);
905 ~Parser() { 911 ~Parser() {
906 delete reusable_preparser_; 912 delete reusable_preparser_;
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 Scanner::Location bindings_loc; 1039 Scanner::Location bindings_loc;
1034 }; 1040 };
1035 1041
1036 class PatternRewriter : private AstVisitor { 1042 class PatternRewriter : private AstVisitor {
1037 public: 1043 public:
1038 static void DeclareAndInitializeVariables( 1044 static void DeclareAndInitializeVariables(
1039 Block* block, const DeclarationDescriptor* declaration_descriptor, 1045 Block* block, const DeclarationDescriptor* declaration_descriptor,
1040 const DeclarationParsingResult::Declaration* declaration, 1046 const DeclarationParsingResult::Declaration* declaration,
1041 ZoneList<const AstRawString*>* names, bool* ok); 1047 ZoneList<const AstRawString*>* names, bool* ok);
1042 1048
1049 static void RewriteDestructuringAssignment(Parser* parser,
1050 RewritableExpression* expr,
1051 Scope* Scope, bool* ok);
1052
1043 void set_initializer_position(int pos) { initializer_position_ = pos; } 1053 void set_initializer_position(int pos) { initializer_position_ = pos; }
1044 1054
1045 private: 1055 private:
1046 PatternRewriter() {} 1056 PatternRewriter() {}
1047 1057
1048 #define DECLARE_VISIT(type) void Visit##type(v8::internal::type* node) override; 1058 #define DECLARE_VISIT(type) void Visit##type(v8::internal::type* node) override;
1049 // Visiting functions for AST nodes make this an AstVisitor. 1059 // Visiting functions for AST nodes make this an AstVisitor.
1050 AST_NODE_LIST(DECLARE_VISIT) 1060 AST_NODE_LIST(DECLARE_VISIT)
1051 #undef DECLARE_VISIT 1061 #undef DECLARE_VISIT
1052 void Visit(AstNode* node) override; 1062 void Visit(AstNode* node) override;
1053 1063
1064 enum PatternContext {
1065 BINDING,
1066 INITIALIZER,
1067 ASSIGNMENT,
1068 ASSIGNMENT_INITIALIZER
1069 };
1070
1071 PatternContext context() const { return context_; }
1072 void set_context(PatternContext context) { context_ = context; }
1073
1054 void RecurseIntoSubpattern(AstNode* pattern, Expression* value) { 1074 void RecurseIntoSubpattern(AstNode* pattern, Expression* value) {
1055 Expression* old_value = current_value_; 1075 Expression* old_value = current_value_;
1056 current_value_ = value; 1076 current_value_ = value;
1057 pattern->Accept(this); 1077 pattern->Accept(this);
1058 current_value_ = old_value; 1078 current_value_ = old_value;
1059 } 1079 }
1060 1080
1081 void VisitObjectLiteral(ObjectLiteral* node, Variable** temp_var);
1082 void VisitArrayLiteral(ArrayLiteral* node, Variable** temp_var);
1083
1084 bool IsBindingContext() const { return IsBindingContext(context_); }
1085 bool IsInitializerContext() const { return context_ != ASSIGNMENT; }
1086 bool IsAssignmentContext() const { return IsAssignmentContext(context_); }
1087 bool IsAssignmentContext(PatternContext c) const;
1088 bool IsBindingContext(PatternContext c) const;
1089 PatternContext SetAssignmentContextIfNeeded(Expression* node);
1090 PatternContext SetInitializerContextIfNeeded(Expression* node);
1091
1061 Variable* CreateTempVar(Expression* value = nullptr); 1092 Variable* CreateTempVar(Expression* value = nullptr);
1062 1093
1063 AstNodeFactory* factory() const { return descriptor_->parser->factory(); } 1094 AstNodeFactory* factory() const { return parser_->factory(); }
1064 AstValueFactory* ast_value_factory() const { 1095 AstValueFactory* ast_value_factory() const {
1065 return descriptor_->parser->ast_value_factory(); 1096 return parser_->ast_value_factory();
1066 } 1097 }
1067 Zone* zone() const { return descriptor_->parser->zone(); } 1098 Zone* zone() const { return parser_->zone(); }
1099 Scope* scope() const { return scope_; }
1068 1100
1101 Scope* scope_;
1102 Parser* parser_;
1103 PatternContext context_;
1069 Expression* pattern_; 1104 Expression* pattern_;
1070 int initializer_position_; 1105 int initializer_position_;
1071 Block* block_; 1106 Block* block_;
1072 const DeclarationDescriptor* descriptor_; 1107 const DeclarationDescriptor* descriptor_;
1073 ZoneList<const AstRawString*>* names_; 1108 ZoneList<const AstRawString*>* names_;
1074 Expression* current_value_; 1109 Expression* current_value_;
1075 bool* ok_; 1110 bool* ok_;
1076 }; 1111 };
1077 1112
1078 1113
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1208 ZoneList<v8::internal::Expression*>* PrepareSpreadArguments( 1243 ZoneList<v8::internal::Expression*>* PrepareSpreadArguments(
1209 ZoneList<v8::internal::Expression*>* list); 1244 ZoneList<v8::internal::Expression*>* list);
1210 Expression* SpreadCall(Expression* function, 1245 Expression* SpreadCall(Expression* function,
1211 ZoneList<v8::internal::Expression*>* args, int pos); 1246 ZoneList<v8::internal::Expression*>* args, int pos);
1212 Expression* SpreadCallNew(Expression* function, 1247 Expression* SpreadCallNew(Expression* function,
1213 ZoneList<v8::internal::Expression*>* args, int pos); 1248 ZoneList<v8::internal::Expression*>* args, int pos);
1214 1249
1215 void SetLanguageMode(Scope* scope, LanguageMode mode); 1250 void SetLanguageMode(Scope* scope, LanguageMode mode);
1216 void RaiseLanguageMode(LanguageMode mode); 1251 void RaiseLanguageMode(LanguageMode mode);
1217 1252
1253 V8_INLINE void RewriteDestructuringAssignments();
1254
1255 friend class InitializerRewriter;
1256 void RewriteParameterInitializer(Expression* expr, Scope* scope);
1257
1218 Scanner scanner_; 1258 Scanner scanner_;
1219 PreParser* reusable_preparser_; 1259 PreParser* reusable_preparser_;
1220 Scope* original_scope_; // for ES5 function declarations in sloppy eval 1260 Scope* original_scope_; // for ES5 function declarations in sloppy eval
1221 Target* target_stack_; // for break, continue statements 1261 Target* target_stack_; // for break, continue statements
1222 ScriptCompiler::CompileOptions compile_options_; 1262 ScriptCompiler::CompileOptions compile_options_;
1223 ParseData* cached_parse_data_; 1263 ParseData* cached_parse_data_;
1224 1264
1225 PendingCompilationErrorHandler pending_error_handler_; 1265 PendingCompilationErrorHandler pending_error_handler_;
1226 1266
1227 // Other information which will be stored in Parser and moved to Isolate after 1267 // Other information which will be stored in Parser and moved to Isolate after
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 1443
1404 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { 1444 DoExpression* ParserTraits::ParseDoExpression(bool* ok) {
1405 return parser_->ParseDoExpression(ok); 1445 return parser_->ParseDoExpression(ok);
1406 } 1446 }
1407 1447
1408 1448
1409 } // namespace internal 1449 } // namespace internal
1410 } // namespace v8 1450 } // namespace v8
1411 1451
1412 #endif // V8_PARSING_PARSER_H_ 1452 #endif // V8_PARSING_PARSER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698