OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 var $functionSourceString; | 5 var $functionSourceString; |
6 var $globalEval; | 6 var $globalEval; |
7 var $objectDefineOwnProperty; | 7 var $objectDefineOwnProperty; |
8 var $objectGetOwnPropertyDescriptor; | 8 var $objectGetOwnPropertyDescriptor; |
9 var $toCompletePropertyDescriptor; | 9 var $toCompletePropertyDescriptor; |
10 | 10 |
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 setter = current.getSet(); | 795 setter = current.getSet(); |
796 } | 796 } |
797 %DefineAccessorPropertyUnchecked(obj, p, getter, setter, flag); | 797 %DefineAccessorPropertyUnchecked(obj, p, getter, setter, flag); |
798 } | 798 } |
799 return true; | 799 return true; |
800 } | 800 } |
801 | 801 |
802 | 802 |
803 // ES5 section 15.4.5.1. | 803 // ES5 section 15.4.5.1. |
804 function DefineArrayProperty(obj, p, desc, should_throw) { | 804 function DefineArrayProperty(obj, p, desc, should_throw) { |
805 // Note that the length of an array is not actually stored as part of the | 805 // Step 3 - Special handling for array index. |
806 // property, hence we use generated code throughout this function instead of | |
807 // DefineObjectProperty() to modify its value. | |
808 | |
809 // Step 3 - Special handling for length property. | |
810 if (p === "length") { | |
811 var length = obj.length; | |
812 var old_length = length; | |
813 if (!desc.hasValue()) { | |
814 return DefineObjectProperty(obj, "length", desc, should_throw); | |
815 } | |
816 var new_length = $toUint32(desc.getValue()); | |
817 if (new_length != $toNumber(desc.getValue())) { | |
818 throw MakeRangeError(kArrayLengthOutOfRange); | |
819 } | |
820 var length_desc = GetOwnPropertyJS(obj, "length"); | |
821 if (new_length != length && !length_desc.isWritable()) { | |
822 if (should_throw) { | |
823 throw MakeTypeError(kRedefineDisallowed, p); | |
824 } else { | |
825 return false; | |
826 } | |
827 } | |
828 var threw = false; | |
829 | |
830 var emit_splice = %IsObserved(obj) && new_length !== old_length; | |
831 var removed; | |
832 if (emit_splice) { | |
833 $observeBeginPerformSplice(obj); | |
834 removed = []; | |
835 if (new_length < old_length) | |
836 removed.length = old_length - new_length; | |
837 } | |
838 | |
839 while (new_length < length--) { | |
840 var index = $toString(length); | |
841 if (emit_splice) { | |
842 var deletedDesc = GetOwnPropertyJS(obj, index); | |
843 if (deletedDesc && deletedDesc.hasValue()) | |
844 removed[length - new_length] = deletedDesc.getValue(); | |
845 } | |
846 if (!Delete(obj, index, false)) { | |
847 new_length = length + 1; | |
848 threw = true; | |
849 break; | |
850 } | |
851 } | |
852 threw = !DefineObjectProperty(obj, "length", desc, should_throw) || threw; | |
853 if (emit_splice) { | |
854 $observeEndPerformSplice(obj); | |
855 $observeEnqueueSpliceRecord(obj, | |
856 new_length < old_length ? new_length : old_length, | |
857 removed, | |
858 new_length > old_length ? new_length - old_length : 0); | |
859 } | |
860 if (threw) { | |
861 if (should_throw) { | |
862 throw MakeTypeError(kRedefineDisallowed, p); | |
863 } else { | |
864 return false; | |
865 } | |
866 } | |
867 return true; | |
868 } | |
869 | |
870 // Step 4 - Special handling for array index. | |
871 if (!IS_SYMBOL(p)) { | 806 if (!IS_SYMBOL(p)) { |
872 var index = $toUint32(p); | 807 var index = $toUint32(p); |
873 var emit_splice = false; | 808 var emit_splice = false; |
874 if ($toString(index) == p && index != 4294967295) { | 809 if ($toString(index) == p && index != 4294967295) { |
875 var length = obj.length; | 810 var length = obj.length; |
876 if (index >= length && %IsObserved(obj)) { | 811 if (index >= length && %IsObserved(obj)) { |
877 emit_splice = true; | 812 emit_splice = true; |
878 $observeBeginPerformSplice(obj); | 813 $observeBeginPerformSplice(obj); |
879 } | 814 } |
880 | 815 |
(...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1873 to.ObjectGetOwnPropertyKeys = ObjectGetOwnPropertyKeys; | 1808 to.ObjectGetOwnPropertyKeys = ObjectGetOwnPropertyKeys; |
1874 to.ObjectHasOwnProperty = ObjectHasOwnProperty; | 1809 to.ObjectHasOwnProperty = ObjectHasOwnProperty; |
1875 to.ObjectIsFrozen = ObjectIsFrozen; | 1810 to.ObjectIsFrozen = ObjectIsFrozen; |
1876 to.ObjectIsSealed = ObjectIsSealed; | 1811 to.ObjectIsSealed = ObjectIsSealed; |
1877 to.ObjectToString = ObjectToString; | 1812 to.ObjectToString = ObjectToString; |
1878 to.OwnPropertyKeys = OwnPropertyKeys; | 1813 to.OwnPropertyKeys = OwnPropertyKeys; |
1879 to.ToNameArray = ToNameArray; | 1814 to.ToNameArray = ToNameArray; |
1880 }); | 1815 }); |
1881 | 1816 |
1882 }) | 1817 }) |
OLD | NEW |