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 |