Chromium Code Reviews| Index: src/ast.h |
| diff --git a/src/ast.h b/src/ast.h |
| index c5a924c43d914f10246f7b8513a0cb0417dfae01..fe2a68ee2808de20c9b017eb849db245a369ab49 100644 |
| --- a/src/ast.h |
| +++ b/src/ast.h |
| @@ -375,15 +375,15 @@ class Expression : public AstNode { |
| byte to_boolean_types() const { return to_boolean_types_; } |
| BailoutId id() const { return id_; } |
| - TypeFeedbackId test_id() const { return test_id_; } |
| + TypeFeedbackId test_id() const { return TypeFeedbackId(id_.ToInt() + 1); } |
| protected: |
| Expression(Zone* zone, int pos, IdGen* id_gen) |
| : AstNode(pos), |
| bounds_(Bounds::Unbounded(zone)), |
| parenthesization_level_(0), |
| - id_(id_gen->GetNextId()), |
| - test_id_(id_gen->GetNextId()) {} |
| + id_(id_gen->ReserveIdRange(2)) {} // Reserve id and test id |
| + |
| void set_to_boolean_types(byte types) { to_boolean_types_ = types; } |
| private: |
| @@ -392,7 +392,6 @@ class Expression : public AstNode { |
| unsigned parenthesization_level_; |
| const BailoutId id_; |
| - const TypeFeedbackId test_id_; |
| }; |
| @@ -421,7 +420,7 @@ class BreakableStatement : public Statement { |
| } |
| BailoutId EntryId() const { return entry_id_; } |
| - BailoutId ExitId() const { return exit_id_; } |
| + BailoutId ExitId() const { return BailoutId(entry_id_.ToInt() + 1); } |
| protected: |
| BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, |
| @@ -429,8 +428,7 @@ class BreakableStatement : public Statement { |
| : Statement(zone, position), |
| labels_(labels), |
| breakable_type_(breakable_type), |
| - entry_id_(id_gen->GetNextId()), |
| - exit_id_(id_gen->GetNextId()) { |
| + entry_id_(id_gen->ReserveIdRange(2)) { // Reserve entry and exit ids |
| DCHECK(labels == NULL || labels->length() > 0); |
| } |
| @@ -440,7 +438,6 @@ class BreakableStatement : public Statement { |
| BreakableType breakable_type_; |
| Label break_target_; |
| const BailoutId entry_id_; |
| - const BailoutId exit_id_; |
| }; |
| @@ -455,7 +452,7 @@ class Block FINAL : public BreakableStatement { |
| ZoneList<Statement*>* statements() { return &statements_; } |
| bool is_initializer_block() const { return is_initializer_block_; } |
| - BailoutId DeclsId() const { return decls_id_; } |
| + BailoutId DeclsId() const { return BailoutId(EntryId().ToInt() + 2); } |
|
marja
2014/09/12 12:51:55
This looks a bit fragile... now if somebody adds a
oetuaho-nv
2014/09/12 13:26:29
Yep, the thought crossed my mind that there might
|
| virtual bool IsJump() const OVERRIDE { |
| return !statements_.is_empty() && statements_.last()->IsJump() |
| @@ -471,13 +468,17 @@ class Block FINAL : public BreakableStatement { |
| : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, id_gen), |
| statements_(capacity, zone), |
| is_initializer_block_(is_initializer_block), |
| - decls_id_(id_gen->GetNextId()), |
| - scope_(NULL) {} |
| + scope_(NULL) { |
| +#ifdef DEBUG |
| + int decls_id = |
| +#endif |
| + id_gen->GetNextId(); // Reserve decls id |
| + DCHECK(decls_id == EntryId().ToInt() + 2); |
| + } |
| private: |
| ZoneList<Statement*> statements_; |
| bool is_initializer_block_; |
| - const BailoutId decls_id_; |
| Scope* scope_; |
| }; |
| @@ -729,7 +730,7 @@ class IterationStatement : public BreakableStatement { |
| Statement* body() const { return body_; } |
| - BailoutId OsrEntryId() const { return osr_entry_id_; } |
| + BailoutId OsrEntryId() const { return BailoutId(EntryId().ToInt() + 2); } |
| virtual BailoutId ContinueId() const = 0; |
| virtual BailoutId StackCheckId() const = 0; |
| @@ -740,8 +741,13 @@ class IterationStatement : public BreakableStatement { |
| IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| IdGen* id_gen) |
| : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen), |
| - body_(NULL), |
| - osr_entry_id_(id_gen->GetNextId()) {} |
| + body_(NULL) { |
| +#ifdef DEBUG |
| + int id = |
| +#endif |
| + id_gen->GetNextId(); // Reserve osr entry id |
| + DCHECK(id == EntryId().ToInt() + 2); |
| + } |
| void Initialize(Statement* body) { |
| body_ = body; |
| @@ -750,8 +756,6 @@ class IterationStatement : public BreakableStatement { |
| private: |
| Statement* body_; |
| Label continue_target_; |
| - |
| - const BailoutId osr_entry_id_; |
| }; |
| @@ -766,23 +770,29 @@ class DoWhileStatement FINAL : public IterationStatement { |
| Expression* cond() const { return cond_; } |
| - virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; } |
| - virtual BailoutId StackCheckId() const OVERRIDE { return back_edge_id_; } |
| - BailoutId BackEdgeId() const { return back_edge_id_; } |
| + virtual BailoutId ContinueId() const OVERRIDE { |
| + return BailoutId(EntryId().ToInt() + 3); |
| + } |
| + virtual BailoutId StackCheckId() const OVERRIDE { |
| + return BailoutId(EntryId().ToInt() + 4); |
| + } |
| + BailoutId BackEdgeId() const { return BailoutId(EntryId().ToInt() + 4); } |
| protected: |
| DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| IdGen* id_gen) |
| : IterationStatement(zone, labels, pos, id_gen), |
| - cond_(NULL), |
| - continue_id_(id_gen->GetNextId()), |
| - back_edge_id_(id_gen->GetNextId()) {} |
| + cond_(NULL) { |
| + // reserve continue and back edge ids |
| +#ifdef DEBUG |
| + int continue_id = |
| +#endif |
| + id_gen->ReserveIdRange(2); |
| + DCHECK(continue_id == EntryId().ToInt() + 3); |
| + } |
| private: |
| Expression* cond_; |
| - |
| - const BailoutId continue_id_; |
| - const BailoutId back_edge_id_; |
| }; |
| @@ -804,24 +814,29 @@ class WhileStatement FINAL : public IterationStatement { |
| } |
| virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } |
| - virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } |
| - BailoutId BodyId() const { return body_id_; } |
| + virtual BailoutId StackCheckId() const OVERRIDE { |
| + return BailoutId(EntryId().ToInt() + 3); |
| + } |
| + BailoutId BodyId() const { return BailoutId(EntryId().ToInt() + 3); } |
| protected: |
| WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| IdGen* id_gen) |
| : IterationStatement(zone, labels, pos, id_gen), |
| cond_(NULL), |
| - may_have_function_literal_(true), |
| - body_id_(id_gen->GetNextId()) {} |
| + may_have_function_literal_(true) { |
| +#ifdef DEBUG |
| + int body_id = |
| +#endif |
| + id_gen->GetNextId(); // Reserve body id |
| + DCHECK(body_id == EntryId().ToInt() + 3); |
| + } |
| private: |
| Expression* cond_; |
| // True if there is a function literal subexpression in the condition. |
| bool may_have_function_literal_; |
| - |
| - const BailoutId body_id_; |
| }; |
| @@ -850,9 +865,13 @@ class ForStatement FINAL : public IterationStatement { |
| may_have_function_literal_ = value; |
| } |
| - virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; } |
| - virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } |
| - BailoutId BodyId() const { return body_id_; } |
| + virtual BailoutId ContinueId() const OVERRIDE { |
| + return BailoutId(EntryId().ToInt() + 3); |
| + } |
| + virtual BailoutId StackCheckId() const OVERRIDE { |
| + return BailoutId(EntryId().ToInt() + 4); |
| + } |
| + BailoutId BodyId() const { return BailoutId(EntryId().ToInt() + 4); } |
| bool is_fast_smi_loop() { return loop_variable_ != NULL; } |
| Variable* loop_variable() { return loop_variable_; } |
| @@ -866,9 +885,13 @@ class ForStatement FINAL : public IterationStatement { |
| cond_(NULL), |
| next_(NULL), |
| may_have_function_literal_(true), |
| - loop_variable_(NULL), |
| - continue_id_(id_gen->GetNextId()), |
| - body_id_(id_gen->GetNextId()) {} |
| + loop_variable_(NULL) { |
| +#ifdef DEBUG |
| + int continue_id = |
| +#endif |
| + id_gen->ReserveIdRange(2); // Reserve continue and body ids |
| + DCHECK(continue_id == EntryId().ToInt() + 3); |
| + } |
| private: |
| Statement* init_; |
| @@ -878,9 +901,6 @@ class ForStatement FINAL : public IterationStatement { |
| // True if there is a function literal subexpression in the condition. |
| bool may_have_function_literal_; |
| Variable* loop_variable_; |
| - |
| - const BailoutId continue_id_; |
| - const BailoutId body_id_; |
| }; |
| @@ -935,24 +955,26 @@ class ForInStatement FINAL : public ForEachStatement, |
| ForInType for_in_type() const { return for_in_type_; } |
| void set_for_in_type(ForInType type) { for_in_type_ = type; } |
| - BailoutId BodyId() const { return body_id_; } |
| - BailoutId PrepareId() const { return prepare_id_; } |
| + BailoutId BodyId() const { return BailoutId(EntryId().ToInt() + 3); } |
| + BailoutId PrepareId() const { return BailoutId(EntryId().ToInt() + 4); } |
| virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } |
| - virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } |
| + virtual BailoutId StackCheckId() const OVERRIDE { return BodyId(); } |
| protected: |
| ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| IdGen* id_gen) |
| : ForEachStatement(zone, labels, pos, id_gen), |
| for_in_type_(SLOW_FOR_IN), |
| - for_in_feedback_slot_(kInvalidFeedbackSlot), |
| - body_id_(id_gen->GetNextId()), |
| - prepare_id_(id_gen->GetNextId()) {} |
| + for_in_feedback_slot_(kInvalidFeedbackSlot) { |
| +#ifdef DEBUG |
| + int body_id = |
| +#endif |
| + id_gen->ReserveIdRange(2); // reserve body and prepare ids |
| + DCHECK(body_id == EntryId().ToInt() + 3); |
| + } |
| ForInType for_in_type_; |
| int for_in_feedback_slot_; |
| - const BailoutId body_id_; |
| - const BailoutId prepare_id_; |
| }; |
| @@ -1001,7 +1023,7 @@ class ForOfStatement FINAL : public ForEachStatement { |
| virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } |
| virtual BailoutId StackCheckId() const OVERRIDE { return BackEdgeId(); } |
| - BailoutId BackEdgeId() const { return back_edge_id_; } |
| + BailoutId BackEdgeId() const { return BailoutId(EntryId().ToInt() + 3); } |
| protected: |
| ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
| @@ -1010,14 +1032,18 @@ class ForOfStatement FINAL : public ForEachStatement { |
| assign_iterator_(NULL), |
| next_result_(NULL), |
| result_done_(NULL), |
| - assign_each_(NULL), |
| - back_edge_id_(id_gen->GetNextId()) {} |
| + assign_each_(NULL) { |
| +#ifdef DEBUG |
| + int back_edge_id = |
| +#endif |
| + id_gen->GetNextId(); // reserve back edge id |
| + DCHECK(back_edge_id == EntryId().ToInt() + 3); |
| + } |
| Expression* assign_iterator_; |
| Expression* next_result_; |
| Expression* result_done_; |
| Expression* assign_each_; |
| - const BailoutId back_edge_id_; |
| }; |
| @@ -1128,10 +1154,10 @@ class CaseClause FINAL : public Expression { |
| Label* body_target() { return &body_target_; } |
| ZoneList<Statement*>* statements() const { return statements_; } |
| - BailoutId EntryId() const { return entry_id_; } |
| + BailoutId EntryId() const { return BailoutId(id().ToInt() + 3); } |
| // Type feedback information. |
| - TypeFeedbackId CompareId() { return compare_id_; } |
| + TypeFeedbackId CompareId() { return TypeFeedbackId(id().ToInt() + 2); } |
| Type* compare_type() { return compare_type_; } |
| void set_compare_type(Type* type) { compare_type_ = type; } |
| @@ -1143,9 +1169,6 @@ class CaseClause FINAL : public Expression { |
| Label body_target_; |
| ZoneList<Statement*>* statements_; |
| Type* compare_type_; |
| - |
| - const TypeFeedbackId compare_id_; |
| - const BailoutId entry_id_; |
| }; |
| @@ -1196,8 +1219,8 @@ class IfStatement FINAL : public Statement { |
| } |
| BailoutId IfId() const { return if_id_; } |
| - BailoutId ThenId() const { return then_id_; } |
| - BailoutId ElseId() const { return else_id_; } |
| + BailoutId ThenId() const { return BailoutId(if_id_.ToInt() + 1); } |
| + BailoutId ElseId() const { return BailoutId(if_id_.ToInt() + 2); } |
| protected: |
| IfStatement(Zone* zone, Expression* condition, Statement* then_statement, |
| @@ -1206,17 +1229,13 @@ class IfStatement FINAL : public Statement { |
| condition_(condition), |
| then_statement_(then_statement), |
| else_statement_(else_statement), |
| - if_id_(id_gen->GetNextId()), |
| - then_id_(id_gen->GetNextId()), |
| - else_id_(id_gen->GetNextId()) {} |
| + if_id_(id_gen->ReserveIdRange(3)) {} // Reserve if, then, else ids |
| private: |
| Expression* condition_; |
| Statement* then_statement_; |
| Statement* else_statement_; |
| const BailoutId if_id_; |
| - const BailoutId then_id_; |
| - const BailoutId else_id_; |
| }; |
| @@ -1791,7 +1810,7 @@ class Call FINAL : public Expression, public FeedbackSlotInterface { |
| } |
| bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupIterator* it); |
| - BailoutId ReturnId() const { return return_id_; } |
| + BailoutId ReturnId() const { return BailoutId(id().ToInt() + 2); } |
| enum CallType { |
| POSSIBLY_EVAL_CALL, |
| @@ -1816,8 +1835,12 @@ class Call FINAL : public Expression, public FeedbackSlotInterface { |
| : Expression(zone, pos, id_gen), |
| expression_(expression), |
| arguments_(arguments), |
| - call_feedback_slot_(kInvalidFeedbackSlot), |
| - return_id_(id_gen->GetNextId()) { |
| + call_feedback_slot_(kInvalidFeedbackSlot) { |
| +#ifdef DEBUG |
| + int return_id = |
| +#endif |
| + id_gen->GetNextId(); // Reserve return id |
| + DCHECK(return_id == id().ToInt() + 2); |
| if (expression->IsProperty()) { |
| expression->AsProperty()->mark_for_call(); |
| } |
| @@ -1831,8 +1854,6 @@ class Call FINAL : public Expression, public FeedbackSlotInterface { |
| Handle<Cell> cell_; |
| Handle<AllocationSite> allocation_site_; |
| int call_feedback_slot_; |
| - |
| - const BailoutId return_id_; |
| }; |
| @@ -1952,8 +1973,10 @@ class UnaryOperation FINAL : public Expression { |
| Token::Value op() const { return op_; } |
| Expression* expression() const { return expression_; } |
| - BailoutId MaterializeTrueId() { return materialize_true_id_; } |
| - BailoutId MaterializeFalseId() { return materialize_false_id_; } |
| + // For unary not (Token::NOT), the AST ids where true and false will |
| + // actually be materialized, respectively. |
| + BailoutId MaterializeTrueId() { return BailoutId(id().ToInt() + 2); } |
| + BailoutId MaterializeFalseId() { return BailoutId(id().ToInt() + 3); } |
| virtual void RecordToBooleanTypeFeedback( |
| TypeFeedbackOracle* oracle) OVERRIDE; |
| @@ -1963,20 +1986,19 @@ class UnaryOperation FINAL : public Expression { |
| IdGen* id_gen) |
| : Expression(zone, pos, id_gen), |
| op_(op), |
| - expression_(expression), |
| - materialize_true_id_(id_gen->GetNextId()), |
| - materialize_false_id_(id_gen->GetNextId()) { |
| + expression_(expression) { |
| + // Reserve materialize true and false ids |
| +#ifdef DEBUG |
| + int materialize_true_id = |
| +#endif |
| + id_gen->ReserveIdRange(2); |
| + DCHECK(materialize_true_id == id().ToInt() + 2); |
| DCHECK(Token::IsUnaryOp(op)); |
| } |
| private: |
| Token::Value op_; |
| Expression* expression_; |
| - |
| - // For unary not (Token::NOT), the AST ids where true and false will |
| - // actually be materialized, respectively. |
| - const BailoutId materialize_true_id_; |
| - const BailoutId materialize_false_id_; |
| }; |
| @@ -1994,7 +2016,9 @@ class BinaryOperation FINAL : public Expression { |
| allocation_site_ = allocation_site; |
| } |
| - BailoutId RightId() const { return right_id_; } |
| + // The short-circuit logical operations need an AST ID for their |
| + // right-hand subexpression. |
| + BailoutId RightId() const { return BailoutId(id().ToInt() + 2); } |
| TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } |
| Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } |
| @@ -2009,8 +2033,12 @@ class BinaryOperation FINAL : public Expression { |
| : Expression(zone, pos, id_gen), |
| op_(op), |
| left_(left), |
| - right_(right), |
| - right_id_(id_gen->GetNextId()) { |
| + right_(right) { |
| +#ifdef DEBUG |
| + int right_id = |
| +#endif |
| + id_gen->GetNextId(); // Reserve right id |
| + DCHECK(right_id == id().ToInt() + 2); |
| DCHECK(Token::IsBinaryOp(op)); |
| } |
| @@ -2023,10 +2051,6 @@ class BinaryOperation FINAL : public Expression { |
| // TODO(rossberg): the fixed arg should probably be represented as a Constant |
| // type for the RHS. |
| Maybe<int> fixed_right_arg_; |
| - |
| - // The short-circuit logical operations need an AST ID for their |
| - // right-hand subexpression. |
| - const BailoutId right_id_; |
| }; |
| @@ -2057,9 +2081,11 @@ class CountOperation FINAL : public Expression { |
| void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } |
| void set_type(Type* type) { type_ = type; } |
| - BailoutId AssignmentId() const { return assignment_id_; } |
| + BailoutId AssignmentId() const { return BailoutId(id().ToInt() + 2); } |
| - TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } |
| + TypeFeedbackId CountBinOpFeedbackId() const { |
| + return TypeFeedbackId(id().ToInt() + 3); |
| + } |
| TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } |
| protected: |
| @@ -2069,9 +2095,14 @@ class CountOperation FINAL : public Expression { |
| op_(op), |
| is_prefix_(is_prefix), |
| store_mode_(STANDARD_STORE), |
| - expression_(expr), |
| - assignment_id_(id_gen->GetNextId()), |
| - count_id_(id_gen->GetNextId()) {} |
| + expression_(expr) { |
| + // Reserve assignment and count ids |
| +#ifdef DEBUG |
| + int assignment_id = |
| +#endif |
| + id_gen->ReserveIdRange(2); |
| + DCHECK(assignment_id == id().ToInt() + 2); |
| + } |
| private: |
| Token::Value op_; |
| @@ -2081,8 +2112,6 @@ class CountOperation FINAL : public Expression { |
| Type* type_; |
| Expression* expression_; |
| - const BailoutId assignment_id_; |
| - const TypeFeedbackId count_id_; |
| SmallMapList receiver_types_; |
| }; |
| @@ -2133,8 +2162,8 @@ class Conditional FINAL : public Expression { |
| Expression* then_expression() const { return then_expression_; } |
| Expression* else_expression() const { return else_expression_; } |
| - BailoutId ThenId() const { return then_id_; } |
| - BailoutId ElseId() const { return else_id_; } |
| + BailoutId ThenId() const { return BailoutId(id().ToInt() + 2); } |
| + BailoutId ElseId() const { return BailoutId(id().ToInt() + 3); } |
| protected: |
| Conditional(Zone* zone, Expression* condition, Expression* then_expression, |
| @@ -2142,16 +2171,18 @@ class Conditional FINAL : public Expression { |
| : Expression(zone, position, id_gen), |
| condition_(condition), |
| then_expression_(then_expression), |
| - else_expression_(else_expression), |
| - then_id_(id_gen->GetNextId()), |
| - else_id_(id_gen->GetNextId()) {} |
| + else_expression_(else_expression) { |
| +#ifdef DEBUG |
| + int then_id = |
| +#endif |
| + id_gen->ReserveIdRange(2); // Reserve then and else ids |
| + DCHECK(then_id == id().ToInt() + 2); |
| + } |
| private: |
| Expression* condition_; |
| Expression* then_expression_; |
| Expression* else_expression_; |
| - const BailoutId then_id_; |
| - const BailoutId else_id_; |
| }; |
| @@ -2171,7 +2202,7 @@ class Assignment FINAL : public Expression { |
| // This check relies on the definition order of token in token.h. |
| bool is_compound() const { return op() > Token::ASSIGN; } |
| - BailoutId AssignmentId() const { return assignment_id_; } |
| + BailoutId AssignmentId() const { return BailoutId(id().ToInt() + 2); } |
| // Type feedback information. |
| TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } |
| @@ -2209,7 +2240,6 @@ class Assignment FINAL : public Expression { |
| Expression* target_; |
| Expression* value_; |
| BinaryOperation* binary_operation_; |
| - const BailoutId assignment_id_; |
| bool is_uninitialized_ : 1; |
| KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, |