| 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 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 DCHECK(!GetSharedFunctionInfo()->HasDebugInfo()); | 1191 DCHECK(!GetSharedFunctionInfo()->HasDebugInfo()); |
| 1192 Handle<Object> getter(Handle<AccessorPair>::cast(accessors)->getter(), | 1192 Handle<Object> getter(Handle<AccessorPair>::cast(accessors)->getter(), |
| 1193 isolate()); | 1193 isolate()); |
| 1194 CallOptimization call_optimization(getter); | 1194 CallOptimization call_optimization(getter); |
| 1195 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); | 1195 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); |
| 1196 if (call_optimization.is_simple_api_call()) { | 1196 if (call_optimization.is_simple_api_call()) { |
| 1197 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback); | 1197 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback); |
| 1198 int index = lookup->GetAccessorIndex(); | 1198 int index = lookup->GetAccessorIndex(); |
| 1199 Handle<Code> code = compiler.CompileLoadCallback( | 1199 Handle<Code> code = compiler.CompileLoadCallback( |
| 1200 lookup->name(), call_optimization, index); | 1200 lookup->name(), call_optimization, index); |
| 1201 if (FLAG_runtime_call_stats) return slow_stub(); | |
| 1202 return code; | 1201 return code; |
| 1203 } | 1202 } |
| 1204 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadViaGetter); | 1203 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadViaGetter); |
| 1205 int expected_arguments = Handle<JSFunction>::cast(getter) | 1204 int expected_arguments = Handle<JSFunction>::cast(getter) |
| 1206 ->shared() | 1205 ->shared() |
| 1207 ->internal_formal_parameter_count(); | 1206 ->internal_formal_parameter_count(); |
| 1208 return compiler.CompileLoadViaGetter( | 1207 return compiler.CompileLoadViaGetter( |
| 1209 lookup->name(), lookup->GetAccessorIndex(), expected_arguments); | 1208 lookup->name(), lookup->GetAccessorIndex(), expected_arguments); |
| 1210 } else { | 1209 } else { |
| 1211 DCHECK(accessors->IsAccessorInfo()); | 1210 DCHECK(accessors->IsAccessorInfo()); |
| 1212 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); | 1211 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); |
| 1213 DCHECK(v8::ToCData<Address>(info->getter()) != nullptr); | 1212 DCHECK(v8::ToCData<Address>(info->getter()) != nullptr); |
| 1214 DCHECK(AccessorInfo::IsCompatibleReceiverMap(isolate(), info, map)); | 1213 DCHECK(AccessorInfo::IsCompatibleReceiverMap(isolate(), info, map)); |
| 1215 DCHECK(holder->HasFastProperties()); | 1214 DCHECK(holder->HasFastProperties()); |
| 1216 DCHECK(!receiver_is_holder); | 1215 DCHECK(!receiver_is_holder); |
| 1217 DCHECK(!info->is_sloppy() || receiver->IsJSReceiver()); | 1216 DCHECK(!info->is_sloppy() || receiver->IsJSReceiver()); |
| 1218 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback); | 1217 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback); |
| 1219 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); | 1218 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); |
| 1220 Handle<Code> code = compiler.CompileLoadCallback(lookup->name(), info); | 1219 Handle<Code> code = compiler.CompileLoadCallback(lookup->name(), info); |
| 1221 if (FLAG_runtime_call_stats) return slow_stub(); | |
| 1222 return code; | 1220 return code; |
| 1223 } | 1221 } |
| 1224 UNREACHABLE(); | 1222 UNREACHABLE(); |
| 1225 } | 1223 } |
| 1226 | 1224 |
| 1227 case LookupIterator::DATA: { | 1225 case LookupIterator::DATA: { |
| 1228 if (lookup->is_dictionary_holder()) { | 1226 if (lookup->is_dictionary_holder()) { |
| 1229 DCHECK(kind() == Code::LOAD_IC); | 1227 DCHECK(kind() == Code::LOAD_IC); |
| 1230 DCHECK(holder->IsJSGlobalObject()); | 1228 DCHECK(holder->IsJSGlobalObject()); |
| 1231 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobal); | 1229 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobal); |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1558 Handle<Code> code = stub.GetCode(); | 1556 Handle<Code> code = stub.GetCode(); |
| 1559 return code; | 1557 return code; |
| 1560 } | 1558 } |
| 1561 | 1559 |
| 1562 Handle<Code> StoreIC::initialize_stub_in_optimized_code( | 1560 Handle<Code> StoreIC::initialize_stub_in_optimized_code( |
| 1563 Isolate* isolate, LanguageMode language_mode) { | 1561 Isolate* isolate, LanguageMode language_mode) { |
| 1564 VectorStoreICStub stub(isolate, StoreICState(language_mode)); | 1562 VectorStoreICStub stub(isolate, StoreICState(language_mode)); |
| 1565 return stub.GetCode(); | 1563 return stub.GetCode(); |
| 1566 } | 1564 } |
| 1567 | 1565 |
| 1568 Handle<Code> StoreIC::slow_stub() const { | |
| 1569 return isolate()->builtins()->StoreIC_Slow(); | |
| 1570 } | |
| 1571 | |
| 1572 | |
| 1573 void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, | 1566 void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, |
| 1574 JSReceiver::StoreFromKeyed store_mode) { | 1567 JSReceiver::StoreFromKeyed store_mode) { |
| 1575 if (state() == UNINITIALIZED) { | 1568 if (state() == UNINITIALIZED) { |
| 1576 // This is the first time we execute this inline cache. Set the target to | 1569 // This is the first time we execute this inline cache. Set the target to |
| 1577 // the pre monomorphic stub to delay setting the monomorphic state. | 1570 // the pre monomorphic stub to delay setting the monomorphic state. |
| 1578 ConfigureVectorState(PREMONOMORPHIC, Handle<Object>()); | 1571 ConfigureVectorState(PREMONOMORPHIC, Handle<Object>()); |
| 1579 TRACE_IC("StoreIC", lookup->name()); | 1572 TRACE_IC("StoreIC", lookup->name()); |
| 1580 return; | 1573 return; |
| 1581 } | 1574 } |
| 1582 | 1575 |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 DCHECK(v8::ToCData<Address>(info->setter()) != 0); | 1774 DCHECK(v8::ToCData<Address>(info->setter()) != 0); |
| 1782 DCHECK(!AccessorInfo::cast(*accessors)->is_special_data_property() || | 1775 DCHECK(!AccessorInfo::cast(*accessors)->is_special_data_property() || |
| 1783 lookup->HolderIsReceiverOrHiddenPrototype()); | 1776 lookup->HolderIsReceiverOrHiddenPrototype()); |
| 1784 DCHECK(AccessorInfo::IsCompatibleReceiverMap(isolate(), info, | 1777 DCHECK(AccessorInfo::IsCompatibleReceiverMap(isolate(), info, |
| 1785 receiver_map())); | 1778 receiver_map())); |
| 1786 DCHECK(!info->is_sloppy() || receiver->IsJSReceiver()); | 1779 DCHECK(!info->is_sloppy() || receiver->IsJSReceiver()); |
| 1787 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreCallback); | 1780 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreCallback); |
| 1788 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); | 1781 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); |
| 1789 Handle<Code> code = compiler.CompileStoreCallback( | 1782 Handle<Code> code = compiler.CompileStoreCallback( |
| 1790 receiver, lookup->name(), info, language_mode()); | 1783 receiver, lookup->name(), info, language_mode()); |
| 1791 if (FLAG_runtime_call_stats) return slow_stub(); | |
| 1792 return code; | 1784 return code; |
| 1793 } else { | 1785 } else { |
| 1794 DCHECK(accessors->IsAccessorPair()); | 1786 DCHECK(accessors->IsAccessorPair()); |
| 1795 Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(), | 1787 Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(), |
| 1796 isolate()); | 1788 isolate()); |
| 1797 DCHECK(setter->IsJSFunction() || setter->IsFunctionTemplateInfo()); | 1789 DCHECK(setter->IsJSFunction() || setter->IsFunctionTemplateInfo()); |
| 1798 CallOptimization call_optimization(setter); | 1790 CallOptimization call_optimization(setter); |
| 1799 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); | 1791 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); |
| 1800 if (call_optimization.is_simple_api_call()) { | 1792 if (call_optimization.is_simple_api_call()) { |
| 1801 DCHECK(call_optimization.IsCompatibleReceiver(receiver, holder)); | 1793 DCHECK(call_optimization.IsCompatibleReceiver(receiver, holder)); |
| 1802 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreCallback); | 1794 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreCallback); |
| 1803 Handle<Code> code = compiler.CompileStoreCallback( | 1795 Handle<Code> code = compiler.CompileStoreCallback( |
| 1804 receiver, lookup->name(), call_optimization, | 1796 receiver, lookup->name(), call_optimization, |
| 1805 lookup->GetAccessorIndex()); | 1797 lookup->GetAccessorIndex()); |
| 1806 if (FLAG_runtime_call_stats) return slow_stub(); | |
| 1807 return code; | 1798 return code; |
| 1808 } | 1799 } |
| 1809 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreViaSetter); | 1800 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreViaSetter); |
| 1810 int expected_arguments = JSFunction::cast(*setter) | 1801 int expected_arguments = JSFunction::cast(*setter) |
| 1811 ->shared() | 1802 ->shared() |
| 1812 ->internal_formal_parameter_count(); | 1803 ->internal_formal_parameter_count(); |
| 1813 return compiler.CompileStoreViaSetter(receiver, lookup->name(), | 1804 return compiler.CompileStoreViaSetter(receiver, lookup->name(), |
| 1814 lookup->GetAccessorIndex(), | 1805 lookup->GetAccessorIndex(), |
| 1815 expected_arguments); | 1806 expected_arguments); |
| 1816 } | 1807 } |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2736 | 2727 |
| 2737 RUNTIME_FUNCTION(Runtime_StoreCallbackProperty) { | 2728 RUNTIME_FUNCTION(Runtime_StoreCallbackProperty) { |
| 2738 Handle<JSObject> receiver = args.at<JSObject>(0); | 2729 Handle<JSObject> receiver = args.at<JSObject>(0); |
| 2739 Handle<JSObject> holder = args.at<JSObject>(1); | 2730 Handle<JSObject> holder = args.at<JSObject>(1); |
| 2740 Handle<HeapObject> callback_or_cell = args.at<HeapObject>(2); | 2731 Handle<HeapObject> callback_or_cell = args.at<HeapObject>(2); |
| 2741 Handle<Name> name = args.at<Name>(3); | 2732 Handle<Name> name = args.at<Name>(3); |
| 2742 Handle<Object> value = args.at<Object>(4); | 2733 Handle<Object> value = args.at<Object>(4); |
| 2743 CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 5); | 2734 CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 5); |
| 2744 HandleScope scope(isolate); | 2735 HandleScope scope(isolate); |
| 2745 | 2736 |
| 2737 if (FLAG_runtime_call_stats) { |
| 2738 RETURN_RESULT_OR_FAILURE( |
| 2739 isolate, Runtime::SetObjectProperty(isolate, receiver, name, value, |
| 2740 language_mode)); |
| 2741 } |
| 2742 |
| 2746 Handle<AccessorInfo> callback( | 2743 Handle<AccessorInfo> callback( |
| 2747 callback_or_cell->IsWeakCell() | 2744 callback_or_cell->IsWeakCell() |
| 2748 ? AccessorInfo::cast(WeakCell::cast(*callback_or_cell)->value()) | 2745 ? AccessorInfo::cast(WeakCell::cast(*callback_or_cell)->value()) |
| 2749 : AccessorInfo::cast(*callback_or_cell)); | 2746 : AccessorInfo::cast(*callback_or_cell)); |
| 2750 | 2747 |
| 2751 DCHECK(callback->IsCompatibleReceiver(*receiver)); | 2748 DCHECK(callback->IsCompatibleReceiver(*receiver)); |
| 2752 | 2749 |
| 2753 Address setter_address = v8::ToCData<Address>(callback->setter()); | 2750 Address setter_address = v8::ToCData<Address>(callback->setter()); |
| 2754 v8::AccessorNameSetterCallback fun = | 2751 v8::AccessorNameSetterCallback fun = |
| 2755 FUNCTION_CAST<v8::AccessorNameSetterCallback>(setter_address); | 2752 FUNCTION_CAST<v8::AccessorNameSetterCallback>(setter_address); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2951 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 2948 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 2952 vector->GetKind(vector_slot)); | 2949 vector->GetKind(vector_slot)); |
| 2953 KeyedLoadICNexus nexus(vector, vector_slot); | 2950 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2954 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2951 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2955 ic.UpdateState(receiver, key); | 2952 ic.UpdateState(receiver, key); |
| 2956 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); | 2953 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2957 } | 2954 } |
| 2958 } | 2955 } |
| 2959 } // namespace internal | 2956 } // namespace internal |
| 2960 } // namespace v8 | 2957 } // namespace v8 |
| OLD | NEW |