Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index 63ee29ae0e80af35b73a11c94314364d9a11b8a8..8a1aaf297dd52c7dc07d2ebd3dc1c7d3e3eec970 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -195,13 +195,6 @@ class AstNode: public ZoneObject { |
}; |
#undef DECLARE_TYPE_ENUM |
- static const int kNoNumber = -1; |
- static const int kFunctionEntryId = 2; // Using 0 could disguise errors. |
- // This AST id identifies the point after the declarations have been |
- // visited. We need it to capture the environment effects of declarations |
- // that emit code (function declarations). |
- static const int kDeclarationsId = 3; |
- |
void* operator new(size_t size, Zone* zone) { |
return zone->New(static_cast<int>(size)); |
} |
@@ -236,6 +229,12 @@ class AstNode: public ZoneObject { |
return tmp; |
} |
+ // Some nodes re-use bailout IDs for type feedback. |
+ static TypeFeedbackId reuse(BailoutId id) { |
+ return TypeFeedbackId(id.ToInt()); |
+ } |
+ |
+ |
private: |
// Hidden to prevent accidental usage. It would have to load the |
// current zone from the TLS. |
@@ -349,8 +348,8 @@ class Expression: public AstNode { |
return types->at(0); |
} |
- unsigned id() const { return id_; } |
- unsigned test_id() const { return test_id_; } |
+ BailoutId id() const { return id_; } |
+ TypeFeedbackId test_id() const { return test_id_; } |
protected: |
explicit Expression(Isolate* isolate) |
@@ -358,8 +357,8 @@ class Expression: public AstNode { |
test_id_(GetNextId(isolate)) {} |
private: |
- const int id_; |
- const int test_id_; |
+ const BailoutId id_; |
+ const TypeFeedbackId test_id_; |
}; |
@@ -383,9 +382,8 @@ class BreakableStatement: public Statement { |
// Testers. |
bool is_target_for_anonymous() const { return type_ == TARGET_FOR_ANONYMOUS; } |
- // Bailout support. |
- int EntryId() const { return entry_id_; } |
- int ExitId() const { return exit_id_; } |
+ BailoutId EntryId() const { return entry_id_; } |
+ BailoutId ExitId() const { return exit_id_; } |
protected: |
BreakableStatement(Isolate* isolate, ZoneStringList* labels, Type type) |
@@ -401,8 +399,8 @@ class BreakableStatement: public Statement { |
ZoneStringList* labels_; |
Type type_; |
Label break_target_; |
- const int entry_id_; |
- const int exit_id_; |
+ const BailoutId entry_id_; |
+ const BailoutId exit_id_; |
}; |
@@ -676,10 +674,9 @@ class IterationStatement: public BreakableStatement { |
Statement* body() const { return body_; } |
- // Bailout support. |
- int OsrEntryId() const { return osr_entry_id_; } |
- virtual int ContinueId() const = 0; |
- virtual int StackCheckId() const = 0; |
+ BailoutId OsrEntryId() const { return osr_entry_id_; } |
+ virtual BailoutId ContinueId() const = 0; |
+ virtual BailoutId StackCheckId() const = 0; |
// Code generation |
Label* continue_target() { return &continue_target_; } |
@@ -698,7 +695,7 @@ class IterationStatement: public BreakableStatement { |
private: |
Statement* body_; |
Label continue_target_; |
- const int osr_entry_id_; |
+ const BailoutId osr_entry_id_; |
}; |
@@ -718,10 +715,9 @@ class DoWhileStatement: public IterationStatement { |
int condition_position() { return condition_position_; } |
void set_condition_position(int pos) { condition_position_ = pos; } |
- // Bailout support. |
- virtual int ContinueId() const { return continue_id_; } |
- virtual int StackCheckId() const { return back_edge_id_; } |
- int BackEdgeId() const { return back_edge_id_; } |
+ virtual BailoutId ContinueId() const { return continue_id_; } |
+ virtual BailoutId StackCheckId() const { return back_edge_id_; } |
+ BailoutId BackEdgeId() const { return back_edge_id_; } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -737,8 +733,8 @@ class DoWhileStatement: public IterationStatement { |
private: |
Expression* cond_; |
int condition_position_; |
- const int continue_id_; |
- const int back_edge_id_; |
+ const BailoutId continue_id_; |
+ const BailoutId back_edge_id_; |
}; |
@@ -759,10 +755,9 @@ class WhileStatement: public IterationStatement { |
may_have_function_literal_ = value; |
} |
- // Bailout support. |
- virtual int ContinueId() const { return EntryId(); } |
- virtual int StackCheckId() const { return body_id_; } |
- int BodyId() const { return body_id_; } |
+ virtual BailoutId ContinueId() const { return EntryId(); } |
+ virtual BailoutId StackCheckId() const { return body_id_; } |
+ BailoutId BodyId() const { return body_id_; } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -778,7 +773,7 @@ class WhileStatement: public IterationStatement { |
Expression* cond_; |
// True if there is a function literal subexpression in the condition. |
bool may_have_function_literal_; |
- const int body_id_; |
+ const BailoutId body_id_; |
}; |
@@ -807,10 +802,9 @@ class ForStatement: public IterationStatement { |
may_have_function_literal_ = value; |
} |
- // Bailout support. |
- virtual int ContinueId() const { return continue_id_; } |
- virtual int StackCheckId() const { return body_id_; } |
- int BodyId() const { return body_id_; } |
+ virtual BailoutId ContinueId() const { return continue_id_; } |
+ virtual BailoutId StackCheckId() const { return body_id_; } |
+ BailoutId BodyId() const { return body_id_; } |
bool is_fast_smi_loop() { return loop_variable_ != NULL; } |
Variable* loop_variable() { return loop_variable_; } |
@@ -837,8 +831,8 @@ class ForStatement: public IterationStatement { |
// True if there is a function literal subexpression in the condition. |
bool may_have_function_literal_; |
Variable* loop_variable_; |
- const int continue_id_; |
- const int body_id_; |
+ const BailoutId continue_id_; |
+ const BailoutId body_id_; |
}; |
@@ -855,10 +849,12 @@ class ForInStatement: public IterationStatement { |
Expression* each() const { return each_; } |
Expression* enumerable() const { return enumerable_; } |
- virtual int ContinueId() const { return EntryId(); } |
- virtual int StackCheckId() const { return body_id_; } |
- int BodyId() const { return body_id_; } |
- int PrepareId() const { return prepare_id_; } |
+ virtual BailoutId ContinueId() const { return EntryId(); } |
+ virtual BailoutId StackCheckId() const { return body_id_; } |
+ BailoutId BodyId() const { return body_id_; } |
+ BailoutId PrepareId() const { return prepare_id_; } |
+ |
+ TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -874,8 +870,8 @@ class ForInStatement: public IterationStatement { |
private: |
Expression* each_; |
Expression* enumerable_; |
- const int body_id_; |
- const int prepare_id_; |
+ const BailoutId body_id_; |
+ const BailoutId prepare_id_; |
}; |
@@ -986,10 +982,10 @@ class CaseClause: public ZoneObject { |
int position() const { return position_; } |
void set_position(int pos) { position_ = pos; } |
- int EntryId() { return entry_id_; } |
- int CompareId() { return compare_id_; } |
+ BailoutId EntryId() const { return entry_id_; } |
// Type feedback information. |
+ TypeFeedbackId CompareId() { return compare_id_; } |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
bool IsSmiCompare() { return compare_type_ == SMI_ONLY; } |
bool IsSymbolCompare() { return compare_type_ == SYMBOL_ONLY; } |
@@ -1009,8 +1005,8 @@ class CaseClause: public ZoneObject { |
OBJECT_ONLY |
}; |
CompareTypeFeedback compare_type_; |
- const int compare_id_; |
- const int entry_id_; |
+ const TypeFeedbackId compare_id_; |
+ const BailoutId entry_id_; |
}; |
@@ -1056,9 +1052,9 @@ class IfStatement: public Statement { |
Statement* then_statement() const { return then_statement_; } |
Statement* else_statement() const { return else_statement_; } |
- int IfId() const { return if_id_; } |
- int ThenId() const { return then_id_; } |
- int ElseId() const { return else_id_; } |
+ BailoutId IfId() const { return if_id_; } |
+ BailoutId ThenId() const { return then_id_; } |
+ BailoutId ElseId() const { return else_id_; } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1079,9 +1075,9 @@ class IfStatement: public Statement { |
Expression* condition_; |
Statement* then_statement_; |
Statement* else_statement_; |
- const int if_id_; |
- const int then_id_; |
- const int else_id_; |
+ const BailoutId if_id_; |
+ const BailoutId then_id_; |
+ const BailoutId else_id_; |
}; |
@@ -1248,6 +1244,8 @@ class Literal: public Expression { |
return s1->Equals(*s2); |
} |
+ TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); } |
+ |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1426,7 +1424,9 @@ class ArrayLiteral: public MaterializedLiteral { |
ZoneList<Expression*>* values() const { return values_; } |
// Return an AST id for an element that is used in simulate instructions. |
- int GetIdForElement(int i) { return first_element_id_ + i; } |
+ BailoutId GetIdForElement(int i) { |
+ return BailoutId(first_element_id_.ToInt() + i); |
+ } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1445,7 +1445,7 @@ class ArrayLiteral: public MaterializedLiteral { |
private: |
Handle<FixedArray> constant_elements_; |
ZoneList<Expression*>* values_; |
- const int first_element_id_; |
+ const BailoutId first_element_id_; |
}; |
@@ -1513,8 +1513,7 @@ class Property: public Expression { |
Expression* key() const { return key_; } |
virtual int position() const { return pos_; } |
- // Bailout support. |
- int ReturnId() const { return return_id_; } |
+ BailoutId ReturnId() const { return return_id_; } |
bool IsStringLength() const { return is_string_length_; } |
bool IsStringAccess() const { return is_string_access_; } |
@@ -1526,6 +1525,7 @@ class Property: public Expression { |
virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
bool IsArrayLength() { return is_array_length_; } |
bool IsUninitialized() { return is_uninitialized_; } |
+ TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1550,7 +1550,7 @@ class Property: public Expression { |
Expression* obj_; |
Expression* key_; |
int pos_; |
- const int return_id_; |
+ const BailoutId return_id_; |
SmallMapList receiver_types_; |
bool is_monomorphic_ : 1; |
@@ -1570,8 +1570,9 @@ class Call: public Expression { |
ZoneList<Expression*>* arguments() const { return arguments_; } |
virtual int position() const { return pos_; } |
- void RecordTypeFeedback(TypeFeedbackOracle* oracle, |
- CallKind call_kind); |
+ // Type feedback information. |
+ TypeFeedbackId CallFeedbackId() const { return reuse(id()); } |
+ void RecordTypeFeedback(TypeFeedbackOracle* oracle, CallKind call_kind); |
virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
CheckType check_type() const { return check_type_; } |
@@ -1587,8 +1588,7 @@ class Call: public Expression { |
bool ComputeTarget(Handle<Map> type, Handle<String> name); |
bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupResult* lookup); |
- // Bailout support. |
- int ReturnId() const { return return_id_; } |
+ BailoutId ReturnId() const { return return_id_; } |
#ifdef DEBUG |
// Used to assert that the FullCodeGenerator records the return site. |
@@ -1622,7 +1622,7 @@ class Call: public Expression { |
Handle<JSObject> holder_; |
Handle<JSGlobalPropertyCell> cell_; |
- const int return_id_; |
+ const BailoutId return_id_; |
}; |
@@ -1634,12 +1634,13 @@ class CallNew: public Expression { |
ZoneList<Expression*>* arguments() const { return arguments_; } |
virtual int position() const { return pos_; } |
+ // Type feedback information. |
+ TypeFeedbackId CallNewFeedbackId() const { return reuse(id()); } |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
Handle<JSFunction> target() { return target_; } |
- // Bailout support. |
- int ReturnId() const { return return_id_; } |
+ BailoutId ReturnId() const { return return_id_; } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1663,7 +1664,7 @@ class CallNew: public Expression { |
bool is_monomorphic_; |
Handle<JSFunction> target_; |
- const int return_id_; |
+ const BailoutId return_id_; |
}; |
@@ -1680,6 +1681,8 @@ class CallRuntime: public Expression { |
ZoneList<Expression*>* arguments() const { return arguments_; } |
bool is_jsruntime() const { return function_ == NULL; } |
+ TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } |
+ |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1709,8 +1712,10 @@ class UnaryOperation: public Expression { |
Expression* expression() const { return expression_; } |
virtual int position() const { return pos_; } |
- int MaterializeTrueId() { return materialize_true_id_; } |
- int MaterializeFalseId() { return materialize_false_id_; } |
+ BailoutId MaterializeTrueId() { return materialize_true_id_; } |
+ BailoutId MaterializeFalseId() { return materialize_false_id_; } |
+ |
+ TypeFeedbackId UnaryOperationFeedbackId() const { return reuse(id()); } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1735,8 +1740,8 @@ class UnaryOperation: public Expression { |
// For unary not (Token::NOT), the AST ids where true and false will |
// actually be materialized, respectively. |
- const int materialize_true_id_; |
- const int materialize_false_id_; |
+ const BailoutId materialize_true_id_; |
+ const BailoutId materialize_false_id_; |
}; |
@@ -1751,8 +1756,9 @@ class BinaryOperation: public Expression { |
Expression* right() const { return right_; } |
virtual int position() const { return pos_; } |
- // Bailout support. |
- int RightId() const { return right_id_; } |
+ BailoutId RightId() const { return right_id_; } |
+ |
+ TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1778,7 +1784,7 @@ class BinaryOperation: public Expression { |
int pos_; |
// The short-circuit logical operations need an AST ID for their |
// right-hand subexpression. |
- const int right_id_; |
+ const BailoutId right_id_; |
}; |
@@ -1803,9 +1809,12 @@ class CountOperation: public Expression { |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
- // Bailout support. |
- int AssignmentId() const { return assignment_id_; } |
- int CountId() const { return count_id_; } |
+ BailoutId AssignmentId() const { return assignment_id_; } |
+ BailoutId CountId() const { return count_id_; } |
+ |
+ TypeFeedbackId CountBinOpFeedbackId() const { return reuse(CountId()); } |
+ TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } |
+ |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1829,8 +1838,8 @@ class CountOperation: public Expression { |
bool is_monomorphic_; |
Expression* expression_; |
int pos_; |
- const int assignment_id_; |
- const int count_id_; |
+ const BailoutId assignment_id_; |
+ const BailoutId count_id_; |
SmallMapList receiver_types_; |
}; |
@@ -1845,6 +1854,7 @@ class CompareOperation: public Expression { |
virtual int position() const { return pos_; } |
// Type feedback information. |
+ TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); } |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
bool IsSmiCompare() { return compare_type_ == SMI_ONLY; } |
bool IsObjectCompare() { return compare_type_ == OBJECT_ONLY; } |
@@ -1893,8 +1903,8 @@ class Conditional: public Expression { |
int then_expression_position() const { return then_expression_position_; } |
int else_expression_position() const { return else_expression_position_; } |
- int ThenId() const { return then_id_; } |
- int ElseId() const { return else_id_; } |
+ BailoutId ThenId() const { return then_id_; } |
+ BailoutId ElseId() const { return else_id_; } |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1920,8 +1930,8 @@ class Conditional: public Expression { |
Expression* else_expression_; |
int then_expression_position_; |
int else_expression_position_; |
- const int then_id_; |
- const int else_id_; |
+ const BailoutId then_id_; |
+ const BailoutId else_id_; |
}; |
@@ -1951,15 +1961,15 @@ class Assignment: public Expression { |
void mark_block_start() { block_start_ = true; } |
void mark_block_end() { block_end_ = true; } |
+ BailoutId CompoundLoadId() const { return compound_load_id_; } |
+ BailoutId AssignmentId() const { return assignment_id_; } |
+ |
// Type feedback information. |
+ TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } |
void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone); |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
- // Bailout support. |
- int CompoundLoadId() const { return compound_load_id_; } |
- int AssignmentId() const { return assignment_id_; } |
- |
protected: |
template<class> friend class AstNodeFactory; |
@@ -1984,8 +1994,8 @@ class Assignment: public Expression { |
Expression* value_; |
int pos_; |
BinaryOperation* binary_operation_; |
- const int compound_load_id_; |
- const int assignment_id_; |
+ const BailoutId compound_load_id_; |
+ const BailoutId assignment_id_; |
bool block_start_; |
bool block_end_; |