OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/debug.h" | 9 #include "src/debug.h" |
10 #include "src/runtime/runtime.h" | 10 #include "src/runtime/runtime.h" |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 PropertyAttributes attrs; | 361 PropertyAttributes attrs; |
362 uint32_t index = 0; | 362 uint32_t index = 0; |
363 Handle<Object> value; | 363 Handle<Object> value; |
364 MaybeHandle<AccessorPair> maybe_accessors; | 364 MaybeHandle<AccessorPair> maybe_accessors; |
365 // TODO(verwaest): Unify once indexed properties can be handled by the | 365 // TODO(verwaest): Unify once indexed properties can be handled by the |
366 // LookupIterator. | 366 // LookupIterator. |
367 if (name->AsArrayIndex(&index)) { | 367 if (name->AsArrayIndex(&index)) { |
368 // Get attributes. | 368 // Get attributes. |
369 Maybe<PropertyAttributes> maybe = | 369 Maybe<PropertyAttributes> maybe = |
370 JSReceiver::GetOwnElementAttribute(obj, index); | 370 JSReceiver::GetOwnElementAttribute(obj, index); |
371 if (!maybe.has_value) return MaybeHandle<Object>(); | 371 if (!maybe.IsJust()) return MaybeHandle<Object>(); |
372 attrs = maybe.value; | 372 attrs = maybe.FromJust(); |
373 if (attrs == ABSENT) return factory->undefined_value(); | 373 if (attrs == ABSENT) return factory->undefined_value(); |
374 | 374 |
375 // Get AccessorPair if present. | 375 // Get AccessorPair if present. |
376 maybe_accessors = JSObject::GetOwnElementAccessorPair(obj, index); | 376 maybe_accessors = JSObject::GetOwnElementAccessorPair(obj, index); |
377 | 377 |
378 // Get value if not an AccessorPair. | 378 // Get value if not an AccessorPair. |
379 if (maybe_accessors.is_null()) { | 379 if (maybe_accessors.is_null()) { |
380 ASSIGN_RETURN_ON_EXCEPTION( | 380 ASSIGN_RETURN_ON_EXCEPTION( |
381 isolate, value, Runtime::GetElementOrCharAt(isolate, obj, index), | 381 isolate, value, Runtime::GetElementOrCharAt(isolate, obj, index), |
382 Object); | 382 Object); |
383 } | 383 } |
384 } else { | 384 } else { |
385 // Get attributes. | 385 // Get attributes. |
386 LookupIterator it(obj, name, LookupIterator::HIDDEN); | 386 LookupIterator it(obj, name, LookupIterator::HIDDEN); |
387 Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(&it); | 387 Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(&it); |
388 if (!maybe.has_value) return MaybeHandle<Object>(); | 388 if (!maybe.IsJust()) return MaybeHandle<Object>(); |
389 attrs = maybe.value; | 389 attrs = maybe.FromJust(); |
390 if (attrs == ABSENT) return factory->undefined_value(); | 390 if (attrs == ABSENT) return factory->undefined_value(); |
391 | 391 |
392 // Get AccessorPair if present. | 392 // Get AccessorPair if present. |
393 if (it.state() == LookupIterator::ACCESSOR && | 393 if (it.state() == LookupIterator::ACCESSOR && |
394 it.GetAccessors()->IsAccessorPair()) { | 394 it.GetAccessors()->IsAccessorPair()) { |
395 maybe_accessors = Handle<AccessorPair>::cast(it.GetAccessors()); | 395 maybe_accessors = Handle<AccessorPair>::cast(it.GetAccessors()); |
396 } | 396 } |
397 | 397 |
398 // Get value if not an AccessorPair. | 398 // Get value if not an AccessorPair. |
399 if (maybe_accessors.is_null()) { | 399 if (maybe_accessors.is_null()) { |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 660 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
661 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 661 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
662 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 662 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
663 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); | 663 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
664 | 664 |
665 #ifdef DEBUG | 665 #ifdef DEBUG |
666 uint32_t index = 0; | 666 uint32_t index = 0; |
667 DCHECK(!key->ToArrayIndex(&index)); | 667 DCHECK(!key->ToArrayIndex(&index)); |
668 LookupIterator it(object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); | 668 LookupIterator it(object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); |
669 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); | 669 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); |
670 if (!maybe.has_value) return isolate->heap()->exception(); | 670 if (!maybe.IsJust()) return isolate->heap()->exception(); |
671 RUNTIME_ASSERT(!it.IsFound()); | 671 RUNTIME_ASSERT(!it.IsFound()); |
672 #endif | 672 #endif |
673 | 673 |
674 Handle<Object> result; | 674 Handle<Object> result; |
675 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 675 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
676 isolate, result, | 676 isolate, result, |
677 JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attrs)); | 677 JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attrs)); |
678 return *result; | 678 return *result; |
679 } | 679 } |
680 | 680 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 729 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
730 isolate, result, JSReceiver::DeleteProperty(object, key, language_mode)); | 730 isolate, result, JSReceiver::DeleteProperty(object, key, language_mode)); |
731 return *result; | 731 return *result; |
732 } | 732 } |
733 | 733 |
734 | 734 |
735 static Object* HasOwnPropertyImplementation(Isolate* isolate, | 735 static Object* HasOwnPropertyImplementation(Isolate* isolate, |
736 Handle<JSObject> object, | 736 Handle<JSObject> object, |
737 Handle<Name> key) { | 737 Handle<Name> key) { |
738 Maybe<bool> maybe = JSReceiver::HasOwnProperty(object, key); | 738 Maybe<bool> maybe = JSReceiver::HasOwnProperty(object, key); |
739 if (!maybe.has_value) return isolate->heap()->exception(); | 739 if (!maybe.IsJust()) return isolate->heap()->exception(); |
740 if (maybe.value) return isolate->heap()->true_value(); | 740 if (maybe.FromJust()) return isolate->heap()->true_value(); |
741 // Handle hidden prototypes. If there's a hidden prototype above this thing | 741 // Handle hidden prototypes. If there's a hidden prototype above this thing |
742 // then we have to check it for properties, because they are supposed to | 742 // then we have to check it for properties, because they are supposed to |
743 // look like they are on this object. | 743 // look like they are on this object. |
744 PrototypeIterator iter(isolate, object); | 744 PrototypeIterator iter(isolate, object); |
745 if (!iter.IsAtEnd() && | 745 if (!iter.IsAtEnd() && |
746 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)) | 746 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)) |
747 ->map() | 747 ->map() |
748 ->is_hidden_prototype()) { | 748 ->is_hidden_prototype()) { |
749 // TODO(verwaest): The recursion is not necessary for keys that are array | 749 // TODO(verwaest): The recursion is not necessary for keys that are array |
750 // indices. Removing this. | 750 // indices. Removing this. |
(...skipping 20 matching lines...) Expand all Loading... |
771 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); | 771 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); |
772 // Fast case: either the key is a real named property or it is not | 772 // Fast case: either the key is a real named property or it is not |
773 // an array index and there are no interceptors or hidden | 773 // an array index and there are no interceptors or hidden |
774 // prototypes. | 774 // prototypes. |
775 Maybe<bool> maybe = Nothing<bool>(); | 775 Maybe<bool> maybe = Nothing<bool>(); |
776 if (key_is_array_index) { | 776 if (key_is_array_index) { |
777 maybe = JSObject::HasOwnElement(js_obj, index); | 777 maybe = JSObject::HasOwnElement(js_obj, index); |
778 } else { | 778 } else { |
779 maybe = JSObject::HasRealNamedProperty(js_obj, key); | 779 maybe = JSObject::HasRealNamedProperty(js_obj, key); |
780 } | 780 } |
781 if (!maybe.has_value) return isolate->heap()->exception(); | 781 if (!maybe.IsJust()) return isolate->heap()->exception(); |
782 DCHECK(!isolate->has_pending_exception()); | 782 DCHECK(!isolate->has_pending_exception()); |
783 if (maybe.value) { | 783 if (maybe.FromJust()) { |
784 return isolate->heap()->true_value(); | 784 return isolate->heap()->true_value(); |
785 } | 785 } |
786 Map* map = js_obj->map(); | 786 Map* map = js_obj->map(); |
787 if (!key_is_array_index && !map->has_named_interceptor() && | 787 if (!key_is_array_index && !map->has_named_interceptor() && |
788 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) { | 788 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) { |
789 return isolate->heap()->false_value(); | 789 return isolate->heap()->false_value(); |
790 } | 790 } |
791 // Slow case. | 791 // Slow case. |
792 return HasOwnPropertyImplementation(isolate, Handle<JSObject>(js_obj), | 792 return HasOwnPropertyImplementation(isolate, Handle<JSObject>(js_obj), |
793 Handle<Name>(key)); | 793 Handle<Name>(key)); |
794 } else if (object->IsString() && key_is_array_index) { | 794 } else if (object->IsString() && key_is_array_index) { |
795 // Well, there is one exception: Handle [] on strings. | 795 // Well, there is one exception: Handle [] on strings. |
796 Handle<String> string = Handle<String>::cast(object); | 796 Handle<String> string = Handle<String>::cast(object); |
797 if (index < static_cast<uint32_t>(string->length())) { | 797 if (index < static_cast<uint32_t>(string->length())) { |
798 return isolate->heap()->true_value(); | 798 return isolate->heap()->true_value(); |
799 } | 799 } |
800 } | 800 } |
801 return isolate->heap()->false_value(); | 801 return isolate->heap()->false_value(); |
802 } | 802 } |
803 | 803 |
804 | 804 |
805 RUNTIME_FUNCTION(Runtime_HasProperty) { | 805 RUNTIME_FUNCTION(Runtime_HasProperty) { |
806 HandleScope scope(isolate); | 806 HandleScope scope(isolate); |
807 DCHECK(args.length() == 2); | 807 DCHECK(args.length() == 2); |
808 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); | 808 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); |
809 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 809 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
810 | 810 |
811 Maybe<bool> maybe = JSReceiver::HasProperty(receiver, key); | 811 Maybe<bool> maybe = JSReceiver::HasProperty(receiver, key); |
812 if (!maybe.has_value) return isolate->heap()->exception(); | 812 if (!maybe.IsJust()) return isolate->heap()->exception(); |
813 return isolate->heap()->ToBoolean(maybe.value); | 813 return isolate->heap()->ToBoolean(maybe.FromJust()); |
814 } | 814 } |
815 | 815 |
816 | 816 |
817 RUNTIME_FUNCTION(Runtime_HasElement) { | 817 RUNTIME_FUNCTION(Runtime_HasElement) { |
818 HandleScope scope(isolate); | 818 HandleScope scope(isolate); |
819 DCHECK(args.length() == 2); | 819 DCHECK(args.length() == 2); |
820 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); | 820 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); |
821 CONVERT_SMI_ARG_CHECKED(index, 1); | 821 CONVERT_SMI_ARG_CHECKED(index, 1); |
822 | 822 |
823 Maybe<bool> maybe = JSReceiver::HasElement(receiver, index); | 823 Maybe<bool> maybe = JSReceiver::HasElement(receiver, index); |
824 if (!maybe.has_value) return isolate->heap()->exception(); | 824 if (!maybe.IsJust()) return isolate->heap()->exception(); |
825 return isolate->heap()->ToBoolean(maybe.value); | 825 return isolate->heap()->ToBoolean(maybe.FromJust()); |
826 } | 826 } |
827 | 827 |
828 | 828 |
829 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) { | 829 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) { |
830 HandleScope scope(isolate); | 830 HandleScope scope(isolate); |
831 DCHECK(args.length() == 2); | 831 DCHECK(args.length() == 2); |
832 | 832 |
833 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 833 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
834 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 834 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
835 | 835 |
836 Maybe<PropertyAttributes> maybe = | 836 Maybe<PropertyAttributes> maybe = |
837 JSReceiver::GetOwnPropertyAttributes(object, key); | 837 JSReceiver::GetOwnPropertyAttributes(object, key); |
838 if (!maybe.has_value) return isolate->heap()->exception(); | 838 if (!maybe.IsJust()) return isolate->heap()->exception(); |
839 if (maybe.value == ABSENT) maybe.value = DONT_ENUM; | 839 if (maybe.FromJust() == ABSENT) maybe = Just(DONT_ENUM); |
840 return isolate->heap()->ToBoolean((maybe.value & DONT_ENUM) == 0); | 840 return isolate->heap()->ToBoolean((maybe.FromJust() & DONT_ENUM) == 0); |
841 } | 841 } |
842 | 842 |
843 | 843 |
844 RUNTIME_FUNCTION(Runtime_GetPropertyNames) { | 844 RUNTIME_FUNCTION(Runtime_GetPropertyNames) { |
845 HandleScope scope(isolate); | 845 HandleScope scope(isolate); |
846 DCHECK(args.length() == 1); | 846 DCHECK(args.length() == 1); |
847 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); | 847 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
848 Handle<JSArray> result; | 848 Handle<JSArray> result; |
849 | 849 |
850 isolate->counters()->for_in()->Increment(); | 850 isolate->counters()->for_in()->Increment(); |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1571 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); | 1571 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
1572 | 1572 |
1573 RETURN_FAILURE_ON_EXCEPTION( | 1573 RETURN_FAILURE_ON_EXCEPTION( |
1574 isolate, | 1574 isolate, |
1575 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), | 1575 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), |
1576 setter, attrs)); | 1576 setter, attrs)); |
1577 return isolate->heap()->undefined_value(); | 1577 return isolate->heap()->undefined_value(); |
1578 } | 1578 } |
1579 } | 1579 } |
1580 } // namespace v8::internal | 1580 } // namespace v8::internal |
OLD | NEW |