Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: src/js/array.js

Issue 1879053003: Replace DefineIndexedProperty with %CreateDataProperty (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/js/regexp.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 (function(global, utils, extrasUtils) { 5 (function(global, utils, extrasUtils) {
6 6
7 "use strict"; 7 "use strict";
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
11 // ------------------------------------------------------------------- 11 // -------------------------------------------------------------------
12 // Imports 12 // Imports
13 13
14 var AddIndexedProperty;
15 var FLAG_harmony_species; 14 var FLAG_harmony_species;
16 var GetIterator; 15 var GetIterator;
17 var GetMethod; 16 var GetMethod;
18 var GlobalArray = global.Array; 17 var GlobalArray = global.Array;
19 var InternalArray = utils.InternalArray; 18 var InternalArray = utils.InternalArray;
20 var InternalPackedArray = utils.InternalPackedArray; 19 var InternalPackedArray = utils.InternalPackedArray;
21 var MakeTypeError; 20 var MakeTypeError;
22 var MaxSimple; 21 var MaxSimple;
23 var MinSimple; 22 var MinSimple;
24 var ObjectDefineProperty; 23 var ObjectDefineProperty;
25 var ObjectHasOwnProperty; 24 var ObjectHasOwnProperty;
26 var ObjectToString = utils.ImportNow("object_to_string"); 25 var ObjectToString = utils.ImportNow("object_to_string");
27 var ObserveBeginPerformSplice; 26 var ObserveBeginPerformSplice;
28 var ObserveEndPerformSplice; 27 var ObserveEndPerformSplice;
29 var ObserveEnqueueSpliceRecord; 28 var ObserveEnqueueSpliceRecord;
30 var iteratorSymbol = utils.ImportNow("iterator_symbol"); 29 var iteratorSymbol = utils.ImportNow("iterator_symbol");
31 var unscopablesSymbol = utils.ImportNow("unscopables_symbol"); 30 var unscopablesSymbol = utils.ImportNow("unscopables_symbol");
32 31
33 utils.Import(function(from) { 32 utils.Import(function(from) {
34 AddIndexedProperty = from.AddIndexedProperty;
35 GetIterator = from.GetIterator; 33 GetIterator = from.GetIterator;
36 GetMethod = from.GetMethod; 34 GetMethod = from.GetMethod;
37 MakeTypeError = from.MakeTypeError; 35 MakeTypeError = from.MakeTypeError;
38 MaxSimple = from.MaxSimple; 36 MaxSimple = from.MaxSimple;
39 MinSimple = from.MinSimple; 37 MinSimple = from.MinSimple;
40 ObjectDefineProperty = from.ObjectDefineProperty; 38 ObjectDefineProperty = from.ObjectDefineProperty;
41 ObjectHasOwnProperty = from.ObjectHasOwnProperty; 39 ObjectHasOwnProperty = from.ObjectHasOwnProperty;
42 ObserveBeginPerformSplice = from.ObserveBeginPerformSplice; 40 ObserveBeginPerformSplice = from.ObserveBeginPerformSplice;
43 ObserveEndPerformSplice = from.ObserveEndPerformSplice; 41 ObserveEndPerformSplice = from.ObserveEndPerformSplice;
44 ObserveEnqueueSpliceRecord = from.ObserveEnqueueSpliceRecord; 42 ObserveEnqueueSpliceRecord = from.ObserveEnqueueSpliceRecord;
(...skipping 10 matching lines...) Expand all
55 var constructor; 53 var constructor;
56 if (FLAG_harmony_species) { 54 if (FLAG_harmony_species) {
57 constructor = %ArraySpeciesConstructor(array); 55 constructor = %ArraySpeciesConstructor(array);
58 } else { 56 } else {
59 constructor = GlobalArray; 57 constructor = GlobalArray;
60 } 58 }
61 return new constructor(length); 59 return new constructor(length);
62 } 60 }
63 61
64 62
65 function DefineIndexedProperty(array, i, value) {
66 if (FLAG_harmony_species) {
67 var result = ObjectDefineProperty(array, i, {
68 value: value, writable: true, configurable: true, enumerable: true
69 });
70 if (!result) throw MakeTypeError(kStrictCannotAssign, i);
71 } else {
72 AddIndexedProperty(array, i, value);
73 }
74 }
75
76 function KeySortCompare(a, b) { 63 function KeySortCompare(a, b) {
77 return a - b; 64 return a - b;
78 } 65 }
79 66
80 function GetSortedArrayKeys(array, indices) { 67 function GetSortedArrayKeys(array, indices) {
81 if (IS_NUMBER(indices)) { 68 if (IS_NUMBER(indices)) {
82 var keys = new InternalArray(); 69 var keys = new InternalArray();
83 // It's an interval 70 // It's an interval
84 var limit = indices; 71 var limit = indices;
85 for (var i = 0; i < limit; ++i) { 72 for (var i = 0; i < limit; ++i) {
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 // This function implements the optimized splice implementation that can use 245 // This function implements the optimized splice implementation that can use
259 // special array operations to handle sparse arrays in a sensible fashion. 246 // special array operations to handle sparse arrays in a sensible fashion.
260 function SparseSlice(array, start_i, del_count, len, deleted_elements) { 247 function SparseSlice(array, start_i, del_count, len, deleted_elements) {
261 // Move deleted elements to a new array (the return value from splice). 248 // Move deleted elements to a new array (the return value from splice).
262 var indices = %GetArrayKeys(array, start_i + del_count); 249 var indices = %GetArrayKeys(array, start_i + del_count);
263 if (IS_NUMBER(indices)) { 250 if (IS_NUMBER(indices)) {
264 var limit = indices; 251 var limit = indices;
265 for (var i = start_i; i < limit; ++i) { 252 for (var i = start_i; i < limit; ++i) {
266 var current = array[i]; 253 var current = array[i];
267 if (!IS_UNDEFINED(current) || i in array) { 254 if (!IS_UNDEFINED(current) || i in array) {
268 DefineIndexedProperty(deleted_elements, i - start_i, current); 255 %CreateDataProperty(deleted_elements, i - start_i, current);
269 } 256 }
270 } 257 }
271 } else { 258 } else {
272 var length = indices.length; 259 var length = indices.length;
273 for (var k = 0; k < length; ++k) { 260 for (var k = 0; k < length; ++k) {
274 var key = indices[k]; 261 var key = indices[k];
275 if (key >= start_i) { 262 if (key >= start_i) {
276 var current = array[key]; 263 var current = array[key];
277 if (!IS_UNDEFINED(current) || key in array) { 264 if (!IS_UNDEFINED(current) || key in array) {
278 DefineIndexedProperty(deleted_elements, key - start_i, current); 265 %CreateDataProperty(deleted_elements, key - start_i, current);
279 } 266 }
280 } 267 }
281 } 268 }
282 } 269 }
283 } 270 }
284 271
285 272
286 // This function implements the optimized splice implementation that can use 273 // This function implements the optimized splice implementation that can use
287 // special array operations to handle sparse arrays in a sensible fashion. 274 // special array operations to handle sparse arrays in a sensible fashion.
288 function SparseMove(array, start_i, del_count, len, num_additional_args) { 275 function SparseMove(array, start_i, del_count, len, num_additional_args) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 332
346 // This is part of the old simple-minded splice. We are using it either 333 // This is part of the old simple-minded splice. We are using it either
347 // because the receiver is not an array (so we have no choice) or because we 334 // because the receiver is not an array (so we have no choice) or because we
348 // know we are not deleting or moving a lot of elements. 335 // know we are not deleting or moving a lot of elements.
349 function SimpleSlice(array, start_i, del_count, len, deleted_elements) { 336 function SimpleSlice(array, start_i, del_count, len, deleted_elements) {
350 var is_array = IS_ARRAY(array); 337 var is_array = IS_ARRAY(array);
351 for (var i = 0; i < del_count; i++) { 338 for (var i = 0; i < del_count; i++) {
352 var index = start_i + i; 339 var index = start_i + i;
353 if (HAS_INDEX(array, index, is_array)) { 340 if (HAS_INDEX(array, index, is_array)) {
354 var current = array[index]; 341 var current = array[index];
355 DefineIndexedProperty(deleted_elements, i, current); 342 %CreateDataProperty(deleted_elements, i, current);
356 } 343 }
357 } 344 }
358 } 345 }
359 346
360 347
361 function SimpleMove(array, start_i, del_count, len, num_additional_args) { 348 function SimpleMove(array, start_i, del_count, len, num_additional_args) {
362 var is_array = IS_ARRAY(array); 349 var is_array = IS_ARRAY(array);
363 if (num_additional_args !== del_count) { 350 if (num_additional_args !== del_count) {
364 // Move the existing elements after the elements to be deleted 351 // Move the existing elements after the elements to be deleted
365 // to the right position in the resulting array. 352 // to the right position in the resulting array.
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 // The following functions cannot be made efficient on sparse arrays while 1191 // The following functions cannot be made efficient on sparse arrays while
1205 // preserving the semantics, since the calls to the receiver function can add 1192 // preserving the semantics, since the calls to the receiver function can add
1206 // or delete elements from the array. 1193 // or delete elements from the array.
1207 function InnerArrayFilter(f, receiver, array, length, result) { 1194 function InnerArrayFilter(f, receiver, array, length, result) {
1208 var result_length = 0; 1195 var result_length = 0;
1209 var is_array = IS_ARRAY(array); 1196 var is_array = IS_ARRAY(array);
1210 for (var i = 0; i < length; i++) { 1197 for (var i = 0; i < length; i++) {
1211 if (HAS_INDEX(array, i, is_array)) { 1198 if (HAS_INDEX(array, i, is_array)) {
1212 var element = array[i]; 1199 var element = array[i];
1213 if (%_Call(f, receiver, element, i, array)) { 1200 if (%_Call(f, receiver, element, i, array)) {
1214 DefineIndexedProperty(result, result_length, element); 1201 %CreateDataProperty(result, result_length, element);
1215 result_length++; 1202 result_length++;
1216 } 1203 }
1217 } 1204 }
1218 } 1205 }
1219 return result; 1206 return result;
1220 } 1207 }
1221 1208
1222 1209
1223 1210
1224 function ArrayFilter(f, receiver) { 1211 function ArrayFilter(f, receiver) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1324 // Pull out the length so that modifications to the length in the 1311 // Pull out the length so that modifications to the length in the
1325 // loop will not affect the looping and side effects are visible. 1312 // loop will not affect the looping and side effects are visible.
1326 var array = TO_OBJECT(this); 1313 var array = TO_OBJECT(this);
1327 var length = TO_LENGTH(array.length); 1314 var length = TO_LENGTH(array.length);
1328 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); 1315 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f);
1329 var result = ArraySpeciesCreate(array, length); 1316 var result = ArraySpeciesCreate(array, length);
1330 var is_array = IS_ARRAY(array); 1317 var is_array = IS_ARRAY(array);
1331 for (var i = 0; i < length; i++) { 1318 for (var i = 0; i < length; i++) {
1332 if (HAS_INDEX(array, i, is_array)) { 1319 if (HAS_INDEX(array, i, is_array)) {
1333 var element = array[i]; 1320 var element = array[i];
1334 DefineIndexedProperty(result, i, %_Call(f, receiver, element, i, array)); 1321 %CreateDataProperty(result, i, %_Call(f, receiver, element, i, array));
1335 } 1322 }
1336 } 1323 }
1337 return result; 1324 return result;
1338 } 1325 }
1339 1326
1340 1327
1341 // For .indexOf, we don't need to pass in the number of arguments 1328 // For .indexOf, we don't need to pass in the number of arguments
1342 // at the callsite since ToInteger(undefined) == 0; however, for 1329 // at the callsite since ToInteger(undefined) == 0; however, for
1343 // .lastIndexOf, we need to pass it, since the behavior for passing 1330 // .lastIndexOf, we need to pass it, since the behavior for passing
1344 // undefined is 0 but for not including the argument is length-1. 1331 // undefined is 0 but for not including the argument is length-1.
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1729 function ArrayIncludes(searchElement, fromIndex) { 1716 function ArrayIncludes(searchElement, fromIndex) {
1730 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.includes"); 1717 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.includes");
1731 1718
1732 var array = TO_OBJECT(this); 1719 var array = TO_OBJECT(this);
1733 var length = TO_LENGTH(array.length); 1720 var length = TO_LENGTH(array.length);
1734 1721
1735 return InnerArrayIncludes(searchElement, fromIndex, array, length); 1722 return InnerArrayIncludes(searchElement, fromIndex, array, length);
1736 } 1723 }
1737 1724
1738 1725
1739 function AddArrayElement(constructor, array, i, value) {
1740 if (constructor === GlobalArray) {
1741 AddIndexedProperty(array, i, value);
1742 } else {
1743 ObjectDefineProperty(array, i, {
1744 value: value, writable: true, configurable: true, enumerable: true
1745 });
1746 }
1747 }
1748
1749
1750 // ES6, draft 10-14-14, section 22.1.2.1 1726 // ES6, draft 10-14-14, section 22.1.2.1
1751 function ArrayFrom(arrayLike, mapfn, receiver) { 1727 function ArrayFrom(arrayLike, mapfn, receiver) {
1752 var items = TO_OBJECT(arrayLike); 1728 var items = TO_OBJECT(arrayLike);
1753 var mapping = !IS_UNDEFINED(mapfn); 1729 var mapping = !IS_UNDEFINED(mapfn);
1754 1730
1755 if (mapping) { 1731 if (mapping) {
1756 if (!IS_CALLABLE(mapfn)) { 1732 if (!IS_CALLABLE(mapfn)) {
1757 throw MakeTypeError(kCalledNonCallable, mapfn); 1733 throw MakeTypeError(kCalledNonCallable, mapfn);
1758 } 1734 }
1759 } 1735 }
1760 1736
1761 var iterable = GetMethod(items, iteratorSymbol); 1737 var iterable = GetMethod(items, iteratorSymbol);
1762 var k; 1738 var k;
1763 var result; 1739 var result;
1764 var mappedValue; 1740 var mappedValue;
1765 var nextValue; 1741 var nextValue;
1766 1742
1767 if (!IS_UNDEFINED(iterable)) { 1743 if (!IS_UNDEFINED(iterable)) {
1768 result = %IsConstructor(this) ? new this() : []; 1744 result = %IsConstructor(this) ? new this() : [];
1769 k = 0; 1745 k = 0;
1770 1746
1771 for (nextValue of 1747 for (nextValue of
1772 { [iteratorSymbol]() { return GetIterator(items, iterable) } }) { 1748 { [iteratorSymbol]() { return GetIterator(items, iterable) } }) {
1773 if (mapping) { 1749 if (mapping) {
1774 mappedValue = %_Call(mapfn, receiver, nextValue, k); 1750 mappedValue = %_Call(mapfn, receiver, nextValue, k);
1775 } else { 1751 } else {
1776 mappedValue = nextValue; 1752 mappedValue = nextValue;
1777 } 1753 }
1778 AddArrayElement(this, result, k, mappedValue); 1754 %CreateDataProperty(result, k, mappedValue);
1779 k++; 1755 k++;
1780 } 1756 }
1781 result.length = k; 1757 result.length = k;
1782 return result; 1758 return result;
1783 } else { 1759 } else {
1784 var len = TO_LENGTH(items.length); 1760 var len = TO_LENGTH(items.length);
1785 result = %IsConstructor(this) ? new this(len) : new GlobalArray(len); 1761 result = %IsConstructor(this) ? new this(len) : new GlobalArray(len);
1786 1762
1787 for (k = 0; k < len; ++k) { 1763 for (k = 0; k < len; ++k) {
1788 nextValue = items[k]; 1764 nextValue = items[k];
1789 if (mapping) { 1765 if (mapping) {
1790 mappedValue = %_Call(mapfn, receiver, nextValue, k); 1766 mappedValue = %_Call(mapfn, receiver, nextValue, k);
1791 } else { 1767 } else {
1792 mappedValue = nextValue; 1768 mappedValue = nextValue;
1793 } 1769 }
1794 AddArrayElement(this, result, k, mappedValue); 1770 %CreateDataProperty(result, k, mappedValue);
1795 } 1771 }
1796 1772
1797 result.length = k; 1773 result.length = k;
1798 return result; 1774 return result;
1799 } 1775 }
1800 } 1776 }
1801 1777
1802 1778
1803 // ES6, draft 05-22-14, section 22.1.2.3 1779 // ES6, draft 05-22-14, section 22.1.2.3
1804 function ArrayOf(...args) { 1780 function ArrayOf(...args) {
1805 var length = args.length; 1781 var length = args.length;
1806 var constructor = this; 1782 var constructor = this;
1807 // TODO: Implement IsConstructor (ES6 section 7.2.5) 1783 // TODO: Implement IsConstructor (ES6 section 7.2.5)
1808 var array = %IsConstructor(constructor) ? new constructor(length) : []; 1784 var array = %IsConstructor(constructor) ? new constructor(length) : [];
1809 for (var i = 0; i < length; i++) { 1785 for (var i = 0; i < length; i++) {
1810 AddArrayElement(constructor, array, i, args[i]); 1786 %CreateDataProperty(array, i, args[i]);
1811 } 1787 }
1812 array.length = length; 1788 array.length = length;
1813 return array; 1789 return array;
1814 } 1790 }
1815 1791
1816 // ------------------------------------------------------------------- 1792 // -------------------------------------------------------------------
1817 1793
1818 // Set up non-enumerable constructor property on the Array.prototype 1794 // Set up non-enumerable constructor property on the Array.prototype
1819 // object. 1795 // object.
1820 %AddNamedProperty(GlobalArray.prototype, "constructor", GlobalArray, 1796 %AddNamedProperty(GlobalArray.prototype, "constructor", GlobalArray,
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1955 %InstallToContext([ 1931 %InstallToContext([
1956 "array_pop", ArrayPop, 1932 "array_pop", ArrayPop,
1957 "array_push", ArrayPush, 1933 "array_push", ArrayPush,
1958 "array_shift", ArrayShift, 1934 "array_shift", ArrayShift,
1959 "array_splice", ArraySplice, 1935 "array_splice", ArraySplice,
1960 "array_slice", ArraySlice, 1936 "array_slice", ArraySlice,
1961 "array_unshift", ArrayUnshift, 1937 "array_unshift", ArrayUnshift,
1962 ]); 1938 ]);
1963 1939
1964 }); 1940 });
OLDNEW
« no previous file with comments | « no previous file | src/js/regexp.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698