| 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);
|
| }
|
|
|