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

Side by Side Diff: src/ast/ast.h

Issue 2149663003: Reorder fields of AstNode subclasses for better packing (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: tweaks Created 4 years, 5 months 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
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_AST_AST_H_ 5 #ifndef V8_AST_AST_H_
6 #define V8_AST_AST_H_ 6 #define V8_AST_AST_H_
7 7
8 #include "src/ast/ast-value-factory.h" 8 #include "src/ast/ast-value-factory.h"
9 #include "src/ast/modules.h" 9 #include "src/ast/modules.h"
10 #include "src/ast/variables.h" 10 #include "src/ast/variables.h"
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 223
224 private: 224 private:
225 // Hidden to prevent accidental usage. It would have to load the 225 // Hidden to prevent accidental usage. It would have to load the
226 // current zone from the TLS. 226 // current zone from the TLS.
227 void* operator new(size_t size); 227 void* operator new(size_t size);
228 228
229 friend class CaseClause; // Generates AST IDs. 229 friend class CaseClause; // Generates AST IDs.
230 230
231 int position_; 231 int position_;
232 NodeType node_type_; 232 NodeType node_type_;
233 // Ends with NodeType which is uint8_t sized. Deriving classes in turn begin
234 // sub-int32_t-sized fields for optimum packing efficiency.
233 }; 235 };
234 236
235 237
236 class Statement : public AstNode { 238 class Statement : public AstNode {
237 public: 239 public:
238 bool IsEmpty() { return AsEmptyStatement() != NULL; } 240 bool IsEmpty() { return AsEmptyStatement() != NULL; }
239 bool IsJump() const; 241 bool IsJump() const;
240 242
241 protected: 243 protected:
242 Statement(Zone* zone, int position, NodeType type) 244 Statement(Zone* zone, int position, NodeType type)
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 IcCheckType GetKeyType() const; 353 IcCheckType GetKeyType() const;
352 bool IsMonomorphic() const; 354 bool IsMonomorphic() const;
353 355
354 void set_base_id(int id) { base_id_ = id; } 356 void set_base_id(int id) { base_id_ = id; }
355 static int num_ids() { return parent_num_ids() + 2; } 357 static int num_ids() { return parent_num_ids() + 2; }
356 BailoutId id() const { return BailoutId(local_id(0)); } 358 BailoutId id() const { return BailoutId(local_id(0)); }
357 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } 359 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); }
358 360
359 protected: 361 protected:
360 Expression(Zone* zone, int pos, NodeType type) 362 Expression(Zone* zone, int pos, NodeType type)
361 : AstNode(pos, type), 363 : AstNode(pos, type), base_id_(BailoutId::None().ToInt()) {}
362 base_id_(BailoutId::None().ToInt()),
363 bit_field_(0) {}
364 static int parent_num_ids() { return 0; } 364 static int parent_num_ids() { return 0; }
365 void set_to_boolean_types(uint16_t types) { 365 void set_to_boolean_types(uint16_t types) {
366 bit_field_ = ToBooleanTypesField::update(bit_field_, types); 366 bit_field_ = ToBooleanTypesField::update(bit_field_, types);
367 } 367 }
368 368
369 int base_id() const { 369 int base_id() const {
370 DCHECK(!BailoutId(base_id_).IsNone()); 370 DCHECK(!BailoutId(base_id_).IsNone());
371 return base_id_; 371 return base_id_;
372 } 372 }
373 373
374 private: 374 private:
375 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 375 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
376 376
377 uint16_t bit_field_ = 0;
Michael Starzinger 2016/07/18 08:20:52 nit: Why use implicit initialization here and expl
377 int base_id_; 378 int base_id_;
378 class ToBooleanTypesField : public BitField16<uint16_t, 0, 9> {}; 379 class ToBooleanTypesField : public BitField16<uint16_t, 0, 9> {};
379 uint16_t bit_field_;
380 // Ends with 16-bit field; deriving classes in turn begin with
381 // 16-bit fields for optimum packing efficiency.
382 }; 380 };
383 381
384 382
385 class BreakableStatement : public Statement { 383 class BreakableStatement : public Statement {
386 public: 384 public:
387 enum BreakableType { 385 enum BreakableType {
388 TARGET_FOR_ANONYMOUS, 386 TARGET_FOR_ANONYMOUS,
389 TARGET_FOR_NAMED_ONLY 387 TARGET_FOR_NAMED_ONLY
390 }; 388 };
391 389
(...skipping 11 matching lines...) Expand all
403 401
404 void set_base_id(int id) { base_id_ = id; } 402 void set_base_id(int id) { base_id_ = id; }
405 static int num_ids() { return parent_num_ids() + 2; } 403 static int num_ids() { return parent_num_ids() + 2; }
406 BailoutId EntryId() const { return BailoutId(local_id(0)); } 404 BailoutId EntryId() const { return BailoutId(local_id(0)); }
407 BailoutId ExitId() const { return BailoutId(local_id(1)); } 405 BailoutId ExitId() const { return BailoutId(local_id(1)); }
408 406
409 protected: 407 protected:
410 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, 408 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels,
411 BreakableType breakable_type, int position, NodeType type) 409 BreakableType breakable_type, int position, NodeType type)
412 : Statement(zone, position, type), 410 : Statement(zone, position, type),
413 labels_(labels),
414 breakable_type_(breakable_type), 411 breakable_type_(breakable_type),
415 base_id_(BailoutId::None().ToInt()) { 412 base_id_(BailoutId::None().ToInt()),
413 labels_(labels) {
416 DCHECK(labels == NULL || labels->length() > 0); 414 DCHECK(labels == NULL || labels->length() > 0);
417 } 415 }
418 static int parent_num_ids() { return 0; } 416 static int parent_num_ids() { return 0; }
419 417
420 int base_id() const { 418 int base_id() const {
421 DCHECK(!BailoutId(base_id_).IsNone()); 419 DCHECK(!BailoutId(base_id_).IsNone());
422 return base_id_; 420 return base_id_;
423 } 421 }
424 422
425 private: 423 private:
426 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 424 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
427 425
426 BreakableType breakable_type_;
427 int base_id_;
428 Label break_target_;
428 ZoneList<const AstRawString*>* labels_; 429 ZoneList<const AstRawString*>* labels_;
429 BreakableType breakable_type_;
430 Label break_target_;
431 int base_id_;
432 }; 430 };
433 431
434 432
435 class Block final : public BreakableStatement { 433 class Block final : public BreakableStatement {
436 public: 434 public:
437 DECLARE_NODE_TYPE(Block) 435 DECLARE_NODE_TYPE(Block)
438 436
439 ZoneList<Statement*>* statements() { return &statements_; } 437 ZoneList<Statement*>* statements() { return &statements_; }
440 bool ignore_completion_value() const { return ignore_completion_value_; } 438 bool ignore_completion_value() const { return ignore_completion_value_; }
441 439
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 974
977 void set_base_id(int id) { base_id_ = id; } 975 void set_base_id(int id) { base_id_ = id; }
978 static int num_ids() { return parent_num_ids() + 2; } 976 static int num_ids() { return parent_num_ids() + 2; }
979 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } 977 BailoutId ToObjectId() const { return BailoutId(local_id(0)); }
980 BailoutId EntryId() const { return BailoutId(local_id(1)); } 978 BailoutId EntryId() const { return BailoutId(local_id(1)); }
981 979
982 protected: 980 protected:
983 WithStatement(Zone* zone, Scope* scope, Expression* expression, 981 WithStatement(Zone* zone, Scope* scope, Expression* expression,
984 Statement* statement, int pos) 982 Statement* statement, int pos)
985 : Statement(zone, pos, kWithStatement), 983 : Statement(zone, pos, kWithStatement),
984 base_id_(BailoutId::None().ToInt()),
986 scope_(scope), 985 scope_(scope),
987 expression_(expression), 986 expression_(expression),
988 statement_(statement), 987 statement_(statement) {}
989 base_id_(BailoutId::None().ToInt()) {}
990 static int parent_num_ids() { return 0; } 988 static int parent_num_ids() { return 0; }
991 989
992 int base_id() const { 990 int base_id() const {
993 DCHECK(!BailoutId(base_id_).IsNone()); 991 DCHECK(!BailoutId(base_id_).IsNone());
994 return base_id_; 992 return base_id_;
995 } 993 }
996 994
997 private: 995 private:
998 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 996 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
999 997
998 int base_id_;
1000 Scope* scope_; 999 Scope* scope_;
1001 Expression* expression_; 1000 Expression* expression_;
1002 Statement* statement_; 1001 Statement* statement_;
1003 int base_id_;
1004 }; 1002 };
1005 1003
1006 1004
1007 class CaseClause final : public Expression { 1005 class CaseClause final : public Expression {
1008 public: 1006 public:
1009 DECLARE_NODE_TYPE(CaseClause) 1007 DECLARE_NODE_TYPE(CaseClause)
1010 1008
1011 bool is_default() const { return label_ == NULL; } 1009 bool is_default() const { return label_ == NULL; }
1012 Expression* label() const { 1010 Expression* label() const {
1013 CHECK(!is_default()); 1011 CHECK(!is_default());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 void set_base_id(int id) { base_id_ = id; } 1092 void set_base_id(int id) { base_id_ = id; }
1095 static int num_ids() { return parent_num_ids() + 3; } 1093 static int num_ids() { return parent_num_ids() + 3; }
1096 BailoutId IfId() const { return BailoutId(local_id(0)); } 1094 BailoutId IfId() const { return BailoutId(local_id(0)); }
1097 BailoutId ThenId() const { return BailoutId(local_id(1)); } 1095 BailoutId ThenId() const { return BailoutId(local_id(1)); }
1098 BailoutId ElseId() const { return BailoutId(local_id(2)); } 1096 BailoutId ElseId() const { return BailoutId(local_id(2)); }
1099 1097
1100 protected: 1098 protected:
1101 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, 1099 IfStatement(Zone* zone, Expression* condition, Statement* then_statement,
1102 Statement* else_statement, int pos) 1100 Statement* else_statement, int pos)
1103 : Statement(zone, pos, kIfStatement), 1101 : Statement(zone, pos, kIfStatement),
1102 base_id_(BailoutId::None().ToInt()),
1104 condition_(condition), 1103 condition_(condition),
1105 then_statement_(then_statement), 1104 then_statement_(then_statement),
1106 else_statement_(else_statement), 1105 else_statement_(else_statement) {}
1107 base_id_(BailoutId::None().ToInt()) {}
1108 static int parent_num_ids() { return 0; } 1106 static int parent_num_ids() { return 0; }
1109 1107
1110 int base_id() const { 1108 int base_id() const {
1111 DCHECK(!BailoutId(base_id_).IsNone()); 1109 DCHECK(!BailoutId(base_id_).IsNone());
1112 return base_id_; 1110 return base_id_;
1113 } 1111 }
1114 1112
1115 private: 1113 private:
1116 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1114 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1117 1115
1116 int base_id_;
1118 Expression* condition_; 1117 Expression* condition_;
1119 Statement* then_statement_; 1118 Statement* then_statement_;
1120 Statement* else_statement_; 1119 Statement* else_statement_;
1121 int base_id_;
1122 }; 1120 };
1123 1121
1124 1122
1125 class TryStatement : public Statement { 1123 class TryStatement : public Statement {
1126 public: 1124 public:
1127 Block* try_block() const { return try_block_; } 1125 Block* try_block() const { return try_block_; }
1128 void set_try_block(Block* b) { try_block_ = b; } 1126 void set_try_block(Block* b) { try_block_ = b; }
1129 1127
1130 // Prediction of whether exceptions thrown into the handler for this try block 1128 // Prediction of whether exceptions thrown into the handler for this try block
1131 // will be caught. 1129 // will be caught.
1132 // 1130 //
1133 // This is set in ast-numbering and later compiled into the code's handler 1131 // This is set in ast-numbering and later compiled into the code's handler
1134 // table. The runtime uses this information to implement a feature that 1132 // table. The runtime uses this information to implement a feature that
1135 // notifies the debugger when an uncaught exception is thrown, _before_ the 1133 // notifies the debugger when an uncaught exception is thrown, _before_ the
1136 // exception propagates to the top. 1134 // exception propagates to the top.
1137 // 1135 //
1138 // Since it's generally undecidable whether an exception will be caught, our 1136 // Since it's generally undecidable whether an exception will be caught, our
1139 // prediction is only an approximation. 1137 // prediction is only an approximation.
1140 bool catch_predicted() const { return catch_predicted_; } 1138 bool catch_predicted() const { return catch_predicted_; }
1141 void set_catch_predicted(bool b) { catch_predicted_ = b; } 1139 void set_catch_predicted(bool b) { catch_predicted_ = b; }
1142 1140
1143 protected: 1141 protected:
1144 TryStatement(Zone* zone, Block* try_block, int pos, NodeType type) 1142 TryStatement(Zone* zone, Block* try_block, int pos, NodeType type)
1145 : Statement(zone, pos, type), 1143 : Statement(zone, pos, type),
1146 try_block_(try_block), 1144 catch_predicted_(false),
1147 catch_predicted_(false) {} 1145 try_block_(try_block) {}
1148 1146
1149 private: 1147 private:
1148 bool catch_predicted_;
1150 Block* try_block_; 1149 Block* try_block_;
1151 bool catch_predicted_;
1152 }; 1150 };
1153 1151
1154 1152
1155 class TryCatchStatement final : public TryStatement { 1153 class TryCatchStatement final : public TryStatement {
1156 public: 1154 public:
1157 DECLARE_NODE_TYPE(TryCatchStatement) 1155 DECLARE_NODE_TYPE(TryCatchStatement)
1158 1156
1159 Scope* scope() { return scope_; } 1157 Scope* scope() { return scope_; }
1160 Variable* variable() { return variable_; } 1158 Variable* variable() { return variable_; }
1161 Block* catch_block() const { return catch_block_; } 1159 Block* catch_block() const { return catch_block_; }
1162 void set_catch_block(Block* b) { catch_block_ = b; } 1160 void set_catch_block(Block* b) { catch_block_ = b; }
1163 1161
1164 // The clear_pending_message flag indicates whether or not to clear the 1162 // The clear_pending_message flag indicates whether or not to clear the
1165 // isolate's pending exception message before executing the catch_block. In 1163 // isolate's pending exception message before executing the catch_block. In
1166 // the normal use case, this flag is always on because the message object 1164 // the normal use case, this flag is always on because the message object
1167 // is not needed anymore when entering the catch block and should not be kept 1165 // is not needed anymore when entering the catch block and should not be kept
1168 // alive. 1166 // alive.
1169 // The use case where the flag is off is when the catch block is guaranteed to 1167 // The use case where the flag is off is when the catch block is guaranteed to
1170 // rethrow the caught exception (using %ReThrow), which reuses the pending 1168 // rethrow the caught exception (using %ReThrow), which reuses the pending
1171 // message instead of generating a new one. 1169 // message instead of generating a new one.
1172 // (When the catch block doesn't rethrow but is guaranteed to perform an 1170 // (When the catch block doesn't rethrow but is guaranteed to perform an
1173 // ordinary throw, not clearing the old message is safe but not very useful.) 1171 // ordinary throw, not clearing the old message is safe but not very useful.)
1174 bool clear_pending_message() { return clear_pending_message_; } 1172 bool clear_pending_message() { return clear_pending_message_; }
1175 1173
1176 protected: 1174 protected:
1177 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, 1175 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope,
1178 Variable* variable, Block* catch_block, 1176 Variable* variable, Block* catch_block,
1179 bool clear_pending_message, int pos) 1177 bool clear_pending_message, int pos)
1180 : TryStatement(zone, try_block, pos, kTryCatchStatement), 1178 : TryStatement(zone, try_block, pos, kTryCatchStatement),
1179 clear_pending_message_(clear_pending_message),
1181 scope_(scope), 1180 scope_(scope),
1182 variable_(variable), 1181 variable_(variable),
1183 catch_block_(catch_block), 1182 catch_block_(catch_block) {}
1184 clear_pending_message_(clear_pending_message) {}
1185 1183
1186 private: 1184 private:
1185 bool clear_pending_message_;
1187 Scope* scope_; 1186 Scope* scope_;
1188 Variable* variable_; 1187 Variable* variable_;
1189 Block* catch_block_; 1188 Block* catch_block_;
1190 bool clear_pending_message_;
1191 }; 1189 };
1192 1190
1193 1191
1194 class TryFinallyStatement final : public TryStatement { 1192 class TryFinallyStatement final : public TryStatement {
1195 public: 1193 public:
1196 DECLARE_NODE_TYPE(TryFinallyStatement) 1194 DECLARE_NODE_TYPE(TryFinallyStatement)
1197 1195
1198 Block* finally_block() const { return finally_block_; } 1196 Block* finally_block() const { return finally_block_; }
1199 void set_finally_block(Block* b) { finally_block_ = b; } 1197 void set_finally_block(Block* b) { finally_block_ = b; }
1200 1198
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 1318
1321 int depth() const { 1319 int depth() const {
1322 // only callable after initialization. 1320 // only callable after initialization.
1323 DCHECK(depth_ >= 1); 1321 DCHECK(depth_ >= 1);
1324 return depth_; 1322 return depth_;
1325 } 1323 }
1326 1324
1327 protected: 1325 protected:
1328 MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type) 1326 MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type)
1329 : Expression(zone, pos, type), 1327 : Expression(zone, pos, type),
1330 literal_index_(literal_index),
1331 is_simple_(false), 1328 is_simple_(false),
1332 depth_(0) {} 1329 depth_(0),
1330 literal_index_(literal_index) {}
1333 1331
1334 // A materialized literal is simple if the values consist of only 1332 // A materialized literal is simple if the values consist of only
1335 // constants and simple object and array literals. 1333 // constants and simple object and array literals.
1336 bool is_simple() const { return is_simple_; } 1334 bool is_simple() const { return is_simple_; }
1337 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } 1335 void set_is_simple(bool is_simple) { is_simple_ = is_simple; }
1338 friend class CompileTimeValue; 1336 friend class CompileTimeValue;
1339 1337
1340 void set_depth(int depth) { 1338 void set_depth(int depth) {
1341 DCHECK(depth >= 1); 1339 DCHECK_LE(1, depth);
1342 depth_ = depth; 1340 depth_ = depth;
1343 } 1341 }
1344 1342
1345 // Populate the constant properties/elements fixed array. 1343 // Populate the constant properties/elements fixed array.
1346 void BuildConstants(Isolate* isolate); 1344 void BuildConstants(Isolate* isolate);
1347 friend class ArrayLiteral; 1345 friend class ArrayLiteral;
1348 friend class ObjectLiteral; 1346 friend class ObjectLiteral;
1349 1347
1350 // If the expression is a literal, return the literal value; 1348 // If the expression is a literal, return the literal value;
1351 // if the expression is a materialized literal and is simple return a 1349 // if the expression is a materialized literal and is simple return a
1352 // compile time value as encoded by CompileTimeValue::GetValue(). 1350 // compile time value as encoded by CompileTimeValue::GetValue().
1353 // Otherwise, return undefined literal as the placeholder 1351 // Otherwise, return undefined literal as the placeholder
1354 // in the object literal boilerplate. 1352 // in the object literal boilerplate.
1355 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); 1353 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate);
1356 1354
1357 private: 1355 private:
1356 bool is_simple_ : 1;
1357 int depth_ : 31;
1358 int literal_index_; 1358 int literal_index_;
1359 bool is_simple_;
1360 int depth_;
1361 1359
1362 friend class AstLiteralReindexer; 1360 friend class AstLiteralReindexer;
1363 }; 1361 };
1364 1362
1365 1363
1366 // Property is used for passing information 1364 // Property is used for passing information
1367 // about an object literal's properties from the parser 1365 // about an object literal's properties from the parser
1368 // to the code generator. 1366 // to the code generator.
1369 class ObjectLiteralProperty final : public ZoneObject { 1367 class ObjectLiteralProperty final : public ZoneObject {
1370 public: 1368 public:
1371 enum Kind { 1369 enum Kind : uint8_t {
1372 CONSTANT, // Property with constant value (compile time). 1370 CONSTANT, // Property with constant value (compile time).
1373 COMPUTED, // Property with computed value (execution time). 1371 COMPUTED, // Property with computed value (execution time).
1374 MATERIALIZED_LITERAL, // Property value is a materialized literal. 1372 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1375 GETTER, SETTER, // Property is an accessor function. 1373 GETTER,
1376 PROTOTYPE // Property is __proto__. 1374 SETTER, // Property is an accessor function.
1375 PROTOTYPE // Property is __proto__.
1377 }; 1376 };
1378 1377
1379 Expression* key() { return key_; } 1378 Expression* key() { return key_; }
1380 Expression* value() { return value_; } 1379 Expression* value() { return value_; }
1381 Kind kind() { return kind_; } 1380 Kind kind() { return kind_; }
1382 1381
1383 void set_key(Expression* e) { key_ = e; } 1382 void set_key(Expression* e) { key_ = e; }
1384 void set_value(Expression* e) { value_ = e; } 1383 void set_value(Expression* e) { value_ = e; }
1385 1384
1386 // Type feedback information. 1385 // Type feedback information.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 return parent_num_ids() + 1 + 2 * properties()->length(); 1500 return parent_num_ids() + 1 + 2 * properties()->length();
1502 } 1501 }
1503 1502
1504 // Object literals need one feedback slot for each non-trivial value, as well 1503 // Object literals need one feedback slot for each non-trivial value, as well
1505 // as some slots for home objects. 1504 // as some slots for home objects.
1506 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1505 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1507 FeedbackVectorSlotCache* cache); 1506 FeedbackVectorSlotCache* cache);
1508 1507
1509 protected: 1508 protected:
1510 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, 1509 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index,
1511 int boilerplate_properties, int pos) 1510 uint32_t boilerplate_properties, int pos)
1512 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), 1511 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral),
1513 properties_(properties),
1514 boilerplate_properties_(boilerplate_properties), 1512 boilerplate_properties_(boilerplate_properties),
1515 fast_elements_(false), 1513 fast_elements_(false),
1516 has_elements_(false), 1514 has_elements_(false),
1517 may_store_doubles_(false) {} 1515 may_store_doubles_(false),
1516 properties_(properties) {}
1518 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } 1517 static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
1519 1518
1520 private: 1519 private:
1521 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1520 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1521 uint32_t boilerplate_properties_ : 29;
1522 bool fast_elements_ : 1;
1523 bool has_elements_ : 1;
1524 bool may_store_doubles_ : 1;
1525 FeedbackVectorSlot slot_;
1522 Handle<FixedArray> constant_properties_; 1526 Handle<FixedArray> constant_properties_;
1523 ZoneList<Property*>* properties_; 1527 ZoneList<Property*>* properties_;
1524 int boilerplate_properties_;
1525 bool fast_elements_;
1526 bool has_elements_;
1527 bool may_store_doubles_;
1528 FeedbackVectorSlot slot_;
1529 }; 1528 };
1530 1529
1531 1530
1532 // A map from property names to getter/setter pairs allocated in the zone. 1531 // A map from property names to getter/setter pairs allocated in the zone.
1533 class AccessorTable 1532 class AccessorTable
1534 : public base::TemplateHashMap<Literal, ObjectLiteral::Accessors, 1533 : public base::TemplateHashMap<Literal, ObjectLiteral::Accessors,
1535 ZoneAllocationPolicy> { 1534 ZoneAllocationPolicy> {
1536 public: 1535 public:
1537 explicit AccessorTable(Zone* zone) 1536 explicit AccessorTable(Zone* zone)
1538 : base::TemplateHashMap<Literal, ObjectLiteral::Accessors, 1537 : base::TemplateHashMap<Literal, ObjectLiteral::Accessors,
(...skipping 17 matching lines...) Expand all
1556 public: 1555 public:
1557 DECLARE_NODE_TYPE(RegExpLiteral) 1556 DECLARE_NODE_TYPE(RegExpLiteral)
1558 1557
1559 Handle<String> pattern() const { return pattern_->string(); } 1558 Handle<String> pattern() const { return pattern_->string(); }
1560 int flags() const { return flags_; } 1559 int flags() const { return flags_; }
1561 1560
1562 protected: 1561 protected:
1563 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, 1562 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags,
1564 int literal_index, int pos) 1563 int literal_index, int pos)
1565 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), 1564 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral),
1566 pattern_(pattern), 1565 flags_(flags),
1567 flags_(flags) { 1566 pattern_(pattern) {
1568 set_depth(1); 1567 set_depth(1);
1569 } 1568 }
1570 1569
1571 private: 1570 private:
1571 int const flags_;
1572 const AstRawString* const pattern_; 1572 const AstRawString* const pattern_;
1573 int const flags_;
1574 }; 1573 };
1575 1574
1576 1575
1577 // An array literal has a literals object that is used 1576 // An array literal has a literals object that is used
1578 // for minimizing the work when constructing it at runtime. 1577 // for minimizing the work when constructing it at runtime.
1579 class ArrayLiteral final : public MaterializedLiteral { 1578 class ArrayLiteral final : public MaterializedLiteral {
1580 public: 1579 public:
1581 DECLARE_NODE_TYPE(ArrayLiteral) 1580 DECLARE_NODE_TYPE(ArrayLiteral)
1582 1581
1583 Handle<FixedArray> constant_elements() const { return constant_elements_; } 1582 Handle<FixedArray> constant_elements() const { return constant_elements_; }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 }; 1629 };
1631 1630
1632 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1631 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1633 FeedbackVectorSlotCache* cache); 1632 FeedbackVectorSlotCache* cache);
1634 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } 1633 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; }
1635 1634
1636 protected: 1635 protected:
1637 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, 1636 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values,
1638 int first_spread_index, int literal_index, int pos) 1637 int first_spread_index, int literal_index, int pos)
1639 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), 1638 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral),
1640 values_(values), 1639 first_spread_index_(first_spread_index),
1641 first_spread_index_(first_spread_index) {} 1640 values_(values) {}
1642 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } 1641 static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
1643 1642
1644 private: 1643 private:
1645 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1644 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1646 1645
1646 int first_spread_index_;
1647 FeedbackVectorSlot literal_slot_;
1647 Handle<FixedArray> constant_elements_; 1648 Handle<FixedArray> constant_elements_;
1648 ZoneList<Expression*>* values_; 1649 ZoneList<Expression*>* values_;
1649 int first_spread_index_;
1650 FeedbackVectorSlot literal_slot_;
1651 }; 1650 };
1652 1651
1653 1652
1654 class VariableProxy final : public Expression { 1653 class VariableProxy final : public Expression {
1655 public: 1654 public:
1656 DECLARE_NODE_TYPE(VariableProxy) 1655 DECLARE_NODE_TYPE(VariableProxy)
1657 1656
1658 bool IsValidReferenceExpression() const { 1657 bool IsValidReferenceExpression() const {
1659 return !is_this() && !is_new_target(); 1658 return !is_this() && !is_new_target();
1660 } 1659 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1720 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1722 1721
1723 class IsThisField : public BitField8<bool, 0, 1> {}; 1722 class IsThisField : public BitField8<bool, 0, 1> {};
1724 class IsAssignedField : public BitField8<bool, 1, 1> {}; 1723 class IsAssignedField : public BitField8<bool, 1, 1> {};
1725 class IsResolvedField : public BitField8<bool, 2, 1> {}; 1724 class IsResolvedField : public BitField8<bool, 2, 1> {};
1726 class IsNewTargetField : public BitField8<bool, 3, 1> {}; 1725 class IsNewTargetField : public BitField8<bool, 3, 1> {};
1727 1726
1728 // Start with 16-bit (or smaller) field, which should get packed together 1727 // Start with 16-bit (or smaller) field, which should get packed together
1729 // with Expression's trailing 16-bit field. 1728 // with Expression's trailing 16-bit field.
1730 uint8_t bit_field_; 1729 uint8_t bit_field_;
1730 // Position is stored in the AstNode superclass, but VariableProxy needs to
1731 // know its end position too (for error messages). It cannot be inferred from
1732 // the variable name length because it can contain escapes.
1733 int end_position_;
1731 FeedbackVectorSlot variable_feedback_slot_; 1734 FeedbackVectorSlot variable_feedback_slot_;
1732 union { 1735 union {
1733 const AstRawString* raw_name_; // if !is_resolved_ 1736 const AstRawString* raw_name_; // if !is_resolved_
1734 Variable* var_; // if is_resolved_ 1737 Variable* var_; // if is_resolved_
1735 }; 1738 };
1736 // Position is stored in the AstNode superclass, but VariableProxy needs to
1737 // know its end position too (for error messages). It cannot be inferred from
1738 // the variable name length because it can contain escapes.
1739 int end_position_;
1740 }; 1739 };
1741 1740
1742 1741
1743 // Left-hand side can only be a property, a global or a (parameter or local) 1742 // Left-hand side can only be a property, a global or a (parameter or local)
1744 // slot. 1743 // slot.
1745 enum LhsKind { 1744 enum LhsKind {
1746 VARIABLE, 1745 VARIABLE,
1747 NAMED_PROPERTY, 1746 NAMED_PROPERTY,
1748 KEYED_PROPERTY, 1747 KEYED_PROPERTY,
1749 NAMED_SUPER_PROPERTY, 1748 NAMED_SUPER_PROPERTY,
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1936 1935
1937 #ifdef DEBUG 1936 #ifdef DEBUG
1938 // Used to assert that the FullCodeGenerator records the return site. 1937 // Used to assert that the FullCodeGenerator records the return site.
1939 bool return_is_recorded_; 1938 bool return_is_recorded_;
1940 #endif 1939 #endif
1941 1940
1942 protected: 1941 protected:
1943 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1942 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1944 int pos) 1943 int pos)
1945 : Expression(zone, pos, kCall), 1944 : Expression(zone, pos, kCall),
1945 bit_field_(IsUninitializedField::encode(false)),
1946 expression_(expression), 1946 expression_(expression),
1947 arguments_(arguments), 1947 arguments_(arguments) {
1948 bit_field_(IsUninitializedField::encode(false)) {
1949 if (expression->IsProperty()) { 1948 if (expression->IsProperty()) {
1950 expression->AsProperty()->mark_for_call(); 1949 expression->AsProperty()->mark_for_call();
1951 } 1950 }
1952 } 1951 }
1953 static int parent_num_ids() { return Expression::num_ids(); } 1952 static int parent_num_ids() { return Expression::num_ids(); }
1954 1953
1955 private: 1954 private:
1956 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1955 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1957 1956
1957 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1958 class IsTailField : public BitField8<bool, 1, 1> {};
1959 uint8_t bit_field_;
1958 FeedbackVectorSlot ic_slot_; 1960 FeedbackVectorSlot ic_slot_;
1959 FeedbackVectorSlot stub_slot_; 1961 FeedbackVectorSlot stub_slot_;
1960 Expression* expression_; 1962 Expression* expression_;
1961 ZoneList<Expression*>* arguments_; 1963 ZoneList<Expression*>* arguments_;
1962 Handle<JSFunction> target_; 1964 Handle<JSFunction> target_;
1963 Handle<AllocationSite> allocation_site_; 1965 Handle<AllocationSite> allocation_site_;
1964 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1965 class IsTailField : public BitField8<bool, 1, 1> {};
1966 uint8_t bit_field_;
1967 }; 1966 };
1968 1967
1969 1968
1970 class CallNew final : public Expression { 1969 class CallNew final : public Expression {
1971 public: 1970 public:
1972 DECLARE_NODE_TYPE(CallNew) 1971 DECLARE_NODE_TYPE(CallNew)
1973 1972
1974 Expression* expression() const { return expression_; } 1973 Expression* expression() const { return expression_; }
1975 ZoneList<Expression*>* arguments() const { return arguments_; } 1974 ZoneList<Expression*>* arguments() const { return arguments_; }
1976 1975
(...skipping 30 matching lines...) Expand all
2007 void set_target(Handle<JSFunction> target) { target_ = target; } 2006 void set_target(Handle<JSFunction> target) { target_ = target; }
2008 void SetKnownGlobalTarget(Handle<JSFunction> target) { 2007 void SetKnownGlobalTarget(Handle<JSFunction> target) {
2009 target_ = target; 2008 target_ = target;
2010 is_monomorphic_ = true; 2009 is_monomorphic_ = true;
2011 } 2010 }
2012 2011
2013 protected: 2012 protected:
2014 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 2013 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
2015 int pos) 2014 int pos)
2016 : Expression(zone, pos, kCallNew), 2015 : Expression(zone, pos, kCallNew),
2016 is_monomorphic_(false),
2017 expression_(expression), 2017 expression_(expression),
2018 arguments_(arguments), 2018 arguments_(arguments) {}
2019 is_monomorphic_(false) {}
2020 2019
2021 static int parent_num_ids() { return Expression::num_ids(); } 2020 static int parent_num_ids() { return Expression::num_ids(); }
2022 2021
2023 private: 2022 private:
2024 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2023 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2025 2024
2025 bool is_monomorphic_;
2026 FeedbackVectorSlot callnew_feedback_slot_;
2026 Expression* expression_; 2027 Expression* expression_;
2027 ZoneList<Expression*>* arguments_; 2028 ZoneList<Expression*>* arguments_;
2028 bool is_monomorphic_;
2029 Handle<JSFunction> target_; 2029 Handle<JSFunction> target_;
2030 Handle<AllocationSite> allocation_site_; 2030 Handle<AllocationSite> allocation_site_;
2031 FeedbackVectorSlot callnew_feedback_slot_;
2032 }; 2031 };
2033 2032
2034 2033
2035 // The CallRuntime class does not represent any official JavaScript 2034 // The CallRuntime class does not represent any official JavaScript
2036 // language construct. Instead it is used to call a C or JS function 2035 // language construct. Instead it is used to call a C or JS function
2037 // with a set of arguments. This is used from the builtins that are 2036 // with a set of arguments. This is used from the builtins that are
2038 // implemented in JavaScript (see "v8natives.js"). 2037 // implemented in JavaScript (see "v8natives.js").
2039 class CallRuntime final : public Expression { 2038 class CallRuntime final : public Expression {
2040 public: 2039 public:
2041 DECLARE_NODE_TYPE(CallRuntime) 2040 DECLARE_NODE_TYPE(CallRuntime)
(...skipping 20 matching lines...) Expand all
2062 protected: 2061 protected:
2063 CallRuntime(Zone* zone, const Runtime::Function* function, 2062 CallRuntime(Zone* zone, const Runtime::Function* function,
2064 ZoneList<Expression*>* arguments, int pos) 2063 ZoneList<Expression*>* arguments, int pos)
2065 : Expression(zone, pos, kCallRuntime), 2064 : Expression(zone, pos, kCallRuntime),
2066 function_(function), 2065 function_(function),
2067 arguments_(arguments) {} 2066 arguments_(arguments) {}
2068 2067
2069 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, 2068 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments,
2070 int pos) 2069 int pos)
2071 : Expression(zone, pos, kCallRuntime), 2070 : Expression(zone, pos, kCallRuntime),
2071 context_index_(context_index),
2072 function_(NULL), 2072 function_(NULL),
2073 context_index_(context_index),
2074 arguments_(arguments) {} 2073 arguments_(arguments) {}
2075 2074
2076 static int parent_num_ids() { return Expression::num_ids(); } 2075 static int parent_num_ids() { return Expression::num_ids(); }
2077 2076
2078 private: 2077 private:
2079 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2078 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2080 2079
2080 int context_index_;
2081 const Runtime::Function* function_; 2081 const Runtime::Function* function_;
2082 int context_index_;
2083 ZoneList<Expression*>* arguments_; 2082 ZoneList<Expression*>* arguments_;
2084 }; 2083 };
2085 2084
2086 2085
2087 class UnaryOperation final : public Expression { 2086 class UnaryOperation final : public Expression {
2088 public: 2087 public:
2089 DECLARE_NODE_TYPE(UnaryOperation) 2088 DECLARE_NODE_TYPE(UnaryOperation)
2090 2089
2091 Token::Value op() const { return op_; } 2090 Token::Value op() const { return op_; }
2092 Expression* expression() const { return expression_; } 2091 Expression* expression() const { return expression_; }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
2246 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2245 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2247 2246
2248 class IsPrefixField : public BitField16<bool, 0, 1> {}; 2247 class IsPrefixField : public BitField16<bool, 0, 1> {};
2249 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2248 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2250 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; 2249 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {};
2251 class TokenField : public BitField16<Token::Value, 5, 8> {}; 2250 class TokenField : public BitField16<Token::Value, 5, 8> {};
2252 2251
2253 // Starts with 16-bit field, which should get packed together with 2252 // Starts with 16-bit field, which should get packed together with
2254 // Expression's trailing 16-bit field. 2253 // Expression's trailing 16-bit field.
2255 uint16_t bit_field_; 2254 uint16_t bit_field_;
2255 FeedbackVectorSlot slot_;
2256 Type* type_; 2256 Type* type_;
2257 Expression* expression_; 2257 Expression* expression_;
2258 SmallMapList receiver_types_; 2258 SmallMapList receiver_types_;
2259 FeedbackVectorSlot slot_;
2260 }; 2259 };
2261 2260
2262 2261
2263 class CompareOperation final : public Expression { 2262 class CompareOperation final : public Expression {
2264 public: 2263 public:
2265 DECLARE_NODE_TYPE(CompareOperation) 2264 DECLARE_NODE_TYPE(CompareOperation)
2266 2265
2267 Token::Value op() const { return op_; } 2266 Token::Value op() const { return op_; }
2268 Expression* left() const { return left_; } 2267 Expression* left() const { return left_; }
2269 Expression* right() const { return right_; } 2268 Expression* right() const { return right_; }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2314 Expression* expression() const { return expression_; } 2313 Expression* expression() const { return expression_; }
2315 void set_expression(Expression* e) { expression_ = e; } 2314 void set_expression(Expression* e) { expression_ = e; }
2316 2315
2317 int expression_position() const { return expr_pos_; } 2316 int expression_position() const { return expr_pos_; }
2318 2317
2319 static int num_ids() { return parent_num_ids(); } 2318 static int num_ids() { return parent_num_ids(); }
2320 2319
2321 protected: 2320 protected:
2322 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) 2321 Spread(Zone* zone, Expression* expression, int pos, int expr_pos)
2323 : Expression(zone, pos, kSpread), 2322 : Expression(zone, pos, kSpread),
2324 expression_(expression), 2323 expr_pos_(expr_pos),
2325 expr_pos_(expr_pos) {} 2324 expression_(expression) {}
2326 static int parent_num_ids() { return Expression::num_ids(); } 2325 static int parent_num_ids() { return Expression::num_ids(); }
2327 2326
2328 private: 2327 private:
2329 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2328 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2330 2329
2330 int expr_pos_;
2331 Expression* expression_; 2331 Expression* expression_;
2332 int expr_pos_;
2333 }; 2332 };
2334 2333
2335 2334
2336 class Conditional final : public Expression { 2335 class Conditional final : public Expression {
2337 public: 2336 public:
2338 DECLARE_NODE_TYPE(Conditional) 2337 DECLARE_NODE_TYPE(Conditional)
2339 2338
2340 Expression* condition() const { return condition_; } 2339 Expression* condition() const { return condition_; }
2341 Expression* then_expression() const { return then_expression_; } 2340 Expression* then_expression() const { return then_expression_; }
2342 Expression* else_expression() const { return else_expression_; } 2341 Expression* else_expression() const { return else_expression_; }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2435 class KeyTypeField 2434 class KeyTypeField
2436 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; 2435 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {};
2437 class StoreModeField 2436 class StoreModeField
2438 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; 2437 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {};
2439 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { 2438 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> {
2440 }; 2439 };
2441 2440
2442 // Starts with 16-bit field, which should get packed together with 2441 // Starts with 16-bit field, which should get packed together with
2443 // Expression's trailing 16-bit field. 2442 // Expression's trailing 16-bit field.
2444 uint16_t bit_field_; 2443 uint16_t bit_field_;
2444 FeedbackVectorSlot slot_;
2445 Expression* target_; 2445 Expression* target_;
2446 Expression* value_; 2446 Expression* value_;
2447 BinaryOperation* binary_operation_; 2447 BinaryOperation* binary_operation_;
2448 SmallMapList receiver_types_; 2448 SmallMapList receiver_types_;
2449 FeedbackVectorSlot slot_;
2450 }; 2449 };
2451 2450
2452 2451
2453 // The RewritableExpression class is a wrapper for AST nodes that wait 2452 // The RewritableExpression class is a wrapper for AST nodes that wait
2454 // for some potential rewriting. However, even if such nodes are indeed 2453 // for some potential rewriting. However, even if such nodes are indeed
2455 // rewritten, the RewritableExpression wrapper nodes will survive in the 2454 // rewritten, the RewritableExpression wrapper nodes will survive in the
2456 // final AST and should be just ignored, i.e., they should be treated as 2455 // final AST and should be just ignored, i.e., they should be treated as
2457 // equivalent to the wrapped nodes. For this reason and to simplify later 2456 // equivalent to the wrapped nodes. For this reason and to simplify later
2458 // phases, RewritableExpressions are considered as exceptions of AST nodes 2457 // phases, RewritableExpressions are considered as exceptions of AST nodes
2459 // in the following sense: 2458 // in the following sense:
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2514 int yield_id() const { return yield_id_; } 2513 int yield_id() const { return yield_id_; }
2515 2514
2516 void set_generator_object(Expression* e) { generator_object_ = e; } 2515 void set_generator_object(Expression* e) { generator_object_ = e; }
2517 void set_expression(Expression* e) { expression_ = e; } 2516 void set_expression(Expression* e) { expression_ = e; }
2518 void set_yield_id(int yield_id) { yield_id_ = yield_id; } 2517 void set_yield_id(int yield_id) { yield_id_ = yield_id; }
2519 2518
2520 protected: 2519 protected:
2521 Yield(Zone* zone, Expression* generator_object, Expression* expression, 2520 Yield(Zone* zone, Expression* generator_object, Expression* expression,
2522 int pos, OnException on_exception) 2521 int pos, OnException on_exception)
2523 : Expression(zone, pos, kYield), 2522 : Expression(zone, pos, kYield),
2523 on_exception_(on_exception),
2524 yield_id_(-1),
2524 generator_object_(generator_object), 2525 generator_object_(generator_object),
2525 expression_(expression), 2526 expression_(expression) {}
2526 on_exception_(on_exception),
2527 yield_id_(-1) {}
2528 2527
2529 private: 2528 private:
2529 OnException on_exception_;
2530 int yield_id_;
2530 Expression* generator_object_; 2531 Expression* generator_object_;
2531 Expression* expression_; 2532 Expression* expression_;
2532 OnException on_exception_;
2533 int yield_id_;
2534 }; 2533 };
2535 2534
2536 2535
2537 class Throw final : public Expression { 2536 class Throw final : public Expression {
2538 public: 2537 public:
2539 DECLARE_NODE_TYPE(Throw) 2538 DECLARE_NODE_TYPE(Throw)
2540 2539
2541 Expression* exception() const { return exception_; } 2540 Expression* exception() const { return exception_; }
2542 void set_exception(Expression* e) { exception_ = e; } 2541 void set_exception(Expression* e) { exception_ = e; }
2543 2542
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2686 protected: 2685 protected:
2687 FunctionLiteral(Zone* zone, const AstString* name, 2686 FunctionLiteral(Zone* zone, const AstString* name,
2688 AstValueFactory* ast_value_factory, Scope* scope, 2687 AstValueFactory* ast_value_factory, Scope* scope,
2689 ZoneList<Statement*>* body, int materialized_literal_count, 2688 ZoneList<Statement*>* body, int materialized_literal_count,
2690 int expected_property_count, int parameter_count, 2689 int expected_property_count, int parameter_count,
2691 FunctionType function_type, 2690 FunctionType function_type,
2692 ParameterFlag has_duplicate_parameters, 2691 ParameterFlag has_duplicate_parameters,
2693 EagerCompileHint eager_compile_hint, FunctionKind kind, 2692 EagerCompileHint eager_compile_hint, FunctionKind kind,
2694 int position, bool is_function) 2693 int position, bool is_function)
2695 : Expression(zone, position, kFunctionLiteral), 2694 : Expression(zone, position, kFunctionLiteral),
2696 raw_name_(name),
2697 scope_(scope),
2698 body_(body),
2699 raw_inferred_name_(ast_value_factory->empty_string()),
2700 ast_properties_(zone),
2701 dont_optimize_reason_(kNoReason), 2695 dont_optimize_reason_(kNoReason),
2702 materialized_literal_count_(materialized_literal_count), 2696 materialized_literal_count_(materialized_literal_count),
2703 expected_property_count_(expected_property_count), 2697 expected_property_count_(expected_property_count),
2704 parameter_count_(parameter_count), 2698 parameter_count_(parameter_count),
2705 function_token_position_(kNoSourcePosition), 2699 function_token_position_(kNoSourcePosition),
2706 yield_count_(0) { 2700 yield_count_(0),
2701 raw_name_(name),
2702 scope_(scope),
2703 body_(body),
2704 raw_inferred_name_(ast_value_factory->empty_string()),
2705 ast_properties_(zone) {
2707 bitfield_ = 2706 bitfield_ =
2708 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | 2707 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) |
2709 HasDuplicateParameters::encode(has_duplicate_parameters == 2708 HasDuplicateParameters::encode(has_duplicate_parameters ==
2710 kHasDuplicateParameters) | 2709 kHasDuplicateParameters) |
2711 IsFunction::encode(is_function) | 2710 IsFunction::encode(is_function) |
2712 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) | 2711 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) |
2713 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false); 2712 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false);
2714 DCHECK(IsValidFunctionKind(kind)); 2713 DCHECK(IsValidFunctionKind(kind));
2715 } 2714 }
2716 2715
2717 private: 2716 private:
2718 class FunctionTypeBits : public BitField16<FunctionType, 0, 2> {}; 2717 class FunctionTypeBits : public BitField16<FunctionType, 0, 2> {};
2719 class Pretenure : public BitField16<bool, 2, 1> {}; 2718 class Pretenure : public BitField16<bool, 2, 1> {};
2720 class HasDuplicateParameters : public BitField16<bool, 3, 1> {}; 2719 class HasDuplicateParameters : public BitField16<bool, 3, 1> {};
2721 class IsFunction : public BitField16<bool, 4, 1> {}; 2720 class IsFunction : public BitField16<bool, 4, 1> {};
2722 class ShouldEagerCompile : public BitField16<bool, 5, 1> {}; 2721 class ShouldEagerCompile : public BitField16<bool, 5, 1> {};
2723 class ShouldBeUsedOnceHint : public BitField16<bool, 6, 1> {}; 2722 class ShouldBeUsedOnceHint : public BitField16<bool, 6, 1> {};
2724 class FunctionKindBits : public BitField16<FunctionKind, 7, 9> {}; 2723 class FunctionKindBits : public BitField16<FunctionKind, 7, 9> {};
2725 2724
2726 // Start with 16-bit field, which should get packed together 2725 // Start with 16-bit field, which should get packed together
2727 // with Expression's trailing 16-bit field. 2726 // with Expression's trailing 16-bit field.
2728 uint16_t bitfield_; 2727 uint16_t bitfield_;
2729 2728
2730 const AstString* raw_name_;
2731 Scope* scope_;
2732 ZoneList<Statement*>* body_;
2733 const AstString* raw_inferred_name_;
2734 Handle<String> inferred_name_;
2735 AstProperties ast_properties_;
2736 BailoutReason dont_optimize_reason_; 2729 BailoutReason dont_optimize_reason_;
2737 2730
2738 int materialized_literal_count_; 2731 int materialized_literal_count_;
2739 int expected_property_count_; 2732 int expected_property_count_;
2740 int parameter_count_; 2733 int parameter_count_;
2741 int function_token_position_; 2734 int function_token_position_;
2742 int yield_count_; 2735 int yield_count_;
2736
2737 const AstString* raw_name_;
2738 Scope* scope_;
2739 ZoneList<Statement*>* body_;
2740 const AstString* raw_inferred_name_;
2741 Handle<String> inferred_name_;
2742 AstProperties ast_properties_;
2743 }; 2743 };
2744 2744
2745 2745
2746 class ClassLiteral final : public Expression { 2746 class ClassLiteral final : public Expression {
2747 public: 2747 public:
2748 typedef ObjectLiteralProperty Property; 2748 typedef ObjectLiteralProperty Property;
2749 2749
2750 DECLARE_NODE_TYPE(ClassLiteral) 2750 DECLARE_NODE_TYPE(ClassLiteral)
2751 2751
2752 Scope* scope() const { return scope_; } 2752 Scope* scope() const { return scope_; }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2788 bool IsAnonymousFunctionDefinition() const { 2788 bool IsAnonymousFunctionDefinition() const {
2789 return constructor()->raw_name()->length() == 0; 2789 return constructor()->raw_name()->length() == 0;
2790 } 2790 }
2791 2791
2792 protected: 2792 protected:
2793 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, 2793 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy,
2794 Expression* extends, FunctionLiteral* constructor, 2794 Expression* extends, FunctionLiteral* constructor,
2795 ZoneList<Property*>* properties, int start_position, 2795 ZoneList<Property*>* properties, int start_position,
2796 int end_position) 2796 int end_position)
2797 : Expression(zone, start_position, kClassLiteral), 2797 : Expression(zone, start_position, kClassLiteral),
2798 end_position_(end_position),
2798 scope_(scope), 2799 scope_(scope),
2799 class_variable_proxy_(class_variable_proxy), 2800 class_variable_proxy_(class_variable_proxy),
2800 extends_(extends), 2801 extends_(extends),
2801 constructor_(constructor), 2802 constructor_(constructor),
2802 properties_(properties), 2803 properties_(properties) {}
2803 end_position_(end_position) {}
2804 2804
2805 static int parent_num_ids() { return Expression::num_ids(); } 2805 static int parent_num_ids() { return Expression::num_ids(); }
2806 2806
2807 private: 2807 private:
2808 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2808 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2809 2809
2810 int end_position_;
2811 FeedbackVectorSlot prototype_slot_;
2812 FeedbackVectorSlot proxy_slot_;
2810 Scope* scope_; 2813 Scope* scope_;
2811 VariableProxy* class_variable_proxy_; 2814 VariableProxy* class_variable_proxy_;
2812 Expression* extends_; 2815 Expression* extends_;
2813 FunctionLiteral* constructor_; 2816 FunctionLiteral* constructor_;
2814 ZoneList<Property*>* properties_; 2817 ZoneList<Property*>* properties_;
2815 int end_position_;
2816 FeedbackVectorSlot prototype_slot_;
2817 FeedbackVectorSlot proxy_slot_;
2818 }; 2818 };
2819 2819
2820 2820
2821 class NativeFunctionLiteral final : public Expression { 2821 class NativeFunctionLiteral final : public Expression {
2822 public: 2822 public:
2823 DECLARE_NODE_TYPE(NativeFunctionLiteral) 2823 DECLARE_NODE_TYPE(NativeFunctionLiteral)
2824 2824
2825 Handle<String> name() const { return name_->string(); } 2825 Handle<String> name() const { return name_->string(); }
2826 v8::Extension* extension() const { return extension_; } 2826 v8::Extension* extension() const { return extension_; }
2827 2827
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
3278 return new (local_zone_) 3278 return new (local_zone_)
3279 Literal(local_zone_, ast_value_factory_->NewUndefined(), pos); 3279 Literal(local_zone_, ast_value_factory_->NewUndefined(), pos);
3280 } 3280 }
3281 3281
3282 Literal* NewTheHoleLiteral(int pos) { 3282 Literal* NewTheHoleLiteral(int pos) {
3283 return new (local_zone_) 3283 return new (local_zone_)
3284 Literal(local_zone_, ast_value_factory_->NewTheHole(), pos); 3284 Literal(local_zone_, ast_value_factory_->NewTheHole(), pos);
3285 } 3285 }
3286 3286
3287 ObjectLiteral* NewObjectLiteral( 3287 ObjectLiteral* NewObjectLiteral(
3288 ZoneList<ObjectLiteral::Property*>* properties, 3288 ZoneList<ObjectLiteral::Property*>* properties, int literal_index,
3289 int literal_index, 3289 uint32_t boilerplate_properties, int pos) {
3290 int boilerplate_properties,
3291 int pos) {
3292 return new (local_zone_) ObjectLiteral( 3290 return new (local_zone_) ObjectLiteral(
3293 local_zone_, properties, literal_index, boilerplate_properties, pos); 3291 local_zone_, properties, literal_index, boilerplate_properties, pos);
3294 } 3292 }
3295 3293
3296 ObjectLiteral::Property* NewObjectLiteralProperty( 3294 ObjectLiteral::Property* NewObjectLiteralProperty(
3297 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind, 3295 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind,
3298 bool is_static, bool is_computed_name) { 3296 bool is_static, bool is_computed_name) {
3299 return new (local_zone_) 3297 return new (local_zone_)
3300 ObjectLiteral::Property(key, value, kind, is_static, is_computed_name); 3298 ObjectLiteral::Property(key, value, kind, is_static, is_computed_name);
3301 } 3299 }
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
3593 : NULL; \ 3591 : NULL; \
3594 } 3592 }
3595 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3593 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3596 #undef DECLARE_NODE_FUNCTIONS 3594 #undef DECLARE_NODE_FUNCTIONS
3597 3595
3598 3596
3599 } // namespace internal 3597 } // namespace internal
3600 } // namespace v8 3598 } // namespace v8
3601 3599
3602 #endif // V8_AST_AST_H_ 3600 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698