OLD | NEW |
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 4272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4283 Isolate* isolate = object->GetIsolate(); | 4283 Isolate* isolate = object->GetIsolate(); |
4284 LookupIterator it(isolate, object, index, LookupIterator::OWN); | 4284 LookupIterator it(isolate, object, index, LookupIterator::OWN); |
4285 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); | 4285 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); |
4286 } | 4286 } |
4287 | 4287 |
4288 | 4288 |
4289 MaybeHandle<Object> JSObject::DefinePropertyOrElementIgnoreAttributes( | 4289 MaybeHandle<Object> JSObject::DefinePropertyOrElementIgnoreAttributes( |
4290 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, | 4290 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, |
4291 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { | 4291 PropertyAttributes attributes, ExecutableAccessorInfoHandling handling) { |
4292 Isolate* isolate = object->GetIsolate(); | 4292 Isolate* isolate = object->GetIsolate(); |
4293 uint32_t index; | 4293 LookupIterator it = LookupIterator::PropertyOrElement(isolate, object, name, |
4294 LookupIterator it = | 4294 LookupIterator::OWN); |
4295 name->AsArrayIndex(&index) | |
4296 ? LookupIterator(isolate, object, index, LookupIterator::OWN) | |
4297 : LookupIterator(object, name, LookupIterator::OWN); | |
4298 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); | 4295 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); |
4299 } | 4296 } |
4300 | 4297 |
4301 | 4298 |
4302 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( | 4299 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
4303 LookupIterator* it) { | 4300 LookupIterator* it) { |
4304 Isolate* isolate = it->isolate(); | 4301 Isolate* isolate = it->isolate(); |
4305 // Make sure that the top context does not change when doing | 4302 // Make sure that the top context does not change when doing |
4306 // callbacks or interceptor calls. | 4303 // callbacks or interceptor calls. |
4307 AssertNoContextChange ncc(isolate); | 4304 AssertNoContextChange ncc(isolate); |
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5247 uint32_t index, | 5244 uint32_t index, |
5248 LanguageMode language_mode) { | 5245 LanguageMode language_mode) { |
5249 LookupIterator it(object->GetIsolate(), object, index); | 5246 LookupIterator it(object->GetIsolate(), object, index); |
5250 return DeleteProperty(&it, language_mode); | 5247 return DeleteProperty(&it, language_mode); |
5251 } | 5248 } |
5252 | 5249 |
5253 | 5250 |
5254 MaybeHandle<Object> JSReceiver::DeleteProperty(Handle<JSReceiver> object, | 5251 MaybeHandle<Object> JSReceiver::DeleteProperty(Handle<JSReceiver> object, |
5255 Handle<Name> name, | 5252 Handle<Name> name, |
5256 LanguageMode language_mode) { | 5253 LanguageMode language_mode) { |
5257 uint32_t index; | 5254 LookupIterator it = LookupIterator::PropertyOrElement( |
5258 LookupIterator::Configuration c = LookupIterator::HIDDEN; | 5255 name->GetIsolate(), object, name, LookupIterator::HIDDEN); |
5259 LookupIterator it = name->AsArrayIndex(&index) | |
5260 ? LookupIterator(name->GetIsolate(), object, index, c) | |
5261 : LookupIterator(object, name, c); | |
5262 return JSObject::DeleteProperty(&it, language_mode); | 5256 return JSObject::DeleteProperty(&it, language_mode); |
5263 } | 5257 } |
5264 | 5258 |
5265 | 5259 |
5266 bool JSObject::ReferencesObjectFromElements(FixedArray* elements, | 5260 bool JSObject::ReferencesObjectFromElements(FixedArray* elements, |
5267 ElementsKind kind, | 5261 ElementsKind kind, |
5268 Object* object) { | 5262 Object* object) { |
5269 DCHECK(IsFastObjectElementsKind(kind) || | 5263 DCHECK(IsFastObjectElementsKind(kind) || |
5270 kind == DICTIONARY_ELEMENTS); | 5264 kind == DICTIONARY_ELEMENTS); |
5271 if (IsFastObjectElementsKind(kind)) { | 5265 if (IsFastObjectElementsKind(kind)) { |
(...skipping 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6402 PropertyAttributes attributes) { | 6396 PropertyAttributes attributes) { |
6403 Isolate* isolate = object->GetIsolate(); | 6397 Isolate* isolate = object->GetIsolate(); |
6404 | 6398 |
6405 // Make sure that the top context does not change when doing callbacks or | 6399 // Make sure that the top context does not change when doing callbacks or |
6406 // interceptor calls. | 6400 // interceptor calls. |
6407 AssertNoContextChange ncc(isolate); | 6401 AssertNoContextChange ncc(isolate); |
6408 | 6402 |
6409 // Try to flatten before operating on the string. | 6403 // Try to flatten before operating on the string. |
6410 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 6404 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
6411 | 6405 |
6412 uint32_t index = 0; | 6406 LookupIterator it = LookupIterator::PropertyOrElement( |
6413 LookupIterator::Configuration c = LookupIterator::HIDDEN_SKIP_INTERCEPTOR; | 6407 isolate, object, name, LookupIterator::HIDDEN_SKIP_INTERCEPTOR); |
6414 LookupIterator it = name->AsArrayIndex(&index) | |
6415 ? LookupIterator(isolate, object, index, c) | |
6416 : LookupIterator(object, name, c); | |
6417 | 6408 |
6418 if (it.state() == LookupIterator::ACCESS_CHECK) { | 6409 if (it.state() == LookupIterator::ACCESS_CHECK) { |
6419 if (!it.HasAccess()) { | 6410 if (!it.HasAccess()) { |
6420 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); | 6411 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); |
6421 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 6412 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
6422 return isolate->factory()->undefined_value(); | 6413 return isolate->factory()->undefined_value(); |
6423 } | 6414 } |
6424 it.Next(); | 6415 it.Next(); |
6425 } | 6416 } |
6426 | 6417 |
6427 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 6418 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
6428 bool is_observed = object->map()->is_observed() && | 6419 bool is_observed = object->map()->is_observed() && |
6429 !isolate->IsInternallyUsedPropertyName(name); | 6420 !isolate->IsInternallyUsedPropertyName(name); |
6430 bool preexists = false; | 6421 bool preexists = false; |
6431 if (is_observed) { | 6422 if (is_observed) { |
6432 CHECK(GetPropertyAttributes(&it).IsJust()); | 6423 CHECK(GetPropertyAttributes(&it).IsJust()); |
6433 preexists = it.IsFound(); | 6424 preexists = it.IsFound(); |
6434 if (preexists && (it.state() == LookupIterator::DATA || | 6425 if (preexists && (it.state() == LookupIterator::DATA || |
6435 it.GetAccessors()->IsAccessorInfo())) { | 6426 it.GetAccessors()->IsAccessorInfo())) { |
6436 old_value = GetProperty(&it).ToHandleChecked(); | 6427 old_value = GetProperty(&it).ToHandleChecked(); |
6437 } | 6428 } |
6438 } | 6429 } |
6439 | 6430 |
6440 if (it.IsElement()) { | 6431 if (it.IsElement()) { |
6441 DefineElementAccessor(it.GetStoreTarget(), index, getter, setter, | 6432 DefineElementAccessor(it.GetStoreTarget(), it.index(), getter, setter, |
6442 attributes); | 6433 attributes); |
6443 } else { | 6434 } else { |
6444 DCHECK(getter->IsSpecFunction() || getter->IsUndefined() || | 6435 DCHECK(getter->IsSpecFunction() || getter->IsUndefined() || |
6445 getter->IsNull()); | 6436 getter->IsNull()); |
6446 DCHECK(setter->IsSpecFunction() || setter->IsUndefined() || | 6437 DCHECK(setter->IsSpecFunction() || setter->IsUndefined() || |
6447 setter->IsNull()); | 6438 setter->IsNull()); |
6448 // At least one of the accessors needs to be a new value. | 6439 // At least one of the accessors needs to be a new value. |
6449 DCHECK(!getter->IsNull() || !setter->IsNull()); | 6440 DCHECK(!getter->IsNull() || !setter->IsNull()); |
6450 if (!getter->IsNull()) { | 6441 if (!getter->IsNull()) { |
6451 it.TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); | 6442 it.TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); |
(...skipping 18 matching lines...) Expand all Loading... |
6470 Isolate* isolate = object->GetIsolate(); | 6461 Isolate* isolate = object->GetIsolate(); |
6471 | 6462 |
6472 // Make sure that the top context does not change when doing callbacks or | 6463 // Make sure that the top context does not change when doing callbacks or |
6473 // interceptor calls. | 6464 // interceptor calls. |
6474 AssertNoContextChange ncc(isolate); | 6465 AssertNoContextChange ncc(isolate); |
6475 | 6466 |
6476 // Try to flatten before operating on the string. | 6467 // Try to flatten before operating on the string. |
6477 Handle<Name> name(Name::cast(info->name())); | 6468 Handle<Name> name(Name::cast(info->name())); |
6478 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 6469 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
6479 | 6470 |
6480 uint32_t index = 0; | 6471 LookupIterator it = LookupIterator::PropertyOrElement( |
6481 LookupIterator::Configuration c = LookupIterator::HIDDEN_SKIP_INTERCEPTOR; | 6472 isolate, object, name, LookupIterator::HIDDEN_SKIP_INTERCEPTOR); |
6482 LookupIterator it = name->AsArrayIndex(&index) | |
6483 ? LookupIterator(isolate, object, index, c) | |
6484 : LookupIterator(object, name, c); | |
6485 | 6473 |
6486 // Duplicate ACCESS_CHECK outside of GetPropertyAttributes for the case that | 6474 // Duplicate ACCESS_CHECK outside of GetPropertyAttributes for the case that |
6487 // the FailedAccessCheckCallbackFunction doesn't throw an exception. | 6475 // the FailedAccessCheckCallbackFunction doesn't throw an exception. |
6488 // | 6476 // |
6489 // TODO(verwaest): Force throw an exception if the callback doesn't, so we can | 6477 // TODO(verwaest): Force throw an exception if the callback doesn't, so we can |
6490 // remove reliance on default return values. | 6478 // remove reliance on default return values. |
6491 if (it.state() == LookupIterator::ACCESS_CHECK) { | 6479 if (it.state() == LookupIterator::ACCESS_CHECK) { |
6492 if (!it.HasAccess()) { | 6480 if (!it.HasAccess()) { |
6493 isolate->ReportFailedAccessCheck(object); | 6481 isolate->ReportFailedAccessCheck(object); |
6494 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 6482 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
(...skipping 10 matching lines...) Expand all Loading... |
6505 return it.factory()->undefined_value(); | 6493 return it.factory()->undefined_value(); |
6506 } | 6494 } |
6507 | 6495 |
6508 // Ignore accessors on typed arrays. | 6496 // Ignore accessors on typed arrays. |
6509 if (it.IsElement() && (object->HasFixedTypedArrayElements() || | 6497 if (it.IsElement() && (object->HasFixedTypedArrayElements() || |
6510 object->HasExternalArrayElements())) { | 6498 object->HasExternalArrayElements())) { |
6511 return it.factory()->undefined_value(); | 6499 return it.factory()->undefined_value(); |
6512 } | 6500 } |
6513 | 6501 |
6514 if (it.IsElement()) { | 6502 if (it.IsElement()) { |
6515 SetElementCallback(object, index, info, info->property_attributes()); | 6503 SetElementCallback(object, it.index(), info, info->property_attributes()); |
6516 } else { | 6504 } else { |
6517 SetPropertyCallback(object, name, info, info->property_attributes()); | 6505 SetPropertyCallback(object, name, info, info->property_attributes()); |
6518 } | 6506 } |
6519 | 6507 |
6520 return object; | 6508 return object; |
6521 } | 6509 } |
6522 | 6510 |
6523 | 6511 |
6524 MaybeHandle<Object> JSObject::GetAccessor(Handle<JSObject> object, | 6512 MaybeHandle<Object> JSObject::GetAccessor(Handle<JSObject> object, |
6525 Handle<Name> name, | 6513 Handle<Name> name, |
6526 AccessorComponent component) { | 6514 AccessorComponent component) { |
6527 Isolate* isolate = object->GetIsolate(); | 6515 Isolate* isolate = object->GetIsolate(); |
6528 | 6516 |
6529 // Make sure that the top context does not change when doing callbacks or | 6517 // Make sure that the top context does not change when doing callbacks or |
6530 // interceptor calls. | 6518 // interceptor calls. |
6531 AssertNoContextChange ncc(isolate); | 6519 AssertNoContextChange ncc(isolate); |
6532 | 6520 |
6533 // Make the lookup and include prototypes. | 6521 LookupIterator it = LookupIterator::PropertyOrElement( |
6534 uint32_t index = 0; | 6522 isolate, object, name, LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); |
6535 LookupIterator::Configuration c = | |
6536 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR; | |
6537 LookupIterator it = name->AsArrayIndex(&index) | |
6538 ? LookupIterator(isolate, object, index, c) | |
6539 : LookupIterator(object, name, c); | |
6540 | 6523 |
6541 for (; it.IsFound(); it.Next()) { | 6524 for (; it.IsFound(); it.Next()) { |
6542 switch (it.state()) { | 6525 switch (it.state()) { |
6543 case LookupIterator::INTERCEPTOR: | 6526 case LookupIterator::INTERCEPTOR: |
6544 case LookupIterator::NOT_FOUND: | 6527 case LookupIterator::NOT_FOUND: |
6545 case LookupIterator::TRANSITION: | 6528 case LookupIterator::TRANSITION: |
6546 UNREACHABLE(); | 6529 UNREACHABLE(); |
6547 | 6530 |
6548 case LookupIterator::ACCESS_CHECK: | 6531 case LookupIterator::ACCESS_CHECK: |
6549 if (it.HasAccess()) continue; | 6532 if (it.HasAccess()) continue; |
(...skipping 10092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16642 Handle<Object> new_value) { | 16625 Handle<Object> new_value) { |
16643 if (cell->value() != *new_value) { | 16626 if (cell->value() != *new_value) { |
16644 cell->set_value(*new_value); | 16627 cell->set_value(*new_value); |
16645 Isolate* isolate = cell->GetIsolate(); | 16628 Isolate* isolate = cell->GetIsolate(); |
16646 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16629 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
16647 isolate, DependentCode::kPropertyCellChangedGroup); | 16630 isolate, DependentCode::kPropertyCellChangedGroup); |
16648 } | 16631 } |
16649 } | 16632 } |
16650 } // namespace internal | 16633 } // namespace internal |
16651 } // namespace v8 | 16634 } // namespace v8 |
OLD | NEW |