Index: src/type-info.cc |
diff --git a/src/type-info.cc b/src/type-info.cc |
index 3438ff8f8ff5de8e604b0dd16de28561445dacfc..8ec415c6d037e3ee4962d762e3cfe9ef750091bf 100644 |
--- a/src/type-info.cc |
+++ b/src/type-info.cc |
@@ -76,12 +76,26 @@ void TypeFeedbackOracle::Initialize(Handle<Code> code) { |
bool TypeFeedbackOracle::LoadIsMonomorphic(Property* expr) { |
- return GetElement(map_, expr->position())->IsMap(); |
+ Handle<Object> map_or_code(GetElement(map_, expr->position())); |
+ if (map_or_code->IsMap()) return true; |
+ if (map_or_code->IsCode()) { |
+ Handle<Code> code(Code::cast(*map_or_code)); |
+ return code->kind() == Code::KEYED_EXTERNAL_ARRAY_LOAD_IC && |
+ code->FindFirstMap() != NULL; |
+ } |
+ return false; |
} |
-bool TypeFeedbackOracle:: StoreIsMonomorphic(Assignment* expr) { |
- return GetElement(map_, expr->position())->IsMap(); |
+bool TypeFeedbackOracle::StoreIsMonomorphic(Assignment* expr) { |
+ Handle<Object> map_or_code(GetElement(map_, expr->position())); |
+ if (map_or_code->IsMap()) return true; |
+ if (map_or_code->IsCode()) { |
+ Handle<Code> code(Code::cast(*map_or_code)); |
+ return code->kind() == Code::KEYED_EXTERNAL_ARRAY_STORE_IC && |
+ code->FindFirstMap() != NULL; |
+ } |
+ return false; |
} |
@@ -93,13 +107,25 @@ bool TypeFeedbackOracle::CallIsMonomorphic(Call* expr) { |
Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { |
ASSERT(LoadIsMonomorphic(expr)); |
- return Handle<Map>::cast(GetElement(map_, expr->position())); |
+ Handle<Object> map_or_code( |
+ Handle<HeapObject>::cast(GetElement(map_, expr->position()))); |
+ if (map_or_code->IsCode()) { |
+ Handle<Code> code(Code::cast(*map_or_code)); |
+ return Handle<Map>(code->FindFirstMap()); |
+ } |
+ return Handle<Map>(Map::cast(*map_or_code)); |
} |
Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType(Assignment* expr) { |
ASSERT(StoreIsMonomorphic(expr)); |
- return Handle<Map>::cast(GetElement(map_, expr->position())); |
+ Handle<HeapObject> map_or_code( |
+ Handle<HeapObject>::cast(GetElement(map_, expr->position()))); |
+ if (map_or_code->IsCode()) { |
+ Handle<Code> code(Code::cast(*map_or_code)); |
+ return Handle<Map>(code->FindFirstMap()); |
+ } |
+ return Handle<Map>(Map::cast(*map_or_code)); |
} |
@@ -142,6 +168,19 @@ CheckType TypeFeedbackOracle::GetCallCheckType(Call* expr) { |
return check; |
} |
+ExternalArrayType TypeFeedbackOracle::GetKeyedLoadExternalArrayType( |
+ Property* expr) { |
+ Handle<Object> stub = GetElement(map_, expr->position()); |
+ ASSERT(stub->IsCode()); |
+ return Code::cast(*stub)->external_array_type(); |
+} |
+ |
+ExternalArrayType TypeFeedbackOracle::GetKeyedStoreExternalArrayType( |
+ Assignment* expr) { |
+ Handle<Object> stub = GetElement(map_, expr->position()); |
+ ASSERT(stub->IsCode()); |
+ return Code::cast(*stub)->external_array_type(); |
+} |
Handle<JSObject> TypeFeedbackOracle::GetPrototypeForPrimitiveCheck( |
CheckType check) { |
@@ -340,8 +379,11 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) { |
SetElement(map_, position, target, kNonStrictMode); |
} |
} else if (state == MONOMORPHIC) { |
- if (target->kind() != Code::CALL_IC || |
- target->check_type() == RECEIVER_MAP_CHECK) { |
+ if (kind == Code::KEYED_EXTERNAL_ARRAY_LOAD_IC || |
+ kind == Code::KEYED_EXTERNAL_ARRAY_STORE_IC) { |
+ SetElement(map_, position, target, kNonStrictMode); |
+ } else if (kind != Code::CALL_IC || |
+ target->check_type() == RECEIVER_MAP_CHECK) { |
Handle<Map> map = Handle<Map>(target->FindFirstMap()); |
if (*map == NULL) { |
SetElement(map_, position, target, kNonStrictMode); |