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

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

Issue 2827443002: Reland [typedarrays] Check detached buffer at start of typed array methods (Closed)
Patch Set: rebase Created 3 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 | « src/crankshaft/hydrogen.cc ('k') | src/objects-inl.h » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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) { 5 (function(global, utils) {
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 // array.js has to come before typedarray.js for this to work 14 // array.js has to come before typedarray.js for this to work
15 var ArrayToString = utils.ImportNow("ArrayToString"); 15 var ArrayToString = utils.ImportNow("ArrayToString");
16 var ArrayValues;
17 var GetIterator; 16 var GetIterator;
18 var GetMethod; 17 var GetMethod;
19 var GlobalArray = global.Array; 18 var GlobalArray = global.Array;
20 var GlobalArrayBuffer = global.ArrayBuffer; 19 var GlobalArrayBuffer = global.ArrayBuffer;
21 var GlobalArrayBufferPrototype = GlobalArrayBuffer.prototype; 20 var GlobalArrayBufferPrototype = GlobalArrayBuffer.prototype;
22 var GlobalObject = global.Object; 21 var GlobalObject = global.Object;
23 var InnerArrayFind; 22 var InnerArrayFind;
24 var InnerArrayFindIndex; 23 var InnerArrayFindIndex;
25 var InnerArrayJoin; 24 var InnerArrayJoin;
26 var InnerArraySort; 25 var InnerArraySort;
(...skipping 19 matching lines...) Expand all
46 45
47 macro DECLARE_GLOBALS(NAME, SIZE) 46 macro DECLARE_GLOBALS(NAME, SIZE)
48 var GlobalNAME = global.NAME; 47 var GlobalNAME = global.NAME;
49 endmacro 48 endmacro
50 49
51 TYPED_ARRAYS(DECLARE_GLOBALS) 50 TYPED_ARRAYS(DECLARE_GLOBALS)
52 51
53 var GlobalTypedArray = %object_get_prototype_of(GlobalUint8Array); 52 var GlobalTypedArray = %object_get_prototype_of(GlobalUint8Array);
54 53
55 utils.Import(function(from) { 54 utils.Import(function(from) {
56 ArrayValues = from.ArrayValues;
57 GetIterator = from.GetIterator; 55 GetIterator = from.GetIterator;
58 GetMethod = from.GetMethod; 56 GetMethod = from.GetMethod;
59 InnerArrayFind = from.InnerArrayFind; 57 InnerArrayFind = from.InnerArrayFind;
60 InnerArrayFindIndex = from.InnerArrayFindIndex; 58 InnerArrayFindIndex = from.InnerArrayFindIndex;
61 InnerArrayJoin = from.InnerArrayJoin; 59 InnerArrayJoin = from.InnerArrayJoin;
62 InnerArraySort = from.InnerArraySort; 60 InnerArraySort = from.InnerArraySort;
63 InnerArrayToLocaleString = from.InnerArrayToLocaleString; 61 InnerArrayToLocaleString = from.InnerArrayToLocaleString;
64 MaxSimple = from.MaxSimple; 62 MaxSimple = from.MaxSimple;
65 MinSimple = from.MinSimple; 63 MinSimple = from.MinSimple;
66 }); 64 });
(...skipping 12 matching lines...) Expand all
79 return defaultConstructor; 77 return defaultConstructor;
80 } 78 }
81 if (%IsConstructor(species)) { 79 if (%IsConstructor(species)) {
82 return species; 80 return species;
83 } 81 }
84 throw %make_type_error(kSpeciesNotConstructor); 82 throw %make_type_error(kSpeciesNotConstructor);
85 } 83 }
86 84
87 // --------------- Typed Arrays --------------------- 85 // --------------- Typed Arrays ---------------------
88 86
87 // ES6 section 22.2.3.5.1 ValidateTypedArray ( O )
88 function ValidateTypedArray(array, methodName) {
89 if (!IS_TYPEDARRAY(array)) throw %make_type_error(kNotTypedArray);
90
91 if (%_ArrayBufferViewWasNeutered(array))
92 throw %make_type_error(kDetachedOperation, methodName);
93 }
94
89 function TypedArrayDefaultConstructor(typedArray) { 95 function TypedArrayDefaultConstructor(typedArray) {
90 switch (%_ClassOf(typedArray)) { 96 switch (%_ClassOf(typedArray)) {
91 macro TYPED_ARRAY_CONSTRUCTOR_CASE(NAME, ELEMENT_SIZE) 97 macro TYPED_ARRAY_CONSTRUCTOR_CASE(NAME, ELEMENT_SIZE)
92 case "NAME": 98 case "NAME":
93 return GlobalNAME; 99 return GlobalNAME;
94 endmacro 100 endmacro
95 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR_CASE) 101 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR_CASE)
96 } 102 }
97 // The TypeError should not be generated since all callers should 103 // The TypeError should not be generated since all callers should
98 // have already called ValidateTypedArray. 104 // have already called ValidateTypedArray.
99 throw %make_type_error(kIncompatibleMethodReceiver, 105 throw %make_type_error(kIncompatibleMethodReceiver,
100 "TypedArrayDefaultConstructor", this); 106 "TypedArrayDefaultConstructor", this);
101 } 107 }
102 108
103 function TypedArrayCreate(constructor, arg0, arg1, arg2) { 109 function TypedArrayCreate(constructor, arg0, arg1, arg2) {
104 if (IS_UNDEFINED(arg1)) { 110 if (IS_UNDEFINED(arg1)) {
105 var newTypedArray = new constructor(arg0); 111 var newTypedArray = new constructor(arg0);
106 } else { 112 } else {
107 var newTypedArray = new constructor(arg0, arg1, arg2); 113 var newTypedArray = new constructor(arg0, arg1, arg2);
108 } 114 }
109 if (!IS_TYPEDARRAY(newTypedArray)) throw %make_type_error(kNotTypedArray); 115 ValidateTypedArray(newTypedArray, "TypedArrayCreate");
110 // TODO(littledan): Check for being detached, here and elsewhere
111 // All callers where the first argument is a Number have no additional
112 // arguments.
113 if (IS_NUMBER(arg0) && %_TypedArrayGetLength(newTypedArray) < arg0) { 116 if (IS_NUMBER(arg0) && %_TypedArrayGetLength(newTypedArray) < arg0) {
114 throw %make_type_error(kTypedArrayTooShort); 117 throw %make_type_error(kTypedArrayTooShort);
115 } 118 }
116 return newTypedArray; 119 return newTypedArray;
117 } 120 }
118 121
119 function TypedArraySpeciesCreate(exemplar, arg0, arg1, arg2, conservative) { 122 function TypedArraySpeciesCreate(exemplar, arg0, arg1, arg2) {
120 var defaultConstructor = TypedArrayDefaultConstructor(exemplar); 123 var defaultConstructor = TypedArrayDefaultConstructor(exemplar);
121 var constructor = SpeciesConstructor(exemplar, defaultConstructor, 124 var constructor = SpeciesConstructor(exemplar, defaultConstructor);
122 conservative);
123 return TypedArrayCreate(constructor, arg0, arg1, arg2); 125 return TypedArrayCreate(constructor, arg0, arg1, arg2);
124 } 126 }
125 127
126 macro TYPED_ARRAY_CONSTRUCTOR(NAME, ELEMENT_SIZE) 128 macro TYPED_ARRAY_CONSTRUCTOR(NAME, ELEMENT_SIZE)
127 function NAMEConstructByIterable(obj, iterable, iteratorFn) { 129 function NAMEConstructByIterable(obj, iterable, iteratorFn) {
128 if (%IterableToListCanBeElided(iterable)) { 130 if (%IterableToListCanBeElided(iterable)) {
129 // This .length access is unobservable, because it being observable would 131 // This .length access is unobservable, because it being observable would
130 // mean that iteration has side effects, and we wouldn't reach this path. 132 // mean that iteration has side effects, and we wouldn't reach this path.
131 %typed_array_construct_by_array_like( 133 %typed_array_construct_by_array_like(
132 obj, iterable, iterable.length, ELEMENT_SIZE); 134 obj, iterable, iterable.length, ELEMENT_SIZE);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 endInt = MinSimple(endInt, srcLength); 219 endInt = MinSimple(endInt, srcLength);
218 } 220 }
219 221
220 if (endInt < beginInt) { 222 if (endInt < beginInt) {
221 endInt = beginInt; 223 endInt = beginInt;
222 } 224 }
223 225
224 var newLength = endInt - beginInt; 226 var newLength = endInt - beginInt;
225 var beginByteOffset = 227 var beginByteOffset =
226 %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; 228 %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE;
227 // BUG(v8:4665): For web compatibility, subarray needs to always build an 229 return TypedArraySpeciesCreate(this, %TypedArrayGetBuffer(this),
228 // instance of the default constructor. 230 beginByteOffset, newLength);
229 // TODO(littledan): Switch to the standard or standardize the fix
230 return new GlobalNAME(%TypedArrayGetBuffer(this), beginByteOffset, newLength);
231 } 231 }
232 endmacro 232 endmacro
233 233
234 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) 234 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR)
235 235
236 function TypedArraySubArray(begin, end) { 236 function TypedArraySubArray(begin, end) {
237 switch (%_ClassOf(this)) { 237 switch (%_ClassOf(this)) {
238 macro TYPED_ARRAY_SUBARRAY_CASE(NAME, ELEMENT_SIZE) 238 macro TYPED_ARRAY_SUBARRAY_CASE(NAME, ELEMENT_SIZE)
239 case "NAME": 239 case "NAME":
240 return %_Call(NAMESubArray, this, begin, end); 240 return %_Call(NAMESubArray, this, begin, end);
241 endmacro 241 endmacro
242 TYPED_ARRAYS(TYPED_ARRAY_SUBARRAY_CASE) 242 TYPED_ARRAYS(TYPED_ARRAY_SUBARRAY_CASE)
243 } 243 }
244 throw %make_type_error(kIncompatibleMethodReceiver, 244 throw %make_type_error(kIncompatibleMethodReceiver,
245 "get TypedArray.prototype.subarray", this); 245 "get %TypedArray%.prototype.subarray", this);
246 } 246 }
247 %SetForceInlineFlag(TypedArraySubArray); 247 %SetForceInlineFlag(TypedArraySubArray);
248 248
249 249
250 250
251 function TypedArraySetFromArrayLike(target, source, sourceLength, offset) { 251 function TypedArraySetFromArrayLike(target, source, sourceLength, offset) {
252 if (offset > 0) { 252 if (offset > 0) {
253 for (var i = 0; i < sourceLength; i++) { 253 for (var i = 0; i < sourceLength; i++) {
254 target[offset + i] = source[i]; 254 target[offset + i] = source[i];
255 } 255 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 if (i in array) { 368 if (i in array) {
369 var element = array[i]; 369 var element = array[i];
370 if (!%_Call(f, receiver, element, i, array)) return false; 370 if (!%_Call(f, receiver, element, i, array)) return false;
371 } 371 }
372 } 372 }
373 return true; 373 return true;
374 } 374 }
375 375
376 // ES6 draft 05-05-15, section 22.2.3.7 376 // ES6 draft 05-05-15, section 22.2.3.7
377 function TypedArrayEvery(f, receiver) { 377 function TypedArrayEvery(f, receiver) {
378 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 378 ValidateTypedArray(this, "%TypedArray%.prototype.every");
379 379
380 var length = %_TypedArrayGetLength(this); 380 var length = %_TypedArrayGetLength(this);
381 381
382 return InnerTypedArrayEvery(f, receiver, this, length); 382 return InnerTypedArrayEvery(f, receiver, this, length);
383 } 383 }
384 %FunctionSetLength(TypedArrayEvery, 1); 384 %FunctionSetLength(TypedArrayEvery, 1);
385 385
386 function InnerTypedArrayForEach(f, receiver, array, length) { 386 function InnerTypedArrayForEach(f, receiver, array, length) {
387 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); 387 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f);
388 388
389 if (IS_UNDEFINED(receiver)) { 389 if (IS_UNDEFINED(receiver)) {
390 for (var i = 0; i < length; i++) { 390 for (var i = 0; i < length; i++) {
391 if (i in array) { 391 if (i in array) {
392 var element = array[i]; 392 var element = array[i];
393 f(element, i, array); 393 f(element, i, array);
394 } 394 }
395 } 395 }
396 } else { 396 } else {
397 for (var i = 0; i < length; i++) { 397 for (var i = 0; i < length; i++) {
398 if (i in array) { 398 if (i in array) {
399 var element = array[i]; 399 var element = array[i];
400 %_Call(f, receiver, element, i, array); 400 %_Call(f, receiver, element, i, array);
401 } 401 }
402 } 402 }
403 } 403 }
404 } 404 }
405 405
406 // ES6 draft 08-24-14, section 22.2.3.12 406 // ES6 draft 08-24-14, section 22.2.3.12
407 function TypedArrayForEach(f, receiver) { 407 function TypedArrayForEach(f, receiver) {
408 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 408 ValidateTypedArray(this, "%TypedArray%.prototype.forEach");
409 409
410 var length = %_TypedArrayGetLength(this); 410 var length = %_TypedArrayGetLength(this);
411 411
412 InnerTypedArrayForEach(f, receiver, this, length); 412 InnerTypedArrayForEach(f, receiver, this, length);
413 } 413 }
414 %FunctionSetLength(TypedArrayForEach, 1); 414 %FunctionSetLength(TypedArrayForEach, 1);
415 415
416 // The following functions cannot be made efficient on sparse arrays while 416 // The following functions cannot be made efficient on sparse arrays while
417 // preserving the semantics, since the calls to the receiver function can add 417 // preserving the semantics, since the calls to the receiver function can add
418 // or delete elements from the array. 418 // or delete elements from the array.
419 function InnerTypedArrayFilter(f, receiver, array, length, result) { 419 function InnerTypedArrayFilter(f, receiver, array, length, result) {
420 var result_length = 0; 420 var result_length = 0;
421 for (var i = 0; i < length; i++) { 421 for (var i = 0; i < length; i++) {
422 if (i in array) { 422 if (i in array) {
423 var element = array[i]; 423 var element = array[i];
424 if (%_Call(f, receiver, element, i, array)) { 424 if (%_Call(f, receiver, element, i, array)) {
425 %CreateDataProperty(result, result_length, element); 425 %CreateDataProperty(result, result_length, element);
426 result_length++; 426 result_length++;
427 } 427 }
428 } 428 }
429 } 429 }
430 return result; 430 return result;
431 } 431 }
432 432
433 433
434 // ES6 draft 07-15-13, section 22.2.3.9 434 // ES6 draft 07-15-13, section 22.2.3.9
435 function TypedArrayFilter(f, thisArg) { 435 function TypedArrayFilter(f, thisArg) {
436 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 436 ValidateTypedArray(this, "%TypeArray%.prototype.filter");
437 437
438 var length = %_TypedArrayGetLength(this); 438 var length = %_TypedArrayGetLength(this);
439 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); 439 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f);
440 var result = new InternalArray(); 440 var result = new InternalArray();
441 InnerTypedArrayFilter(f, thisArg, this, length, result); 441 InnerTypedArrayFilter(f, thisArg, this, length, result);
442 var captured = result.length; 442 var captured = result.length;
443 var output = TypedArraySpeciesCreate(this, captured); 443 var output = TypedArraySpeciesCreate(this, captured);
444 for (var i = 0; i < captured; i++) { 444 for (var i = 0; i < captured; i++) {
445 output[i] = result[i]; 445 output[i] = result[i];
446 } 446 }
447 return output; 447 return output;
448 } 448 }
449 %FunctionSetLength(TypedArrayFilter, 1); 449 %FunctionSetLength(TypedArrayFilter, 1);
450 450
451 451
452 // ES6 draft 07-15-13, section 22.2.3.10 452 // ES6 draft 07-15-13, section 22.2.3.10
453 function TypedArrayFind(predicate, thisArg) { 453 function TypedArrayFind(predicate, thisArg) {
454 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 454 ValidateTypedArray(this, "%TypedArray%.prototype.find");
455 455
456 var length = %_TypedArrayGetLength(this); 456 var length = %_TypedArrayGetLength(this);
457 457
458 return InnerArrayFind(predicate, thisArg, this, length); 458 return InnerArrayFind(predicate, thisArg, this, length);
459 } 459 }
460 %FunctionSetLength(TypedArrayFind, 1); 460 %FunctionSetLength(TypedArrayFind, 1);
461 461
462 462
463 // ES6 draft 07-15-13, section 22.2.3.11 463 // ES6 draft 07-15-13, section 22.2.3.11
464 function TypedArrayFindIndex(predicate, thisArg) { 464 function TypedArrayFindIndex(predicate, thisArg) {
465 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 465 ValidateTypedArray(this, "%TypedArray%.prototype.findIndex");
466 466
467 var length = %_TypedArrayGetLength(this); 467 var length = %_TypedArrayGetLength(this);
468 468
469 return InnerArrayFindIndex(predicate, thisArg, this, length); 469 return InnerArrayFindIndex(predicate, thisArg, this, length);
470 } 470 }
471 %FunctionSetLength(TypedArrayFindIndex, 1); 471 %FunctionSetLength(TypedArrayFindIndex, 1);
472 472
473 473
474 // ES6 draft 05-18-15, section 22.2.3.25 474 // ES6 draft 05-18-15, section 22.2.3.25
475 function TypedArraySort(comparefn) { 475 function TypedArraySort(comparefn) {
476 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 476 ValidateTypedArray(this, "%TypedArray%.prototype.sort");
477 477
478 var length = %_TypedArrayGetLength(this); 478 var length = %_TypedArrayGetLength(this);
479 479
480 if (IS_UNDEFINED(comparefn)) { 480 if (IS_UNDEFINED(comparefn)) {
481 return %TypedArraySortFast(this); 481 return %TypedArraySortFast(this);
482 } 482 }
483 483
484 return InnerArraySort(this, length, comparefn); 484 return InnerArraySort(this, length, comparefn);
485 } 485 }
486 486
487 487
488 // ES6 draft 07-15-13, section 22.2.3.18 488 // ES6 draft 07-15-13, section 22.2.3.18
489 function TypedArrayMap(f, thisArg) { 489 function TypedArrayMap(f, thisArg) {
490 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 490 ValidateTypedArray(this, "%TypedArray%.prototype.map");
491 491
492 var length = %_TypedArrayGetLength(this); 492 var length = %_TypedArrayGetLength(this);
493 var result = TypedArraySpeciesCreate(this, length); 493 var result = TypedArraySpeciesCreate(this, length);
494 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); 494 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f);
495 for (var i = 0; i < length; i++) { 495 for (var i = 0; i < length; i++) {
496 var element = this[i]; 496 var element = this[i];
497 result[i] = %_Call(f, thisArg, element, i, this); 497 result[i] = %_Call(f, thisArg, element, i, this);
498 } 498 }
499 return result; 499 return result;
500 } 500 }
501 %FunctionSetLength(TypedArrayMap, 1); 501 %FunctionSetLength(TypedArrayMap, 1);
502 502
503 function InnerTypedArraySome(f, receiver, array, length) { 503 function InnerTypedArraySome(f, receiver, array, length) {
504 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); 504 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f);
505 505
506 for (var i = 0; i < length; i++) { 506 for (var i = 0; i < length; i++) {
507 if (i in array) { 507 if (i in array) {
508 var element = array[i]; 508 var element = array[i];
509 if (%_Call(f, receiver, element, i, array)) return true; 509 if (%_Call(f, receiver, element, i, array)) return true;
510 } 510 }
511 } 511 }
512 return false; 512 return false;
513 } 513 }
514 514
515 // ES6 draft 05-05-15, section 22.2.3.24 515 // ES6 draft 05-05-15, section 22.2.3.24
516 function TypedArraySome(f, receiver) { 516 function TypedArraySome(f, receiver) {
517 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 517 ValidateTypedArray(this, "%TypedArray%.prototype.some");
518 518
519 var length = %_TypedArrayGetLength(this); 519 var length = %_TypedArrayGetLength(this);
520 520
521 return InnerTypedArraySome(f, receiver, this, length); 521 return InnerTypedArraySome(f, receiver, this, length);
522 } 522 }
523 %FunctionSetLength(TypedArraySome, 1); 523 %FunctionSetLength(TypedArraySome, 1);
524 524
525 525
526 // ES6 section 22.2.3.27 526 // ES6 section 22.2.3.27
527 function TypedArrayToLocaleString() { 527 function TypedArrayToLocaleString() {
528 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 528 ValidateTypedArray(this, "%TypedArray%.prototype.toLocaleString");
529 529
530 var length = %_TypedArrayGetLength(this); 530 var length = %_TypedArrayGetLength(this);
531 531
532 return InnerArrayToLocaleString(this, length); 532 return InnerArrayToLocaleString(this, length);
533 } 533 }
534 534
535 535
536 // ES6 section 22.2.3.14 536 // ES6 section 22.2.3.14
537 function TypedArrayJoin(separator) { 537 function TypedArrayJoin(separator) {
538 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 538 ValidateTypedArray(this, "%TypedArray%.prototype.join");
539 539
540 var length = %_TypedArrayGetLength(this); 540 var length = %_TypedArrayGetLength(this);
541 541
542 return InnerArrayJoin(separator, this, length); 542 return InnerArrayJoin(separator, this, length);
543 } 543 }
544 544
545 function InnerTypedArrayReduce( 545 function InnerTypedArrayReduce(
546 callback, current, array, length, argumentsLength) { 546 callback, current, array, length, argumentsLength) {
547 if (!IS_CALLABLE(callback)) { 547 if (!IS_CALLABLE(callback)) {
548 throw %make_type_error(kCalledNonCallable, callback); 548 throw %make_type_error(kCalledNonCallable, callback);
(...skipping 14 matching lines...) Expand all
563 if (i in array) { 563 if (i in array) {
564 var element = array[i]; 564 var element = array[i];
565 current = callback(current, element, i, array); 565 current = callback(current, element, i, array);
566 } 566 }
567 } 567 }
568 return current; 568 return current;
569 } 569 }
570 570
571 // ES6 draft 07-15-13, section 22.2.3.19 571 // ES6 draft 07-15-13, section 22.2.3.19
572 function TypedArrayReduce(callback, current) { 572 function TypedArrayReduce(callback, current) {
573 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 573 ValidateTypedArray(this, "%TypedArray%.prototype.reduce");
574 574
575 var length = %_TypedArrayGetLength(this); 575 var length = %_TypedArrayGetLength(this);
576 return InnerTypedArrayReduce( 576 return InnerTypedArrayReduce(
577 callback, current, this, length, arguments.length); 577 callback, current, this, length, arguments.length);
578 } 578 }
579 %FunctionSetLength(TypedArrayReduce, 1); 579 %FunctionSetLength(TypedArrayReduce, 1);
580 580
581 function InnerArrayReduceRight(callback, current, array, length, 581 function InnerArrayReduceRight(callback, current, array, length,
582 argumentsLength) { 582 argumentsLength) {
583 if (!IS_CALLABLE(callback)) { 583 if (!IS_CALLABLE(callback)) {
(...skipping 15 matching lines...) Expand all
599 if (i in array) { 599 if (i in array) {
600 var element = array[i]; 600 var element = array[i];
601 current = callback(current, element, i, array); 601 current = callback(current, element, i, array);
602 } 602 }
603 } 603 }
604 return current; 604 return current;
605 } 605 }
606 606
607 // ES6 draft 07-15-13, section 22.2.3.19 607 // ES6 draft 07-15-13, section 22.2.3.19
608 function TypedArrayReduceRight(callback, current) { 608 function TypedArrayReduceRight(callback, current) {
609 if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray); 609 ValidateTypedArray(this, "%TypedArray%.prototype.reduceRight");
610 610
611 var length = %_TypedArrayGetLength(this); 611 var length = %_TypedArrayGetLength(this);
612 return InnerArrayReduceRight(callback, current, this, length, 612 return InnerArrayReduceRight(callback, current, this, length,
613 arguments.length); 613 arguments.length);
614 } 614 }
615 %FunctionSetLength(TypedArrayReduceRight, 1); 615 %FunctionSetLength(TypedArrayReduceRight, 1);
616 616
617 617
618 // ES6 draft 08-24-14, section 22.2.2.2 618 // ES6 draft 08-24-14, section 22.2.2.2
619 function TypedArrayOf() { 619 function TypedArrayOf() {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 %AddNamedProperty(GlobalNAME.prototype, 720 %AddNamedProperty(GlobalNAME.prototype,
721 "constructor", global.NAME, DONT_ENUM); 721 "constructor", global.NAME, DONT_ENUM);
722 %AddNamedProperty(GlobalNAME.prototype, 722 %AddNamedProperty(GlobalNAME.prototype,
723 "BYTES_PER_ELEMENT", ELEMENT_SIZE, 723 "BYTES_PER_ELEMENT", ELEMENT_SIZE,
724 READ_ONLY | DONT_ENUM | DONT_DELETE); 724 READ_ONLY | DONT_ENUM | DONT_DELETE);
725 endmacro 725 endmacro
726 726
727 TYPED_ARRAYS(SETUP_TYPED_ARRAY) 727 TYPED_ARRAYS(SETUP_TYPED_ARRAY)
728 728
729 }) 729 })
OLDNEW
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698