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

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: Addressed comments 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 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 222
223 private: 223 private:
224 // Hidden to prevent accidental usage. It would have to load the 224 // Hidden to prevent accidental usage. It would have to load the
225 // current zone from the TLS. 225 // current zone from the TLS.
226 void* operator new(size_t size); 226 void* operator new(size_t size);
227 227
228 friend class CaseClause; // Generates AST IDs. 228 friend class CaseClause; // Generates AST IDs.
229 229
230 int position_; 230 int position_;
231 NodeType node_type_; 231 NodeType node_type_;
232 // Ends with NodeType which is uint8_t sized. Deriving classes in turn begin
233 // sub-int32_t-sized fields for optimum packing efficiency.
232 }; 234 };
233 235
234 236
235 class Statement : public AstNode { 237 class Statement : public AstNode {
236 public: 238 public:
237 bool IsEmpty() { return AsEmptyStatement() != NULL; } 239 bool IsEmpty() { return AsEmptyStatement() != NULL; }
238 bool IsJump() const; 240 bool IsJump() const;
239 241
240 protected: 242 protected:
241 Statement(Zone* zone, int position, NodeType type) 243 Statement(Zone* zone, int position, NodeType type)
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 bool IsMonomorphic() const; 353 bool IsMonomorphic() const;
352 354
353 void set_base_id(int id) { base_id_ = id; } 355 void set_base_id(int id) { base_id_ = id; }
354 static int num_ids() { return parent_num_ids() + 2; } 356 static int num_ids() { return parent_num_ids() + 2; }
355 BailoutId id() const { return BailoutId(local_id(0)); } 357 BailoutId id() const { return BailoutId(local_id(0)); }
356 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } 358 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); }
357 359
358 protected: 360 protected:
359 Expression(Zone* zone, int pos, NodeType type) 361 Expression(Zone* zone, int pos, NodeType type)
360 : AstNode(pos, type), 362 : AstNode(pos, type),
361 base_id_(BailoutId::None().ToInt()), 363 bit_field_(0),
362 bit_field_(0) {} 364 base_id_(BailoutId::None().ToInt()) {}
363 static int parent_num_ids() { return 0; } 365 static int parent_num_ids() { return 0; }
364 void set_to_boolean_types(uint16_t types) { 366 void set_to_boolean_types(uint16_t types) {
365 bit_field_ = ToBooleanTypesField::update(bit_field_, types); 367 bit_field_ = ToBooleanTypesField::update(bit_field_, types);
366 } 368 }
367 369
368 int base_id() const { 370 int base_id() const {
369 DCHECK(!BailoutId(base_id_).IsNone()); 371 DCHECK(!BailoutId(base_id_).IsNone());
370 return base_id_; 372 return base_id_;
371 } 373 }
372 374
373 private: 375 private:
374 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 376 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
375 377
378 uint16_t bit_field_;
376 int base_id_; 379 int base_id_;
377 class ToBooleanTypesField : public BitField16<uint16_t, 0, 9> {}; 380 class ToBooleanTypesField : public BitField16<uint16_t, 0, 9> {};
378 uint16_t bit_field_;
379 // Ends with 16-bit field; deriving classes in turn begin with
380 // 16-bit fields for optimum packing efficiency.
381 }; 381 };
382 382
383 383
384 class BreakableStatement : public Statement { 384 class BreakableStatement : public Statement {
385 public: 385 public:
386 enum BreakableType { 386 enum BreakableType {
387 TARGET_FOR_ANONYMOUS, 387 TARGET_FOR_ANONYMOUS,
388 TARGET_FOR_NAMED_ONLY 388 TARGET_FOR_NAMED_ONLY
389 }; 389 };
390 390
(...skipping 11 matching lines...) Expand all
402 402
403 void set_base_id(int id) { base_id_ = id; } 403 void set_base_id(int id) { base_id_ = id; }
404 static int num_ids() { return parent_num_ids() + 2; } 404 static int num_ids() { return parent_num_ids() + 2; }
405 BailoutId EntryId() const { return BailoutId(local_id(0)); } 405 BailoutId EntryId() const { return BailoutId(local_id(0)); }
406 BailoutId ExitId() const { return BailoutId(local_id(1)); } 406 BailoutId ExitId() const { return BailoutId(local_id(1)); }
407 407
408 protected: 408 protected:
409 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, 409 BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels,
410 BreakableType breakable_type, int position, NodeType type) 410 BreakableType breakable_type, int position, NodeType type)
411 : Statement(zone, position, type), 411 : Statement(zone, position, type),
412 labels_(labels),
413 breakable_type_(breakable_type), 412 breakable_type_(breakable_type),
414 base_id_(BailoutId::None().ToInt()) { 413 base_id_(BailoutId::None().ToInt()),
414 labels_(labels) {
415 DCHECK(labels == NULL || labels->length() > 0); 415 DCHECK(labels == NULL || labels->length() > 0);
416 } 416 }
417 static int parent_num_ids() { return 0; } 417 static int parent_num_ids() { return 0; }
418 418
419 int base_id() const { 419 int base_id() const {
420 DCHECK(!BailoutId(base_id_).IsNone()); 420 DCHECK(!BailoutId(base_id_).IsNone());
421 return base_id_; 421 return base_id_;
422 } 422 }
423 423
424 private: 424 private:
425 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 425 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
426 426
427 BreakableType breakable_type_;
428 int base_id_;
429 Label break_target_;
427 ZoneList<const AstRawString*>* labels_; 430 ZoneList<const AstRawString*>* labels_;
428 BreakableType breakable_type_;
429 Label break_target_;
430 int base_id_;
431 }; 431 };
432 432
433 433
434 class Block final : public BreakableStatement { 434 class Block final : public BreakableStatement {
435 public: 435 public:
436 DECLARE_NODE_TYPE(Block) 436 DECLARE_NODE_TYPE(Block)
437 437
438 ZoneList<Statement*>* statements() { return &statements_; } 438 ZoneList<Statement*>* statements() { return &statements_; }
439 bool ignore_completion_value() const { return ignore_completion_value_; } 439 bool ignore_completion_value() const { return ignore_completion_value_; }
440 440
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 931
932 void set_base_id(int id) { base_id_ = id; } 932 void set_base_id(int id) { base_id_ = id; }
933 static int num_ids() { return parent_num_ids() + 2; } 933 static int num_ids() { return parent_num_ids() + 2; }
934 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } 934 BailoutId ToObjectId() const { return BailoutId(local_id(0)); }
935 BailoutId EntryId() const { return BailoutId(local_id(1)); } 935 BailoutId EntryId() const { return BailoutId(local_id(1)); }
936 936
937 protected: 937 protected:
938 WithStatement(Zone* zone, Scope* scope, Expression* expression, 938 WithStatement(Zone* zone, Scope* scope, Expression* expression,
939 Statement* statement, int pos) 939 Statement* statement, int pos)
940 : Statement(zone, pos, kWithStatement), 940 : Statement(zone, pos, kWithStatement),
941 base_id_(BailoutId::None().ToInt()),
941 scope_(scope), 942 scope_(scope),
942 expression_(expression), 943 expression_(expression),
943 statement_(statement), 944 statement_(statement) {}
944 base_id_(BailoutId::None().ToInt()) {}
945 static int parent_num_ids() { return 0; } 945 static int parent_num_ids() { return 0; }
946 946
947 int base_id() const { 947 int base_id() const {
948 DCHECK(!BailoutId(base_id_).IsNone()); 948 DCHECK(!BailoutId(base_id_).IsNone());
949 return base_id_; 949 return base_id_;
950 } 950 }
951 951
952 private: 952 private:
953 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 953 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
954 954
955 int base_id_;
955 Scope* scope_; 956 Scope* scope_;
956 Expression* expression_; 957 Expression* expression_;
957 Statement* statement_; 958 Statement* statement_;
958 int base_id_;
959 }; 959 };
960 960
961 961
962 class CaseClause final : public Expression { 962 class CaseClause final : public Expression {
963 public: 963 public:
964 DECLARE_NODE_TYPE(CaseClause) 964 DECLARE_NODE_TYPE(CaseClause)
965 965
966 bool is_default() const { return label_ == NULL; } 966 bool is_default() const { return label_ == NULL; }
967 Expression* label() const { 967 Expression* label() const {
968 CHECK(!is_default()); 968 CHECK(!is_default());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 void set_base_id(int id) { base_id_ = id; } 1049 void set_base_id(int id) { base_id_ = id; }
1050 static int num_ids() { return parent_num_ids() + 3; } 1050 static int num_ids() { return parent_num_ids() + 3; }
1051 BailoutId IfId() const { return BailoutId(local_id(0)); } 1051 BailoutId IfId() const { return BailoutId(local_id(0)); }
1052 BailoutId ThenId() const { return BailoutId(local_id(1)); } 1052 BailoutId ThenId() const { return BailoutId(local_id(1)); }
1053 BailoutId ElseId() const { return BailoutId(local_id(2)); } 1053 BailoutId ElseId() const { return BailoutId(local_id(2)); }
1054 1054
1055 protected: 1055 protected:
1056 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, 1056 IfStatement(Zone* zone, Expression* condition, Statement* then_statement,
1057 Statement* else_statement, int pos) 1057 Statement* else_statement, int pos)
1058 : Statement(zone, pos, kIfStatement), 1058 : Statement(zone, pos, kIfStatement),
1059 base_id_(BailoutId::None().ToInt()),
1059 condition_(condition), 1060 condition_(condition),
1060 then_statement_(then_statement), 1061 then_statement_(then_statement),
1061 else_statement_(else_statement), 1062 else_statement_(else_statement) {}
1062 base_id_(BailoutId::None().ToInt()) {}
1063 static int parent_num_ids() { return 0; } 1063 static int parent_num_ids() { return 0; }
1064 1064
1065 int base_id() const { 1065 int base_id() const {
1066 DCHECK(!BailoutId(base_id_).IsNone()); 1066 DCHECK(!BailoutId(base_id_).IsNone());
1067 return base_id_; 1067 return base_id_;
1068 } 1068 }
1069 1069
1070 private: 1070 private:
1071 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1071 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1072 1072
1073 int base_id_;
1073 Expression* condition_; 1074 Expression* condition_;
1074 Statement* then_statement_; 1075 Statement* then_statement_;
1075 Statement* else_statement_; 1076 Statement* else_statement_;
1076 int base_id_;
1077 }; 1077 };
1078 1078
1079 1079
1080 class TryStatement : public Statement { 1080 class TryStatement : public Statement {
1081 public: 1081 public:
1082 Block* try_block() const { return try_block_; } 1082 Block* try_block() const { return try_block_; }
1083 void set_try_block(Block* b) { try_block_ = b; } 1083 void set_try_block(Block* b) { try_block_ = b; }
1084 1084
1085 // Prediction of whether exceptions thrown into the handler for this try block 1085 // Prediction of whether exceptions thrown into the handler for this try block
1086 // will be caught. 1086 // will be caught.
1087 // 1087 //
1088 // This is set in ast-numbering and later compiled into the code's handler 1088 // This is set in ast-numbering and later compiled into the code's handler
1089 // table. The runtime uses this information to implement a feature that 1089 // table. The runtime uses this information to implement a feature that
1090 // notifies the debugger when an uncaught exception is thrown, _before_ the 1090 // notifies the debugger when an uncaught exception is thrown, _before_ the
1091 // exception propagates to the top. 1091 // exception propagates to the top.
1092 // 1092 //
1093 // Since it's generally undecidable whether an exception will be caught, our 1093 // Since it's generally undecidable whether an exception will be caught, our
1094 // prediction is only an approximation. 1094 // prediction is only an approximation.
1095 bool catch_predicted() const { return catch_predicted_; } 1095 bool catch_predicted() const { return catch_predicted_; }
1096 void set_catch_predicted(bool b) { catch_predicted_ = b; } 1096 void set_catch_predicted(bool b) { catch_predicted_ = b; }
1097 1097
1098 protected: 1098 protected:
1099 TryStatement(Zone* zone, Block* try_block, int pos, NodeType type) 1099 TryStatement(Zone* zone, Block* try_block, int pos, NodeType type)
1100 : Statement(zone, pos, type), 1100 : Statement(zone, pos, type),
1101 try_block_(try_block), 1101 catch_predicted_(false),
1102 catch_predicted_(false) {} 1102 try_block_(try_block) {}
1103 1103
1104 private: 1104 private:
1105 bool catch_predicted_;
1105 Block* try_block_; 1106 Block* try_block_;
1106 bool catch_predicted_;
1107 }; 1107 };
1108 1108
1109 1109
1110 class TryCatchStatement final : public TryStatement { 1110 class TryCatchStatement final : public TryStatement {
1111 public: 1111 public:
1112 DECLARE_NODE_TYPE(TryCatchStatement) 1112 DECLARE_NODE_TYPE(TryCatchStatement)
1113 1113
1114 Scope* scope() { return scope_; } 1114 Scope* scope() { return scope_; }
1115 Variable* variable() { return variable_; } 1115 Variable* variable() { return variable_; }
1116 Block* catch_block() const { return catch_block_; } 1116 Block* catch_block() const { return catch_block_; }
1117 void set_catch_block(Block* b) { catch_block_ = b; } 1117 void set_catch_block(Block* b) { catch_block_ = b; }
1118 1118
1119 // The clear_pending_message flag indicates whether or not to clear the 1119 // The clear_pending_message flag indicates whether or not to clear the
1120 // isolate's pending exception message before executing the catch_block. In 1120 // isolate's pending exception message before executing the catch_block. In
1121 // the normal use case, this flag is always on because the message object 1121 // the normal use case, this flag is always on because the message object
1122 // is not needed anymore when entering the catch block and should not be kept 1122 // is not needed anymore when entering the catch block and should not be kept
1123 // alive. 1123 // alive.
1124 // The use case where the flag is off is when the catch block is guaranteed to 1124 // The use case where the flag is off is when the catch block is guaranteed to
1125 // rethrow the caught exception (using %ReThrow), which reuses the pending 1125 // rethrow the caught exception (using %ReThrow), which reuses the pending
1126 // message instead of generating a new one. 1126 // message instead of generating a new one.
1127 // (When the catch block doesn't rethrow but is guaranteed to perform an 1127 // (When the catch block doesn't rethrow but is guaranteed to perform an
1128 // ordinary throw, not clearing the old message is safe but not very useful.) 1128 // ordinary throw, not clearing the old message is safe but not very useful.)
1129 bool clear_pending_message() { return clear_pending_message_; } 1129 bool clear_pending_message() { return clear_pending_message_; }
1130 1130
1131 protected: 1131 protected:
1132 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, 1132 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope,
1133 Variable* variable, Block* catch_block, 1133 Variable* variable, Block* catch_block,
1134 bool clear_pending_message, int pos) 1134 bool clear_pending_message, int pos)
1135 : TryStatement(zone, try_block, pos, kTryCatchStatement), 1135 : TryStatement(zone, try_block, pos, kTryCatchStatement),
1136 clear_pending_message_(clear_pending_message),
1136 scope_(scope), 1137 scope_(scope),
1137 variable_(variable), 1138 variable_(variable),
1138 catch_block_(catch_block), 1139 catch_block_(catch_block) {}
1139 clear_pending_message_(clear_pending_message) {}
1140 1140
1141 private: 1141 private:
1142 bool clear_pending_message_;
1142 Scope* scope_; 1143 Scope* scope_;
1143 Variable* variable_; 1144 Variable* variable_;
1144 Block* catch_block_; 1145 Block* catch_block_;
1145 bool clear_pending_message_;
1146 }; 1146 };
1147 1147
1148 1148
1149 class TryFinallyStatement final : public TryStatement { 1149 class TryFinallyStatement final : public TryStatement {
1150 public: 1150 public:
1151 DECLARE_NODE_TYPE(TryFinallyStatement) 1151 DECLARE_NODE_TYPE(TryFinallyStatement)
1152 1152
1153 Block* finally_block() const { return finally_block_; } 1153 Block* finally_block() const { return finally_block_; }
1154 void set_finally_block(Block* b) { finally_block_ = b; } 1154 void set_finally_block(Block* b) { finally_block_ = b; }
1155 1155
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 1275
1276 int depth() const { 1276 int depth() const {
1277 // only callable after initialization. 1277 // only callable after initialization.
1278 DCHECK(depth_ >= 1); 1278 DCHECK(depth_ >= 1);
1279 return depth_; 1279 return depth_;
1280 } 1280 }
1281 1281
1282 protected: 1282 protected:
1283 MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type) 1283 MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type)
1284 : Expression(zone, pos, type), 1284 : Expression(zone, pos, type),
1285 literal_index_(literal_index),
1286 is_simple_(false), 1285 is_simple_(false),
1287 depth_(0) {} 1286 depth_(0),
1287 literal_index_(literal_index) {}
1288 1288
1289 // A materialized literal is simple if the values consist of only 1289 // A materialized literal is simple if the values consist of only
1290 // constants and simple object and array literals. 1290 // constants and simple object and array literals.
1291 bool is_simple() const { return is_simple_; } 1291 bool is_simple() const { return is_simple_; }
1292 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } 1292 void set_is_simple(bool is_simple) { is_simple_ = is_simple; }
1293 friend class CompileTimeValue; 1293 friend class CompileTimeValue;
1294 1294
1295 void set_depth(int depth) { 1295 void set_depth(int depth) {
1296 DCHECK(depth >= 1); 1296 DCHECK_LE(1, depth);
1297 depth_ = depth; 1297 depth_ = depth;
1298 } 1298 }
1299 1299
1300 // Populate the constant properties/elements fixed array. 1300 // Populate the constant properties/elements fixed array.
1301 void BuildConstants(Isolate* isolate); 1301 void BuildConstants(Isolate* isolate);
1302 friend class ArrayLiteral; 1302 friend class ArrayLiteral;
1303 friend class ObjectLiteral; 1303 friend class ObjectLiteral;
1304 1304
1305 // If the expression is a literal, return the literal value; 1305 // If the expression is a literal, return the literal value;
1306 // if the expression is a materialized literal and is simple return a 1306 // if the expression is a materialized literal and is simple return a
1307 // compile time value as encoded by CompileTimeValue::GetValue(). 1307 // compile time value as encoded by CompileTimeValue::GetValue().
1308 // Otherwise, return undefined literal as the placeholder 1308 // Otherwise, return undefined literal as the placeholder
1309 // in the object literal boilerplate. 1309 // in the object literal boilerplate.
1310 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); 1310 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate);
1311 1311
1312 private: 1312 private:
1313 bool is_simple_ : 1;
1314 int depth_ : 31;
1313 int literal_index_; 1315 int literal_index_;
1314 bool is_simple_;
1315 int depth_;
1316 1316
1317 friend class AstLiteralReindexer; 1317 friend class AstLiteralReindexer;
1318 }; 1318 };
1319 1319
1320 1320
1321 // Property is used for passing information 1321 // Property is used for passing information
1322 // about an object literal's properties from the parser 1322 // about an object literal's properties from the parser
1323 // to the code generator. 1323 // to the code generator.
1324 class ObjectLiteralProperty final : public ZoneObject { 1324 class ObjectLiteralProperty final : public ZoneObject {
1325 public: 1325 public:
1326 enum Kind { 1326 enum Kind : uint8_t {
1327 CONSTANT, // Property with constant value (compile time). 1327 CONSTANT, // Property with constant value (compile time).
1328 COMPUTED, // Property with computed value (execution time). 1328 COMPUTED, // Property with computed value (execution time).
1329 MATERIALIZED_LITERAL, // Property value is a materialized literal. 1329 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1330 GETTER, SETTER, // Property is an accessor function. 1330 GETTER,
1331 PROTOTYPE // Property is __proto__. 1331 SETTER, // Property is an accessor function.
1332 PROTOTYPE // Property is __proto__.
1332 }; 1333 };
1333 1334
1334 Expression* key() { return key_; } 1335 Expression* key() { return key_; }
1335 Expression* value() { return value_; } 1336 Expression* value() { return value_; }
1336 Kind kind() { return kind_; } 1337 Kind kind() { return kind_; }
1337 1338
1338 void set_key(Expression* e) { key_ = e; } 1339 void set_key(Expression* e) { key_ = e; }
1339 void set_value(Expression* e) { value_ = e; } 1340 void set_value(Expression* e) { value_ = e; }
1340 1341
1341 // Type feedback information. 1342 // Type feedback information.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 return parent_num_ids() + 1 + 2 * properties()->length(); 1457 return parent_num_ids() + 1 + 2 * properties()->length();
1457 } 1458 }
1458 1459
1459 // Object literals need one feedback slot for each non-trivial value, as well 1460 // Object literals need one feedback slot for each non-trivial value, as well
1460 // as some slots for home objects. 1461 // as some slots for home objects.
1461 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1462 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1462 FeedbackVectorSlotCache* cache); 1463 FeedbackVectorSlotCache* cache);
1463 1464
1464 protected: 1465 protected:
1465 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, 1466 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index,
1466 int boilerplate_properties, int pos) 1467 uint32_t boilerplate_properties, int pos)
1467 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), 1468 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral),
1468 properties_(properties),
1469 boilerplate_properties_(boilerplate_properties), 1469 boilerplate_properties_(boilerplate_properties),
1470 fast_elements_(false), 1470 fast_elements_(false),
1471 has_elements_(false), 1471 has_elements_(false),
1472 may_store_doubles_(false) {} 1472 may_store_doubles_(false),
1473 properties_(properties) {}
1473 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } 1474 static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
1474 1475
1475 private: 1476 private:
1476 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1477 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1478 uint32_t boilerplate_properties_ : 29;
1479 bool fast_elements_ : 1;
1480 bool has_elements_ : 1;
1481 bool may_store_doubles_ : 1;
1482 FeedbackVectorSlot slot_;
1477 Handle<FixedArray> constant_properties_; 1483 Handle<FixedArray> constant_properties_;
1478 ZoneList<Property*>* properties_; 1484 ZoneList<Property*>* properties_;
1479 int boilerplate_properties_;
1480 bool fast_elements_;
1481 bool has_elements_;
1482 bool may_store_doubles_;
1483 FeedbackVectorSlot slot_;
1484 }; 1485 };
1485 1486
1486 1487
1487 // A map from property names to getter/setter pairs allocated in the zone. 1488 // A map from property names to getter/setter pairs allocated in the zone.
1488 class AccessorTable 1489 class AccessorTable
1489 : public base::TemplateHashMap<Literal, ObjectLiteral::Accessors, 1490 : public base::TemplateHashMap<Literal, ObjectLiteral::Accessors,
1490 ZoneAllocationPolicy> { 1491 ZoneAllocationPolicy> {
1491 public: 1492 public:
1492 explicit AccessorTable(Zone* zone) 1493 explicit AccessorTable(Zone* zone)
1493 : base::TemplateHashMap<Literal, ObjectLiteral::Accessors, 1494 : base::TemplateHashMap<Literal, ObjectLiteral::Accessors,
(...skipping 17 matching lines...) Expand all
1511 public: 1512 public:
1512 DECLARE_NODE_TYPE(RegExpLiteral) 1513 DECLARE_NODE_TYPE(RegExpLiteral)
1513 1514
1514 Handle<String> pattern() const { return pattern_->string(); } 1515 Handle<String> pattern() const { return pattern_->string(); }
1515 int flags() const { return flags_; } 1516 int flags() const { return flags_; }
1516 1517
1517 protected: 1518 protected:
1518 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, 1519 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags,
1519 int literal_index, int pos) 1520 int literal_index, int pos)
1520 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), 1521 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral),
1521 pattern_(pattern), 1522 flags_(flags),
1522 flags_(flags) { 1523 pattern_(pattern) {
1523 set_depth(1); 1524 set_depth(1);
1524 } 1525 }
1525 1526
1526 private: 1527 private:
1528 int const flags_;
1527 const AstRawString* const pattern_; 1529 const AstRawString* const pattern_;
1528 int const flags_;
1529 }; 1530 };
1530 1531
1531 1532
1532 // An array literal has a literals object that is used 1533 // An array literal has a literals object that is used
1533 // for minimizing the work when constructing it at runtime. 1534 // for minimizing the work when constructing it at runtime.
1534 class ArrayLiteral final : public MaterializedLiteral { 1535 class ArrayLiteral final : public MaterializedLiteral {
1535 public: 1536 public:
1536 DECLARE_NODE_TYPE(ArrayLiteral) 1537 DECLARE_NODE_TYPE(ArrayLiteral)
1537 1538
1538 Handle<FixedArray> constant_elements() const { return constant_elements_; } 1539 Handle<FixedArray> constant_elements() const { return constant_elements_; }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1585 }; 1586 };
1586 1587
1587 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1588 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1588 FeedbackVectorSlotCache* cache); 1589 FeedbackVectorSlotCache* cache);
1589 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } 1590 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; }
1590 1591
1591 protected: 1592 protected:
1592 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, 1593 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values,
1593 int first_spread_index, int literal_index, int pos) 1594 int first_spread_index, int literal_index, int pos)
1594 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), 1595 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral),
1595 values_(values), 1596 first_spread_index_(first_spread_index),
1596 first_spread_index_(first_spread_index) {} 1597 values_(values) {}
1597 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } 1598 static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
1598 1599
1599 private: 1600 private:
1600 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1601 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1601 1602
1603 int first_spread_index_;
1604 FeedbackVectorSlot literal_slot_;
1602 Handle<FixedArray> constant_elements_; 1605 Handle<FixedArray> constant_elements_;
1603 ZoneList<Expression*>* values_; 1606 ZoneList<Expression*>* values_;
1604 int first_spread_index_;
1605 FeedbackVectorSlot literal_slot_;
1606 }; 1607 };
1607 1608
1608 1609
1609 class VariableProxy final : public Expression { 1610 class VariableProxy final : public Expression {
1610 public: 1611 public:
1611 DECLARE_NODE_TYPE(VariableProxy) 1612 DECLARE_NODE_TYPE(VariableProxy)
1612 1613
1613 bool IsValidReferenceExpression() const { 1614 bool IsValidReferenceExpression() const {
1614 return !is_this() && !is_new_target(); 1615 return !is_this() && !is_new_target();
1615 } 1616 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1677 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1677 1678
1678 class IsThisField : public BitField8<bool, 0, 1> {}; 1679 class IsThisField : public BitField8<bool, 0, 1> {};
1679 class IsAssignedField : public BitField8<bool, 1, 1> {}; 1680 class IsAssignedField : public BitField8<bool, 1, 1> {};
1680 class IsResolvedField : public BitField8<bool, 2, 1> {}; 1681 class IsResolvedField : public BitField8<bool, 2, 1> {};
1681 class IsNewTargetField : public BitField8<bool, 3, 1> {}; 1682 class IsNewTargetField : public BitField8<bool, 3, 1> {};
1682 1683
1683 // Start with 16-bit (or smaller) field, which should get packed together 1684 // Start with 16-bit (or smaller) field, which should get packed together
1684 // with Expression's trailing 16-bit field. 1685 // with Expression's trailing 16-bit field.
1685 uint8_t bit_field_; 1686 uint8_t bit_field_;
1687 // Position is stored in the AstNode superclass, but VariableProxy needs to
1688 // know its end position too (for error messages). It cannot be inferred from
1689 // the variable name length because it can contain escapes.
1690 int end_position_;
1686 FeedbackVectorSlot variable_feedback_slot_; 1691 FeedbackVectorSlot variable_feedback_slot_;
1687 union { 1692 union {
1688 const AstRawString* raw_name_; // if !is_resolved_ 1693 const AstRawString* raw_name_; // if !is_resolved_
1689 Variable* var_; // if is_resolved_ 1694 Variable* var_; // if is_resolved_
1690 }; 1695 };
1691 // Position is stored in the AstNode superclass, but VariableProxy needs to
1692 // know its end position too (for error messages). It cannot be inferred from
1693 // the variable name length because it can contain escapes.
1694 int end_position_;
1695 }; 1696 };
1696 1697
1697 1698
1698 // Left-hand side can only be a property, a global or a (parameter or local) 1699 // Left-hand side can only be a property, a global or a (parameter or local)
1699 // slot. 1700 // slot.
1700 enum LhsKind { 1701 enum LhsKind {
1701 VARIABLE, 1702 VARIABLE,
1702 NAMED_PROPERTY, 1703 NAMED_PROPERTY,
1703 KEYED_PROPERTY, 1704 KEYED_PROPERTY,
1704 NAMED_SUPER_PROPERTY, 1705 NAMED_SUPER_PROPERTY,
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1891 1892
1892 #ifdef DEBUG 1893 #ifdef DEBUG
1893 // Used to assert that the FullCodeGenerator records the return site. 1894 // Used to assert that the FullCodeGenerator records the return site.
1894 bool return_is_recorded_; 1895 bool return_is_recorded_;
1895 #endif 1896 #endif
1896 1897
1897 protected: 1898 protected:
1898 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1899 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1899 int pos) 1900 int pos)
1900 : Expression(zone, pos, kCall), 1901 : Expression(zone, pos, kCall),
1902 bit_field_(IsUninitializedField::encode(false)),
1901 expression_(expression), 1903 expression_(expression),
1902 arguments_(arguments), 1904 arguments_(arguments) {
1903 bit_field_(IsUninitializedField::encode(false)) {
1904 if (expression->IsProperty()) { 1905 if (expression->IsProperty()) {
1905 expression->AsProperty()->mark_for_call(); 1906 expression->AsProperty()->mark_for_call();
1906 } 1907 }
1907 } 1908 }
1908 static int parent_num_ids() { return Expression::num_ids(); } 1909 static int parent_num_ids() { return Expression::num_ids(); }
1909 1910
1910 private: 1911 private:
1911 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1912 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1912 1913
1914 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1915 class IsTailField : public BitField8<bool, 1, 1> {};
1916 uint8_t bit_field_;
1913 FeedbackVectorSlot ic_slot_; 1917 FeedbackVectorSlot ic_slot_;
1914 FeedbackVectorSlot stub_slot_; 1918 FeedbackVectorSlot stub_slot_;
1915 Expression* expression_; 1919 Expression* expression_;
1916 ZoneList<Expression*>* arguments_; 1920 ZoneList<Expression*>* arguments_;
1917 Handle<JSFunction> target_; 1921 Handle<JSFunction> target_;
1918 Handle<AllocationSite> allocation_site_; 1922 Handle<AllocationSite> allocation_site_;
1919 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1920 class IsTailField : public BitField8<bool, 1, 1> {};
1921 uint8_t bit_field_;
1922 }; 1923 };
1923 1924
1924 1925
1925 class CallNew final : public Expression { 1926 class CallNew final : public Expression {
1926 public: 1927 public:
1927 DECLARE_NODE_TYPE(CallNew) 1928 DECLARE_NODE_TYPE(CallNew)
1928 1929
1929 Expression* expression() const { return expression_; } 1930 Expression* expression() const { return expression_; }
1930 ZoneList<Expression*>* arguments() const { return arguments_; } 1931 ZoneList<Expression*>* arguments() const { return arguments_; }
1931 1932
(...skipping 30 matching lines...) Expand all
1962 void set_target(Handle<JSFunction> target) { target_ = target; } 1963 void set_target(Handle<JSFunction> target) { target_ = target; }
1963 void SetKnownGlobalTarget(Handle<JSFunction> target) { 1964 void SetKnownGlobalTarget(Handle<JSFunction> target) {
1964 target_ = target; 1965 target_ = target;
1965 is_monomorphic_ = true; 1966 is_monomorphic_ = true;
1966 } 1967 }
1967 1968
1968 protected: 1969 protected:
1969 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1970 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1970 int pos) 1971 int pos)
1971 : Expression(zone, pos, kCallNew), 1972 : Expression(zone, pos, kCallNew),
1973 is_monomorphic_(false),
1972 expression_(expression), 1974 expression_(expression),
1973 arguments_(arguments), 1975 arguments_(arguments) {}
1974 is_monomorphic_(false) {}
1975 1976
1976 static int parent_num_ids() { return Expression::num_ids(); } 1977 static int parent_num_ids() { return Expression::num_ids(); }
1977 1978
1978 private: 1979 private:
1979 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1980 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1980 1981
1982 bool is_monomorphic_;
1983 FeedbackVectorSlot callnew_feedback_slot_;
1981 Expression* expression_; 1984 Expression* expression_;
1982 ZoneList<Expression*>* arguments_; 1985 ZoneList<Expression*>* arguments_;
1983 bool is_monomorphic_;
1984 Handle<JSFunction> target_; 1986 Handle<JSFunction> target_;
1985 Handle<AllocationSite> allocation_site_; 1987 Handle<AllocationSite> allocation_site_;
1986 FeedbackVectorSlot callnew_feedback_slot_;
1987 }; 1988 };
1988 1989
1989 1990
1990 // The CallRuntime class does not represent any official JavaScript 1991 // The CallRuntime class does not represent any official JavaScript
1991 // language construct. Instead it is used to call a C or JS function 1992 // language construct. Instead it is used to call a C or JS function
1992 // with a set of arguments. This is used from the builtins that are 1993 // with a set of arguments. This is used from the builtins that are
1993 // implemented in JavaScript (see "v8natives.js"). 1994 // implemented in JavaScript (see "v8natives.js").
1994 class CallRuntime final : public Expression { 1995 class CallRuntime final : public Expression {
1995 public: 1996 public:
1996 DECLARE_NODE_TYPE(CallRuntime) 1997 DECLARE_NODE_TYPE(CallRuntime)
(...skipping 20 matching lines...) Expand all
2017 protected: 2018 protected:
2018 CallRuntime(Zone* zone, const Runtime::Function* function, 2019 CallRuntime(Zone* zone, const Runtime::Function* function,
2019 ZoneList<Expression*>* arguments, int pos) 2020 ZoneList<Expression*>* arguments, int pos)
2020 : Expression(zone, pos, kCallRuntime), 2021 : Expression(zone, pos, kCallRuntime),
2021 function_(function), 2022 function_(function),
2022 arguments_(arguments) {} 2023 arguments_(arguments) {}
2023 2024
2024 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, 2025 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments,
2025 int pos) 2026 int pos)
2026 : Expression(zone, pos, kCallRuntime), 2027 : Expression(zone, pos, kCallRuntime),
2028 context_index_(context_index),
2027 function_(NULL), 2029 function_(NULL),
2028 context_index_(context_index),
2029 arguments_(arguments) {} 2030 arguments_(arguments) {}
2030 2031
2031 static int parent_num_ids() { return Expression::num_ids(); } 2032 static int parent_num_ids() { return Expression::num_ids(); }
2032 2033
2033 private: 2034 private:
2034 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2035 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2035 2036
2037 int context_index_;
2036 const Runtime::Function* function_; 2038 const Runtime::Function* function_;
2037 int context_index_;
2038 ZoneList<Expression*>* arguments_; 2039 ZoneList<Expression*>* arguments_;
2039 }; 2040 };
2040 2041
2041 2042
2042 class UnaryOperation final : public Expression { 2043 class UnaryOperation final : public Expression {
2043 public: 2044 public:
2044 DECLARE_NODE_TYPE(UnaryOperation) 2045 DECLARE_NODE_TYPE(UnaryOperation)
2045 2046
2046 Token::Value op() const { return op_; } 2047 Token::Value op() const { return op_; }
2047 Expression* expression() const { return expression_; } 2048 Expression* expression() const { return expression_; }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
2201 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2202 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2202 2203
2203 class IsPrefixField : public BitField16<bool, 0, 1> {}; 2204 class IsPrefixField : public BitField16<bool, 0, 1> {};
2204 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2205 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2205 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; 2206 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {};
2206 class TokenField : public BitField16<Token::Value, 5, 8> {}; 2207 class TokenField : public BitField16<Token::Value, 5, 8> {};
2207 2208
2208 // Starts with 16-bit field, which should get packed together with 2209 // Starts with 16-bit field, which should get packed together with
2209 // Expression's trailing 16-bit field. 2210 // Expression's trailing 16-bit field.
2210 uint16_t bit_field_; 2211 uint16_t bit_field_;
2212 FeedbackVectorSlot slot_;
2211 Type* type_; 2213 Type* type_;
2212 Expression* expression_; 2214 Expression* expression_;
2213 SmallMapList receiver_types_; 2215 SmallMapList receiver_types_;
2214 FeedbackVectorSlot slot_;
2215 }; 2216 };
2216 2217
2217 2218
2218 class CompareOperation final : public Expression { 2219 class CompareOperation final : public Expression {
2219 public: 2220 public:
2220 DECLARE_NODE_TYPE(CompareOperation) 2221 DECLARE_NODE_TYPE(CompareOperation)
2221 2222
2222 Token::Value op() const { return op_; } 2223 Token::Value op() const { return op_; }
2223 Expression* left() const { return left_; } 2224 Expression* left() const { return left_; }
2224 Expression* right() const { return right_; } 2225 Expression* right() const { return right_; }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 Expression* expression() const { return expression_; } 2270 Expression* expression() const { return expression_; }
2270 void set_expression(Expression* e) { expression_ = e; } 2271 void set_expression(Expression* e) { expression_ = e; }
2271 2272
2272 int expression_position() const { return expr_pos_; } 2273 int expression_position() const { return expr_pos_; }
2273 2274
2274 static int num_ids() { return parent_num_ids(); } 2275 static int num_ids() { return parent_num_ids(); }
2275 2276
2276 protected: 2277 protected:
2277 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) 2278 Spread(Zone* zone, Expression* expression, int pos, int expr_pos)
2278 : Expression(zone, pos, kSpread), 2279 : Expression(zone, pos, kSpread),
2279 expression_(expression), 2280 expr_pos_(expr_pos),
2280 expr_pos_(expr_pos) {} 2281 expression_(expression) {}
2281 static int parent_num_ids() { return Expression::num_ids(); } 2282 static int parent_num_ids() { return Expression::num_ids(); }
2282 2283
2283 private: 2284 private:
2284 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2285 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2285 2286
2287 int expr_pos_;
2286 Expression* expression_; 2288 Expression* expression_;
2287 int expr_pos_;
2288 }; 2289 };
2289 2290
2290 2291
2291 class Conditional final : public Expression { 2292 class Conditional final : public Expression {
2292 public: 2293 public:
2293 DECLARE_NODE_TYPE(Conditional) 2294 DECLARE_NODE_TYPE(Conditional)
2294 2295
2295 Expression* condition() const { return condition_; } 2296 Expression* condition() const { return condition_; }
2296 Expression* then_expression() const { return then_expression_; } 2297 Expression* then_expression() const { return then_expression_; }
2297 Expression* else_expression() const { return else_expression_; } 2298 Expression* else_expression() const { return else_expression_; }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2390 class KeyTypeField 2391 class KeyTypeField
2391 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; 2392 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {};
2392 class StoreModeField 2393 class StoreModeField
2393 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; 2394 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {};
2394 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { 2395 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> {
2395 }; 2396 };
2396 2397
2397 // Starts with 16-bit field, which should get packed together with 2398 // Starts with 16-bit field, which should get packed together with
2398 // Expression's trailing 16-bit field. 2399 // Expression's trailing 16-bit field.
2399 uint16_t bit_field_; 2400 uint16_t bit_field_;
2401 FeedbackVectorSlot slot_;
2400 Expression* target_; 2402 Expression* target_;
2401 Expression* value_; 2403 Expression* value_;
2402 BinaryOperation* binary_operation_; 2404 BinaryOperation* binary_operation_;
2403 SmallMapList receiver_types_; 2405 SmallMapList receiver_types_;
2404 FeedbackVectorSlot slot_;
2405 }; 2406 };
2406 2407
2407 2408
2408 // The RewritableExpression class is a wrapper for AST nodes that wait 2409 // The RewritableExpression class is a wrapper for AST nodes that wait
2409 // for some potential rewriting. However, even if such nodes are indeed 2410 // for some potential rewriting. However, even if such nodes are indeed
2410 // rewritten, the RewritableExpression wrapper nodes will survive in the 2411 // rewritten, the RewritableExpression wrapper nodes will survive in the
2411 // final AST and should be just ignored, i.e., they should be treated as 2412 // final AST and should be just ignored, i.e., they should be treated as
2412 // equivalent to the wrapped nodes. For this reason and to simplify later 2413 // equivalent to the wrapped nodes. For this reason and to simplify later
2413 // phases, RewritableExpressions are considered as exceptions of AST nodes 2414 // phases, RewritableExpressions are considered as exceptions of AST nodes
2414 // in the following sense: 2415 // in the following sense:
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2469 int yield_id() const { return yield_id_; } 2470 int yield_id() const { return yield_id_; }
2470 2471
2471 void set_generator_object(Expression* e) { generator_object_ = e; } 2472 void set_generator_object(Expression* e) { generator_object_ = e; }
2472 void set_expression(Expression* e) { expression_ = e; } 2473 void set_expression(Expression* e) { expression_ = e; }
2473 void set_yield_id(int yield_id) { yield_id_ = yield_id; } 2474 void set_yield_id(int yield_id) { yield_id_ = yield_id; }
2474 2475
2475 protected: 2476 protected:
2476 Yield(Zone* zone, Expression* generator_object, Expression* expression, 2477 Yield(Zone* zone, Expression* generator_object, Expression* expression,
2477 int pos, OnException on_exception) 2478 int pos, OnException on_exception)
2478 : Expression(zone, pos, kYield), 2479 : Expression(zone, pos, kYield),
2480 on_exception_(on_exception),
2481 yield_id_(-1),
2479 generator_object_(generator_object), 2482 generator_object_(generator_object),
2480 expression_(expression), 2483 expression_(expression) {}
2481 on_exception_(on_exception),
2482 yield_id_(-1) {}
2483 2484
2484 private: 2485 private:
2486 OnException on_exception_;
2487 int yield_id_;
2485 Expression* generator_object_; 2488 Expression* generator_object_;
2486 Expression* expression_; 2489 Expression* expression_;
2487 OnException on_exception_;
2488 int yield_id_;
2489 }; 2490 };
2490 2491
2491 2492
2492 class Throw final : public Expression { 2493 class Throw final : public Expression {
2493 public: 2494 public:
2494 DECLARE_NODE_TYPE(Throw) 2495 DECLARE_NODE_TYPE(Throw)
2495 2496
2496 Expression* exception() const { return exception_; } 2497 Expression* exception() const { return exception_; }
2497 void set_exception(Expression* e) { exception_ = e; } 2498 void set_exception(Expression* e) { exception_ = e; }
2498 2499
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2641 protected: 2642 protected:
2642 FunctionLiteral(Zone* zone, const AstString* name, 2643 FunctionLiteral(Zone* zone, const AstString* name,
2643 AstValueFactory* ast_value_factory, Scope* scope, 2644 AstValueFactory* ast_value_factory, Scope* scope,
2644 ZoneList<Statement*>* body, int materialized_literal_count, 2645 ZoneList<Statement*>* body, int materialized_literal_count,
2645 int expected_property_count, int parameter_count, 2646 int expected_property_count, int parameter_count,
2646 FunctionType function_type, 2647 FunctionType function_type,
2647 ParameterFlag has_duplicate_parameters, 2648 ParameterFlag has_duplicate_parameters,
2648 EagerCompileHint eager_compile_hint, FunctionKind kind, 2649 EagerCompileHint eager_compile_hint, FunctionKind kind,
2649 int position, bool is_function) 2650 int position, bool is_function)
2650 : Expression(zone, position, kFunctionLiteral), 2651 : Expression(zone, position, kFunctionLiteral),
2651 raw_name_(name),
2652 scope_(scope),
2653 body_(body),
2654 raw_inferred_name_(ast_value_factory->empty_string()),
2655 ast_properties_(zone),
2656 dont_optimize_reason_(kNoReason), 2652 dont_optimize_reason_(kNoReason),
2657 materialized_literal_count_(materialized_literal_count), 2653 materialized_literal_count_(materialized_literal_count),
2658 expected_property_count_(expected_property_count), 2654 expected_property_count_(expected_property_count),
2659 parameter_count_(parameter_count), 2655 parameter_count_(parameter_count),
2660 function_token_position_(kNoSourcePosition), 2656 function_token_position_(kNoSourcePosition),
2661 yield_count_(0) { 2657 yield_count_(0),
2658 raw_name_(name),
2659 scope_(scope),
2660 body_(body),
2661 raw_inferred_name_(ast_value_factory->empty_string()),
2662 ast_properties_(zone) {
2662 bitfield_ = 2663 bitfield_ =
2663 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | 2664 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) |
2664 HasDuplicateParameters::encode(has_duplicate_parameters == 2665 HasDuplicateParameters::encode(has_duplicate_parameters ==
2665 kHasDuplicateParameters) | 2666 kHasDuplicateParameters) |
2666 IsFunction::encode(is_function) | 2667 IsFunction::encode(is_function) |
2667 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) | 2668 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) |
2668 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false); 2669 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false);
2669 DCHECK(IsValidFunctionKind(kind)); 2670 DCHECK(IsValidFunctionKind(kind));
2670 } 2671 }
2671 2672
2672 private: 2673 private:
2673 class FunctionTypeBits : public BitField16<FunctionType, 0, 2> {}; 2674 class FunctionTypeBits : public BitField16<FunctionType, 0, 2> {};
2674 class Pretenure : public BitField16<bool, 2, 1> {}; 2675 class Pretenure : public BitField16<bool, 2, 1> {};
2675 class HasDuplicateParameters : public BitField16<bool, 3, 1> {}; 2676 class HasDuplicateParameters : public BitField16<bool, 3, 1> {};
2676 class IsFunction : public BitField16<bool, 4, 1> {}; 2677 class IsFunction : public BitField16<bool, 4, 1> {};
2677 class ShouldEagerCompile : public BitField16<bool, 5, 1> {}; 2678 class ShouldEagerCompile : public BitField16<bool, 5, 1> {};
2678 class ShouldBeUsedOnceHint : public BitField16<bool, 6, 1> {}; 2679 class ShouldBeUsedOnceHint : public BitField16<bool, 6, 1> {};
2679 class FunctionKindBits : public BitField16<FunctionKind, 7, 9> {}; 2680 class FunctionKindBits : public BitField16<FunctionKind, 7, 9> {};
2680 2681
2681 // Start with 16-bit field, which should get packed together 2682 // Start with 16-bit field, which should get packed together
2682 // with Expression's trailing 16-bit field. 2683 // with Expression's trailing 16-bit field.
2683 uint16_t bitfield_; 2684 uint16_t bitfield_;
2684 2685
2685 const AstString* raw_name_;
2686 Scope* scope_;
2687 ZoneList<Statement*>* body_;
2688 const AstString* raw_inferred_name_;
2689 Handle<String> inferred_name_;
2690 AstProperties ast_properties_;
2691 BailoutReason dont_optimize_reason_; 2686 BailoutReason dont_optimize_reason_;
2692 2687
2693 int materialized_literal_count_; 2688 int materialized_literal_count_;
2694 int expected_property_count_; 2689 int expected_property_count_;
2695 int parameter_count_; 2690 int parameter_count_;
2696 int function_token_position_; 2691 int function_token_position_;
2697 int yield_count_; 2692 int yield_count_;
2693
2694 const AstString* raw_name_;
2695 Scope* scope_;
2696 ZoneList<Statement*>* body_;
2697 const AstString* raw_inferred_name_;
2698 Handle<String> inferred_name_;
2699 AstProperties ast_properties_;
2698 }; 2700 };
2699 2701
2700 2702
2701 class ClassLiteral final : public Expression { 2703 class ClassLiteral final : public Expression {
2702 public: 2704 public:
2703 typedef ObjectLiteralProperty Property; 2705 typedef ObjectLiteralProperty Property;
2704 2706
2705 DECLARE_NODE_TYPE(ClassLiteral) 2707 DECLARE_NODE_TYPE(ClassLiteral)
2706 2708
2707 Scope* scope() const { return scope_; } 2709 Scope* scope() const { return scope_; }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2743 bool IsAnonymousFunctionDefinition() const { 2745 bool IsAnonymousFunctionDefinition() const {
2744 return constructor()->raw_name()->length() == 0; 2746 return constructor()->raw_name()->length() == 0;
2745 } 2747 }
2746 2748
2747 protected: 2749 protected:
2748 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, 2750 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy,
2749 Expression* extends, FunctionLiteral* constructor, 2751 Expression* extends, FunctionLiteral* constructor,
2750 ZoneList<Property*>* properties, int start_position, 2752 ZoneList<Property*>* properties, int start_position,
2751 int end_position) 2753 int end_position)
2752 : Expression(zone, start_position, kClassLiteral), 2754 : Expression(zone, start_position, kClassLiteral),
2755 end_position_(end_position),
2753 scope_(scope), 2756 scope_(scope),
2754 class_variable_proxy_(class_variable_proxy), 2757 class_variable_proxy_(class_variable_proxy),
2755 extends_(extends), 2758 extends_(extends),
2756 constructor_(constructor), 2759 constructor_(constructor),
2757 properties_(properties), 2760 properties_(properties) {}
2758 end_position_(end_position) {}
2759 2761
2760 static int parent_num_ids() { return Expression::num_ids(); } 2762 static int parent_num_ids() { return Expression::num_ids(); }
2761 2763
2762 private: 2764 private:
2763 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2765 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2764 2766
2767 int end_position_;
2768 FeedbackVectorSlot prototype_slot_;
2769 FeedbackVectorSlot proxy_slot_;
2765 Scope* scope_; 2770 Scope* scope_;
2766 VariableProxy* class_variable_proxy_; 2771 VariableProxy* class_variable_proxy_;
2767 Expression* extends_; 2772 Expression* extends_;
2768 FunctionLiteral* constructor_; 2773 FunctionLiteral* constructor_;
2769 ZoneList<Property*>* properties_; 2774 ZoneList<Property*>* properties_;
2770 int end_position_;
2771 FeedbackVectorSlot prototype_slot_;
2772 FeedbackVectorSlot proxy_slot_;
2773 }; 2775 };
2774 2776
2775 2777
2776 class NativeFunctionLiteral final : public Expression { 2778 class NativeFunctionLiteral final : public Expression {
2777 public: 2779 public:
2778 DECLARE_NODE_TYPE(NativeFunctionLiteral) 2780 DECLARE_NODE_TYPE(NativeFunctionLiteral)
2779 2781
2780 Handle<String> name() const { return name_->string(); } 2782 Handle<String> name() const { return name_->string(); }
2781 v8::Extension* extension() const { return extension_; } 2783 v8::Extension* extension() const { return extension_; }
2782 2784
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
3225 return new (local_zone_) 3227 return new (local_zone_)
3226 Literal(local_zone_, ast_value_factory_->NewUndefined(), pos); 3228 Literal(local_zone_, ast_value_factory_->NewUndefined(), pos);
3227 } 3229 }
3228 3230
3229 Literal* NewTheHoleLiteral(int pos) { 3231 Literal* NewTheHoleLiteral(int pos) {
3230 return new (local_zone_) 3232 return new (local_zone_)
3231 Literal(local_zone_, ast_value_factory_->NewTheHole(), pos); 3233 Literal(local_zone_, ast_value_factory_->NewTheHole(), pos);
3232 } 3234 }
3233 3235
3234 ObjectLiteral* NewObjectLiteral( 3236 ObjectLiteral* NewObjectLiteral(
3235 ZoneList<ObjectLiteral::Property*>* properties, 3237 ZoneList<ObjectLiteral::Property*>* properties, int literal_index,
3236 int literal_index, 3238 uint32_t boilerplate_properties, int pos) {
3237 int boilerplate_properties,
3238 int pos) {
3239 return new (local_zone_) ObjectLiteral( 3239 return new (local_zone_) ObjectLiteral(
3240 local_zone_, properties, literal_index, boilerplate_properties, pos); 3240 local_zone_, properties, literal_index, boilerplate_properties, pos);
3241 } 3241 }
3242 3242
3243 ObjectLiteral::Property* NewObjectLiteralProperty( 3243 ObjectLiteral::Property* NewObjectLiteralProperty(
3244 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind, 3244 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind,
3245 bool is_static, bool is_computed_name) { 3245 bool is_static, bool is_computed_name) {
3246 return new (local_zone_) 3246 return new (local_zone_)
3247 ObjectLiteral::Property(key, value, kind, is_static, is_computed_name); 3247 ObjectLiteral::Property(key, value, kind, is_static, is_computed_name);
3248 } 3248 }
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
3540 : NULL; \ 3540 : NULL; \
3541 } 3541 }
3542 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3542 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3543 #undef DECLARE_NODE_FUNCTIONS 3543 #undef DECLARE_NODE_FUNCTIONS
3544 3544
3545 3545
3546 } // namespace internal 3546 } // namespace internal
3547 } // namespace v8 3547 } // namespace v8
3548 3548
3549 #endif // V8_AST_AST_H_ 3549 #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