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

Side by Side Diff: src/objects.cc

Issue 1147863002: Prepare GetProperty(Attributes)WithInterceptor to support elements (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 } 126 }
127 127
128 128
129 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { 129 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) {
130 for (; it->IsFound(); it->Next()) { 130 for (; it->IsFound(); it->Next()) {
131 switch (it->state()) { 131 switch (it->state()) {
132 case LookupIterator::NOT_FOUND: 132 case LookupIterator::NOT_FOUND:
133 case LookupIterator::TRANSITION: 133 case LookupIterator::TRANSITION:
134 UNREACHABLE(); 134 UNREACHABLE();
135 case LookupIterator::JSPROXY: 135 case LookupIterator::JSPROXY:
136 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(), 136 return JSProxy::GetPropertyWithHandler(
137 it->GetReceiver(), it->name()); 137 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName());
138 case LookupIterator::INTERCEPTOR: { 138 case LookupIterator::INTERCEPTOR: {
139 MaybeHandle<Object> maybe_result = 139 MaybeHandle<Object> maybe_result =
140 JSObject::GetPropertyWithInterceptor(it); 140 JSObject::GetPropertyWithInterceptor(it);
141 if (!maybe_result.is_null()) return maybe_result; 141 if (!maybe_result.is_null()) return maybe_result;
142 if (it->isolate()->has_pending_exception()) return maybe_result; 142 if (it->isolate()->has_pending_exception()) return maybe_result;
143 break; 143 break;
144 } 144 }
145 case LookupIterator::ACCESS_CHECK: 145 case LookupIterator::ACCESS_CHECK:
146 if (it->HasAccess()) break; 146 if (it->HasAccess()) break;
147 return JSObject::GetPropertyWithFailedAccessCheck(it); 147 return JSObject::GetPropertyWithFailedAccessCheck(it);
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 302
303 303
304 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it) { 304 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it) {
305 Handle<Object> structure = it->GetAccessors(); 305 Handle<Object> structure = it->GetAccessors();
306 Handle<Object> receiver = it->GetReceiver(); 306 Handle<Object> receiver = it->GetReceiver();
307 307
308 DCHECK(!structure->IsForeign()); 308 DCHECK(!structure->IsForeign());
309 // api style callbacks. 309 // api style callbacks.
310 if (structure->IsAccessorInfo()) { 310 if (structure->IsAccessorInfo()) {
311 Handle<JSObject> holder = it->GetHolder<JSObject>(); 311 Handle<JSObject> holder = it->GetHolder<JSObject>();
312 Handle<Name> name = it->name(); 312 Handle<Name> name = it->GetName();
313 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); 313 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
314 if (!info->IsCompatibleReceiver(*receiver)) { 314 if (!info->IsCompatibleReceiver(*receiver)) {
315 THROW_NEW_ERROR(it->isolate(), 315 THROW_NEW_ERROR(it->isolate(),
316 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, 316 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver,
317 name, receiver), 317 name, receiver),
318 Object); 318 Object);
319 } 319 }
320 320
321 Handle<ExecutableAccessorInfo> data = 321 Handle<ExecutableAccessorInfo> data =
322 Handle<ExecutableAccessorInfo>::cast(structure); 322 Handle<ExecutableAccessorInfo>::cast(structure);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 505
506 506
507 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck( 507 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
508 LookupIterator* it) { 508 LookupIterator* it) {
509 Handle<JSObject> checked = it->GetHolder<JSObject>(); 509 Handle<JSObject> checked = it->GetHolder<JSObject>();
510 while (FindAllCanReadHolder(it)) { 510 while (FindAllCanReadHolder(it)) {
511 if (it->state() == LookupIterator::ACCESSOR) { 511 if (it->state() == LookupIterator::ACCESSOR) {
512 return Just(it->property_details().attributes()); 512 return Just(it->property_details().attributes());
513 } 513 }
514 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 514 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
515 auto result = GetPropertyAttributesWithInterceptor( 515 auto result = GetPropertyAttributesWithInterceptor(it);
516 it->GetHolder<JSObject>(), it->GetReceiver(), it->name());
517 if (it->isolate()->has_scheduled_exception()) break; 516 if (it->isolate()->has_scheduled_exception()) break;
518 if (result.IsJust() && result.FromJust() != ABSENT) return result; 517 if (result.IsJust() && result.FromJust() != ABSENT) return result;
519 } 518 }
520 it->isolate()->ReportFailedAccessCheck(checked); 519 it->isolate()->ReportFailedAccessCheck(checked);
521 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), 520 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(),
522 Nothing<PropertyAttributes>()); 521 Nothing<PropertyAttributes>());
523 return Just(ABSENT); 522 return Just(ABSENT);
524 } 523 }
525 524
526 525
527 static bool FindAllCanWriteHolder(LookupIterator* it) { 526 static bool FindAllCanWriteHolder(LookupIterator* it) {
528 for (; it->IsFound(); it->Next()) { 527 for (; it->IsFound(); it->Next()) {
529 if (it->state() == LookupIterator::ACCESSOR) { 528 if (it->state() == LookupIterator::ACCESSOR) {
530 Handle<Object> accessors = it->GetAccessors(); 529 Handle<Object> accessors = it->GetAccessors();
531 if (accessors->IsAccessorInfo()) { 530 if (accessors->IsAccessorInfo()) {
532 if (AccessorInfo::cast(*accessors)->all_can_write()) return true; 531 if (AccessorInfo::cast(*accessors)->all_can_write()) return true;
533 } 532 }
534 } 533 }
535 } 534 }
536 return false; 535 return false;
537 } 536 }
538 537
539 538
540 MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck( 539 MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck(
541 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) { 540 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) {
542 Handle<JSObject> checked = it->GetHolder<JSObject>(); 541 Handle<JSObject> checked = it->GetHolder<JSObject>();
543 if (FindAllCanWriteHolder(it)) { 542 if (FindAllCanWriteHolder(it)) {
544 return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value, 543 return SetPropertyWithAccessor(it->GetReceiver(), it->GetName(), value,
545 it->GetHolder<JSObject>(), 544 it->GetHolder<JSObject>(),
546 it->GetAccessors(), language_mode); 545 it->GetAccessors(), language_mode);
547 } 546 }
548 547
549 it->isolate()->ReportFailedAccessCheck(checked); 548 it->isolate()->ReportFailedAccessCheck(checked);
550 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 549 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
551 return value; 550 return value;
552 } 551 }
553 552
554 553
(...skipping 2612 matching lines...) Expand 10 before | Expand all | Expand 10 after
3167 case LookupIterator::ACCESS_CHECK: 3166 case LookupIterator::ACCESS_CHECK:
3168 // TODO(verwaest): Remove the distinction. This is mostly bogus since we 3167 // TODO(verwaest): Remove the distinction. This is mostly bogus since we
3169 // don't know whether we'll want to fetch attributes or call a setter 3168 // don't know whether we'll want to fetch attributes or call a setter
3170 // until we find the property. 3169 // until we find the property.
3171 if (it->HasAccess()) break; 3170 if (it->HasAccess()) break;
3172 return JSObject::SetPropertyWithFailedAccessCheck(it, value, 3171 return JSObject::SetPropertyWithFailedAccessCheck(it, value,
3173 language_mode); 3172 language_mode);
3174 3173
3175 case LookupIterator::JSPROXY: 3174 case LookupIterator::JSPROXY:
3176 if (it->HolderIsReceiverOrHiddenPrototype()) { 3175 if (it->HolderIsReceiverOrHiddenPrototype()) {
3177 return JSProxy::SetPropertyWithHandler(it->GetHolder<JSProxy>(), 3176 return JSProxy::SetPropertyWithHandler(
3178 it->GetReceiver(), it->name(), 3177 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName(), value,
3179 value, language_mode); 3178 language_mode);
3180 } else { 3179 } else {
3181 // TODO(verwaest): Use the MaybeHandle to indicate result. 3180 // TODO(verwaest): Use the MaybeHandle to indicate result.
3182 bool has_result = false; 3181 bool has_result = false;
3183 MaybeHandle<Object> maybe_result = 3182 MaybeHandle<Object> maybe_result =
3184 JSProxy::SetPropertyViaPrototypesWithHandler( 3183 JSProxy::SetPropertyViaPrototypesWithHandler(
3185 it->GetHolder<JSProxy>(), it->GetReceiver(), it->name(), 3184 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName(),
3186 value, language_mode, &has_result); 3185 value, language_mode, &has_result);
3187 if (has_result) return maybe_result; 3186 if (has_result) return maybe_result;
3188 done = true; 3187 done = true;
3189 } 3188 }
3190 break; 3189 break;
3191 3190
3192 case LookupIterator::INTERCEPTOR: 3191 case LookupIterator::INTERCEPTOR:
3193 if (it->HolderIsReceiverOrHiddenPrototype()) { 3192 if (it->HolderIsReceiverOrHiddenPrototype()) {
3194 MaybeHandle<Object> maybe_result = 3193 MaybeHandle<Object> maybe_result =
3195 JSObject::SetPropertyWithInterceptor(it, value); 3194 JSObject::SetPropertyWithInterceptor(it, value);
3196 if (!maybe_result.is_null()) return maybe_result; 3195 if (!maybe_result.is_null()) return maybe_result;
3197 if (it->isolate()->has_pending_exception()) return maybe_result; 3196 if (it->isolate()->has_pending_exception()) return maybe_result;
3198 } else { 3197 } else {
3199 Maybe<PropertyAttributes> maybe_attributes = 3198 Maybe<PropertyAttributes> maybe_attributes =
3200 JSObject::GetPropertyAttributesWithInterceptor( 3199 JSObject::GetPropertyAttributesWithInterceptor(it);
3201 it->GetHolder<JSObject>(), it->GetReceiver(), it->name());
3202 if (!maybe_attributes.IsJust()) return MaybeHandle<Object>(); 3200 if (!maybe_attributes.IsJust()) return MaybeHandle<Object>();
3203 done = maybe_attributes.FromJust() != ABSENT; 3201 done = maybe_attributes.FromJust() != ABSENT;
3204 if (done && (maybe_attributes.FromJust() & READ_ONLY) != 0) { 3202 if (done && (maybe_attributes.FromJust() & READ_ONLY) != 0) {
3205 return WriteToReadOnlyProperty(it, value, language_mode); 3203 return WriteToReadOnlyProperty(it, value, language_mode);
3206 } 3204 }
3207 } 3205 }
3208 break; 3206 break;
3209 3207
3210 case LookupIterator::ACCESSOR: { 3208 case LookupIterator::ACCESSOR: {
3211 if (it->property_details().IsReadOnly()) { 3209 if (it->property_details().IsReadOnly()) {
3212 return WriteToReadOnlyProperty(it, value, language_mode); 3210 return WriteToReadOnlyProperty(it, value, language_mode);
3213 } 3211 }
3214 Handle<Object> accessors = it->GetAccessors(); 3212 Handle<Object> accessors = it->GetAccessors();
3215 if (accessors->IsAccessorInfo() && 3213 if (accessors->IsAccessorInfo() &&
3216 !it->HolderIsReceiverOrHiddenPrototype() && 3214 !it->HolderIsReceiverOrHiddenPrototype() &&
3217 AccessorInfo::cast(*accessors)->is_special_data_property()) { 3215 AccessorInfo::cast(*accessors)->is_special_data_property()) {
3218 done = true; 3216 done = true;
3219 break; 3217 break;
3220 } 3218 }
3221 return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value, 3219 return SetPropertyWithAccessor(it->GetReceiver(), it->GetName(), value,
3222 it->GetHolder<JSObject>(), accessors, 3220 it->GetHolder<JSObject>(), accessors,
3223 language_mode); 3221 language_mode);
3224 } 3222 }
3225 case LookupIterator::INTEGER_INDEXED_EXOTIC: 3223 case LookupIterator::INTEGER_INDEXED_EXOTIC:
3226 done = true; 3224 done = true;
3227 break; 3225 break;
3228 3226
3229 case LookupIterator::DATA: 3227 case LookupIterator::DATA:
3230 if (it->property_details().IsReadOnly()) { 3228 if (it->property_details().IsReadOnly()) {
3231 return WriteToReadOnlyProperty(it, value, language_mode); 3229 return WriteToReadOnlyProperty(it, value, language_mode);
(...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after
4351 } 4349 }
4352 } 4350 }
4353 } 4351 }
4354 4352
4355 return AddDataProperty(&it, value, attributes, STRICT, 4353 return AddDataProperty(&it, value, attributes, STRICT,
4356 CERTAINLY_NOT_STORE_FROM_KEYED); 4354 CERTAINLY_NOT_STORE_FROM_KEYED);
4357 } 4355 }
4358 4356
4359 4357
4360 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( 4358 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor(
4361 Handle<JSObject> holder, 4359 LookupIterator* it) {
4362 Handle<Object> receiver,
4363 Handle<Name> name) {
4364 Isolate* isolate = holder->GetIsolate();
4365 HandleScope scope(isolate);
4366
4367 // Make sure that the top context does not change when doing 4360 // Make sure that the top context does not change when doing
4368 // callbacks or interceptor calls. 4361 // callbacks or interceptor calls.
4369 AssertNoContextChange ncc(isolate); 4362 AssertNoContextChange ncc(it->isolate());
Jakob Kummerow 2015/05/20 09:24:15 nit: it->isolate() is used often enough that I'd p
4363 HandleScope scope(it->isolate());
4370 4364
4371 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); 4365 Handle<JSObject> holder = it->GetHolder<JSObject>();
4372 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { 4366 Handle<InterceptorInfo> interceptor(it->GetInterceptor());
4367 if (!it->IsElement() && it->name()->IsSymbol() &&
4368 !interceptor->can_intercept_symbols()) {
4373 return Just(ABSENT); 4369 return Just(ABSENT);
4374 } 4370 }
4375 PropertyCallbackArguments args( 4371 PropertyCallbackArguments args(it->isolate(), interceptor->data(),
4376 isolate, interceptor->data(), *receiver, *holder); 4372 *it->GetReceiver(), *holder);
4377 if (!interceptor->query()->IsUndefined()) { 4373 if (!interceptor->query()->IsUndefined()) {
4378 v8::GenericNamedPropertyQueryCallback query = 4374 v8::Handle<v8::Integer> result;
4379 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( 4375 if (it->IsElement()) {
4380 interceptor->query()); 4376 uint32_t index = it->index();
4381 LOG(isolate, 4377 v8::IndexedPropertyQueryCallback query =
4382 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); 4378 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query());
4383 v8::Handle<v8::Integer> result = args.Call(query, v8::Utils::ToLocal(name)); 4379 LOG(it->isolate(),
4380 ApiIndexedPropertyAccess("interceptor-indexed-has", *holder, index));
4381 result = args.Call(query, index);
4382 } else {
4383 Handle<Name> name = it->name();
4384 v8::GenericNamedPropertyQueryCallback query =
4385 v8::ToCData<v8::GenericNamedPropertyQueryCallback>(
4386 interceptor->query());
4387 LOG(it->isolate(),
4388 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name));
4389 result = args.Call(query, v8::Utils::ToLocal(name));
4390 }
4384 if (!result.IsEmpty()) { 4391 if (!result.IsEmpty()) {
4385 DCHECK(result->IsInt32()); 4392 DCHECK(result->IsInt32());
4386 return Just(static_cast<PropertyAttributes>(result->Int32Value())); 4393 return Just(static_cast<PropertyAttributes>(result->Int32Value()));
4387 } 4394 }
4388 } else if (!interceptor->getter()->IsUndefined()) { 4395 } else if (!interceptor->getter()->IsUndefined()) {
4389 v8::GenericNamedPropertyGetterCallback getter = 4396 // TODO(verwaest): Use GetPropertyWithInterceptor?
Jakob Kummerow 2015/05/20 09:24:15 Sounds good. Or pull out the common core into a st
4390 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( 4397 v8::Handle<v8::Value> result;
4391 interceptor->getter()); 4398 if (it->IsElement()) {
4392 LOG(isolate, 4399 uint32_t index = it->index();
4393 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); 4400 v8::IndexedPropertyGetterCallback getter =
4394 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); 4401 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter());
4402 LOG(it->isolate(), ApiIndexedPropertyAccess("interceptor-indexed-get-has",
4403 *holder, index));
4404 result = args.Call(getter, index);
4405 } else {
4406 Handle<Name> name = it->name();
4407
4408 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
Jakob Kummerow 2015/05/20 09:24:15 I don't think this can happen; you've ruled this o
4409 return Just(ABSENT);
4410 }
4411
4412 v8::GenericNamedPropertyGetterCallback getter =
4413 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
4414 interceptor->getter());
4415 LOG(it->isolate(),
4416 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name));
4417 result = args.Call(getter, v8::Utils::ToLocal(name));
4418 }
4395 if (!result.IsEmpty()) return Just(DONT_ENUM); 4419 if (!result.IsEmpty()) return Just(DONT_ENUM);
4396 } 4420 }
4397 4421
4398 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<PropertyAttributes>()); 4422 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(),
4423 Nothing<PropertyAttributes>());
4399 return Just(ABSENT); 4424 return Just(ABSENT);
4400 } 4425 }
4401 4426
4402 4427
4403 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( 4428 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes(
4404 Handle<JSReceiver> object, Handle<Name> name) { 4429 Handle<JSReceiver> object, Handle<Name> name) {
4405 // Check whether the name is an array index. 4430 // Check whether the name is an array index.
4406 uint32_t index = 0; 4431 uint32_t index = 0;
4407 if (object->IsJSObject() && name->AsArrayIndex(&index)) { 4432 if (object->IsJSObject() && name->AsArrayIndex(&index)) {
4408 return GetOwnElementAttribute(object, index); 4433 return GetOwnElementAttribute(object, index);
4409 } 4434 }
4410 LookupIterator it(object, name, LookupIterator::HIDDEN); 4435 LookupIterator it(object, name, LookupIterator::HIDDEN);
4411 return GetPropertyAttributes(&it); 4436 return GetPropertyAttributes(&it);
4412 } 4437 }
4413 4438
4414 4439
4415 Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes( 4440 Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes(
4416 LookupIterator* it) { 4441 LookupIterator* it) {
4417 for (; it->IsFound(); it->Next()) { 4442 for (; it->IsFound(); it->Next()) {
4418 switch (it->state()) { 4443 switch (it->state()) {
4419 case LookupIterator::NOT_FOUND: 4444 case LookupIterator::NOT_FOUND:
4420 case LookupIterator::TRANSITION: 4445 case LookupIterator::TRANSITION:
4421 UNREACHABLE(); 4446 UNREACHABLE();
4422 case LookupIterator::JSPROXY: 4447 case LookupIterator::JSPROXY:
4423 return JSProxy::GetPropertyAttributesWithHandler( 4448 return JSProxy::GetPropertyAttributesWithHandler(
4424 it->GetHolder<JSProxy>(), it->GetReceiver(), it->name()); 4449 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName());
4425 case LookupIterator::INTERCEPTOR: { 4450 case LookupIterator::INTERCEPTOR: {
4426 Maybe<PropertyAttributes> result = 4451 Maybe<PropertyAttributes> result =
4427 JSObject::GetPropertyAttributesWithInterceptor( 4452 JSObject::GetPropertyAttributesWithInterceptor(it);
4428 it->GetHolder<JSObject>(), it->GetReceiver(), it->name());
4429 if (!result.IsJust()) return result; 4453 if (!result.IsJust()) return result;
4430 if (result.FromJust() != ABSENT) return result; 4454 if (result.FromJust() != ABSENT) return result;
4431 break; 4455 break;
4432 } 4456 }
4433 case LookupIterator::ACCESS_CHECK: 4457 case LookupIterator::ACCESS_CHECK:
4434 if (it->HasAccess()) break; 4458 if (it->HasAccess()) break;
4435 return JSObject::GetPropertyAttributesWithFailedAccessCheck(it); 4459 return JSObject::GetPropertyAttributesWithFailedAccessCheck(it);
4436 case LookupIterator::INTEGER_INDEXED_EXOTIC: 4460 case LookupIterator::INTEGER_INDEXED_EXOTIC:
4437 return Just(ABSENT); 4461 return Just(ABSENT);
4438 case LookupIterator::ACCESSOR: 4462 case LookupIterator::ACCESSOR:
(...skipping 9575 matching lines...) Expand 10 before | Expand all | Expand 10 after
14014 DCHECK(map()->has_indexed_interceptor()); 14038 DCHECK(map()->has_indexed_interceptor());
14015 JSFunction* constructor = JSFunction::cast(map()->GetConstructor()); 14039 JSFunction* constructor = JSFunction::cast(map()->GetConstructor());
14016 DCHECK(constructor->shared()->IsApiFunction()); 14040 DCHECK(constructor->shared()->IsApiFunction());
14017 Object* result = 14041 Object* result =
14018 constructor->shared()->get_api_func_data()->indexed_property_handler(); 14042 constructor->shared()->get_api_func_data()->indexed_property_handler();
14019 return InterceptorInfo::cast(result); 14043 return InterceptorInfo::cast(result);
14020 } 14044 }
14021 14045
14022 14046
14023 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(LookupIterator* it) { 14047 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(LookupIterator* it) {
14048 // Make sure that the top context does not change when doing callbacks or
14049 // interceptor calls.
14050 AssertNoContextChange ncc(it->isolate());
14051
14024 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 14052 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
14025 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); 14053 Handle<InterceptorInfo> interceptor = it->GetInterceptor();
14026 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); 14054 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>();
14027 14055
14028 Handle<Name> name = it->name();
14029 Handle<JSObject> holder = it->GetHolder<JSObject>(); 14056 Handle<JSObject> holder = it->GetHolder<JSObject>();
14057 v8::Handle<v8::Value> result;
14058 PropertyCallbackArguments args(it->isolate(), interceptor->data(),
14059 *it->GetReceiver(), *holder);
14030 14060
14031 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { 14061 if (it->IsElement()) {
14032 return MaybeHandle<Object>(); 14062 uint32_t index = it->index();
14063 v8::IndexedPropertyGetterCallback getter =
14064 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter());
14065 LOG(it->isolate(),
14066 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index));
14067 result = args.Call(getter, index);
14068 } else {
14069 Handle<Name> name = it->name();
14070
14071 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
14072 return MaybeHandle<Object>();
14073 }
14074
14075 v8::GenericNamedPropertyGetterCallback getter =
14076 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
14077 interceptor->getter());
14078 LOG(it->isolate(),
14079 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name));
14080 result = args.Call(getter, v8::Utils::ToLocal(name));
14033 } 14081 }
14034 14082
14035 v8::GenericNamedPropertyGetterCallback getter =
14036 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
14037 interceptor->getter());
14038 LOG(it->isolate(),
14039 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name));
14040 PropertyCallbackArguments args(it->isolate(), interceptor->data(),
14041 *it->GetReceiver(), *holder);
14042 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name));
14043 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 14083 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
14044 if (result.IsEmpty()) return MaybeHandle<Object>(); 14084 if (result.IsEmpty()) return MaybeHandle<Object>();
14045
14046 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 14085 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
14047 result_internal->VerifyApiCallResultType(); 14086 result_internal->VerifyApiCallResultType();
14048 // Rebox handle before return 14087 // Rebox handle before return
14049 return handle(*result_internal, it->isolate()); 14088 return handle(*result_internal, it->isolate());
14050 } 14089 }
14051 14090
14052 14091
14053 // Compute the property keys from the interceptor. 14092 // Compute the property keys from the interceptor.
14054 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( 14093 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor(
14055 Handle<JSObject> object, Handle<JSReceiver> receiver) { 14094 Handle<JSObject> object, Handle<JSReceiver> receiver) {
(...skipping 3187 matching lines...) Expand 10 before | Expand all | Expand 10 after
17243 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell, 17282 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell,
17244 Handle<Object> new_value) { 17283 Handle<Object> new_value) {
17245 if (cell->value() != *new_value) { 17284 if (cell->value() != *new_value) {
17246 cell->set_value(*new_value); 17285 cell->set_value(*new_value);
17247 Isolate* isolate = cell->GetIsolate(); 17286 Isolate* isolate = cell->GetIsolate();
17248 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17287 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17249 isolate, DependentCode::kPropertyCellChangedGroup); 17288 isolate, DependentCode::kPropertyCellChangedGroup);
17250 } 17289 }
17251 } 17290 }
17252 } } // namespace v8::internal 17291 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698