OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
950 } | 950 } |
951 | 951 |
952 | 952 |
953 // Observing array length (including truncation) | 953 // Observing array length (including truncation) |
954 reset(); | 954 reset(); |
955 var arr = ['a', 'b', 'c', 'd']; | 955 var arr = ['a', 'b', 'c', 'd']; |
956 var arr2 = ['alpha', 'beta']; | 956 var arr2 = ['alpha', 'beta']; |
957 var arr3 = ['hello']; | 957 var arr3 = ['hello']; |
958 arr3[2] = 'goodbye'; | 958 arr3[2] = 'goodbye'; |
959 arr3.length = 6; | 959 arr3.length = 6; |
960 var slow_arr = new Array(1000000000); | |
961 slow_arr[500000000] = 'hello'; | |
962 Object.defineProperty(arr, '0', {configurable: false}); | 960 Object.defineProperty(arr, '0', {configurable: false}); |
963 Object.defineProperty(arr, '2', {get: function(){}}); | 961 Object.defineProperty(arr, '2', {get: function(){}}); |
964 Object.defineProperty(arr2, '0', {get: function(){}, configurable: false}); | 962 Object.defineProperty(arr2, '0', {get: function(){}, configurable: false}); |
965 Object.observe(arr, observer.callback); | 963 Object.observe(arr, observer.callback); |
964 Array.observe(arr, observer2.callback); | |
966 Object.observe(arr2, observer.callback); | 965 Object.observe(arr2, observer.callback); |
966 Array.observe(arr2, observer2.callback); | |
967 Object.observe(arr3, observer.callback); | 967 Object.observe(arr3, observer.callback); |
968 Object.observe(slow_arr, observer.callback); | 968 Array.observe(arr3, observer2.callback); |
969 arr.length = 2; | 969 arr.length = 2; |
970 arr.length = 0; | 970 arr.length = 0; |
971 arr.length = 10; | 971 arr.length = 10; |
972 Object.defineProperty(arr, 'length', {writable: false}); | 972 Object.defineProperty(arr, 'length', {writable: false}); |
973 arr2.length = 0; | 973 arr2.length = 0; |
974 arr2.length = 1; // no change expected | 974 arr2.length = 1; // no change expected |
975 Object.defineProperty(arr2, 'length', {value: 1, writable: false}); | 975 Object.defineProperty(arr2, 'length', {value: 1, writable: false}); |
976 arr3.length = 0; | 976 arr3.length = 0; |
977 ++arr3.length; | 977 ++arr3.length; |
978 arr3.length++; | 978 arr3.length++; |
979 arr3.length /= 2; | 979 arr3.length /= 2; |
980 Object.defineProperty(arr3, 'length', {value: 5}); | 980 Object.defineProperty(arr3, 'length', {value: 5}); |
981 Object.defineProperty(arr3, 'length', {value: 10, writable: false}); | 981 arr3[4] = 5; |
982 slow_arr.length = 100; | 982 Object.defineProperty(arr3, 'length', {value: 1, writable: false}); |
983 Object.deliverChangeRecords(observer.callback); | 983 Object.deliverChangeRecords(observer.callback); |
984 observer.assertCallbackRecords([ | 984 observer.assertCallbackRecords([ |
985 { object: arr, name: '3', type: 'deleted', oldValue: 'd' }, | 985 { object: arr, name: '3', type: 'deleted', oldValue: 'd' }, |
986 { object: arr, name: '2', type: 'deleted' }, | 986 { object: arr, name: '2', type: 'deleted' }, |
987 { object: arr, name: 'length', type: 'updated', oldValue: 4 }, | 987 { object: arr, name: 'length', type: 'updated', oldValue: 4 }, |
988 { object: arr, name: '1', type: 'deleted', oldValue: 'b' }, | 988 { object: arr, name: '1', type: 'deleted', oldValue: 'b' }, |
989 { object: arr, name: 'length', type: 'updated', oldValue: 2 }, | 989 { object: arr, name: 'length', type: 'updated', oldValue: 2 }, |
990 { object: arr, name: 'length', type: 'updated', oldValue: 1 }, | 990 { object: arr, name: 'length', type: 'updated', oldValue: 1 }, |
991 { object: arr, name: 'length', type: 'reconfigured' }, | 991 { object: arr, name: 'length', type: 'reconfigured' }, |
992 { object: arr2, name: '1', type: 'deleted', oldValue: 'beta' }, | 992 { object: arr2, name: '1', type: 'deleted', oldValue: 'beta' }, |
993 { object: arr2, name: 'length', type: 'updated', oldValue: 2 }, | 993 { object: arr2, name: 'length', type: 'updated', oldValue: 2 }, |
994 { object: arr2, name: 'length', type: 'reconfigured', oldValue: 1 }, | 994 { object: arr2, name: 'length', type: 'reconfigured' }, |
995 { object: arr3, name: '2', type: 'deleted', oldValue: 'goodbye' }, | 995 { object: arr3, name: '2', type: 'deleted', oldValue: 'goodbye' }, |
996 { object: arr3, name: '0', type: 'deleted', oldValue: 'hello' }, | 996 { object: arr3, name: '0', type: 'deleted', oldValue: 'hello' }, |
997 { object: arr3, name: 'length', type: 'updated', oldValue: 6 }, | 997 { object: arr3, name: 'length', type: 'updated', oldValue: 6 }, |
998 { object: arr3, name: 'length', type: 'updated', oldValue: 0 }, | 998 { object: arr3, name: 'length', type: 'updated', oldValue: 0 }, |
999 { object: arr3, name: 'length', type: 'updated', oldValue: 1 }, | 999 { object: arr3, name: 'length', type: 'updated', oldValue: 1 }, |
1000 { object: arr3, name: 'length', type: 'updated', oldValue: 2 }, | 1000 { object: arr3, name: 'length', type: 'updated', oldValue: 2 }, |
1001 { object: arr3, name: 'length', type: 'updated', oldValue: 1 }, | 1001 { object: arr3, name: 'length', type: 'updated', oldValue: 1 }, |
1002 { object: arr3, name: 'length', type: 'reconfigured', oldValue: 5 }, | 1002 { object: arr3, name: '4', type: 'new' }, |
1003 { object: arr3, name: '4', type: 'deleted', oldValue: 5 }, | |
1004 { object: arr3, name: 'length', type: 'updated', oldValue: 5 }, | |
1005 { object: arr3, name: 'length', type: 'reconfigured' } | |
rossberg
2013/05/27 14:48:41
Not sure I understand, why is it correct that this
rafaelw
2013/05/28 11:38:53
It isn't correct, but Adam and I discussed and dec
rossberg
2013/06/04 10:56:58
OK, can you add a TODO then?
rafaelw
2013/06/04 23:42:21
Done.
| |
1006 ]); | |
1007 Object.deliverChangeRecords(observer2.callback); | |
1008 observer2.assertCallbackRecords([ | |
1009 { object: arr, type: 'splice', index: 2, removed: [, 'd'], addedCount: 0 }, | |
1010 { object: arr, type: 'splice', index: 1, removed: ['b'], addedCount: 0 }, | |
1011 { object: arr, type: 'splice', index: 1, removed: [], addedCount: 9 }, | |
1012 { object: arr2, type: 'splice', index: 1, removed: ['beta'], addedCount: 0 }, | |
1013 { object: arr3, type: 'splice', index: 0, removed: ['hello',, 'goodbye',,,,], addedCount: 0 }, | |
1014 { object: arr3, type: 'splice', index: 0, removed: [], addedCount: 1 }, | |
1015 { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 1 }, | |
1016 { object: arr3, type: 'splice', index: 1, removed: [,], addedCount: 0 }, | |
1017 { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 4 }, | |
1018 { object: arr3, name: '4', type: 'new' }, | |
1019 { object: arr3, type: 'splice', index: 1, removed: [,,,5], addedCount: 0 } | |
1020 ]); | |
1021 | |
1022 | |
1023 // Updating length on large (slow) array | |
1024 reset(); | |
1025 var slow_arr = new Array(1000000000); | |
1026 slow_arr[500000000] = 'hello'; | |
1027 Object.observe(slow_arr, observer.callback); | |
1028 var spliceRecords; | |
1029 function slowSpliceCallback(records) { | |
1030 spliceRecords = records; | |
1031 } | |
1032 Array.observe(slow_arr, slowSpliceCallback); | |
1033 slow_arr.length = 100; | |
1034 Object.deliverChangeRecords(observer.callback); | |
1035 observer.assertCallbackRecords([ | |
1003 { object: slow_arr, name: '500000000', type: 'deleted', oldValue: 'hello' }, | 1036 { object: slow_arr, name: '500000000', type: 'deleted', oldValue: 'hello' }, |
1004 { object: slow_arr, name: 'length', type: 'updated', oldValue: 1000000000 }, | 1037 { object: slow_arr, name: 'length', type: 'updated', oldValue: 1000000000 }, |
1005 ]); | 1038 ]); |
1039 Object.deliverChangeRecords(slowSpliceCallback); | |
1040 assertEquals(spliceRecords.length, 1); | |
1041 // Have to custom assert this splice record because the removed array is huge. | |
1042 var splice = spliceRecords[0]; | |
1043 assertSame(splice.object, slow_arr); | |
1044 assertEquals(splice.type, 'splice'); | |
1045 assertEquals(splice.index, 100); | |
1046 assertEquals(splice.addedCount, 0); | |
1047 var array_keys = %GetArrayKeys(splice.removed, splice.removed.length); | |
1048 assertEquals(array_keys.length, 1); | |
1049 assertEquals(array_keys[0], 499999900); | |
1050 assertEquals(splice.removed[499999900], 'hello'); | |
1051 assertEquals(splice.removed.length, 999999900); | |
1006 | 1052 |
1007 | 1053 |
1008 // Assignments in loops (checking different IC states). | 1054 // Assignments in loops (checking different IC states). |
1009 reset(); | 1055 reset(); |
1010 var obj = {}; | 1056 var obj = {}; |
1011 Object.observe(obj, observer.callback); | 1057 Object.observe(obj, observer.callback); |
1012 for (var i = 0; i < 5; i++) { | 1058 for (var i = 0; i < 5; i++) { |
1013 obj["a" + i] = i; | 1059 obj["a" + i] = i; |
1014 } | 1060 } |
1015 Object.deliverChangeRecords(observer.callback); | 1061 Object.deliverChangeRecords(observer.callback); |
(...skipping 14 matching lines...) Expand all Loading... | |
1030 Object.deliverChangeRecords(observer.callback); | 1076 Object.deliverChangeRecords(observer.callback); |
1031 observer.assertCallbackRecords([ | 1077 observer.assertCallbackRecords([ |
1032 { object: obj, name: "0", type: "new" }, | 1078 { object: obj, name: "0", type: "new" }, |
1033 { object: obj, name: "1", type: "new" }, | 1079 { object: obj, name: "1", type: "new" }, |
1034 { object: obj, name: "2", type: "new" }, | 1080 { object: obj, name: "2", type: "new" }, |
1035 { object: obj, name: "3", type: "new" }, | 1081 { object: obj, name: "3", type: "new" }, |
1036 { object: obj, name: "4", type: "new" }, | 1082 { object: obj, name: "4", type: "new" }, |
1037 ]); | 1083 ]); |
1038 | 1084 |
1039 | 1085 |
1040 // Adding elements past the end of an array should notify on length | 1086 // Adding elements past the end of an array should notify on length for |
1087 // Object.observe and emit "splices" for Array.observe. | |
1041 reset(); | 1088 reset(); |
1042 var arr = [1, 2, 3]; | 1089 var arr = [1, 2, 3]; |
1043 Object.observe(arr, observer.callback); | 1090 Object.observe(arr, observer.callback); |
1091 Array.observe(arr, observer2.callback); | |
1044 arr[3] = 10; | 1092 arr[3] = 10; |
1045 arr[100] = 20; | 1093 arr[100] = 20; |
1046 Object.defineProperty(arr, '200', {value: 7}); | 1094 Object.defineProperty(arr, '200', {value: 7}); |
1047 Object.defineProperty(arr, '400', {get: function(){}}); | 1095 Object.defineProperty(arr, '400', {get: function(){}}); |
1048 arr[50] = 30; // no length change expected | 1096 arr[50] = 30; // no length change expected |
1049 Object.deliverChangeRecords(observer.callback); | 1097 Object.deliverChangeRecords(observer.callback); |
1050 observer.assertCallbackRecords([ | 1098 observer.assertCallbackRecords([ |
1051 { object: arr, name: '3', type: 'new' }, | 1099 { object: arr, name: '3', type: 'new' }, |
1052 { object: arr, name: 'length', type: 'updated', oldValue: 3 }, | 1100 { object: arr, name: 'length', type: 'updated', oldValue: 3 }, |
1053 { object: arr, name: '100', type: 'new' }, | 1101 { object: arr, name: '100', type: 'new' }, |
1054 { object: arr, name: 'length', type: 'updated', oldValue: 4 }, | 1102 { object: arr, name: 'length', type: 'updated', oldValue: 4 }, |
1055 { object: arr, name: '200', type: 'new' }, | 1103 { object: arr, name: '200', type: 'new' }, |
1056 { object: arr, name: 'length', type: 'updated', oldValue: 101 }, | 1104 { object: arr, name: 'length', type: 'updated', oldValue: 101 }, |
1057 { object: arr, name: '400', type: 'new' }, | 1105 { object: arr, name: '400', type: 'new' }, |
1058 { object: arr, name: 'length', type: 'updated', oldValue: 201 }, | 1106 { object: arr, name: 'length', type: 'updated', oldValue: 201 }, |
1059 { object: arr, name: '50', type: 'new' }, | 1107 { object: arr, name: '50', type: 'new' }, |
1060 ]); | 1108 ]); |
1109 Object.deliverChangeRecords(observer2.callback); | |
1110 observer2.assertCallbackRecords([ | |
1111 { object: arr, type: 'splice', index: 3, removed: [], addedCount: 1 }, | |
1112 { object: arr, type: 'splice', index: 4, removed: [], addedCount: 97 }, | |
1113 { object: arr, type: 'splice', index: 101, removed: [], addedCount: 100 }, | |
1114 { object: arr, type: 'splice', index: 201, removed: [], addedCount: 200 }, | |
1115 { object: arr, type: 'new', name: '50' }, | |
1116 ]); | |
1061 | 1117 |
1062 | 1118 |
1063 // Tests for array methods, first on arrays and then on plain objects | 1119 // Tests for array methods, first on arrays and then on plain objects |
1064 // | 1120 // |
1065 // === ARRAYS === | 1121 // === ARRAYS === |
1066 // | 1122 // |
1067 // Push | 1123 // Push |
1068 reset(); | 1124 reset(); |
1069 var array = [1, 2]; | 1125 var array = [1, 2]; |
1070 Object.observe(array, observer.callback); | 1126 Object.observe(array, observer.callback); |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1387 for (var n1 = 0; n1 < 3; ++n1) | 1443 for (var n1 = 0; n1 < 3; ++n1) |
1388 for (var n2 = 0; n2 < 3; ++n2) | 1444 for (var n2 = 0; n2 < 3; ++n2) |
1389 for (var i in mutation) | 1445 for (var i in mutation) |
1390 TestFastElementsLength(mutation[i], b1 != 0, b2 != 0, 20*n1, 20*n2); | 1446 TestFastElementsLength(mutation[i], b1 != 0, b2 != 0, 20*n1, 20*n2); |
1391 | 1447 |
1392 for (var b1 = 0; b1 < 2; ++b1) | 1448 for (var b1 = 0; b1 < 2; ++b1) |
1393 for (var b2 = 0; b2 < 2; ++b2) | 1449 for (var b2 = 0; b2 < 2; ++b2) |
1394 for (var n = 0; n < 3; ++n) | 1450 for (var n = 0; n < 3; ++n) |
1395 for (var i in mutationByIncr) | 1451 for (var i in mutationByIncr) |
1396 TestFastElementsLength(mutationByIncr[i], b1 != 0, b2 != 0, 7*n, 7*n+1); | 1452 TestFastElementsLength(mutationByIncr[i], b1 != 0, b2 != 0, 7*n, 7*n+1); |
OLD | NEW |