| OLD | NEW |
| 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 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 if (!func->IsCallable()) { | 666 if (!func->IsCallable()) { |
| 667 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kPropertyNotFunction, | 667 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kPropertyNotFunction, |
| 668 func, name, receiver), | 668 func, name, receiver), |
| 669 Object); | 669 Object); |
| 670 } | 670 } |
| 671 return func; | 671 return func; |
| 672 } | 672 } |
| 673 | 673 |
| 674 | 674 |
| 675 // static | 675 // static |
| 676 MaybeHandle<FixedArray> Object::CreateListFromArrayLike( | |
| 677 Isolate* isolate, Handle<Object> object, ElementTypes element_types) { | |
| 678 // 1. ReturnIfAbrupt(object). | |
| 679 // 2. (default elementTypes -- not applicable.) | |
| 680 // 3. If Type(obj) is not Object, throw a TypeError exception. | |
| 681 if (!object->IsJSReceiver()) { | |
| 682 THROW_NEW_ERROR(isolate, | |
| 683 NewTypeError(MessageTemplate::kCalledOnNonObject, | |
| 684 isolate->factory()->NewStringFromAsciiChecked( | |
| 685 "CreateListFromArrayLike")), | |
| 686 FixedArray); | |
| 687 } | |
| 688 // 4. Let len be ? ToLength(? Get(obj, "length")). | |
| 689 Handle<Object> raw_length_obj; | |
| 690 ASSIGN_RETURN_ON_EXCEPTION( | |
| 691 isolate, raw_length_obj, | |
| 692 JSReceiver::GetProperty(object, isolate->factory()->length_string()), | |
| 693 FixedArray); | |
| 694 Handle<Object> raw_length_number; | |
| 695 ASSIGN_RETURN_ON_EXCEPTION(isolate, raw_length_number, | |
| 696 Object::ToLength(isolate, raw_length_obj), | |
| 697 FixedArray); | |
| 698 uint32_t len; | |
| 699 if (!raw_length_number->ToUint32(&len) || | |
| 700 len > static_cast<uint32_t>(FixedArray::kMaxLength)) { | |
| 701 THROW_NEW_ERROR(isolate, | |
| 702 NewRangeError(MessageTemplate::kInvalidArrayLength), | |
| 703 FixedArray); | |
| 704 } | |
| 705 // 5. Let list be an empty List. | |
| 706 Handle<FixedArray> list = isolate->factory()->NewFixedArray(len); | |
| 707 // 6. Let index be 0. | |
| 708 // 7. Repeat while index < len: | |
| 709 for (uint32_t index = 0; index < len; ++index) { | |
| 710 // 7a. Let indexName be ToString(index). | |
| 711 // 7b. Let next be ? Get(obj, indexName). | |
| 712 Handle<Object> next; | |
| 713 ASSIGN_RETURN_ON_EXCEPTION( | |
| 714 isolate, next, Object::GetElement(isolate, object, index), FixedArray); | |
| 715 switch (element_types) { | |
| 716 case ElementTypes::kAll: | |
| 717 // Nothing to do. | |
| 718 break; | |
| 719 case ElementTypes::kStringAndSymbol: { | |
| 720 // 7c. If Type(next) is not an element of elementTypes, throw a | |
| 721 // TypeError exception. | |
| 722 if (!next->IsName()) { | |
| 723 THROW_NEW_ERROR(isolate, | |
| 724 NewTypeError(MessageTemplate::kNotPropertyName, next), | |
| 725 FixedArray); | |
| 726 } | |
| 727 // 7d. Append next as the last element of list. | |
| 728 // Internalize on the fly so we can use pointer identity later. | |
| 729 next = isolate->factory()->InternalizeName(Handle<Name>::cast(next)); | |
| 730 break; | |
| 731 } | |
| 732 } | |
| 733 list->set(index, *next); | |
| 734 // 7e. Set index to index + 1. (See loop header.) | |
| 735 } | |
| 736 // 8. Return list. | |
| 737 return list; | |
| 738 } | |
| 739 | |
| 740 | |
| 741 // static | |
| 742 Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) { | 676 Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) { |
| 743 for (; it->IsFound(); it->Next()) { | 677 for (; it->IsFound(); it->Next()) { |
| 744 switch (it->state()) { | 678 switch (it->state()) { |
| 745 case LookupIterator::NOT_FOUND: | 679 case LookupIterator::NOT_FOUND: |
| 746 case LookupIterator::TRANSITION: | 680 case LookupIterator::TRANSITION: |
| 747 UNREACHABLE(); | 681 UNREACHABLE(); |
| 748 case LookupIterator::JSPROXY: | 682 case LookupIterator::JSPROXY: |
| 749 // Call the "has" trap on proxies. | 683 // Call the "has" trap on proxies. |
| 750 return JSProxy::HasProperty(it->isolate(), it->GetHolder<JSProxy>(), | 684 return JSProxy::HasProperty(it->isolate(), it->GetHolder<JSProxy>(), |
| 751 it->GetName()); | 685 it->GetName()); |
| (...skipping 7777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8529 Execution::Call(isolate, isolate->proxy_enumerate(), | 8463 Execution::Call(isolate, isolate->proxy_enumerate(), |
| 8530 isolate->factory()->undefined_value(), arraysize(args), | 8464 isolate->factory()->undefined_value(), arraysize(args), |
| 8531 args), | 8465 args), |
| 8532 Nothing<bool>()); | 8466 Nothing<bool>()); |
| 8533 accumulator->NextPrototype(); | 8467 accumulator->NextPrototype(); |
| 8534 accumulator->AddKeysFromProxy(Handle<JSObject>::cast(trap_result_array)); | 8468 accumulator->AddKeysFromProxy(Handle<JSObject>::cast(trap_result_array)); |
| 8535 return Just(true); | 8469 return Just(true); |
| 8536 } | 8470 } |
| 8537 | 8471 |
| 8538 | 8472 |
| 8473 // ES6 7.3.17 for elementTypes = (String, Symbol) |
| 8474 static MaybeHandle<FixedArray> CreateListFromArrayLike_StringSymbol( |
| 8475 Isolate* isolate, Handle<Object> object) { |
| 8476 // 1. ReturnIfAbrupt(object). |
| 8477 // 2. (default elementTypes -- not applicable.) |
| 8478 // 3. If Type(obj) is not Object, throw a TypeError exception. |
| 8479 if (!object->IsJSReceiver()) { |
| 8480 isolate->Throw(*isolate->factory()->NewTypeError( |
| 8481 MessageTemplate::kCalledOnNonObject, |
| 8482 isolate->factory()->NewStringFromAsciiChecked( |
| 8483 "CreateListFromArrayLike"))); |
| 8484 return MaybeHandle<FixedArray>(); |
| 8485 } |
| 8486 // 4. Let len be ? ToLength(? Get(obj, "length")). |
| 8487 Handle<Object> raw_length_obj; |
| 8488 ASSIGN_RETURN_ON_EXCEPTION( |
| 8489 isolate, raw_length_obj, |
| 8490 JSReceiver::GetProperty(object, isolate->factory()->length_string()), |
| 8491 FixedArray); |
| 8492 Handle<Object> raw_length_number; |
| 8493 ASSIGN_RETURN_ON_EXCEPTION(isolate, raw_length_number, |
| 8494 Object::ToLength(isolate, raw_length_obj), |
| 8495 FixedArray); |
| 8496 uint32_t len; |
| 8497 if (!raw_length_number->ToUint32(&len) || |
| 8498 len > static_cast<uint32_t>(FixedArray::kMaxLength)) { |
| 8499 isolate->Throw(*isolate->factory()->NewRangeError( |
| 8500 MessageTemplate::kInvalidArrayLength)); |
| 8501 return MaybeHandle<FixedArray>(); |
| 8502 } |
| 8503 // 5. Let list be an empty List. |
| 8504 Handle<FixedArray> list = isolate->factory()->NewFixedArray(len); |
| 8505 // 6. Let index be 0. |
| 8506 // 7. Repeat while index < len: |
| 8507 for (uint32_t index = 0; index < len; ++index) { |
| 8508 // 7a. Let indexName be ToString(index). |
| 8509 // 7b. Let next be ? Get(obj, indexName). |
| 8510 Handle<Object> next; |
| 8511 ASSIGN_RETURN_ON_EXCEPTION( |
| 8512 isolate, next, Object::GetElement(isolate, object, index), FixedArray); |
| 8513 // 7c. If Type(next) is not an element of elementTypes, throw a |
| 8514 // TypeError exception. |
| 8515 if (!next->IsName()) { |
| 8516 isolate->Throw(*isolate->factory()->NewTypeError( |
| 8517 MessageTemplate::kNotPropertyName, next)); |
| 8518 return MaybeHandle<FixedArray>(); |
| 8519 } |
| 8520 // 7d. Append next as the last element of list. |
| 8521 // Internalize on the fly so we can use pointer identity later. |
| 8522 next = isolate->factory()->InternalizeName(Handle<Name>::cast(next)); |
| 8523 list->set(index, *next); |
| 8524 // 7e. Set index to index + 1. (See loop header.) |
| 8525 } |
| 8526 // 8. Return list. |
| 8527 return list; |
| 8528 } |
| 8529 |
| 8530 |
| 8539 // ES6 9.5.12 | 8531 // ES6 9.5.12 |
| 8540 // Returns |true| on success, |nothing| in case of exception. | 8532 // Returns |true| on success, |nothing| in case of exception. |
| 8541 // static | 8533 // static |
| 8542 Maybe<bool> JSProxy::OwnPropertyKeys(Isolate* isolate, | 8534 Maybe<bool> JSProxy::OwnPropertyKeys(Isolate* isolate, |
| 8543 Handle<JSReceiver> receiver, | 8535 Handle<JSReceiver> receiver, |
| 8544 Handle<JSProxy> proxy, | 8536 Handle<JSProxy> proxy, |
| 8545 PropertyFilter filter, | 8537 PropertyFilter filter, |
| 8546 KeyAccumulator* accumulator) { | 8538 KeyAccumulator* accumulator) { |
| 8547 STACK_CHECK(Nothing<bool>()); | 8539 STACK_CHECK(Nothing<bool>()); |
| 8548 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 8540 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 8573 Handle<Object> args[] = {target}; | 8565 Handle<Object> args[] = {target}; |
| 8574 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 8566 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 8575 isolate, trap_result_array, | 8567 isolate, trap_result_array, |
| 8576 Execution::Call(isolate, trap, handler, arraysize(args), args), | 8568 Execution::Call(isolate, trap, handler, arraysize(args), args), |
| 8577 Nothing<bool>()); | 8569 Nothing<bool>()); |
| 8578 // 8. Let trapResult be ? CreateListFromArrayLike(trapResultArray, | 8570 // 8. Let trapResult be ? CreateListFromArrayLike(trapResultArray, |
| 8579 // «String, Symbol»). | 8571 // «String, Symbol»). |
| 8580 Handle<FixedArray> trap_result; | 8572 Handle<FixedArray> trap_result; |
| 8581 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 8573 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 8582 isolate, trap_result, | 8574 isolate, trap_result, |
| 8583 Object::CreateListFromArrayLike(isolate, trap_result_array, | 8575 CreateListFromArrayLike_StringSymbol(isolate, trap_result_array), |
| 8584 ElementTypes::kStringAndSymbol), | |
| 8585 Nothing<bool>()); | 8576 Nothing<bool>()); |
| 8586 // 9. Let extensibleTarget be ? IsExtensible(target). | 8577 // 9. Let extensibleTarget be ? IsExtensible(target). |
| 8587 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target); | 8578 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target); |
| 8588 MAYBE_RETURN(maybe_extensible, Nothing<bool>()); | 8579 MAYBE_RETURN(maybe_extensible, Nothing<bool>()); |
| 8589 bool extensible_target = maybe_extensible.FromJust(); | 8580 bool extensible_target = maybe_extensible.FromJust(); |
| 8590 // 10. Let targetKeys be ? target.[[OwnPropertyKeys]](). | 8581 // 10. Let targetKeys be ? target.[[OwnPropertyKeys]](). |
| 8591 Handle<FixedArray> target_keys; | 8582 Handle<FixedArray> target_keys; |
| 8592 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, target_keys, | 8583 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, target_keys, |
| 8593 JSReceiver::OwnPropertyKeys(target), | 8584 JSReceiver::OwnPropertyKeys(target), |
| 8594 Nothing<bool>()); | 8585 Nothing<bool>()); |
| (...skipping 10770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19365 if (cell->value() != *new_value) { | 19356 if (cell->value() != *new_value) { |
| 19366 cell->set_value(*new_value); | 19357 cell->set_value(*new_value); |
| 19367 Isolate* isolate = cell->GetIsolate(); | 19358 Isolate* isolate = cell->GetIsolate(); |
| 19368 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19359 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19369 isolate, DependentCode::kPropertyCellChangedGroup); | 19360 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19370 } | 19361 } |
| 19371 } | 19362 } |
| 19372 | 19363 |
| 19373 } // namespace internal | 19364 } // namespace internal |
| 19374 } // namespace v8 | 19365 } // namespace v8 |
| OLD | NEW |