| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 DCHECK(original_code->IsCode()); | 208 DCHECK(original_code->IsCode()); |
| 209 return original_code; | 209 return original_code; |
| 210 } | 210 } |
| 211 | 211 |
| 212 | 212 |
| 213 static void LookupForRead(LookupIterator* it) { | 213 static void LookupForRead(LookupIterator* it) { |
| 214 for (; it->IsFound(); it->Next()) { | 214 for (; it->IsFound(); it->Next()) { |
| 215 switch (it->state()) { | 215 switch (it->state()) { |
| 216 case LookupIterator::NOT_FOUND: | 216 case LookupIterator::NOT_FOUND: |
| 217 case LookupIterator::TRANSITION: | 217 case LookupIterator::TRANSITION: |
| 218 case LookupIterator::UNKNOWN: | |
| 219 UNREACHABLE(); | 218 UNREACHABLE(); |
| 220 case LookupIterator::JSPROXY: | 219 case LookupIterator::JSPROXY: |
| 221 return; | 220 return; |
| 222 case LookupIterator::INTERCEPTOR: { | 221 case LookupIterator::INTERCEPTOR: { |
| 223 // If there is a getter, return; otherwise loop to perform the lookup. | 222 // If there is a getter, return; otherwise loop to perform the lookup. |
| 224 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 223 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 225 if (!holder->GetNamedInterceptor()->getter()->IsUndefined()) { | 224 if (!holder->GetNamedInterceptor()->getter()->IsUndefined()) { |
| 226 return; | 225 return; |
| 227 } | 226 } |
| 228 break; | 227 break; |
| (...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1075 NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder, | 1074 NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder, |
| 1076 cache_holder); | 1075 cache_holder); |
| 1077 return compiler.CompileLoadConstant(lookup->name(), | 1076 return compiler.CompileLoadConstant(lookup->name(), |
| 1078 lookup->GetConstantIndex()); | 1077 lookup->GetConstantIndex()); |
| 1079 } | 1078 } |
| 1080 | 1079 |
| 1081 case LookupIterator::ACCESS_CHECK: | 1080 case LookupIterator::ACCESS_CHECK: |
| 1082 case LookupIterator::JSPROXY: | 1081 case LookupIterator::JSPROXY: |
| 1083 case LookupIterator::NOT_FOUND: | 1082 case LookupIterator::NOT_FOUND: |
| 1084 case LookupIterator::TRANSITION: | 1083 case LookupIterator::TRANSITION: |
| 1085 case LookupIterator::UNKNOWN: | |
| 1086 UNREACHABLE(); | 1084 UNREACHABLE(); |
| 1087 } | 1085 } |
| 1088 | 1086 |
| 1089 return slow_stub(); | 1087 return slow_stub(); |
| 1090 } | 1088 } |
| 1091 | 1089 |
| 1092 | 1090 |
| 1093 static Handle<Object> TryConvertKey(Handle<Object> key, Isolate* isolate) { | 1091 static Handle<Object> TryConvertKey(Handle<Object> key, Isolate* isolate) { |
| 1094 // This helper implements a few common fast cases for converting | 1092 // This helper implements a few common fast cases for converting |
| 1095 // non-smi keys of keyed loads/stores to a smi or a string. | 1093 // non-smi keys of keyed loads/stores to a smi or a string. |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1225 JSReceiver::StoreFromKeyed store_mode) { | 1223 JSReceiver::StoreFromKeyed store_mode) { |
| 1226 // Disable ICs for non-JSObjects for now. | 1224 // Disable ICs for non-JSObjects for now. |
| 1227 Handle<Object> receiver = it->GetReceiver(); | 1225 Handle<Object> receiver = it->GetReceiver(); |
| 1228 if (!receiver->IsJSObject()) return false; | 1226 if (!receiver->IsJSObject()) return false; |
| 1229 DCHECK(!Handle<JSObject>::cast(receiver)->map()->is_deprecated()); | 1227 DCHECK(!Handle<JSObject>::cast(receiver)->map()->is_deprecated()); |
| 1230 | 1228 |
| 1231 for (; it->IsFound(); it->Next()) { | 1229 for (; it->IsFound(); it->Next()) { |
| 1232 switch (it->state()) { | 1230 switch (it->state()) { |
| 1233 case LookupIterator::NOT_FOUND: | 1231 case LookupIterator::NOT_FOUND: |
| 1234 case LookupIterator::TRANSITION: | 1232 case LookupIterator::TRANSITION: |
| 1235 case LookupIterator::UNKNOWN: | |
| 1236 UNREACHABLE(); | 1233 UNREACHABLE(); |
| 1237 case LookupIterator::JSPROXY: | 1234 case LookupIterator::JSPROXY: |
| 1238 return false; | 1235 return false; |
| 1239 case LookupIterator::INTERCEPTOR: { | 1236 case LookupIterator::INTERCEPTOR: { |
| 1240 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 1237 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 1241 InterceptorInfo* info = holder->GetNamedInterceptor(); | 1238 InterceptorInfo* info = holder->GetNamedInterceptor(); |
| 1242 if (it->HolderIsReceiverOrHiddenPrototype()) { | 1239 if (it->HolderIsReceiverOrHiddenPrototype()) { |
| 1243 if (!info->setter()->IsUndefined()) return true; | 1240 if (!info->setter()->IsUndefined()) return true; |
| 1244 } else if (!info->getter()->IsUndefined() || | 1241 } else if (!info->getter()->IsUndefined() || |
| 1245 !info->query()->IsUndefined()) { | 1242 !info->query()->IsUndefined()) { |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 } | 1493 } |
| 1497 | 1494 |
| 1498 // -------------- Constant properties -------------- | 1495 // -------------- Constant properties -------------- |
| 1499 DCHECK(lookup->property_details().type() == CONSTANT); | 1496 DCHECK(lookup->property_details().type() == CONSTANT); |
| 1500 break; | 1497 break; |
| 1501 } | 1498 } |
| 1502 | 1499 |
| 1503 case LookupIterator::ACCESS_CHECK: | 1500 case LookupIterator::ACCESS_CHECK: |
| 1504 case LookupIterator::JSPROXY: | 1501 case LookupIterator::JSPROXY: |
| 1505 case LookupIterator::NOT_FOUND: | 1502 case LookupIterator::NOT_FOUND: |
| 1506 case LookupIterator::UNKNOWN: | |
| 1507 UNREACHABLE(); | 1503 UNREACHABLE(); |
| 1508 } | 1504 } |
| 1509 return slow_stub(); | 1505 return slow_stub(); |
| 1510 } | 1506 } |
| 1511 | 1507 |
| 1512 | 1508 |
| 1513 Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, | 1509 Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, |
| 1514 KeyedAccessStoreMode store_mode) { | 1510 KeyedAccessStoreMode store_mode) { |
| 1515 // Don't handle megamorphic property accesses for INTERCEPTORS or CALLBACKS | 1511 // Don't handle megamorphic property accesses for INTERCEPTORS or CALLBACKS |
| 1516 // via megamorphic stubs, since they don't have a map in their relocation info | 1512 // via megamorphic stubs, since they don't have a map in their relocation info |
| (...skipping 1688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3205 static const Address IC_utilities[] = { | 3201 static const Address IC_utilities[] = { |
| 3206 #define ADDR(name) FUNCTION_ADDR(name), | 3202 #define ADDR(name) FUNCTION_ADDR(name), |
| 3207 IC_UTIL_LIST(ADDR) NULL | 3203 IC_UTIL_LIST(ADDR) NULL |
| 3208 #undef ADDR | 3204 #undef ADDR |
| 3209 }; | 3205 }; |
| 3210 | 3206 |
| 3211 | 3207 |
| 3212 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; } | 3208 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; } |
| 3213 } | 3209 } |
| 3214 } // namespace v8::internal | 3210 } // namespace v8::internal |
| OLD | NEW |