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

Side by Side Diff: src/objects.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: updates 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 | « src/ic/ic.cc ('k') | test/cctest/test-accessors.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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 4092 matching lines...) Expand 10 before | Expand all | Expand 10 after
4103 // Make sure that the top context does not change when doing callbacks or 4103 // Make sure that the top context does not change when doing callbacks or
4104 // interceptor calls. 4104 // interceptor calls.
4105 AssertNoContextChange ncc(isolate); 4105 AssertNoContextChange ncc(isolate);
4106 4106
4107 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 4107 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
4108 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); 4108 Handle<InterceptorInfo> interceptor(it->GetInterceptor());
4109 if (interceptor->setter()->IsUndefined()) return Just(false); 4109 if (interceptor->setter()->IsUndefined()) return Just(false);
4110 4110
4111 Handle<JSObject> holder = it->GetHolder<JSObject>(); 4111 Handle<JSObject> holder = it->GetHolder<JSObject>();
4112 bool result; 4112 bool result;
4113 PropertyCallbackArguments args(isolate, interceptor->data(), 4113 Handle<Object> receiver = it->GetReceiver();
4114 *it->GetReceiver(), *holder, should_throw); 4114 if (!receiver->IsJSReceiver()) {
4115 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver,
4116 Object::ConvertReceiver(isolate, receiver),
4117 Nothing<bool>());
4118 }
4119 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver,
4120 *holder, should_throw);
4115 4121
4116 if (it->IsElement()) { 4122 if (it->IsElement()) {
4117 uint32_t index = it->index(); 4123 uint32_t index = it->index();
4118 v8::IndexedPropertySetterCallback setter = 4124 v8::IndexedPropertySetterCallback setter =
4119 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); 4125 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter());
4120 // TODO(neis): In the future, we may want to actually return the 4126 // TODO(neis): In the future, we may want to actually return the
4121 // interceptor's result, which then should be a boolean. 4127 // interceptor's result, which then should be a boolean.
4122 result = !args.Call(setter, index, value).is_null(); 4128 result = !args.Call(setter, index, value).is_null();
4123 } else { 4129 } else {
4124 Handle<Name> name = it->name(); 4130 Handle<Name> name = it->name();
(...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after
5386 // callbacks or interceptor calls. 5392 // callbacks or interceptor calls.
5387 AssertNoContextChange ncc(isolate); 5393 AssertNoContextChange ncc(isolate);
5388 HandleScope scope(isolate); 5394 HandleScope scope(isolate);
5389 5395
5390 Handle<JSObject> holder = it->GetHolder<JSObject>(); 5396 Handle<JSObject> holder = it->GetHolder<JSObject>();
5391 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); 5397 Handle<InterceptorInfo> interceptor(it->GetInterceptor());
5392 if (!it->IsElement() && it->name()->IsSymbol() && 5398 if (!it->IsElement() && it->name()->IsSymbol() &&
5393 !interceptor->can_intercept_symbols()) { 5399 !interceptor->can_intercept_symbols()) {
5394 return Just(ABSENT); 5400 return Just(ABSENT);
5395 } 5401 }
5396 PropertyCallbackArguments args(isolate, interceptor->data(), 5402 Handle<Object> receiver = it->GetReceiver();
5397 *it->GetReceiver(), *holder, 5403 if (!receiver->IsJSReceiver()) {
5398 Object::DONT_THROW); 5404 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver,
5405 Object::ConvertReceiver(isolate, receiver),
5406 Nothing<PropertyAttributes>());
5407 }
5408 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver,
5409 *holder, Object::DONT_THROW);
5399 if (!interceptor->query()->IsUndefined()) { 5410 if (!interceptor->query()->IsUndefined()) {
5400 Handle<Object> result; 5411 Handle<Object> result;
5401 if (it->IsElement()) { 5412 if (it->IsElement()) {
5402 uint32_t index = it->index(); 5413 uint32_t index = it->index();
5403 v8::IndexedPropertyQueryCallback query = 5414 v8::IndexedPropertyQueryCallback query =
5404 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); 5415 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query());
5405 result = args.Call(query, index); 5416 result = args.Call(query, index);
5406 } else { 5417 } else {
5407 Handle<Name> name = it->name(); 5418 Handle<Name> name = it->name();
5408 DCHECK(!name->IsPrivate()); 5419 DCHECK(!name->IsPrivate());
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
5832 Isolate* isolate = it->isolate(); 5843 Isolate* isolate = it->isolate();
5833 // Make sure that the top context does not change when doing callbacks or 5844 // Make sure that the top context does not change when doing callbacks or
5834 // interceptor calls. 5845 // interceptor calls.
5835 AssertNoContextChange ncc(isolate); 5846 AssertNoContextChange ncc(isolate);
5836 5847
5837 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 5848 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
5838 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); 5849 Handle<InterceptorInfo> interceptor(it->GetInterceptor());
5839 if (interceptor->deleter()->IsUndefined()) return Nothing<bool>(); 5850 if (interceptor->deleter()->IsUndefined()) return Nothing<bool>();
5840 5851
5841 Handle<JSObject> holder = it->GetHolder<JSObject>(); 5852 Handle<JSObject> holder = it->GetHolder<JSObject>();
5853 Handle<Object> receiver = it->GetReceiver();
5854 if (!receiver->IsJSReceiver()) {
5855 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver,
5856 Object::ConvertReceiver(isolate, receiver),
5857 Nothing<bool>());
5858 }
5842 5859
5843 PropertyCallbackArguments args(isolate, interceptor->data(), 5860 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver,
5844 *it->GetReceiver(), *holder, should_throw); 5861 *holder, should_throw);
5845 Handle<Object> result; 5862 Handle<Object> result;
5846 if (it->IsElement()) { 5863 if (it->IsElement()) {
5847 uint32_t index = it->index(); 5864 uint32_t index = it->index();
5848 v8::IndexedPropertyDeleterCallback deleter = 5865 v8::IndexedPropertyDeleterCallback deleter =
5849 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); 5866 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter());
5850 result = args.Call(deleter, index); 5867 result = args.Call(deleter, index);
5851 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { 5868 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) {
5852 return Nothing<bool>(); 5869 return Nothing<bool>();
5853 } else { 5870 } else {
5854 Handle<Name> name = it->name(); 5871 Handle<Name> name = it->name();
(...skipping 9084 matching lines...) Expand 10 before | Expand all | Expand 10 after
14939 AssertNoContextChange ncc(isolate); 14956 AssertNoContextChange ncc(isolate);
14940 14957
14941 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 14958 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
14942 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); 14959 Handle<InterceptorInfo> interceptor = it->GetInterceptor();
14943 if (interceptor->getter()->IsUndefined()) { 14960 if (interceptor->getter()->IsUndefined()) {
14944 return isolate->factory()->undefined_value(); 14961 return isolate->factory()->undefined_value();
14945 } 14962 }
14946 14963
14947 Handle<JSObject> holder = it->GetHolder<JSObject>(); 14964 Handle<JSObject> holder = it->GetHolder<JSObject>();
14948 Handle<Object> result; 14965 Handle<Object> result;
14949 PropertyCallbackArguments args(isolate, interceptor->data(), 14966 Handle<Object> receiver = it->GetReceiver();
14950 *it->GetReceiver(), *holder, 14967 if (!receiver->IsJSReceiver()) {
14951 Object::DONT_THROW); 14968 ASSIGN_RETURN_ON_EXCEPTION(
14969 isolate, receiver, Object::ConvertReceiver(isolate, receiver), Object);
14970 }
14971 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver,
14972 *holder, Object::DONT_THROW);
14952 14973
14953 if (it->IsElement()) { 14974 if (it->IsElement()) {
14954 uint32_t index = it->index(); 14975 uint32_t index = it->index();
14955 v8::IndexedPropertyGetterCallback getter = 14976 v8::IndexedPropertyGetterCallback getter =
14956 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); 14977 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter());
14957 result = args.Call(getter, index); 14978 result = args.Call(getter, index);
14958 } else { 14979 } else {
14959 Handle<Name> name = it->name(); 14980 Handle<Name> name = it->name();
14960 DCHECK(!name->IsPrivate()); 14981 DCHECK(!name->IsPrivate());
14961 14982
(...skipping 3311 matching lines...) Expand 10 before | Expand all | Expand 10 after
18273 if (cell->value() != *new_value) { 18294 if (cell->value() != *new_value) {
18274 cell->set_value(*new_value); 18295 cell->set_value(*new_value);
18275 Isolate* isolate = cell->GetIsolate(); 18296 Isolate* isolate = cell->GetIsolate();
18276 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18297 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18277 isolate, DependentCode::kPropertyCellChangedGroup); 18298 isolate, DependentCode::kPropertyCellChangedGroup);
18278 } 18299 }
18279 } 18300 }
18280 18301
18281 } // namespace internal 18302 } // namespace internal
18282 } // namespace v8 18303 } // namespace v8
OLDNEW
« no previous file with comments | « src/ic/ic.cc ('k') | test/cctest/test-accessors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698