| 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);
|
|
|