Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: src/ic/ic.cc

Issue 1973513002: Interceptors expect the receiver to always be an JSReceiver. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.h" 8 #include "src/api.h"
9 #include "src/api-arguments.h" 9 #include "src/api-arguments.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 1006 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 TRACE_HANDLER_STATS(isolate(), LoadIC_FunctionPrototypeStub); 1017 TRACE_HANDLER_STATS(isolate(), LoadIC_FunctionPrototypeStub);
1018 FunctionPrototypeStub function_prototype_stub(isolate()); 1018 FunctionPrototypeStub function_prototype_stub(isolate());
1019 return function_prototype_stub.GetCode(); 1019 return function_prototype_stub.GetCode();
1020 } 1020 }
1021 1021
1022 Handle<Map> map = receiver_map(); 1022 Handle<Map> map = receiver_map();
1023 Handle<JSObject> holder = lookup->GetHolder<JSObject>(); 1023 Handle<JSObject> holder = lookup->GetHolder<JSObject>();
1024 bool receiver_is_holder = receiver.is_identical_to(holder); 1024 bool receiver_is_holder = receiver.is_identical_to(holder);
1025 switch (lookup->state()) { 1025 switch (lookup->state()) {
1026 case LookupIterator::INTERCEPTOR: { 1026 case LookupIterator::INTERCEPTOR: {
1027 if (!receiver->IsJSReceiver()) break;
Toon Verwaest 2016/05/11 14:19:36 This shouldn't be necessary given your change belo
1027 DCHECK(!holder->GetNamedInterceptor()->getter()->IsUndefined()); 1028 DCHECK(!holder->GetNamedInterceptor()->getter()->IsUndefined());
1028 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptor); 1029 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptor);
1029 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); 1030 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder);
1030 // Perform a lookup behind the interceptor. Copy the LookupIterator since 1031 // Perform a lookup behind the interceptor. Copy the LookupIterator since
1031 // the original iterator will be used to fetch the value. 1032 // the original iterator will be used to fetch the value.
1032 LookupIterator it = *lookup; 1033 LookupIterator it = *lookup;
1033 it.Next(); 1034 it.Next();
1034 LookupForRead(&it); 1035 LookupForRead(&it);
1035 return compiler.CompileLoadInterceptor(&it); 1036 return compiler.CompileLoadInterceptor(&it);
1036 } 1037 }
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 break; 1545 break;
1545 } 1546 }
1546 1547
1547 DCHECK(lookup->IsCacheableTransition()); 1548 DCHECK(lookup->IsCacheableTransition());
1548 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreTransition); 1549 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreTransition);
1549 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); 1550 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder);
1550 return compiler.CompileStoreTransition(transition, lookup->name()); 1551 return compiler.CompileStoreTransition(transition, lookup->name());
1551 } 1552 }
1552 1553
1553 case LookupIterator::INTERCEPTOR: { 1554 case LookupIterator::INTERCEPTOR: {
1555 DCHECK(receiver->IsJSReceiver());
1554 DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined()); 1556 DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined());
1555 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub); 1557 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub);
1556 StoreInterceptorStub stub(isolate()); 1558 StoreInterceptorStub stub(isolate());
1557 return stub.GetCode(); 1559 return stub.GetCode();
1558 } 1560 }
1559 1561
1560 case LookupIterator::ACCESSOR: { 1562 case LookupIterator::ACCESSOR: {
1561 if (!holder->HasFastProperties()) { 1563 if (!holder->HasFastProperties()) {
1562 TRACE_GENERIC_IC(isolate(), "StoreIC", "accessor on slow map"); 1564 TRACE_GENERIC_IC(isolate(), "StoreIC", "accessor on slow map");
1563 break; 1565 break;
(...skipping 1044 matching lines...) Expand 10 before | Expand all | Expand 10 after
2608 * Attempts to load a property with an interceptor (which must be present), 2610 * Attempts to load a property with an interceptor (which must be present),
2609 * but doesn't search the prototype chain. 2611 * but doesn't search the prototype chain.
2610 * 2612 *
2611 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't 2613 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't
2612 * provide any value for the given name. 2614 * provide any value for the given name.
2613 */ 2615 */
2614 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { 2616 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) {
2615 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); 2617 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength);
2616 Handle<Name> name = 2618 Handle<Name> name =
2617 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); 2619 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex);
2618 Handle<JSObject> receiver = 2620 Handle<Object> receiver =
2619 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); 2621 args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex);
2620 Handle<JSObject> holder = 2622 Handle<JSObject> holder =
2621 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); 2623 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex);
2622 HandleScope scope(isolate); 2624 HandleScope scope(isolate);
2623 2625
2626 if (!receiver->IsJSReceiver()) {
2627 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2628 isolate, receiver, Object::ConvertReceiver(isolate, receiver));
2629 }
2630
2624 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); 2631 InterceptorInfo* interceptor = holder->GetNamedInterceptor();
2625 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, 2632 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver,
2626 *holder, Object::DONT_THROW); 2633 *holder, Object::DONT_THROW);
2627 2634
2628 v8::GenericNamedPropertyGetterCallback getter = 2635 v8::GenericNamedPropertyGetterCallback getter =
2629 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( 2636 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
2630 interceptor->getter()); 2637 interceptor->getter());
2631 Handle<Object> result = arguments.Call(getter, name); 2638 Handle<Object> result = arguments.Call(getter, name);
2632 2639
2633 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 2640 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
2634 2641
2635 if (!result.is_null()) return *result; 2642 if (!result.is_null()) return *result;
2636 return isolate->heap()->no_interceptor_result_sentinel(); 2643 return isolate->heap()->no_interceptor_result_sentinel();
2637 } 2644 }
2638 2645
2639 2646
2640 /** 2647 /**
2641 * Loads a property with an interceptor performing post interceptor 2648 * Loads a property with an interceptor performing post interceptor
2642 * lookup if interceptor failed. 2649 * lookup if interceptor failed.
2643 */ 2650 */
2644 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { 2651 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) {
2645 HandleScope scope(isolate); 2652 HandleScope scope(isolate);
2646 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); 2653 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength);
2647 Handle<Name> name = 2654 Handle<Name> name =
2648 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); 2655 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex);
2649 Handle<JSObject> receiver = 2656 Handle<Object> receiver =
2650 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); 2657 args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex);
2651 Handle<JSObject> holder = 2658 Handle<JSObject> holder =
2652 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); 2659 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex);
2653 2660
2661 if (!receiver->IsJSReceiver()) {
2662 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2663 isolate, receiver, Object::ConvertReceiver(isolate, receiver));
2664 }
2665
2654 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); 2666 InterceptorInfo* interceptor = holder->GetNamedInterceptor();
2655 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, 2667 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver,
2656 *holder, Object::DONT_THROW); 2668 *holder, Object::DONT_THROW);
2657 2669
2658 v8::GenericNamedPropertyGetterCallback getter = 2670 v8::GenericNamedPropertyGetterCallback getter =
2659 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( 2671 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
2660 interceptor->getter()); 2672 interceptor->getter());
2661 Handle<Object> result = arguments.Call(getter, name); 2673 Handle<Object> result = arguments.Call(getter, name);
2662 2674
2663 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 2675 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2783 KeyedLoadICNexus nexus(vector, vector_slot); 2795 KeyedLoadICNexus nexus(vector, vector_slot);
2784 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2796 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2785 ic.UpdateState(receiver, key); 2797 ic.UpdateState(receiver, key);
2786 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 2798 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
2787 } 2799 }
2788 2800
2789 return *result; 2801 return *result;
2790 } 2802 }
2791 } // namespace internal 2803 } // namespace internal
2792 } // namespace v8 2804 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698