| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { | 98 bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { |
| 99 Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); | 99 Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| 100 if (map_or_code->IsMap()) return true; | 100 if (map_or_code->IsMap()) return true; |
| 101 if (map_or_code->IsCode()) { | 101 if (map_or_code->IsCode()) { |
| 102 Handle<Code> code = Handle<Code>::cast(map_or_code); | 102 Handle<Code> code = Handle<Code>::cast(map_or_code); |
| 103 bool preliminary_checks = code->is_keyed_load_stub() && | 103 bool preliminary_checks = code->is_keyed_load_stub() && |
| 104 code->ic_state() == MONOMORPHIC && | 104 code->ic_state() == MONOMORPHIC && |
| 105 Code::ExtractTypeFromFlags(code->flags()) == Code::NORMAL; | 105 Code::ExtractTypeFromFlags(code->flags()) == Code::NORMAL; |
| 106 if (!preliminary_checks) return false; | 106 if (!preliminary_checks) return false; |
| 107 Map* map = code->FindFirstMap(); | 107 Map* map = code->FindFirstMap(); |
| 108 if (map == NULL) return false; |
| 109 map = map->CurrentMapForDeprecated(); |
| 108 return map != NULL && !CanRetainOtherContext(map, *native_context_); | 110 return map != NULL && !CanRetainOtherContext(map, *native_context_); |
| 109 } | 111 } |
| 110 return false; | 112 return false; |
| 111 } | 113 } |
| 112 | 114 |
| 113 | 115 |
| 114 bool TypeFeedbackOracle::LoadIsPolymorphic(Property* expr) { | 116 bool TypeFeedbackOracle::LoadIsPolymorphic(Property* expr) { |
| 115 Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); | 117 Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| 116 if (map_or_code->IsCode()) { | 118 if (map_or_code->IsCode()) { |
| 117 Handle<Code> code = Handle<Code>::cast(map_or_code); | 119 Handle<Code> code = Handle<Code>::cast(map_or_code); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 129 bool standard_store = FLAG_compiled_keyed_stores || | 131 bool standard_store = FLAG_compiled_keyed_stores || |
| 130 (Code::GetKeyedAccessStoreMode(code->extra_ic_state()) == | 132 (Code::GetKeyedAccessStoreMode(code->extra_ic_state()) == |
| 131 STANDARD_STORE); | 133 STANDARD_STORE); |
| 132 bool preliminary_checks = | 134 bool preliminary_checks = |
| 133 code->is_keyed_store_stub() && | 135 code->is_keyed_store_stub() && |
| 134 standard_store && | 136 standard_store && |
| 135 code->ic_state() == MONOMORPHIC && | 137 code->ic_state() == MONOMORPHIC && |
| 136 Code::ExtractTypeFromFlags(code->flags()) == Code::NORMAL; | 138 Code::ExtractTypeFromFlags(code->flags()) == Code::NORMAL; |
| 137 if (!preliminary_checks) return false; | 139 if (!preliminary_checks) return false; |
| 138 Map* map = code->FindFirstMap(); | 140 Map* map = code->FindFirstMap(); |
| 141 if (map == NULL) return false; |
| 142 map = map->CurrentMapForDeprecated(); |
| 139 return map != NULL && !CanRetainOtherContext(map, *native_context_); | 143 return map != NULL && !CanRetainOtherContext(map, *native_context_); |
| 140 } | 144 } |
| 141 return false; | 145 return false; |
| 142 } | 146 } |
| 143 | 147 |
| 144 | 148 |
| 145 bool TypeFeedbackOracle::StoreIsPolymorphic(TypeFeedbackId ast_id) { | 149 bool TypeFeedbackOracle::StoreIsPolymorphic(TypeFeedbackId ast_id) { |
| 146 Handle<Object> map_or_code = GetInfo(ast_id); | 150 Handle<Object> map_or_code = GetInfo(ast_id); |
| 147 if (map_or_code->IsCode()) { | 151 if (map_or_code->IsCode()) { |
| 148 Handle<Code> code = Handle<Code>::cast(map_or_code); | 152 Handle<Code> code = Handle<Code>::cast(map_or_code); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 return value->IsSmi() && | 189 return value->IsSmi() && |
| 186 Smi::cast(*value)->value() == TypeFeedbackCells::kForInFastCaseMarker; | 190 Smi::cast(*value)->value() == TypeFeedbackCells::kForInFastCaseMarker; |
| 187 } | 191 } |
| 188 | 192 |
| 189 | 193 |
| 190 Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { | 194 Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { |
| 191 ASSERT(LoadIsMonomorphicNormal(expr)); | 195 ASSERT(LoadIsMonomorphicNormal(expr)); |
| 192 Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); | 196 Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| 193 if (map_or_code->IsCode()) { | 197 if (map_or_code->IsCode()) { |
| 194 Handle<Code> code = Handle<Code>::cast(map_or_code); | 198 Handle<Code> code = Handle<Code>::cast(map_or_code); |
| 195 Handle<Map> first_map(code->FindFirstMap()); | 199 Map* map = code->FindFirstMap()->CurrentMapForDeprecated(); |
| 196 ASSERT(!first_map.is_null()); | 200 return map == NULL || CanRetainOtherContext(map, *native_context_) |
| 197 first_map = Map::CurrentMapForDeprecated(first_map); | |
| 198 return CanRetainOtherContext(*first_map, *native_context_) | |
| 199 ? Handle<Map>::null() | 201 ? Handle<Map>::null() |
| 200 : first_map; | 202 : Handle<Map>(map); |
| 201 } | 203 } |
| 202 return Map::CurrentMapForDeprecated(Handle<Map>::cast(map_or_code)); | 204 return Handle<Map>::cast(map_or_code); |
| 203 } | 205 } |
| 204 | 206 |
| 205 | 207 |
| 206 Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType( | 208 Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType( |
| 207 TypeFeedbackId ast_id) { | 209 TypeFeedbackId ast_id) { |
| 208 ASSERT(StoreIsMonomorphicNormal(ast_id)); | 210 ASSERT(StoreIsMonomorphicNormal(ast_id)); |
| 209 Handle<Object> map_or_code = GetInfo(ast_id); | 211 Handle<Object> map_or_code = GetInfo(ast_id); |
| 210 if (map_or_code->IsCode()) { | 212 if (map_or_code->IsCode()) { |
| 211 Handle<Code> code = Handle<Code>::cast(map_or_code); | 213 Handle<Code> code = Handle<Code>::cast(map_or_code); |
| 212 Handle<Map> first_map(code->FindFirstMap()); | 214 Map* map = code->FindFirstMap()->CurrentMapForDeprecated(); |
| 213 ASSERT(!first_map.is_null()); | 215 return map == NULL || CanRetainOtherContext(map, *native_context_) |
| 214 first_map = Map::CurrentMapForDeprecated(first_map); | |
| 215 return CanRetainOtherContext(*first_map, *native_context_) | |
| 216 ? Handle<Map>::null() | 216 ? Handle<Map>::null() |
| 217 : first_map; | 217 : Handle<Map>(map); |
| 218 } | 218 } |
| 219 return Map::CurrentMapForDeprecated(Handle<Map>::cast(map_or_code)); | 219 return Handle<Map>::cast(map_or_code); |
| 220 } | 220 } |
| 221 | 221 |
| 222 | 222 |
| 223 Handle<Map> TypeFeedbackOracle::CompareNilMonomorphicReceiverType( | 223 Handle<Map> TypeFeedbackOracle::CompareNilMonomorphicReceiverType( |
| 224 TypeFeedbackId id) { | 224 TypeFeedbackId id) { |
| 225 Handle<Object> maybe_code = GetInfo(id); | 225 Handle<Object> maybe_code = GetInfo(id); |
| 226 if (maybe_code->IsCode()) { | 226 if (maybe_code->IsCode()) { |
| 227 Map* first_map = Handle<Code>::cast(maybe_code)->FindFirstMap(); | 227 Map* map = Handle<Code>::cast(maybe_code)->FindFirstMap(); |
| 228 if (first_map != NULL) { | 228 if (map == NULL) return Handle<Map>(); |
| 229 return Map::CurrentMapForDeprecated(Handle<Map>(first_map)); | 229 map = map->CurrentMapForDeprecated(); |
| 230 } | 230 return map == NULL || CanRetainOtherContext(map, *native_context_) |
| 231 ? Handle<Map>() |
| 232 : Handle<Map>(map); |
| 233 } else if (maybe_code->IsMap()) { |
| 234 ASSERT(!Handle<Map>::cast(maybe_code)->is_deprecated()); |
| 235 return Handle<Map>::cast(maybe_code); |
| 231 } | 236 } |
| 232 return Handle<Map>(); | 237 return Handle<Map>(); |
| 233 } | 238 } |
| 234 | 239 |
| 235 | 240 |
| 236 KeyedAccessStoreMode TypeFeedbackOracle::GetStoreMode( | 241 KeyedAccessStoreMode TypeFeedbackOracle::GetStoreMode( |
| 237 TypeFeedbackId ast_id) { | 242 TypeFeedbackId ast_id) { |
| 238 Handle<Object> map_or_code = GetInfo(ast_id); | 243 Handle<Object> map_or_code = GetInfo(ast_id); |
| 239 if (map_or_code->IsCode()) { | 244 if (map_or_code->IsCode()) { |
| 240 Handle<Code> code = Handle<Code>::cast(map_or_code); | 245 Handle<Code> code = Handle<Code>::cast(map_or_code); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 return FAST_SMI_ELEMENTS; | 349 return FAST_SMI_ELEMENTS; |
| 345 } else { | 350 } else { |
| 346 return FAST_HOLEY_SMI_ELEMENTS; | 351 return FAST_HOLEY_SMI_ELEMENTS; |
| 347 } | 352 } |
| 348 } | 353 } |
| 349 } | 354 } |
| 350 | 355 |
| 351 Handle<Map> TypeFeedbackOracle::GetObjectLiteralStoreMap( | 356 Handle<Map> TypeFeedbackOracle::GetObjectLiteralStoreMap( |
| 352 ObjectLiteral::Property* prop) { | 357 ObjectLiteral::Property* prop) { |
| 353 ASSERT(ObjectLiteralStoreIsMonomorphic(prop)); | 358 ASSERT(ObjectLiteralStoreIsMonomorphic(prop)); |
| 354 return Map::CurrentMapForDeprecated( | 359 return Handle<Map>::cast(GetInfo(prop->key()->LiteralFeedbackId())); |
| 355 Handle<Map>::cast(GetInfo(prop->key()->LiteralFeedbackId()))); | |
| 356 } | 360 } |
| 357 | 361 |
| 358 | 362 |
| 359 bool TypeFeedbackOracle::LoadIsBuiltin(Property* expr, Builtins::Name id) { | 363 bool TypeFeedbackOracle::LoadIsBuiltin(Property* expr, Builtins::Name id) { |
| 360 return *GetInfo(expr->PropertyFeedbackId()) == | 364 return *GetInfo(expr->PropertyFeedbackId()) == |
| 361 isolate_->builtins()->builtin(id); | 365 isolate_->builtins()->builtin(id); |
| 362 } | 366 } |
| 363 | 367 |
| 364 | 368 |
| 365 bool TypeFeedbackOracle::LoadIsStub(Property* expr, ICStub* stub) { | 369 bool TypeFeedbackOracle::LoadIsStub(Property* expr, ICStub* stub) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 | 428 |
| 425 Handle<Map> TypeFeedbackOracle::GetCompareMap(CompareOperation* expr) { | 429 Handle<Map> TypeFeedbackOracle::GetCompareMap(CompareOperation* expr) { |
| 426 Handle<Object> object = GetInfo(expr->CompareOperationFeedbackId()); | 430 Handle<Object> object = GetInfo(expr->CompareOperationFeedbackId()); |
| 427 if (!object->IsCode()) return Handle<Map>::null(); | 431 if (!object->IsCode()) return Handle<Map>::null(); |
| 428 Handle<Code> code = Handle<Code>::cast(object); | 432 Handle<Code> code = Handle<Code>::cast(object); |
| 429 if (!code->is_compare_ic_stub()) return Handle<Map>::null(); | 433 if (!code->is_compare_ic_stub()) return Handle<Map>::null(); |
| 430 CompareIC::State state = ICCompareStub::CompareState(code->stub_info()); | 434 CompareIC::State state = ICCompareStub::CompareState(code->stub_info()); |
| 431 if (state != CompareIC::KNOWN_OBJECT) { | 435 if (state != CompareIC::KNOWN_OBJECT) { |
| 432 return Handle<Map>::null(); | 436 return Handle<Map>::null(); |
| 433 } | 437 } |
| 434 Handle<Map> first_map(code->FindFirstMap()); | 438 Map* map = code->FindFirstMap()->CurrentMapForDeprecated(); |
| 435 ASSERT(!first_map.is_null()); | 439 return map == NULL || CanRetainOtherContext(map, *native_context_) |
| 436 first_map = Map::CurrentMapForDeprecated(first_map); | |
| 437 return CanRetainOtherContext(*first_map, *native_context_) | |
| 438 ? Handle<Map>::null() | 440 ? Handle<Map>::null() |
| 439 : first_map; | 441 : Handle<Map>(map); |
| 440 } | 442 } |
| 441 | 443 |
| 442 | 444 |
| 443 TypeInfo TypeFeedbackOracle::UnaryType(UnaryOperation* expr) { | 445 TypeInfo TypeFeedbackOracle::UnaryType(UnaryOperation* expr) { |
| 444 Handle<Object> object = GetInfo(expr->UnaryOperationFeedbackId()); | 446 Handle<Object> object = GetInfo(expr->UnaryOperationFeedbackId()); |
| 445 TypeInfo unknown = TypeInfo::Unknown(); | 447 TypeInfo unknown = TypeInfo::Unknown(); |
| 446 if (!object->IsCode()) return unknown; | 448 if (!object->IsCode()) return unknown; |
| 447 Handle<Code> code = Handle<Code>::cast(object); | 449 Handle<Code> code = Handle<Code>::cast(object); |
| 448 ASSERT(code->is_unary_op_stub()); | 450 ASSERT(code->is_unary_op_stub()); |
| 449 UnaryOpIC::TypeInfo type = static_cast<UnaryOpIC::TypeInfo>( | 451 UnaryOpIC::TypeInfo type = static_cast<UnaryOpIC::TypeInfo>( |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 if (target->ic_state() == MONOMORPHIC) { | 718 if (target->ic_state() == MONOMORPHIC) { |
| 717 if (target->kind() == Code::CALL_IC && | 719 if (target->kind() == Code::CALL_IC && |
| 718 target->check_type() != RECEIVER_MAP_CHECK) { | 720 target->check_type() != RECEIVER_MAP_CHECK) { |
| 719 SetInfo(ast_id, Smi::FromInt(target->check_type())); | 721 SetInfo(ast_id, Smi::FromInt(target->check_type())); |
| 720 } else { | 722 } else { |
| 721 Object* map = target->FindFirstMap(); | 723 Object* map = target->FindFirstMap(); |
| 722 if (map == NULL) { | 724 if (map == NULL) { |
| 723 SetInfo(ast_id, static_cast<Object*>(target)); | 725 SetInfo(ast_id, static_cast<Object*>(target)); |
| 724 } else if (!CanRetainOtherContext(Map::cast(map), | 726 } else if (!CanRetainOtherContext(Map::cast(map), |
| 725 *native_context_)) { | 727 *native_context_)) { |
| 726 SetInfo(ast_id, map); | 728 Map* feedback = Map::cast(map)->CurrentMapForDeprecated(); |
| 729 if (feedback != NULL) SetInfo(ast_id, feedback); |
| 727 } | 730 } |
| 728 } | 731 } |
| 729 } else { | 732 } else { |
| 730 SetInfo(ast_id, target); | 733 SetInfo(ast_id, target); |
| 731 } | 734 } |
| 732 break; | 735 break; |
| 733 | 736 |
| 734 case Code::KEYED_LOAD_IC: | 737 case Code::KEYED_LOAD_IC: |
| 735 case Code::KEYED_STORE_IC: | 738 case Code::KEYED_STORE_IC: |
| 736 if (target->ic_state() == MONOMORPHIC || | 739 if (target->ic_state() == MONOMORPHIC || |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 779 USE(maybe_result); | 782 USE(maybe_result); |
| 780 #ifdef DEBUG | 783 #ifdef DEBUG |
| 781 Object* result = NULL; | 784 Object* result = NULL; |
| 782 // Dictionary has been allocated with sufficient size for all elements. | 785 // Dictionary has been allocated with sufficient size for all elements. |
| 783 ASSERT(maybe_result->ToObject(&result)); | 786 ASSERT(maybe_result->ToObject(&result)); |
| 784 ASSERT(*dictionary_ == result); | 787 ASSERT(*dictionary_ == result); |
| 785 #endif | 788 #endif |
| 786 } | 789 } |
| 787 | 790 |
| 788 } } // namespace v8::internal | 791 } } // namespace v8::internal |
| OLD | NEW |