| 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/ic/ic.h" | 5 #include "src/ic/ic.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api-arguments-inl.h" | 8 #include "src/api-arguments-inl.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 | 460 |
| 461 void LoadIC::Clear(Isolate* isolate, Code* host, LoadICNexus* nexus) { | 461 void LoadIC::Clear(Isolate* isolate, Code* host, LoadICNexus* nexus) { |
| 462 if (IsCleared(nexus)) return; | 462 if (IsCleared(nexus)) return; |
| 463 nexus->ConfigurePremonomorphic(); | 463 nexus->ConfigurePremonomorphic(); |
| 464 OnTypeFeedbackChanged(isolate, host); | 464 OnTypeFeedbackChanged(isolate, host); |
| 465 } | 465 } |
| 466 | 466 |
| 467 void LoadGlobalIC::Clear(Isolate* isolate, Code* host, | 467 void LoadGlobalIC::Clear(Isolate* isolate, Code* host, |
| 468 LoadGlobalICNexus* nexus) { | 468 LoadGlobalICNexus* nexus) { |
| 469 if (IsCleared(nexus)) return; | 469 if (IsCleared(nexus)) return; |
| 470 nexus->ConfigureUninitialized(); | 470 if (FLAG_new_load_global_ic) { |
| 471 nexus->ConfigureUninitialized(); |
| 472 } else { |
| 473 nexus->ConfigurePremonomorphic(); |
| 474 } |
| 471 OnTypeFeedbackChanged(isolate, host); | 475 OnTypeFeedbackChanged(isolate, host); |
| 472 } | 476 } |
| 473 | 477 |
| 474 void StoreIC::Clear(Isolate* isolate, Code* host, StoreICNexus* nexus) { | 478 void StoreIC::Clear(Isolate* isolate, Code* host, StoreICNexus* nexus) { |
| 475 if (IsCleared(nexus)) return; | 479 if (IsCleared(nexus)) return; |
| 476 nexus->ConfigurePremonomorphic(); | 480 nexus->ConfigurePremonomorphic(); |
| 477 OnTypeFeedbackChanged(isolate, host); | 481 OnTypeFeedbackChanged(isolate, host); |
| 478 } | 482 } |
| 479 | 483 |
| 480 | 484 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 546 |
| 543 | 547 |
| 544 void IC::ConfigureVectorState(Handle<Name> name, Handle<Map> map, | 548 void IC::ConfigureVectorState(Handle<Name> name, Handle<Map> map, |
| 545 Handle<Code> handler) { | 549 Handle<Code> handler) { |
| 546 DCHECK(UseVector()); | 550 DCHECK(UseVector()); |
| 547 if (kind() == Code::LOAD_IC) { | 551 if (kind() == Code::LOAD_IC) { |
| 548 LoadICNexus* nexus = casted_nexus<LoadICNexus>(); | 552 LoadICNexus* nexus = casted_nexus<LoadICNexus>(); |
| 549 nexus->ConfigureMonomorphic(map, handler); | 553 nexus->ConfigureMonomorphic(map, handler); |
| 550 } else if (kind() == Code::LOAD_GLOBAL_IC) { | 554 } else if (kind() == Code::LOAD_GLOBAL_IC) { |
| 551 LoadGlobalICNexus* nexus = casted_nexus<LoadGlobalICNexus>(); | 555 LoadGlobalICNexus* nexus = casted_nexus<LoadGlobalICNexus>(); |
| 552 nexus->ConfigureMonomorphic(map, handler); | 556 if (FLAG_new_load_global_ic) { |
| 557 nexus->ConfigureHandlerMode(handler); |
| 558 } else { |
| 559 nexus->ConfigureMonomorphic(map, handler); |
| 560 } |
| 553 } else if (kind() == Code::KEYED_LOAD_IC) { | 561 } else if (kind() == Code::KEYED_LOAD_IC) { |
| 554 KeyedLoadICNexus* nexus = casted_nexus<KeyedLoadICNexus>(); | 562 KeyedLoadICNexus* nexus = casted_nexus<KeyedLoadICNexus>(); |
| 555 nexus->ConfigureMonomorphic(name, map, handler); | 563 nexus->ConfigureMonomorphic(name, map, handler); |
| 556 } else if (kind() == Code::STORE_IC) { | 564 } else if (kind() == Code::STORE_IC) { |
| 557 StoreICNexus* nexus = casted_nexus<StoreICNexus>(); | 565 StoreICNexus* nexus = casted_nexus<StoreICNexus>(); |
| 558 nexus->ConfigureMonomorphic(map, handler); | 566 nexus->ConfigureMonomorphic(map, handler); |
| 559 } else { | 567 } else { |
| 560 DCHECK(kind() == Code::KEYED_STORE_IC); | 568 DCHECK(kind() == Code::KEYED_STORE_IC); |
| 561 KeyedStoreICNexus* nexus = casted_nexus<KeyedStoreICNexus>(); | 569 KeyedStoreICNexus* nexus = casted_nexus<KeyedStoreICNexus>(); |
| 562 nexus->ConfigureMonomorphic(name, map, handler); | 570 nexus->ConfigureMonomorphic(name, map, handler); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 !call_optimization.IsCompatibleReceiverMap(receiver_map, holder)) { | 915 !call_optimization.IsCompatibleReceiverMap(receiver_map, holder)) { |
| 908 return false; | 916 return false; |
| 909 } | 917 } |
| 910 } | 918 } |
| 911 } | 919 } |
| 912 return true; | 920 return true; |
| 913 } | 921 } |
| 914 | 922 |
| 915 | 923 |
| 916 void LoadIC::UpdateCaches(LookupIterator* lookup) { | 924 void LoadIC::UpdateCaches(LookupIterator* lookup) { |
| 917 if (state() == UNINITIALIZED) { | 925 if (state() == UNINITIALIZED && |
| 926 (!FLAG_new_load_global_ic || kind() != Code::LOAD_GLOBAL_IC)) { |
| 918 // This is the first time we execute this inline cache. Set the target to | 927 // This is the first time we execute this inline cache. Set the target to |
| 919 // the pre monomorphic stub to delay setting the monomorphic state. | 928 // the pre monomorphic stub to delay setting the monomorphic state. |
| 920 ConfigureVectorState(PREMONOMORPHIC, Handle<Object>()); | 929 ConfigureVectorState(PREMONOMORPHIC, Handle<Object>()); |
| 921 TRACE_IC("LoadIC", lookup->name()); | 930 TRACE_IC("LoadIC", lookup->name()); |
| 922 return; | 931 return; |
| 923 } | 932 } |
| 924 | 933 |
| 925 Handle<Code> code; | 934 Handle<Code> code; |
| 926 if (lookup->state() == LookupIterator::JSPROXY || | 935 if (lookup->state() == LookupIterator::JSPROXY || |
| 927 lookup->state() == LookupIterator::ACCESS_CHECK) { | 936 lookup->state() == LookupIterator::ACCESS_CHECK) { |
| 928 code = slow_stub(); | 937 code = slow_stub(); |
| 929 } else if (!lookup->IsFound()) { | 938 } else if (!lookup->IsFound()) { |
| 930 if (kind() == Code::LOAD_IC || kind() == Code::LOAD_GLOBAL_IC) { | 939 if (kind() == Code::LOAD_IC || kind() == Code::LOAD_GLOBAL_IC) { |
| 931 code = NamedLoadHandlerCompiler::ComputeLoadNonexistent(lookup->name(), | 940 code = NamedLoadHandlerCompiler::ComputeLoadNonexistent(lookup->name(), |
| 932 receiver_map()); | 941 receiver_map()); |
| 933 // TODO(jkummerow/verwaest): Introduce a builtin that handles this case. | 942 // TODO(jkummerow/verwaest): Introduce a builtin that handles this case. |
| 934 if (code.is_null()) code = slow_stub(); | 943 if (code.is_null()) code = slow_stub(); |
| 935 } else { | 944 } else { |
| 936 code = slow_stub(); | 945 code = slow_stub(); |
| 937 } | 946 } |
| 938 } else { | 947 } else { |
| 939 if (lookup->state() == LookupIterator::ACCESSOR) { | 948 if (FLAG_new_load_global_ic && kind() == Code::LOAD_GLOBAL_IC && |
| 949 lookup->state() == LookupIterator::DATA && |
| 950 lookup->GetHolder<Object>()->IsJSGlobalObject()) { |
| 951 #if DEBUG |
| 952 Handle<Object> holder = lookup->GetHolder<Object>(); |
| 953 Handle<Object> receiver = lookup->GetReceiver(); |
| 954 DCHECK_EQ(*receiver, *holder); |
| 955 #endif |
| 956 // Now update the cell in the feedback vector. |
| 957 LoadGlobalICNexus* nexus = casted_nexus<LoadGlobalICNexus>(); |
| 958 nexus->ConfigurePropertyCellMode(lookup->GetPropertyCell()); |
| 959 TRACE_IC("LoadGlobalIC", lookup->name()); |
| 960 return; |
| 961 } else if (lookup->state() == LookupIterator::ACCESSOR) { |
| 940 if (!IsCompatibleReceiver(lookup, receiver_map())) { | 962 if (!IsCompatibleReceiver(lookup, receiver_map())) { |
| 941 TRACE_GENERIC_IC(isolate(), "LoadIC", "incompatible receiver type"); | 963 TRACE_GENERIC_IC(isolate(), "LoadIC", "incompatible receiver type"); |
| 942 code = slow_stub(); | 964 code = slow_stub(); |
| 943 } | 965 } |
| 944 } else if (lookup->state() == LookupIterator::INTERCEPTOR) { | 966 } else if (lookup->state() == LookupIterator::INTERCEPTOR) { |
| 945 // Perform a lookup behind the interceptor. Copy the LookupIterator since | 967 // Perform a lookup behind the interceptor. Copy the LookupIterator since |
| 946 // the original iterator will be used to fetch the value. | 968 // the original iterator will be used to fetch the value. |
| 947 LookupIterator it = *lookup; | 969 LookupIterator it = *lookup; |
| 948 it.Next(); | 970 it.Next(); |
| 949 LookupForRead(&it); | 971 LookupForRead(&it); |
| (...skipping 2053 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3003 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 3025 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 3004 vector->GetKind(vector_slot)); | 3026 vector->GetKind(vector_slot)); |
| 3005 KeyedLoadICNexus nexus(vector, vector_slot); | 3027 KeyedLoadICNexus nexus(vector, vector_slot); |
| 3006 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3028 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 3007 ic.UpdateState(receiver, key); | 3029 ic.UpdateState(receiver, key); |
| 3008 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); | 3030 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 3009 } | 3031 } |
| 3010 } | 3032 } |
| 3011 } // namespace internal | 3033 } // namespace internal |
| 3012 } // namespace v8 | 3034 } // namespace v8 |
| OLD | NEW |