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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« 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