Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index aa23b4e237afa7602613a5b6a151adf0c5536608..749e57999c46561532e20ef8064772f842acbb08 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -359,11 +359,16 @@ class Expression : public AstNode { |
void set_bounds(Bounds bounds) { bounds_ = bounds; } |
// Whether the expression is parenthesized |
- bool is_parenthesized() const { return is_parenthesized_; } |
- bool is_multi_parenthesized() const { return is_multi_parenthesized_; } |
+ bool is_parenthesized() const { |
+ return IsParenthesizedField::decode(bit_field_); |
+ } |
+ bool is_multi_parenthesized() const { |
+ return IsMultiParenthesizedField::decode(bit_field_); |
+ } |
void increase_parenthesization_level() { |
- is_multi_parenthesized_ = is_parenthesized_; |
- is_parenthesized_ = true; |
+ bit_field_ = |
+ IsMultiParenthesizedField::update(bit_field_, is_parenthesized()); |
+ bit_field_ = IsParenthesizedField::update(bit_field_, true); |
} |
// Type feedback information for assignments and properties. |
@@ -375,18 +380,20 @@ class Expression : public AstNode { |
UNREACHABLE(); |
return NULL; |
} |
- virtual KeyedAccessStoreMode GetStoreMode() { |
+ virtual KeyedAccessStoreMode GetStoreMode() const { |
UNREACHABLE(); |
return STANDARD_STORE; |
} |
- virtual IcCheckType GetKeyType() { |
+ virtual IcCheckType GetKeyType() const { |
UNREACHABLE(); |
return ELEMENT; |
} |
// TODO(rossberg): this should move to its own AST node eventually. |
virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
- byte to_boolean_types() const { return to_boolean_types_; } |
+ byte to_boolean_types() const { |
+ return ToBooleanTypesField::decode(bit_field_); |
+ } |
void set_base_id(int id) { base_id_ = id; } |
static int num_ids() { return parent_num_ids() + 2; } |
@@ -398,10 +405,11 @@ class Expression : public AstNode { |
: AstNode(pos), |
base_id_(BailoutId::None().ToInt()), |
bounds_(Bounds::Unbounded(zone)), |
- is_parenthesized_(false), |
- is_multi_parenthesized_(false) {} |
+ bit_field_(0) {} |
static int parent_num_ids() { return 0; } |
- void set_to_boolean_types(byte types) { to_boolean_types_ = types; } |
+ void set_to_boolean_types(byte types) { |
+ bit_field_ = ToBooleanTypesField::update(bit_field_, types); |
+ } |
int base_id() const { |
DCHECK(!BailoutId(base_id_).IsNone()); |
@@ -413,9 +421,12 @@ class Expression : public AstNode { |
int base_id_; |
Bounds bounds_; |
- byte to_boolean_types_; |
- bool is_parenthesized_ : 1; |
- bool is_multi_parenthesized_ : 1; |
+ class ToBooleanTypesField : public BitField16<byte, 0, 8> {}; |
+ class IsParenthesizedField : public BitField16<bool, 8, 1> {}; |
+ class IsMultiParenthesizedField : public BitField16<bool, 9, 1> {}; |
+ uint16_t bit_field_; |
+ // Ends with 16-bit field; deriving classes in turn begin with |
+ // 16-bit fields for optimum packing efficiency. |
}; |
@@ -1697,13 +1708,17 @@ class VariableProxy FINAL : public Expression { |
var_ = v; |
} |
- bool is_this() const { return is_this_; } |
+ bool is_this() const { return IsThisField::decode(bit_field_); } |
- bool is_assigned() const { return is_assigned_; } |
- void set_is_assigned() { is_assigned_ = true; } |
+ bool is_assigned() const { return IsAssignedField::decode(bit_field_); } |
+ void set_is_assigned() { |
+ bit_field_ = IsAssignedField::update(bit_field_, true); |
+ } |
- bool is_resolved() const { return is_resolved_; } |
- void set_is_resolved() { is_resolved_ = true; } |
+ bool is_resolved() const { return IsResolvedField::decode(bit_field_); } |
+ void set_is_resolved() { |
+ bit_field_ = IsResolvedField::update(bit_field_, true); |
+ } |
Interface* interface() const { return interface_; } |
@@ -1727,9 +1742,13 @@ class VariableProxy FINAL : public Expression { |
VariableProxy(Zone* zone, const AstRawString* name, bool is_this, |
Interface* interface, int position); |
- bool is_this_ : 1; |
- bool is_assigned_ : 1; |
- bool is_resolved_ : 1; |
+ class IsThisField : public BitField8<bool, 0, 1> {}; |
+ class IsAssignedField : public BitField8<bool, 1, 1> {}; |
+ class IsResolvedField : public BitField8<bool, 2, 1> {}; |
+ |
+ // Start with 16-bit (or smaller) field, which should get packed together |
+ // with Expression's trailing 16-bit field. |
+ uint8_t bit_field_; |
FeedbackVectorICSlot variable_feedback_slot_; |
union { |
const AstRawString* raw_name_; // if !is_resolved_ |
@@ -1752,7 +1771,9 @@ class Property FINAL : public Expression { |
BailoutId LoadId() const { return BailoutId(local_id(0)); } |
TypeFeedbackId PropertyFeedbackId() { return TypeFeedbackId(local_id(1)); } |
- bool IsStringAccess() const { return is_string_access_; } |
+ bool IsStringAccess() const { |
+ return IsStringAccessField::decode(bit_field_); |
+ } |
// Type feedback information. |
virtual bool IsMonomorphic() OVERRIDE { |
@@ -1761,21 +1782,29 @@ class Property FINAL : public Expression { |
virtual SmallMapList* GetReceiverTypes() OVERRIDE { |
return &receiver_types_; |
} |
- virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { |
+ virtual KeyedAccessStoreMode GetStoreMode() const OVERRIDE { |
return STANDARD_STORE; |
} |
- virtual IcCheckType GetKeyType() OVERRIDE { |
+ virtual IcCheckType GetKeyType() const OVERRIDE { |
// PROPERTY key types currently aren't implemented for KeyedLoadICs. |
return ELEMENT; |
} |
- bool IsUninitialized() { return !is_for_call_ && is_uninitialized_; } |
- bool HasNoTypeInformation() { |
- return is_uninitialized_; |
+ bool IsUninitialized() const { |
+ return !is_for_call() && HasNoTypeInformation(); |
+ } |
+ bool HasNoTypeInformation() const { |
+ return IsUninitializedField::decode(bit_field_); |
+ } |
+ void set_is_uninitialized(bool b) { |
+ bit_field_ = IsUninitializedField::update(bit_field_, b); |
} |
- void set_is_uninitialized(bool b) { is_uninitialized_ = b; } |
- void set_is_string_access(bool b) { is_string_access_ = b; } |
- void mark_for_call() { is_for_call_ = true; } |
- bool IsForCall() { return is_for_call_; } |
+ void set_is_string_access(bool b) { |
+ bit_field_ = IsStringAccessField::update(bit_field_, b); |
+ } |
+ void mark_for_call() { |
+ bit_field_ = IsForCallField::update(bit_field_, true); |
+ } |
+ bool is_for_call() const { return IsForCallField::decode(bit_field_); } |
bool IsSuperAccess() { |
return obj()->IsSuperReference(); |
@@ -1795,9 +1824,9 @@ class Property FINAL : public Expression { |
protected: |
Property(Zone* zone, Expression* obj, Expression* key, int pos) |
: Expression(zone, pos), |
- is_for_call_(false), |
- is_uninitialized_(false), |
- is_string_access_(false), |
+ bit_field_(IsForCallField::encode(false) | |
+ IsUninitializedField::encode(false) | |
+ IsStringAccessField::encode(false)), |
property_feedback_slot_(FeedbackVectorICSlot::Invalid()), |
obj_(obj), |
key_(key) {} |
@@ -1806,9 +1835,10 @@ class Property FINAL : public Expression { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- bool is_for_call_ : 1; |
- bool is_uninitialized_ : 1; |
- bool is_string_access_ : 1; |
+ class IsForCallField : public BitField8<bool, 0, 1> {}; |
+ class IsUninitializedField : public BitField8<bool, 1, 1> {}; |
+ class IsStringAccessField : public BitField8<bool, 2, 1> {}; |
+ uint8_t bit_field_; |
FeedbackVectorICSlot property_feedback_slot_; |
Expression* obj_; |
Expression* key_; |
@@ -2120,10 +2150,10 @@ class CountOperation FINAL : public Expression { |
public: |
DECLARE_NODE_TYPE(CountOperation) |
- bool is_prefix() const { return is_prefix_; } |
- bool is_postfix() const { return !is_prefix_; } |
+ bool is_prefix() const { return IsPrefixField::decode(bit_field_); } |
+ bool is_postfix() const { return !is_prefix(); } |
- Token::Value op() const { return op_; } |
+ Token::Value op() const { return TokenField::decode(bit_field_); } |
Token::Value binary_op() { |
return (op() == Token::INC) ? Token::ADD : Token::SUB; |
} |
@@ -2136,13 +2166,19 @@ class CountOperation FINAL : public Expression { |
virtual SmallMapList* GetReceiverTypes() OVERRIDE { |
return &receiver_types_; |
} |
- virtual IcCheckType GetKeyType() OVERRIDE { return key_type_; } |
- virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { |
- return store_mode_; |
+ virtual IcCheckType GetKeyType() const OVERRIDE { |
+ return KeyTypeField::decode(bit_field_); |
+ } |
+ virtual KeyedAccessStoreMode GetStoreMode() const OVERRIDE { |
+ return StoreModeField::decode(bit_field_); |
} |
Type* type() const { return type_; } |
- void set_key_type(IcCheckType type) { key_type_ = type; } |
- void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } |
+ void set_key_type(IcCheckType type) { |
+ bit_field_ = KeyTypeField::update(bit_field_, type); |
+ } |
+ void set_store_mode(KeyedAccessStoreMode mode) { |
+ bit_field_ = StoreModeField::update(bit_field_, mode); |
+ } |
void set_type(Type* type) { type_ = type; } |
static int num_ids() { return parent_num_ids() + 3; } |
@@ -2158,21 +2194,25 @@ class CountOperation FINAL : public Expression { |
CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
int pos) |
: Expression(zone, pos), |
- op_(op), |
- is_prefix_(is_prefix), |
- key_type_(ELEMENT), |
- store_mode_(STANDARD_STORE), |
+ bit_field_(IsPrefixField::encode(is_prefix) | |
+ KeyTypeField::encode(ELEMENT) | |
+ StoreModeField::encode(STANDARD_STORE) | |
+ TokenField::encode(op)), |
+ type_(NULL), |
expression_(expr) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- Token::Value op_; |
- bool is_prefix_ : 1; |
- IcCheckType key_type_ : 1; |
- KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, |
- // must have extra bit. |
+ class IsPrefixField : public BitField16<bool, 0, 1> {}; |
+ class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; |
+ class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 4> {}; |
+ class TokenField : public BitField16<Token::Value, 6, 8> {}; |
+ |
+ // Starts with 16-bit field, which should get packed together with |
+ // Expression's trailing 16-bit field. |
+ uint16_t bit_field_; |
Type* type_; |
Expression* expression_; |
SmallMapList receiver_types_; |
@@ -2261,7 +2301,7 @@ class Assignment FINAL : public Expression { |
Token::Value binary_op() const; |
- Token::Value op() const { return op_; } |
+ Token::Value op() const { return TokenField::decode(bit_field_); } |
Expression* target() const { return target_; } |
Expression* value() const { return value_; } |
BinaryOperation* binary_operation() const { return binary_operation_; } |
@@ -2277,20 +2317,30 @@ class Assignment FINAL : public Expression { |
virtual bool IsMonomorphic() OVERRIDE { |
return receiver_types_.length() == 1; |
} |
- bool IsUninitialized() { return is_uninitialized_; } |
+ bool IsUninitialized() const { |
+ return IsUninitializedField::decode(bit_field_); |
+ } |
bool HasNoTypeInformation() { |
- return is_uninitialized_; |
+ return IsUninitializedField::decode(bit_field_); |
} |
virtual SmallMapList* GetReceiverTypes() OVERRIDE { |
return &receiver_types_; |
} |
- virtual IcCheckType GetKeyType() OVERRIDE { return key_type_; } |
- virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { |
- return store_mode_; |
+ virtual IcCheckType GetKeyType() const OVERRIDE { |
+ return KeyTypeField::decode(bit_field_); |
+ } |
+ virtual KeyedAccessStoreMode GetStoreMode() const OVERRIDE { |
+ return StoreModeField::decode(bit_field_); |
+ } |
+ void set_is_uninitialized(bool b) { |
+ bit_field_ = IsUninitializedField::update(bit_field_, b); |
+ } |
+ void set_key_type(IcCheckType key_type) { |
+ bit_field_ = KeyTypeField::update(bit_field_, key_type); |
+ } |
+ void set_store_mode(KeyedAccessStoreMode mode) { |
+ bit_field_ = StoreModeField::update(bit_field_, mode); |
} |
- void set_is_uninitialized(bool b) { is_uninitialized_ = b; } |
- void set_key_type(IcCheckType key_type) { key_type_ = key_type; } |
- void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } |
protected: |
Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, |
@@ -2299,7 +2349,7 @@ class Assignment FINAL : public Expression { |
template <class Visitor> |
void Init(AstNodeFactory<Visitor>* factory) { |
- DCHECK(Token::IsAssignmentOp(op_)); |
+ DCHECK(Token::IsAssignmentOp(op())); |
if (is_compound()) { |
binary_operation_ = factory->NewBinaryOperation( |
binary_op(), target_, value_, position() + 1); |
@@ -2309,11 +2359,14 @@ class Assignment FINAL : public Expression { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- bool is_uninitialized_ : 1; |
- IcCheckType key_type_ : 1; |
- KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, |
- // must have extra bit. |
- Token::Value op_; |
+ class IsUninitializedField : public BitField16<bool, 0, 1> {}; |
+ class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; |
+ class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 4> {}; |
+ class TokenField : public BitField16<Token::Value, 6, 8> {}; |
+ |
+ // Starts with 16-bit field, which should get packed together with |
+ // Expression's trailing 16-bit field. |
+ uint16_t bit_field_; |
Expression* target_; |
Expression* value_; |
BinaryOperation* binary_operation_; |