| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 PatchInlinedStore(address, Heap::fixed_array_map()); | 347 PatchInlinedStore(address, Heap::fixed_array_map()); |
| 348 } | 348 } |
| 349 | 349 |
| 350 | 350 |
| 351 void KeyedStoreIC::Clear(Address address, Code* target) { | 351 void KeyedStoreIC::Clear(Address address, Code* target) { |
| 352 if (target->ic_state() == UNINITIALIZED) return; | 352 if (target->ic_state() == UNINITIALIZED) return; |
| 353 SetTargetAtAddress(address, initialize_stub()); | 353 SetTargetAtAddress(address, initialize_stub()); |
| 354 } | 354 } |
| 355 | 355 |
| 356 | 356 |
| 357 Code* KeyedLoadIC::external_array_stub(JSObject::ElementsKind elements_kind) { | |
| 358 switch (elements_kind) { | |
| 359 case JSObject::EXTERNAL_BYTE_ELEMENTS: | |
| 360 return Builtins::builtin(Builtins::KeyedLoadIC_ExternalByteArray); | |
| 361 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | |
| 362 return Builtins::builtin(Builtins::KeyedLoadIC_ExternalUnsignedByteArray); | |
| 363 case JSObject::EXTERNAL_SHORT_ELEMENTS: | |
| 364 return Builtins::builtin(Builtins::KeyedLoadIC_ExternalShortArray); | |
| 365 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | |
| 366 return Builtins::builtin( | |
| 367 Builtins::KeyedLoadIC_ExternalUnsignedShortArray); | |
| 368 case JSObject::EXTERNAL_INT_ELEMENTS: | |
| 369 return Builtins::builtin(Builtins::KeyedLoadIC_ExternalIntArray); | |
| 370 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | |
| 371 return Builtins::builtin(Builtins::KeyedLoadIC_ExternalUnsignedIntArray); | |
| 372 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | |
| 373 return Builtins::builtin(Builtins::KeyedLoadIC_ExternalFloatArray); | |
| 374 default: | |
| 375 UNREACHABLE(); | |
| 376 return NULL; | |
| 377 } | |
| 378 } | |
| 379 | |
| 380 | |
| 381 Code* KeyedStoreIC::external_array_stub(JSObject::ElementsKind elements_kind) { | |
| 382 switch (elements_kind) { | |
| 383 case JSObject::EXTERNAL_BYTE_ELEMENTS: | |
| 384 return Builtins::builtin(Builtins::KeyedStoreIC_ExternalByteArray); | |
| 385 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | |
| 386 return Builtins::builtin( | |
| 387 Builtins::KeyedStoreIC_ExternalUnsignedByteArray); | |
| 388 case JSObject::EXTERNAL_SHORT_ELEMENTS: | |
| 389 return Builtins::builtin(Builtins::KeyedStoreIC_ExternalShortArray); | |
| 390 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | |
| 391 return Builtins::builtin( | |
| 392 Builtins::KeyedStoreIC_ExternalUnsignedShortArray); | |
| 393 case JSObject::EXTERNAL_INT_ELEMENTS: | |
| 394 return Builtins::builtin(Builtins::KeyedStoreIC_ExternalIntArray); | |
| 395 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | |
| 396 return Builtins::builtin(Builtins::KeyedStoreIC_ExternalUnsignedIntArray); | |
| 397 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | |
| 398 return Builtins::builtin(Builtins::KeyedStoreIC_ExternalFloatArray); | |
| 399 default: | |
| 400 UNREACHABLE(); | |
| 401 return NULL; | |
| 402 } | |
| 403 } | |
| 404 | |
| 405 | |
| 406 static bool HasInterceptorGetter(JSObject* object) { | 357 static bool HasInterceptorGetter(JSObject* object) { |
| 407 return !object->GetNamedInterceptor()->getter()->IsUndefined(); | 358 return !object->GetNamedInterceptor()->getter()->IsUndefined(); |
| 408 } | 359 } |
| 409 | 360 |
| 410 | 361 |
| 411 static void LookupForRead(Object* object, | 362 static void LookupForRead(Object* object, |
| 412 String* name, | 363 String* name, |
| 413 LookupResult* lookup) { | 364 LookupResult* lookup) { |
| 414 AssertNoAllocation no_gc; // pointers must stay valid | 365 AssertNoAllocation no_gc; // pointers must stay valid |
| 415 | 366 |
| (...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 // the global object). | 1080 // the global object). |
| 1130 bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded(); | 1081 bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded(); |
| 1131 | 1082 |
| 1132 if (use_ic) { | 1083 if (use_ic) { |
| 1133 Code* stub = generic_stub(); | 1084 Code* stub = generic_stub(); |
| 1134 if (object->IsString() && key->IsNumber()) { | 1085 if (object->IsString() && key->IsNumber()) { |
| 1135 stub = string_stub(); | 1086 stub = string_stub(); |
| 1136 } else if (object->IsJSObject()) { | 1087 } else if (object->IsJSObject()) { |
| 1137 Handle<JSObject> receiver = Handle<JSObject>::cast(object); | 1088 Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
| 1138 if (receiver->HasExternalArrayElements()) { | 1089 if (receiver->HasExternalArrayElements()) { |
| 1139 stub = external_array_stub(receiver->GetElementsKind()); | 1090 MaybeObject* probe = |
| 1091 StubCache::ComputeKeyedLoadOrStoreExternalArray(*receiver, false); |
| 1092 stub = |
| 1093 probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); |
| 1140 } else if (receiver->HasIndexedInterceptor()) { | 1094 } else if (receiver->HasIndexedInterceptor()) { |
| 1141 stub = indexed_interceptor_stub(); | 1095 stub = indexed_interceptor_stub(); |
| 1142 } else if (state == UNINITIALIZED && | 1096 } else if (state == UNINITIALIZED && |
| 1143 key->IsSmi() && | 1097 key->IsSmi() && |
| 1144 receiver->map()->has_fast_elements()) { | 1098 receiver->map()->has_fast_elements()) { |
| 1145 MaybeObject* probe = StubCache::ComputeKeyedLoadSpecialized(*receiver); | 1099 MaybeObject* probe = StubCache::ComputeKeyedLoadSpecialized(*receiver); |
| 1146 stub = | 1100 stub = |
| 1147 probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); | 1101 probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); |
| 1148 } | 1102 } |
| 1149 } | 1103 } |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1522 // Do not use ICs for objects that require access checks (including | 1476 // Do not use ICs for objects that require access checks (including |
| 1523 // the global object). | 1477 // the global object). |
| 1524 bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded(); | 1478 bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded(); |
| 1525 ASSERT(!(use_ic && object->IsJSGlobalProxy())); | 1479 ASSERT(!(use_ic && object->IsJSGlobalProxy())); |
| 1526 | 1480 |
| 1527 if (use_ic) { | 1481 if (use_ic) { |
| 1528 Code* stub = generic_stub(); | 1482 Code* stub = generic_stub(); |
| 1529 if (object->IsJSObject()) { | 1483 if (object->IsJSObject()) { |
| 1530 Handle<JSObject> receiver = Handle<JSObject>::cast(object); | 1484 Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
| 1531 if (receiver->HasExternalArrayElements()) { | 1485 if (receiver->HasExternalArrayElements()) { |
| 1532 stub = external_array_stub(receiver->GetElementsKind()); | 1486 MaybeObject* probe = |
| 1487 StubCache::ComputeKeyedLoadOrStoreExternalArray(*receiver, true); |
| 1488 stub = |
| 1489 probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); |
| 1533 } else if (state == UNINITIALIZED && | 1490 } else if (state == UNINITIALIZED && |
| 1534 key->IsSmi() && | 1491 key->IsSmi() && |
| 1535 receiver->map()->has_fast_elements()) { | 1492 receiver->map()->has_fast_elements()) { |
| 1536 MaybeObject* probe = StubCache::ComputeKeyedStoreSpecialized(*receiver); | 1493 MaybeObject* probe = StubCache::ComputeKeyedStoreSpecialized(*receiver); |
| 1537 stub = | 1494 stub = |
| 1538 probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); | 1495 probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); |
| 1539 } | 1496 } |
| 1540 } | 1497 } |
| 1541 if (stub != NULL) set_target(stub); | 1498 if (stub != NULL) set_target(stub); |
| 1542 } | 1499 } |
| (...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2164 #undef ADDR | 2121 #undef ADDR |
| 2165 }; | 2122 }; |
| 2166 | 2123 |
| 2167 | 2124 |
| 2168 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2125 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 2169 return IC_utilities[id]; | 2126 return IC_utilities[id]; |
| 2170 } | 2127 } |
| 2171 | 2128 |
| 2172 | 2129 |
| 2173 } } // namespace v8::internal | 2130 } } // namespace v8::internal |
| OLD | NEW |