Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index c5a924c43d914f10246f7b8513a0cb0417dfae01..36b1e8a8ab007f4164f8b41e15a134fc8eaae381 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -149,6 +149,22 @@ typedef ZoneList<Handle<Object> > ZoneObjectList; |
} \ |
template<class> friend class AstNodeFactory; |
+#define RESERVE_ID_RANGE() \ |
+ id_gen->ReserveIdRange(kClassIdRange) |
+ |
+#define NEXT_ID(SUPER) \ |
+ this->SUPER::NextId() |
+ |
+#define NEXT_ID_FUNC(ID) \ |
+ int NextId() const { \ |
+ return ID.ToInt() + kClassIdRange; \ |
+ } |
+ |
+#define NEXT_ID_FUNC_BASE(SUPER) \ |
+ int NextId() const { \ |
+ return this->SUPER::NextId() + kClassIdRange; \ |
+ } |
+ |
enum AstPropertiesFlag { |
kDontSelfOptimize, |
@@ -186,7 +202,6 @@ class AstNode: public ZoneObject { |
public: |
explicit IdGen(int id = 0) : id_(id) {} |
- int GetNextId() { return ReserveIdRange(1); } |
int ReserveIdRange(int n) { |
int tmp = id_; |
id_ += n; |
@@ -375,24 +390,26 @@ 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_(RESERVE_ID_RANGE()) {} |
+ |
void set_to_boolean_types(byte types) { to_boolean_types_ = types; } |
+ NEXT_ID_FUNC(id_); |
+ |
private: |
Bounds bounds_; |
byte to_boolean_types_; |
unsigned parenthesization_level_; |
const BailoutId id_; |
- const TypeFeedbackId test_id_; |
+ static const int kClassIdRange = 2; // id and test id |
}; |
@@ -421,7 +438,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,18 +446,19 @@ 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_(RESERVE_ID_RANGE()) { |
DCHECK(labels == NULL || labels->length() > 0); |
} |
+ NEXT_ID_FUNC(entry_id_); |
private: |
ZoneList<const AstRawString*>* labels_; |
BreakableType breakable_type_; |
Label break_target_; |
+ |
const BailoutId entry_id_; |
- const BailoutId exit_id_; |
+ static const int kClassIdRange = 2; // Entry and exit ids |
}; |
@@ -455,7 +473,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(NEXT_ID(BreakableStatement)); } |
virtual bool IsJump() const OVERRIDE { |
return !statements_.is_empty() && statements_.last()->IsJump() |
@@ -471,14 +489,22 @@ 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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(decls_id == DeclsId().ToInt()); |
+ } |
+ |
+ NEXT_ID_FUNC_BASE(BreakableStatement) |
private: |
ZoneList<Statement*> statements_; |
bool is_initializer_block_; |
- const BailoutId decls_id_; |
Scope* scope_; |
+ |
+ static const int kClassIdRange = 1; // decls id |
}; |
@@ -729,7 +755,9 @@ class IterationStatement : public BreakableStatement { |
Statement* body() const { return body_; } |
- BailoutId OsrEntryId() const { return osr_entry_id_; } |
+ BailoutId OsrEntryId() const { |
+ return BailoutId(NEXT_ID(BreakableStatement)); |
+ } |
virtual BailoutId ContinueId() const = 0; |
virtual BailoutId StackCheckId() const = 0; |
@@ -740,18 +768,25 @@ 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 osr_entry_id = |
+#endif |
+ RESERVE_ID_RANGE(); |
+ DCHECK(osr_entry_id == OsrEntryId().ToInt()); |
+ } |
void Initialize(Statement* body) { |
body_ = body; |
} |
+ NEXT_ID_FUNC_BASE(BreakableStatement); |
+ |
private: |
Statement* body_; |
Label continue_target_; |
- const BailoutId osr_entry_id_; |
+ static const int kClassIdRange = 1; // Osr entry id |
}; |
@@ -766,23 +801,32 @@ 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(NEXT_ID(IterationStatement)); |
+ } |
+ virtual BailoutId StackCheckId() const OVERRIDE { |
+ return BailoutId(NEXT_ID(IterationStatement) + 1); |
+ } |
+ BailoutId BackEdgeId() const { |
+ return BailoutId(NEXT_ID(IterationStatement) + 1); |
+ } |
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) { |
+#ifdef DEBUG |
+ int continue_id = |
+#endif |
+ RESERVE_ID_RANGE(); |
+ DCHECK(continue_id == ContinueId().ToInt()); |
+ } |
private: |
Expression* cond_; |
- const BailoutId continue_id_; |
- const BailoutId back_edge_id_; |
+ static const int kClassIdRange = 2; // Continue and back edge ids |
}; |
@@ -804,16 +848,23 @@ 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(NEXT_ID(IterationStatement)); |
+ } |
+ BailoutId BodyId() const { return BailoutId(NEXT_ID(IterationStatement)); } |
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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(body_id == BodyId().ToInt()); |
+ } |
private: |
Expression* cond_; |
@@ -821,7 +872,7 @@ class WhileStatement FINAL : public IterationStatement { |
// True if there is a function literal subexpression in the condition. |
bool may_have_function_literal_; |
- const BailoutId body_id_; |
+ static const int kClassIdRange = 1; // Body id |
}; |
@@ -850,9 +901,15 @@ 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(NEXT_ID(IterationStatement)); |
+ } |
+ virtual BailoutId StackCheckId() const OVERRIDE { |
+ return BailoutId(NEXT_ID(IterationStatement) + 1); |
+ } |
+ BailoutId BodyId() const { |
+ return BailoutId(NEXT_ID(IterationStatement) + 1); |
+ } |
bool is_fast_smi_loop() { return loop_variable_ != NULL; } |
Variable* loop_variable() { return loop_variable_; } |
@@ -866,9 +923,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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(continue_id == ContinueId().ToInt()); |
+ } |
private: |
Statement* init_; |
@@ -879,8 +940,7 @@ class ForStatement FINAL : public IterationStatement { |
bool may_have_function_literal_; |
Variable* loop_variable_; |
- const BailoutId continue_id_; |
- const BailoutId body_id_; |
+ static const int kClassIdRange = 2; // Continue and body ids |
}; |
@@ -907,9 +967,13 @@ class ForEachStatement : public IterationStatement { |
each_(NULL), |
subject_(NULL) {} |
+ NEXT_ID_FUNC_BASE(IterationStatement) |
+ |
private: |
Expression* each_; |
Expression* subject_; |
+ |
+ static const int kClassIdRange = 0; // No ids |
}; |
@@ -935,24 +999,31 @@ 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(NEXT_ID(ForEachStatement)); } |
+ BailoutId PrepareId() const { |
+ return BailoutId(NEXT_ID(ForEachStatement) + 1); |
+ } |
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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(body_id == BodyId().ToInt()); |
+ } |
ForInType for_in_type_; |
int for_in_feedback_slot_; |
- const BailoutId body_id_; |
- const BailoutId prepare_id_; |
+ |
+ private: |
+ static const int kClassIdRange = 2; // Body and prepare ids |
}; |
@@ -1001,7 +1072,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(NEXT_ID(ForEachStatement)); } |
protected: |
ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
@@ -1010,14 +1081,21 @@ 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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(back_edge_id == BackEdgeId().ToInt()); |
+ } |
Expression* assign_iterator_; |
Expression* next_result_; |
Expression* result_done_; |
Expression* assign_each_; |
- const BailoutId back_edge_id_; |
+ |
+ private: |
+ static const int kClassIdRange = 1; // Back edge id |
}; |
@@ -1128,10 +1206,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(NEXT_ID(Expression) + 1); } |
// Type feedback information. |
- TypeFeedbackId CompareId() { return compare_id_; } |
+ TypeFeedbackId CompareId() { return TypeFeedbackId(NEXT_ID(Expression)); } |
Type* compare_type() { return compare_type_; } |
void set_compare_type(Type* type) { compare_type_ = type; } |
@@ -1144,8 +1222,7 @@ class CaseClause FINAL : public Expression { |
ZoneList<Statement*>* statements_; |
Type* compare_type_; |
- const TypeFeedbackId compare_id_; |
- const BailoutId entry_id_; |
+ static const int kClassIdRange = 2; // Compare and entry ids |
}; |
@@ -1196,8 +1273,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 +1283,15 @@ 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_(RESERVE_ID_RANGE()) {} |
private: |
Expression* condition_; |
Statement* then_statement_; |
Statement* else_statement_; |
const BailoutId if_id_; |
- const BailoutId then_id_; |
- const BailoutId else_id_; |
+ |
+ static const int kClassIdRange = 3; // If, then, else ids |
}; |
@@ -1324,7 +1399,7 @@ class DebuggerStatement FINAL : public Statement { |
protected: |
explicit DebuggerStatement(Zone* zone, int pos, IdGen* id_gen) |
- : Statement(zone, pos), debugger_id_(id_gen->GetNextId()) {} |
+ : Statement(zone, pos), debugger_id_(id_gen->ReserveIdRange(1)) {} |
private: |
const BailoutId debugger_id_; |
@@ -1678,7 +1753,7 @@ class Property FINAL : public Expression, public FeedbackSlotInterface { |
Expression* obj() const { return obj_; } |
Expression* key() const { return key_; } |
- BailoutId LoadId() const { return load_id_; } |
+ BailoutId LoadId() const { return BailoutId(NEXT_ID(Expression)); } |
bool IsStringAccess() const { return is_string_access_; } |
@@ -1719,22 +1794,28 @@ class Property FINAL : public Expression, public FeedbackSlotInterface { |
: Expression(zone, pos, id_gen), |
obj_(obj), |
key_(key), |
- load_id_(id_gen->GetNextId()), |
property_feedback_slot_(kInvalidFeedbackSlot), |
is_for_call_(false), |
is_uninitialized_(false), |
- is_string_access_(false) {} |
+ is_string_access_(false) { |
+#ifdef DEBUG |
+ int load_id = |
+#endif |
+ RESERVE_ID_RANGE(); |
+ DCHECK(load_id == LoadId().ToInt()); |
+ } |
private: |
Expression* obj_; |
Expression* key_; |
- const BailoutId load_id_; |
int property_feedback_slot_; |
SmallMapList receiver_types_; |
bool is_for_call_ : 1; |
bool is_uninitialized_ : 1; |
bool is_string_access_ : 1; |
+ |
+ static const int kClassIdRange = 1; // Load id |
}; |
@@ -1791,7 +1872,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(NEXT_ID(Expression)); } |
enum CallType { |
POSSIBLY_EVAL_CALL, |
@@ -1816,8 +1897,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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(return_id == ReturnId().ToInt()); |
if (expression->IsProperty()) { |
expression->AsProperty()->mark_for_call(); |
} |
@@ -1832,7 +1917,7 @@ class Call FINAL : public Expression, public FeedbackSlotInterface { |
Handle<AllocationSite> allocation_site_; |
int call_feedback_slot_; |
- const BailoutId return_id_; |
+ static const int kClassIdRange = 1; // Return id |
}; |
@@ -1871,7 +1956,7 @@ class CallNew FINAL : public Expression, public FeedbackSlotInterface { |
static int feedback_slots() { return 1; } |
- BailoutId ReturnId() const { return return_id_; } |
+ BailoutId ReturnId() const { return BailoutId(NEXT_ID(Expression)); } |
protected: |
CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
@@ -1881,8 +1966,13 @@ class CallNew FINAL : public Expression, public FeedbackSlotInterface { |
arguments_(arguments), |
is_monomorphic_(false), |
elements_kind_(GetInitialFastElementsKind()), |
- callnew_feedback_slot_(kInvalidFeedbackSlot), |
- return_id_(id_gen->GetNextId()) {} |
+ callnew_feedback_slot_(kInvalidFeedbackSlot) { |
+#ifdef DEBUG |
+ int return_id = |
+#endif |
+ RESERVE_ID_RANGE(); |
+ DCHECK(return_id = ReturnId().ToInt()); |
+ } |
private: |
Expression* expression_; |
@@ -1894,7 +1984,7 @@ class CallNew FINAL : public Expression, public FeedbackSlotInterface { |
Handle<AllocationSite> allocation_site_; |
int callnew_feedback_slot_; |
- const BailoutId return_id_; |
+ static const int kClassIdRange = 1; // Return id |
}; |
@@ -1952,8 +2042,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(NEXT_ID(Expression)); } |
+ BailoutId MaterializeFalseId() { return BailoutId(NEXT_ID(Expression) + 1); } |
virtual void RecordToBooleanTypeFeedback( |
TypeFeedbackOracle* oracle) OVERRIDE; |
@@ -1963,9 +2055,12 @@ 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) { |
+#ifdef DEBUG |
+ int materialize_true_id = |
+#endif |
+ RESERVE_ID_RANGE(); |
+ DCHECK(materialize_true_id == MaterializeTrueId().ToInt()); |
DCHECK(Token::IsUnaryOp(op)); |
} |
@@ -1973,10 +2068,7 @@ class UnaryOperation FINAL : public Expression { |
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_; |
+ static const int kClassIdRange = 2; // Materialize true and false ids |
}; |
@@ -1994,7 +2086,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(NEXT_ID(Expression)); } |
TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } |
Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } |
@@ -2009,8 +2103,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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(right_id == RightId().ToInt()); |
DCHECK(Token::IsBinaryOp(op)); |
} |
@@ -2024,9 +2122,7 @@ class BinaryOperation FINAL : public Expression { |
// 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_; |
+ static const int kClassIdRange = 1; // Right id |
}; |
@@ -2057,9 +2153,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(NEXT_ID(Expression)); } |
- TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } |
+ TypeFeedbackId CountBinOpFeedbackId() const { |
+ return TypeFeedbackId(NEXT_ID(Expression) + 1); |
+ } |
TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } |
protected: |
@@ -2069,9 +2167,13 @@ 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) { |
+#ifdef DEBUG |
+ int assignment_id = |
+#endif |
+ RESERVE_ID_RANGE(); |
+ DCHECK(assignment_id == AssignmentId().ToInt()); |
+ } |
private: |
Token::Value op_; |
@@ -2081,9 +2183,9 @@ class CountOperation FINAL : public Expression { |
Type* type_; |
Expression* expression_; |
- const BailoutId assignment_id_; |
- const TypeFeedbackId count_id_; |
SmallMapList receiver_types_; |
+ |
+ static const int kClassIdRange = 2; // Assignment and count ids |
}; |
@@ -2133,8 +2235,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(NEXT_ID(Expression)); } |
+ BailoutId ElseId() const { return BailoutId(NEXT_ID(Expression) + 1); } |
protected: |
Conditional(Zone* zone, Expression* condition, Expression* then_expression, |
@@ -2142,16 +2244,20 @@ 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 |
+ RESERVE_ID_RANGE(); |
+ DCHECK(then_id == ThenId().ToInt()); |
+ } |
private: |
Expression* condition_; |
Expression* then_expression_; |
Expression* else_expression_; |
- const BailoutId then_id_; |
- const BailoutId else_id_; |
+ |
+ static const int kClassIdRange = 2; // Then and else ids |
}; |
@@ -2171,7 +2277,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(NEXT_ID(Expression)); } |
// Type feedback information. |
TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } |
@@ -2209,12 +2315,13 @@ 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, |
// must have extra bit. |
SmallMapList receiver_types_; |
+ |
+ static const int kClassIdRange = 1; // Assignment id |
}; |
@@ -2545,6 +2652,10 @@ class SuperReference FINAL : public Expression { |
#undef DECLARE_NODE_TYPE |
+#undef RESERVE_ID_RANGE |
+#undef NEXT_ID |
+#undef NEXT_ID_FUNC |
+#undef NEXT_ID_FUNC_BASE |
// ---------------------------------------------------------------------------- |