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 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 if (key->IsHeapNumber()) { | 976 if (key->IsHeapNumber()) { |
977 double value = Handle<HeapNumber>::cast(key)->value(); | 977 double value = Handle<HeapNumber>::cast(key)->value(); |
978 if (std::isnan(value)) { | 978 if (std::isnan(value)) { |
979 key = isolate->factory()->nan_string(); | 979 key = isolate->factory()->nan_string(); |
980 } else { | 980 } else { |
981 int int_value = FastD2I(value); | 981 int int_value = FastD2I(value); |
982 if (value == int_value && Smi::IsValid(int_value)) { | 982 if (value == int_value && Smi::IsValid(int_value)) { |
983 key = Handle<Smi>(Smi::FromInt(int_value), isolate); | 983 key = Handle<Smi>(Smi::FromInt(int_value), isolate); |
984 } | 984 } |
985 } | 985 } |
986 } else if (key->IsString()) { | |
987 key = isolate->factory()->InternalizeString(Handle<String>::cast(key)); | |
988 } else if (key->IsUndefined()) { | 986 } else if (key->IsUndefined()) { |
989 key = isolate->factory()->undefined_string(); | 987 key = isolate->factory()->undefined_string(); |
990 } | 988 } |
991 return key; | 989 return key; |
992 } | 990 } |
993 | 991 |
994 | 992 |
995 Handle<Code> KeyedLoadIC::LoadElementStub(Handle<JSObject> receiver) { | 993 Handle<Code> KeyedLoadIC::LoadElementStub(Handle<JSObject> receiver) { |
996 // Don't handle megamorphic property accesses for INTERCEPTORS or CALLBACKS | 994 // Don't handle megamorphic property accesses for INTERCEPTORS or CALLBACKS |
997 // via megamorphic stubs, since they don't have a map in their relocation info | 995 // via megamorphic stubs, since they don't have a map in their relocation info |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1056 | 1054 |
1057 | 1055 |
1058 MaybeObject* KeyedLoadIC::Load(Handle<Object> object, Handle<Object> key) { | 1056 MaybeObject* KeyedLoadIC::Load(Handle<Object> object, Handle<Object> key) { |
1059 if (MigrateDeprecated(object)) { | 1057 if (MigrateDeprecated(object)) { |
1060 return Runtime::GetObjectPropertyOrFail(isolate(), object, key); | 1058 return Runtime::GetObjectPropertyOrFail(isolate(), object, key); |
1061 } | 1059 } |
1062 | 1060 |
1063 MaybeObject* maybe_object = NULL; | 1061 MaybeObject* maybe_object = NULL; |
1064 Handle<Code> stub = generic_stub(); | 1062 Handle<Code> stub = generic_stub(); |
1065 | 1063 |
1066 // Check for values that can be converted into an internalized string directly | 1064 // Check for non-string values that can be converted into an |
1067 // or is representable as a smi. | 1065 // internalized string directly or is representable as a smi. |
1068 key = TryConvertKey(key, isolate()); | 1066 key = TryConvertKey(key, isolate()); |
1069 | 1067 |
1070 if (key->IsInternalizedString()) { | 1068 if (key->IsInternalizedString()) { |
1071 maybe_object = LoadIC::Load(object, Handle<String>::cast(key)); | 1069 maybe_object = LoadIC::Load(object, Handle<String>::cast(key)); |
1072 if (maybe_object->IsFailure()) return maybe_object; | 1070 if (maybe_object->IsFailure()) return maybe_object; |
1073 } else if (FLAG_use_ic && !object->IsAccessCheckNeeded()) { | 1071 } else if (FLAG_use_ic && !object->IsAccessCheckNeeded()) { |
1074 ASSERT(!object->IsJSGlobalProxy()); | 1072 ASSERT(!object->IsJSGlobalProxy()); |
1075 if (object->IsString() && key->IsNumber()) { | 1073 if (object->IsString() && key->IsNumber()) { |
1076 if (state() == UNINITIALIZED) stub = string_stub(); | 1074 if (state() == UNINITIALIZED) stub = string_stub(); |
1077 } else if (object->IsJSObject()) { | 1075 } else if (object->IsJSObject()) { |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1653 if (MigrateDeprecated(object)) { | 1651 if (MigrateDeprecated(object)) { |
1654 Handle<Object> result = Runtime::SetObjectProperty(isolate(), object, | 1652 Handle<Object> result = Runtime::SetObjectProperty(isolate(), object, |
1655 key, | 1653 key, |
1656 value, | 1654 value, |
1657 NONE, | 1655 NONE, |
1658 strict_mode()); | 1656 strict_mode()); |
1659 RETURN_IF_EMPTY_HANDLE(isolate(), result); | 1657 RETURN_IF_EMPTY_HANDLE(isolate(), result); |
1660 return *result; | 1658 return *result; |
1661 } | 1659 } |
1662 | 1660 |
1663 // Check for values that can be converted into an internalized string directly | 1661 // Check for non-string values that can be converted into an |
1664 // or is representable as a smi. | 1662 // internalized string directly or is representable as a smi. |
1665 key = TryConvertKey(key, isolate()); | 1663 key = TryConvertKey(key, isolate()); |
1666 | 1664 |
1667 MaybeObject* maybe_object = NULL; | 1665 MaybeObject* maybe_object = NULL; |
1668 Handle<Code> stub = generic_stub(); | 1666 Handle<Code> stub = generic_stub(); |
1669 | 1667 |
1670 if (key->IsInternalizedString()) { | 1668 if (key->IsInternalizedString()) { |
1671 maybe_object = StoreIC::Store(object, | 1669 maybe_object = StoreIC::Store(object, |
1672 Handle<String>::cast(key), | 1670 Handle<String>::cast(key), |
1673 value, | 1671 value, |
1674 JSReceiver::MAY_BE_STORE_FROM_KEYED); | 1672 JSReceiver::MAY_BE_STORE_FROM_KEYED); |
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2817 #undef ADDR | 2815 #undef ADDR |
2818 }; | 2816 }; |
2819 | 2817 |
2820 | 2818 |
2821 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2819 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2822 return IC_utilities[id]; | 2820 return IC_utilities[id]; |
2823 } | 2821 } |
2824 | 2822 |
2825 | 2823 |
2826 } } // namespace v8::internal | 2824 } } // namespace v8::internal |
OLD | NEW |