Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_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-types.h" | 8 #include "src/ast/ast-types.h" |
| 9 #include "src/ast/ast-value-factory.h" | 9 #include "src/ast/ast-value-factory.h" |
| 10 #include "src/ast/modules.h" | 10 #include "src/ast/modules.h" |
| (...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1233 | 1233 |
| 1234 Literal(const AstValue* value, int position) | 1234 Literal(const AstValue* value, int position) |
| 1235 : Expression(position, kLiteral), value_(value) {} | 1235 : Expression(position, kLiteral), value_(value) {} |
| 1236 | 1236 |
| 1237 static int parent_num_ids() { return Expression::num_ids(); } | 1237 static int parent_num_ids() { return Expression::num_ids(); } |
| 1238 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1238 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1239 | 1239 |
| 1240 const AstValue* value_; | 1240 const AstValue* value_; |
| 1241 }; | 1241 }; |
| 1242 | 1242 |
| 1243 | |
| 1244 class AstLiteralReindexer; | |
| 1245 | |
| 1246 // Base class for literals that needs space in the corresponding JSFunction. | 1243 // Base class for literals that needs space in the corresponding JSFunction. |
|
Michael Starzinger
2017/01/30 11:16:44
nit: s/in the corresponding JSFunction/in the type
mvstanton
2017/01/30 11:57:04
Done.
| |
| 1247 class MaterializedLiteral : public Expression { | 1244 class MaterializedLiteral : public Expression { |
| 1248 public: | 1245 public: |
| 1249 int literal_index() { return literal_index_; } | |
| 1250 | |
| 1251 int depth() const { | 1246 int depth() const { |
| 1252 // only callable after initialization. | 1247 // only callable after initialization. |
| 1253 DCHECK(depth_ >= 1); | 1248 DCHECK(depth_ >= 1); |
| 1254 return depth_; | 1249 return depth_; |
| 1255 } | 1250 } |
| 1256 | 1251 |
| 1252 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec, | |
| 1253 FeedbackVectorSlotCache* cache) { | |
| 1254 literal_slot_ = spec->AddLiteralSlot(); | |
| 1255 } | |
| 1256 | |
| 1257 FeedbackVectorSlot literal_slot() const { return literal_slot_; } | |
| 1258 | |
| 1257 private: | 1259 private: |
| 1258 int depth_ : 31; | 1260 int depth_ : 31; |
| 1259 int literal_index_; | 1261 FeedbackVectorSlot literal_slot_; |
| 1260 | |
| 1261 friend class AstLiteralReindexer; | |
| 1262 | 1262 |
| 1263 class IsSimpleField | 1263 class IsSimpleField |
| 1264 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; | 1264 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 1265 | 1265 |
| 1266 protected: | 1266 protected: |
| 1267 MaterializedLiteral(int literal_index, int pos, NodeType type) | 1267 MaterializedLiteral(int pos, NodeType type) |
| 1268 : Expression(pos, type), depth_(0), literal_index_(literal_index) { | 1268 : Expression(pos, type), depth_(0) { |
| 1269 bit_field_ |= IsSimpleField::encode(false); | 1269 bit_field_ |= IsSimpleField::encode(false); |
| 1270 } | 1270 } |
| 1271 | 1271 |
| 1272 // A materialized literal is simple if the values consist of only | 1272 // A materialized literal is simple if the values consist of only |
| 1273 // constants and simple object and array literals. | 1273 // constants and simple object and array literals. |
| 1274 bool is_simple() const { return IsSimpleField::decode(bit_field_); } | 1274 bool is_simple() const { return IsSimpleField::decode(bit_field_); } |
| 1275 void set_is_simple(bool is_simple) { | 1275 void set_is_simple(bool is_simple) { |
| 1276 bit_field_ = IsSimpleField::update(bit_field_, is_simple); | 1276 bit_field_ = IsSimpleField::update(bit_field_, is_simple); |
| 1277 } | 1277 } |
| 1278 friend class CompileTimeValue; | 1278 friend class CompileTimeValue; |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1464 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); } | 1464 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); } |
| 1465 | 1465 |
| 1466 // Object literals need one feedback slot for each non-trivial value, as well | 1466 // Object literals need one feedback slot for each non-trivial value, as well |
| 1467 // as some slots for home objects. | 1467 // as some slots for home objects. |
| 1468 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec, | 1468 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec, |
| 1469 FeedbackVectorSlotCache* cache); | 1469 FeedbackVectorSlotCache* cache); |
| 1470 | 1470 |
| 1471 private: | 1471 private: |
| 1472 friend class AstNodeFactory; | 1472 friend class AstNodeFactory; |
| 1473 | 1473 |
| 1474 ObjectLiteral(ZoneList<Property*>* properties, int literal_index, | 1474 ObjectLiteral(ZoneList<Property*>* properties, |
| 1475 uint32_t boilerplate_properties, int pos, | 1475 uint32_t boilerplate_properties, int pos, |
| 1476 bool has_rest_property) | 1476 bool has_rest_property) |
| 1477 : MaterializedLiteral(literal_index, pos, kObjectLiteral), | 1477 : MaterializedLiteral(pos, kObjectLiteral), |
| 1478 boilerplate_properties_(boilerplate_properties), | 1478 boilerplate_properties_(boilerplate_properties), |
| 1479 properties_(properties) { | 1479 properties_(properties) { |
| 1480 bit_field_ |= FastElementsField::encode(false) | | 1480 bit_field_ |= FastElementsField::encode(false) | |
| 1481 HasElementsField::encode(false) | | 1481 HasElementsField::encode(false) | |
| 1482 MayStoreDoublesField::encode(false) | | 1482 MayStoreDoublesField::encode(false) | |
| 1483 HasRestPropertyField::encode(has_rest_property); | 1483 HasRestPropertyField::encode(has_rest_property); |
| 1484 } | 1484 } |
| 1485 | 1485 |
| 1486 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1486 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1487 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1487 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1523 Zone* zone_; | 1523 Zone* zone_; |
| 1524 }; | 1524 }; |
| 1525 | 1525 |
| 1526 | 1526 |
| 1527 // Node for capturing a regexp literal. | 1527 // Node for capturing a regexp literal. |
| 1528 class RegExpLiteral final : public MaterializedLiteral { | 1528 class RegExpLiteral final : public MaterializedLiteral { |
| 1529 public: | 1529 public: |
| 1530 Handle<String> pattern() const { return pattern_->string(); } | 1530 Handle<String> pattern() const { return pattern_->string(); } |
| 1531 int flags() const { return flags_; } | 1531 int flags() const { return flags_; } |
| 1532 | 1532 |
| 1533 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec, | |
|
Michael Starzinger
2017/01/30 11:16:44
nit: Shouldn't this be the same as just using the
mvstanton
2017/01/30 11:57:04
Yep, thanks!
| |
| 1534 FeedbackVectorSlotCache* cache) { | |
| 1535 MaterializedLiteral::AssignFeedbackVectorSlots(spec, cache); | |
| 1536 } | |
| 1537 | |
| 1533 private: | 1538 private: |
| 1534 friend class AstNodeFactory; | 1539 friend class AstNodeFactory; |
| 1535 | 1540 |
| 1536 RegExpLiteral(const AstRawString* pattern, int flags, int literal_index, | 1541 RegExpLiteral(const AstRawString* pattern, int flags, int pos) |
| 1537 int pos) | 1542 : MaterializedLiteral(pos, kRegExpLiteral), |
| 1538 : MaterializedLiteral(literal_index, pos, kRegExpLiteral), | |
| 1539 flags_(flags), | 1543 flags_(flags), |
| 1540 pattern_(pattern) { | 1544 pattern_(pattern) { |
| 1541 set_depth(1); | 1545 set_depth(1); |
| 1542 } | 1546 } |
| 1543 | 1547 |
| 1544 int const flags_; | 1548 int const flags_; |
| 1545 const AstRawString* const pattern_; | 1549 const AstRawString* const pattern_; |
| 1546 }; | 1550 }; |
| 1547 | 1551 |
| 1548 | 1552 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1613 kDisableMementos = 1 << 1 | 1617 kDisableMementos = 1 << 1 |
| 1614 }; | 1618 }; |
| 1615 | 1619 |
| 1616 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec, | 1620 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec, |
| 1617 FeedbackVectorSlotCache* cache); | 1621 FeedbackVectorSlotCache* cache); |
| 1618 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } | 1622 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } |
| 1619 | 1623 |
| 1620 private: | 1624 private: |
| 1621 friend class AstNodeFactory; | 1625 friend class AstNodeFactory; |
| 1622 | 1626 |
| 1623 ArrayLiteral(ZoneList<Expression*>* values, int first_spread_index, | 1627 ArrayLiteral(ZoneList<Expression*>* values, int first_spread_index, int pos) |
| 1624 int literal_index, int pos) | 1628 : MaterializedLiteral(pos, kArrayLiteral), |
| 1625 : MaterializedLiteral(literal_index, pos, kArrayLiteral), | |
| 1626 first_spread_index_(first_spread_index), | 1629 first_spread_index_(first_spread_index), |
| 1627 values_(values) {} | 1630 values_(values) {} |
| 1628 | 1631 |
| 1629 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1632 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1630 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1633 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1631 | 1634 |
| 1632 int first_spread_index_; | 1635 int first_spread_index_; |
| 1633 FeedbackVectorSlot literal_slot_; | 1636 FeedbackVectorSlot literal_slot_; |
| 1634 Handle<ConstantElementsPair> constant_elements_; | 1637 Handle<ConstantElementsPair> constant_elements_; |
| 1635 ZoneList<Expression*>* values_; | 1638 ZoneList<Expression*>* values_; |
| (...skipping 1691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3327 | 3330 |
| 3328 Literal* NewUndefinedLiteral(int pos) { | 3331 Literal* NewUndefinedLiteral(int pos) { |
| 3329 return new (zone_) Literal(ast_value_factory_->NewUndefined(), pos); | 3332 return new (zone_) Literal(ast_value_factory_->NewUndefined(), pos); |
| 3330 } | 3333 } |
| 3331 | 3334 |
| 3332 Literal* NewTheHoleLiteral(int pos) { | 3335 Literal* NewTheHoleLiteral(int pos) { |
| 3333 return new (zone_) Literal(ast_value_factory_->NewTheHole(), pos); | 3336 return new (zone_) Literal(ast_value_factory_->NewTheHole(), pos); |
| 3334 } | 3337 } |
| 3335 | 3338 |
| 3336 ObjectLiteral* NewObjectLiteral( | 3339 ObjectLiteral* NewObjectLiteral( |
| 3337 ZoneList<ObjectLiteral::Property*>* properties, int literal_index, | 3340 ZoneList<ObjectLiteral::Property*>* properties, |
| 3338 uint32_t boilerplate_properties, int pos, bool has_rest_property) { | 3341 uint32_t boilerplate_properties, int pos, bool has_rest_property) { |
| 3339 return new (zone_) | 3342 return new (zone_) ObjectLiteral(properties, boilerplate_properties, pos, |
| 3340 ObjectLiteral(properties, literal_index, boilerplate_properties, pos, | 3343 has_rest_property); |
| 3341 has_rest_property); | |
| 3342 } | 3344 } |
| 3343 | 3345 |
| 3344 ObjectLiteral::Property* NewObjectLiteralProperty( | 3346 ObjectLiteral::Property* NewObjectLiteralProperty( |
| 3345 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind, | 3347 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind, |
| 3346 bool is_computed_name) { | 3348 bool is_computed_name) { |
| 3347 return new (zone_) | 3349 return new (zone_) |
| 3348 ObjectLiteral::Property(key, value, kind, is_computed_name); | 3350 ObjectLiteral::Property(key, value, kind, is_computed_name); |
| 3349 } | 3351 } |
| 3350 | 3352 |
| 3351 ObjectLiteral::Property* NewObjectLiteralProperty(Expression* key, | 3353 ObjectLiteral::Property* NewObjectLiteralProperty(Expression* key, |
| 3352 Expression* value, | 3354 Expression* value, |
| 3353 bool is_computed_name) { | 3355 bool is_computed_name) { |
| 3354 return new (zone_) ObjectLiteral::Property(ast_value_factory_, key, value, | 3356 return new (zone_) ObjectLiteral::Property(ast_value_factory_, key, value, |
| 3355 is_computed_name); | 3357 is_computed_name); |
| 3356 } | 3358 } |
| 3357 | 3359 |
| 3358 RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, int flags, | 3360 RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, int flags, |
| 3359 int literal_index, int pos) { | 3361 int pos) { |
| 3360 return new (zone_) RegExpLiteral(pattern, flags, literal_index, pos); | 3362 return new (zone_) RegExpLiteral(pattern, flags, pos); |
| 3361 } | 3363 } |
| 3362 | 3364 |
| 3363 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, | 3365 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, |
| 3364 int literal_index, | |
| 3365 int pos) { | 3366 int pos) { |
| 3366 return new (zone_) ArrayLiteral(values, -1, literal_index, pos); | 3367 return new (zone_) ArrayLiteral(values, -1, pos); |
| 3367 } | 3368 } |
| 3368 | 3369 |
| 3369 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, | 3370 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, |
| 3370 int first_spread_index, int literal_index, | 3371 int first_spread_index, int pos) { |
| 3371 int pos) { | 3372 return new (zone_) ArrayLiteral(values, first_spread_index, pos); |
| 3372 return new (zone_) | |
| 3373 ArrayLiteral(values, first_spread_index, literal_index, pos); | |
| 3374 } | 3373 } |
| 3375 | 3374 |
| 3376 VariableProxy* NewVariableProxy(Variable* var, | 3375 VariableProxy* NewVariableProxy(Variable* var, |
| 3377 int start_position = kNoSourcePosition) { | 3376 int start_position = kNoSourcePosition) { |
| 3378 return new (zone_) VariableProxy(var, start_position); | 3377 return new (zone_) VariableProxy(var, start_position); |
| 3379 } | 3378 } |
| 3380 | 3379 |
| 3381 VariableProxy* NewVariableProxy(const AstRawString* name, | 3380 VariableProxy* NewVariableProxy(const AstRawString* name, |
| 3382 VariableKind variable_kind, | 3381 VariableKind variable_kind, |
| 3383 int start_position = kNoSourcePosition) { | 3382 int start_position = kNoSourcePosition) { |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3646 : NULL; \ | 3645 : NULL; \ |
| 3647 } | 3646 } |
| 3648 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3647 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3649 #undef DECLARE_NODE_FUNCTIONS | 3648 #undef DECLARE_NODE_FUNCTIONS |
| 3650 | 3649 |
| 3651 | 3650 |
| 3652 } // namespace internal | 3651 } // namespace internal |
| 3653 } // namespace v8 | 3652 } // namespace v8 |
| 3654 | 3653 |
| 3655 #endif // V8_AST_AST_H_ | 3654 #endif // V8_AST_AST_H_ |
| OLD | NEW |