Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index fccf1aa1cc2f4b235afb3a0836390805bbe65818..f31fa1d0def171d5e844f35438528d98a87466b2 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -33,6 +33,7 @@ |
#include "factory.h" |
#include "jsregexp.h" |
#include "runtime.h" |
+#include "small-pointer-list.h" |
#include "token.h" |
#include "variables.h" |
@@ -207,6 +208,35 @@ class Statement: public AstNode { |
}; |
+class SmallMapList { |
+ public: |
+ SmallMapList() {} |
+ explicit SmallMapList(int capacity) : list_(capacity) {} |
+ |
+ void Reserve(int capacty) { list_.Reserve(capacty); } |
fschneider
2011/08/22 13:38:06
capacty -> capacity
|
+ void Clear() { list_.Clear(); } |
+ |
+ bool is_empty() const { return list_.is_empty(); } |
+ int length() const { return list_.length(); } |
+ |
+ void Add(Handle<Map> handle) { |
+ list_.Add(handle.location()); |
+ } |
+ |
+ Handle<Map> at(int i) const { |
+ return Handle<Map>(list_.at(i)); |
+ } |
+ |
+ Handle<Map> first() const { return at(0); } |
+ Handle<Map> last() const { return at(length() - 1); } |
+ |
+ private: |
+ SmallPointerList<Map*> list_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SmallMapList); |
+}; |
+ |
+ |
class Expression: public AstNode { |
public: |
enum Context { |
@@ -265,13 +295,15 @@ class Expression: public AstNode { |
UNREACHABLE(); |
return false; |
} |
- virtual ZoneMapList* GetReceiverTypes() { |
+ virtual SmallMapList* GetReceiverTypes() { |
UNREACHABLE(); |
return NULL; |
} |
- virtual Handle<Map> GetMonomorphicReceiverType() { |
- UNREACHABLE(); |
- return Handle<Map>(); |
+ Handle<Map> GetMonomorphicReceiverType() { |
+ ASSERT(IsMonomorphic()); |
+ SmallMapList* types = GetReceiverTypes(); |
+ ASSERT(types != NULL && types->length() == 1); |
+ return types->at(0); |
} |
unsigned id() const { return id_; } |
@@ -1211,7 +1243,6 @@ class Property: public Expression { |
key_(key), |
pos_(pos), |
type_(type), |
- receiver_types_(NULL), |
is_monomorphic_(false), |
is_array_length_(false), |
is_string_length_(false), |
@@ -1235,11 +1266,8 @@ class Property: public Expression { |
// Type feedback information. |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
- virtual ZoneMapList* GetReceiverTypes() { return receiver_types_; } |
+ virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
virtual bool IsArrayLength() { return is_array_length_; } |
- virtual Handle<Map> GetMonomorphicReceiverType() { |
- return monomorphic_receiver_type_; |
- } |
private: |
Expression* obj_; |
@@ -1247,13 +1275,12 @@ class Property: public Expression { |
int pos_; |
Type type_; |
- ZoneMapList* receiver_types_; |
+ SmallMapList receiver_types_; |
bool is_monomorphic_ : 1; |
bool is_array_length_ : 1; |
bool is_string_length_ : 1; |
bool is_string_access_ : 1; |
bool is_function_prototype_ : 1; |
- Handle<Map> monomorphic_receiver_type_; |
}; |
@@ -1269,7 +1296,6 @@ class Call: public Expression { |
pos_(pos), |
is_monomorphic_(false), |
check_type_(RECEIVER_MAP_CHECK), |
- receiver_types_(NULL), |
return_id_(GetNextId(isolate)) { |
} |
@@ -1283,7 +1309,7 @@ class Call: public Expression { |
void RecordTypeFeedback(TypeFeedbackOracle* oracle, |
CallKind call_kind); |
- virtual ZoneMapList* GetReceiverTypes() { return receiver_types_; } |
+ virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
CheckType check_type() const { return check_type_; } |
Handle<JSFunction> target() { return target_; } |
@@ -1308,7 +1334,7 @@ class Call: public Expression { |
bool is_monomorphic_; |
CheckType check_type_; |
- ZoneMapList* receiver_types_; |
+ SmallMapList receiver_types_; |
Handle<JSFunction> target_; |
Handle<JSObject> holder_; |
Handle<JSGlobalPropertyCell> cell_; |
@@ -1483,8 +1509,7 @@ class CountOperation: public Expression { |
expression_(expr), |
pos_(pos), |
assignment_id_(GetNextId(isolate)), |
- count_id_(GetNextId(isolate)), |
- receiver_types_(NULL) { } |
+ count_id_(GetNextId(isolate)) {} |
DECLARE_NODE_TYPE(CountOperation) |
@@ -1505,10 +1530,7 @@ class CountOperation: public Expression { |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
- virtual Handle<Map> GetMonomorphicReceiverType() { |
- return monomorphic_receiver_type_; |
- } |
- virtual ZoneMapList* GetReceiverTypes() { return receiver_types_; } |
+ virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
// Bailout support. |
int AssignmentId() const { return assignment_id_; } |
@@ -1522,8 +1544,7 @@ class CountOperation: public Expression { |
int pos_; |
int assignment_id_; |
int count_id_; |
- Handle<Map> monomorphic_receiver_type_; |
- ZoneMapList* receiver_types_; |
+ SmallMapList receiver_types_; |
}; |
@@ -1671,10 +1692,7 @@ class Assignment: public Expression { |
// Type feedback information. |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
- virtual ZoneMapList* GetReceiverTypes() { return receiver_types_; } |
- virtual Handle<Map> GetMonomorphicReceiverType() { |
- return monomorphic_receiver_type_; |
- } |
+ virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
// Bailout support. |
int CompoundLoadId() const { return compound_load_id_; } |
@@ -1693,8 +1711,7 @@ class Assignment: public Expression { |
bool block_end_; |
bool is_monomorphic_; |
- ZoneMapList* receiver_types_; |
- Handle<Map> monomorphic_receiver_type_; |
+ SmallMapList receiver_types_; |
}; |