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 // This file relies on the fact that the following declarations have been made | 5 // This file relies on the fact that the following declarations have been made |
6 // in runtime.js: | 6 // in runtime.js: |
7 // var $Object = global.Object; | 7 // var $Object = global.Object; |
8 // var $Boolean = global.Boolean; | 8 // var $Boolean = global.Boolean; |
9 // var $Number = global.Number; | 9 // var $Number = global.Number; |
10 // var $Function = global.Function; | 10 // var $Function = global.Function; |
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 throw MakeTypeError("redefine_disallowed", [p]); | 902 throw MakeTypeError("redefine_disallowed", [p]); |
903 } else { | 903 } else { |
904 return false; | 904 return false; |
905 } | 905 } |
906 } | 906 } |
907 var threw = false; | 907 var threw = false; |
908 | 908 |
909 var emit_splice = %IsObserved(obj) && new_length !== old_length; | 909 var emit_splice = %IsObserved(obj) && new_length !== old_length; |
910 var removed; | 910 var removed; |
911 if (emit_splice) { | 911 if (emit_splice) { |
912 BeginPerformSplice(obj); | 912 $observeBeginPerformSplice(obj); |
913 removed = []; | 913 removed = []; |
914 if (new_length < old_length) | 914 if (new_length < old_length) |
915 removed.length = old_length - new_length; | 915 removed.length = old_length - new_length; |
916 } | 916 } |
917 | 917 |
918 while (new_length < length--) { | 918 while (new_length < length--) { |
919 var index = ToString(length); | 919 var index = ToString(length); |
920 if (emit_splice) { | 920 if (emit_splice) { |
921 var deletedDesc = GetOwnPropertyJS(obj, index); | 921 var deletedDesc = GetOwnPropertyJS(obj, index); |
922 if (deletedDesc && deletedDesc.hasValue()) | 922 if (deletedDesc && deletedDesc.hasValue()) |
923 removed[length - new_length] = deletedDesc.getValue(); | 923 removed[length - new_length] = deletedDesc.getValue(); |
924 } | 924 } |
925 if (!Delete(obj, index, false)) { | 925 if (!Delete(obj, index, false)) { |
926 new_length = length + 1; | 926 new_length = length + 1; |
927 threw = true; | 927 threw = true; |
928 break; | 928 break; |
929 } | 929 } |
930 } | 930 } |
931 threw = !DefineObjectProperty(obj, "length", desc, should_throw) || threw; | 931 threw = !DefineObjectProperty(obj, "length", desc, should_throw) || threw; |
932 if (emit_splice) { | 932 if (emit_splice) { |
933 EndPerformSplice(obj); | 933 $observeEndPerformSplice(obj); |
934 EnqueueSpliceRecord(obj, | 934 $observeEnqueueSpliceRecord(obj, |
935 new_length < old_length ? new_length : old_length, | 935 new_length < old_length ? new_length : old_length, |
936 removed, | 936 removed, |
937 new_length > old_length ? new_length - old_length : 0); | 937 new_length > old_length ? new_length - old_length : 0); |
938 } | 938 } |
939 if (threw) { | 939 if (threw) { |
940 if (should_throw) { | 940 if (should_throw) { |
941 throw MakeTypeError("redefine_disallowed", [p]); | 941 throw MakeTypeError("redefine_disallowed", [p]); |
942 } else { | 942 } else { |
943 return false; | 943 return false; |
944 } | 944 } |
945 } | 945 } |
946 return true; | 946 return true; |
947 } | 947 } |
948 | 948 |
949 // Step 4 - Special handling for array index. | 949 // Step 4 - Special handling for array index. |
950 if (!IS_SYMBOL(p)) { | 950 if (!IS_SYMBOL(p)) { |
951 var index = ToUint32(p); | 951 var index = ToUint32(p); |
952 var emit_splice = false; | 952 var emit_splice = false; |
953 if (ToString(index) == p && index != 4294967295) { | 953 if (ToString(index) == p && index != 4294967295) { |
954 var length = obj.length; | 954 var length = obj.length; |
955 if (index >= length && %IsObserved(obj)) { | 955 if (index >= length && %IsObserved(obj)) { |
956 emit_splice = true; | 956 emit_splice = true; |
957 BeginPerformSplice(obj); | 957 $observeBeginPerformSplice(obj); |
958 } | 958 } |
959 | 959 |
960 var length_desc = GetOwnPropertyJS(obj, "length"); | 960 var length_desc = GetOwnPropertyJS(obj, "length"); |
961 if ((index >= length && !length_desc.isWritable()) || | 961 if ((index >= length && !length_desc.isWritable()) || |
962 !DefineObjectProperty(obj, p, desc, true)) { | 962 !DefineObjectProperty(obj, p, desc, true)) { |
963 if (emit_splice) | 963 if (emit_splice) |
964 EndPerformSplice(obj); | 964 $observeEndPerformSplice(obj); |
965 if (should_throw) { | 965 if (should_throw) { |
966 throw MakeTypeError("define_disallowed", [p]); | 966 throw MakeTypeError("define_disallowed", [p]); |
967 } else { | 967 } else { |
968 return false; | 968 return false; |
969 } | 969 } |
970 } | 970 } |
971 if (index >= length) { | 971 if (index >= length) { |
972 obj.length = index + 1; | 972 obj.length = index + 1; |
973 } | 973 } |
974 if (emit_splice) { | 974 if (emit_splice) { |
975 EndPerformSplice(obj); | 975 $observeEndPerformSplice(obj); |
976 EnqueueSpliceRecord(obj, length, [], index + 1 - length); | 976 $observeEnqueueSpliceRecord(obj, length, [], index + 1 - length); |
977 } | 977 } |
978 return true; | 978 return true; |
979 } | 979 } |
980 } | 980 } |
981 | 981 |
982 // Step 5 - Fallback to default implementation. | 982 // Step 5 - Fallback to default implementation. |
983 return DefineObjectProperty(obj, p, desc, should_throw); | 983 return DefineObjectProperty(obj, p, desc, should_throw); |
984 } | 984 } |
985 | 985 |
986 | 986 |
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1914 } | 1914 } |
1915 if (!IS_SPEC_FUNCTION(method)) { | 1915 if (!IS_SPEC_FUNCTION(method)) { |
1916 throw MakeTypeError('not_iterable', [obj]); | 1916 throw MakeTypeError('not_iterable', [obj]); |
1917 } | 1917 } |
1918 var iterator = %_CallFunction(obj, method); | 1918 var iterator = %_CallFunction(obj, method); |
1919 if (!IS_SPEC_OBJECT(iterator)) { | 1919 if (!IS_SPEC_OBJECT(iterator)) { |
1920 throw MakeTypeError('not_an_iterator', [iterator]); | 1920 throw MakeTypeError('not_an_iterator', [iterator]); |
1921 } | 1921 } |
1922 return iterator; | 1922 return iterator; |
1923 } | 1923 } |
OLD | NEW |