Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index b608e0a3ce2a443b863410aac07a1dfe4854d360..a5f83d50c9a9198ee329df3bd929ae0d879f0d73 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -229,6 +229,8 @@ class AstNode: public ZoneObject { |
int position_; |
NodeType node_type_; |
+ // Ends with NodeType which is uint8_t sized. Deriving classes in turn begin |
+ // sub-int32_t-sized fields for optimum packing efficiency. |
}; |
@@ -358,8 +360,8 @@ class Expression : public AstNode { |
protected: |
Expression(Zone* zone, int pos, NodeType type) |
: AstNode(pos, type), |
- base_id_(BailoutId::None().ToInt()), |
- bit_field_(0) {} |
+ bit_field_(0), |
+ base_id_(BailoutId::None().ToInt()) {} |
static int parent_num_ids() { return 0; } |
void set_to_boolean_types(uint16_t types) { |
bit_field_ = ToBooleanTypesField::update(bit_field_, types); |
@@ -373,11 +375,9 @@ class Expression : public AstNode { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ uint16_t bit_field_; |
int base_id_; |
class ToBooleanTypesField : public BitField16<uint16_t, 0, 9> {}; |
- uint16_t bit_field_; |
- // Ends with 16-bit field; deriving classes in turn begin with |
- // 16-bit fields for optimum packing efficiency. |
}; |
@@ -409,9 +409,9 @@ class BreakableStatement : public Statement { |
BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, |
BreakableType breakable_type, int position, NodeType type) |
: Statement(zone, position, type), |
- labels_(labels), |
breakable_type_(breakable_type), |
- base_id_(BailoutId::None().ToInt()) { |
+ base_id_(BailoutId::None().ToInt()), |
+ labels_(labels) { |
DCHECK(labels == NULL || labels->length() > 0); |
} |
static int parent_num_ids() { return 0; } |
@@ -424,10 +424,10 @@ class BreakableStatement : public Statement { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- ZoneList<const AstRawString*>* labels_; |
BreakableType breakable_type_; |
- Label break_target_; |
int base_id_; |
+ Label break_target_; |
+ ZoneList<const AstRawString*>* labels_; |
}; |
@@ -938,10 +938,10 @@ class WithStatement final : public Statement { |
WithStatement(Zone* zone, Scope* scope, Expression* expression, |
Statement* statement, int pos) |
: Statement(zone, pos, kWithStatement), |
+ base_id_(BailoutId::None().ToInt()), |
scope_(scope), |
expression_(expression), |
- statement_(statement), |
- base_id_(BailoutId::None().ToInt()) {} |
+ statement_(statement) {} |
static int parent_num_ids() { return 0; } |
int base_id() const { |
@@ -952,10 +952,10 @@ class WithStatement final : public Statement { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ int base_id_; |
Scope* scope_; |
Expression* expression_; |
Statement* statement_; |
- int base_id_; |
}; |
@@ -1056,10 +1056,10 @@ class IfStatement final : public Statement { |
IfStatement(Zone* zone, Expression* condition, Statement* then_statement, |
Statement* else_statement, int pos) |
: Statement(zone, pos, kIfStatement), |
+ base_id_(BailoutId::None().ToInt()), |
condition_(condition), |
then_statement_(then_statement), |
- else_statement_(else_statement), |
- base_id_(BailoutId::None().ToInt()) {} |
+ else_statement_(else_statement) {} |
static int parent_num_ids() { return 0; } |
int base_id() const { |
@@ -1070,10 +1070,10 @@ class IfStatement final : public Statement { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ int base_id_; |
Expression* condition_; |
Statement* then_statement_; |
Statement* else_statement_; |
- int base_id_; |
}; |
@@ -1098,12 +1098,12 @@ class TryStatement : public Statement { |
protected: |
TryStatement(Zone* zone, Block* try_block, int pos, NodeType type) |
: Statement(zone, pos, type), |
- try_block_(try_block), |
- catch_predicted_(false) {} |
+ catch_predicted_(false), |
+ try_block_(try_block) {} |
private: |
- Block* try_block_; |
bool catch_predicted_; |
+ Block* try_block_; |
}; |
@@ -1133,16 +1133,16 @@ class TryCatchStatement final : public TryStatement { |
Variable* variable, Block* catch_block, |
bool clear_pending_message, int pos) |
: TryStatement(zone, try_block, pos, kTryCatchStatement), |
+ clear_pending_message_(clear_pending_message), |
scope_(scope), |
variable_(variable), |
- catch_block_(catch_block), |
- clear_pending_message_(clear_pending_message) {} |
+ catch_block_(catch_block) {} |
private: |
+ bool clear_pending_message_; |
Scope* scope_; |
Variable* variable_; |
Block* catch_block_; |
- bool clear_pending_message_; |
}; |
@@ -1282,9 +1282,9 @@ class MaterializedLiteral : public Expression { |
protected: |
MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type) |
: Expression(zone, pos, type), |
- literal_index_(literal_index), |
is_simple_(false), |
- depth_(0) {} |
+ depth_(0), |
+ literal_index_(literal_index) {} |
// A materialized literal is simple if the values consist of only |
// constants and simple object and array literals. |
@@ -1293,7 +1293,7 @@ class MaterializedLiteral : public Expression { |
friend class CompileTimeValue; |
void set_depth(int depth) { |
- DCHECK(depth >= 1); |
+ DCHECK_LE(1, depth); |
depth_ = depth; |
} |
@@ -1310,9 +1310,9 @@ class MaterializedLiteral : public Expression { |
Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); |
private: |
+ bool is_simple_ : 1; |
+ int depth_ : 31; |
int literal_index_; |
- bool is_simple_; |
- int depth_; |
friend class AstLiteralReindexer; |
}; |
@@ -1323,12 +1323,13 @@ class MaterializedLiteral : public Expression { |
// to the code generator. |
class ObjectLiteralProperty final : public ZoneObject { |
public: |
- enum Kind { |
+ enum Kind : uint8_t { |
CONSTANT, // Property with constant value (compile time). |
COMPUTED, // Property with computed value (execution time). |
MATERIALIZED_LITERAL, // Property value is a materialized literal. |
- GETTER, SETTER, // Property is an accessor function. |
- PROTOTYPE // Property is __proto__. |
+ GETTER, |
+ SETTER, // Property is an accessor function. |
+ PROTOTYPE // Property is __proto__. |
}; |
Expression* key() { return key_; } |
@@ -1463,24 +1464,24 @@ class ObjectLiteral final : public MaterializedLiteral { |
protected: |
ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
- int boilerplate_properties, int pos) |
+ uint32_t boilerplate_properties, int pos) |
: MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), |
- properties_(properties), |
boilerplate_properties_(boilerplate_properties), |
fast_elements_(false), |
has_elements_(false), |
- may_store_doubles_(false) {} |
+ may_store_doubles_(false), |
+ properties_(properties) {} |
static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ uint32_t boilerplate_properties_ : 29; |
+ bool fast_elements_ : 1; |
+ bool has_elements_ : 1; |
+ bool may_store_doubles_ : 1; |
+ FeedbackVectorSlot slot_; |
Handle<FixedArray> constant_properties_; |
ZoneList<Property*>* properties_; |
- int boilerplate_properties_; |
- bool fast_elements_; |
- bool has_elements_; |
- bool may_store_doubles_; |
- FeedbackVectorSlot slot_; |
}; |
@@ -1518,14 +1519,14 @@ class RegExpLiteral final : public MaterializedLiteral { |
RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, |
int literal_index, int pos) |
: MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), |
- pattern_(pattern), |
- flags_(flags) { |
+ flags_(flags), |
+ pattern_(pattern) { |
set_depth(1); |
} |
private: |
- const AstRawString* const pattern_; |
int const flags_; |
+ const AstRawString* const pattern_; |
}; |
@@ -1592,17 +1593,17 @@ class ArrayLiteral final : public MaterializedLiteral { |
ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, |
int first_spread_index, int literal_index, int pos) |
: MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), |
- values_(values), |
- first_spread_index_(first_spread_index) {} |
+ first_spread_index_(first_spread_index), |
+ values_(values) {} |
static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- Handle<FixedArray> constant_elements_; |
- ZoneList<Expression*>* values_; |
int first_spread_index_; |
FeedbackVectorSlot literal_slot_; |
+ Handle<FixedArray> constant_elements_; |
+ ZoneList<Expression*>* values_; |
}; |
@@ -1683,15 +1684,15 @@ class VariableProxy final : public Expression { |
// Start with 16-bit (or smaller) field, which should get packed together |
// with Expression's trailing 16-bit field. |
uint8_t bit_field_; |
+ // Position is stored in the AstNode superclass, but VariableProxy needs to |
+ // know its end position too (for error messages). It cannot be inferred from |
+ // the variable name length because it can contain escapes. |
+ int end_position_; |
FeedbackVectorSlot variable_feedback_slot_; |
union { |
const AstRawString* raw_name_; // if !is_resolved_ |
Variable* var_; // if is_resolved_ |
}; |
- // Position is stored in the AstNode superclass, but VariableProxy needs to |
- // know its end position too (for error messages). It cannot be inferred from |
- // the variable name length because it can contain escapes. |
- int end_position_; |
}; |
@@ -1898,9 +1899,9 @@ class Call final : public Expression { |
Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
int pos) |
: Expression(zone, pos, kCall), |
+ bit_field_(IsUninitializedField::encode(false)), |
expression_(expression), |
- arguments_(arguments), |
- bit_field_(IsUninitializedField::encode(false)) { |
+ arguments_(arguments) { |
if (expression->IsProperty()) { |
expression->AsProperty()->mark_for_call(); |
} |
@@ -1910,15 +1911,15 @@ class Call final : public Expression { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ class IsUninitializedField : public BitField8<bool, 0, 1> {}; |
+ class IsTailField : public BitField8<bool, 1, 1> {}; |
+ uint8_t bit_field_; |
FeedbackVectorSlot ic_slot_; |
FeedbackVectorSlot stub_slot_; |
Expression* expression_; |
ZoneList<Expression*>* arguments_; |
Handle<JSFunction> target_; |
Handle<AllocationSite> allocation_site_; |
- class IsUninitializedField : public BitField8<bool, 0, 1> {}; |
- class IsTailField : public BitField8<bool, 1, 1> {}; |
- uint8_t bit_field_; |
}; |
@@ -1969,21 +1970,21 @@ class CallNew final : public Expression { |
CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
int pos) |
: Expression(zone, pos, kCallNew), |
+ is_monomorphic_(false), |
expression_(expression), |
- arguments_(arguments), |
- is_monomorphic_(false) {} |
+ arguments_(arguments) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ bool is_monomorphic_; |
+ FeedbackVectorSlot callnew_feedback_slot_; |
Expression* expression_; |
ZoneList<Expression*>* arguments_; |
- bool is_monomorphic_; |
Handle<JSFunction> target_; |
Handle<AllocationSite> allocation_site_; |
- FeedbackVectorSlot callnew_feedback_slot_; |
}; |
@@ -2024,8 +2025,8 @@ class CallRuntime final : public Expression { |
CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, |
int pos) |
: Expression(zone, pos, kCallRuntime), |
- function_(NULL), |
context_index_(context_index), |
+ function_(NULL), |
arguments_(arguments) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
@@ -2033,8 +2034,8 @@ class CallRuntime final : public Expression { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- const Runtime::Function* function_; |
int context_index_; |
+ const Runtime::Function* function_; |
ZoneList<Expression*>* arguments_; |
}; |
@@ -2208,10 +2209,10 @@ class CountOperation final : public Expression { |
// Starts with 16-bit field, which should get packed together with |
// Expression's trailing 16-bit field. |
uint16_t bit_field_; |
+ FeedbackVectorSlot slot_; |
Type* type_; |
Expression* expression_; |
SmallMapList receiver_types_; |
- FeedbackVectorSlot slot_; |
}; |
@@ -2276,15 +2277,15 @@ class Spread final : public Expression { |
protected: |
Spread(Zone* zone, Expression* expression, int pos, int expr_pos) |
: Expression(zone, pos, kSpread), |
- expression_(expression), |
- expr_pos_(expr_pos) {} |
+ expr_pos_(expr_pos), |
+ expression_(expression) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- Expression* expression_; |
int expr_pos_; |
+ Expression* expression_; |
}; |
@@ -2397,11 +2398,11 @@ class Assignment final : public Expression { |
// Starts with 16-bit field, which should get packed together with |
// Expression's trailing 16-bit field. |
uint16_t bit_field_; |
+ FeedbackVectorSlot slot_; |
Expression* target_; |
Expression* value_; |
BinaryOperation* binary_operation_; |
SmallMapList receiver_types_; |
- FeedbackVectorSlot slot_; |
}; |
@@ -2476,16 +2477,16 @@ class Yield final : public Expression { |
Yield(Zone* zone, Expression* generator_object, Expression* expression, |
int pos, OnException on_exception) |
: Expression(zone, pos, kYield), |
- generator_object_(generator_object), |
- expression_(expression), |
on_exception_(on_exception), |
- yield_id_(-1) {} |
+ yield_id_(-1), |
+ generator_object_(generator_object), |
+ expression_(expression) {} |
private: |
- Expression* generator_object_; |
- Expression* expression_; |
OnException on_exception_; |
int yield_id_; |
+ Expression* generator_object_; |
+ Expression* expression_; |
}; |
@@ -2648,17 +2649,17 @@ class FunctionLiteral final : public Expression { |
EagerCompileHint eager_compile_hint, FunctionKind kind, |
int position, bool is_function) |
: Expression(zone, position, kFunctionLiteral), |
- raw_name_(name), |
- scope_(scope), |
- body_(body), |
- raw_inferred_name_(ast_value_factory->empty_string()), |
- ast_properties_(zone), |
dont_optimize_reason_(kNoReason), |
materialized_literal_count_(materialized_literal_count), |
expected_property_count_(expected_property_count), |
parameter_count_(parameter_count), |
function_token_position_(kNoSourcePosition), |
- yield_count_(0) { |
+ yield_count_(0), |
+ raw_name_(name), |
+ scope_(scope), |
+ body_(body), |
+ raw_inferred_name_(ast_value_factory->empty_string()), |
+ ast_properties_(zone) { |
bitfield_ = |
FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | |
HasDuplicateParameters::encode(has_duplicate_parameters == |
@@ -2682,12 +2683,6 @@ class FunctionLiteral final : public Expression { |
// with Expression's trailing 16-bit field. |
uint16_t bitfield_; |
- const AstString* raw_name_; |
- Scope* scope_; |
- ZoneList<Statement*>* body_; |
- const AstString* raw_inferred_name_; |
- Handle<String> inferred_name_; |
- AstProperties ast_properties_; |
BailoutReason dont_optimize_reason_; |
int materialized_literal_count_; |
@@ -2695,6 +2690,13 @@ class FunctionLiteral final : public Expression { |
int parameter_count_; |
int function_token_position_; |
int yield_count_; |
+ |
+ const AstString* raw_name_; |
+ Scope* scope_; |
+ ZoneList<Statement*>* body_; |
+ const AstString* raw_inferred_name_; |
+ Handle<String> inferred_name_; |
+ AstProperties ast_properties_; |
}; |
@@ -2750,26 +2752,26 @@ class ClassLiteral final : public Expression { |
ZoneList<Property*>* properties, int start_position, |
int end_position) |
: Expression(zone, start_position, kClassLiteral), |
+ end_position_(end_position), |
scope_(scope), |
class_variable_proxy_(class_variable_proxy), |
extends_(extends), |
constructor_(constructor), |
- properties_(properties), |
- end_position_(end_position) {} |
+ properties_(properties) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ int end_position_; |
+ FeedbackVectorSlot prototype_slot_; |
+ FeedbackVectorSlot proxy_slot_; |
Scope* scope_; |
VariableProxy* class_variable_proxy_; |
Expression* extends_; |
FunctionLiteral* constructor_; |
ZoneList<Property*>* properties_; |
- int end_position_; |
- FeedbackVectorSlot prototype_slot_; |
- FeedbackVectorSlot proxy_slot_; |
}; |
@@ -3232,10 +3234,8 @@ class AstNodeFactory final BASE_EMBEDDED { |
} |
ObjectLiteral* NewObjectLiteral( |
- ZoneList<ObjectLiteral::Property*>* properties, |
- int literal_index, |
- int boilerplate_properties, |
- int pos) { |
+ ZoneList<ObjectLiteral::Property*>* properties, int literal_index, |
+ uint32_t boilerplate_properties, int pos) { |
return new (local_zone_) ObjectLiteral( |
local_zone_, properties, literal_index, boilerplate_properties, pos); |
} |