| 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 |