96fb7d66b8856e141dc755c13fa5c941da09fbedd622d6b7aa2e56547712ed35ca1912c244c031fe2b2e619087b9a5dc5d5d6eb4df9679f1731aa42d54ca35 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. var $TypeError = require('es-errors/type');
  3. var Get = require('es-abstract/2024/Get');
  4. var GetValueFromBuffer = require('es-abstract/2024/GetValueFromBuffer');
  5. var IsDetachedBuffer = require('es-abstract/2024/IsDetachedBuffer');
  6. var max = require('math-intrinsics/max');
  7. var min = require('math-intrinsics/min');
  8. var Set = require('es-abstract/2024/Set');
  9. var SetValueInBuffer = require('es-abstract/2024/SetValueInBuffer');
  10. var ToIntegerOrInfinity = require('es-abstract/2024/ToIntegerOrInfinity');
  11. var ToString = require('es-abstract/2024/ToString');
  12. var TypedArrayElementSize = require('es-abstract/2024/TypedArrayElementSize');
  13. var TypedArrayElementType = require('es-abstract/2024/TypedArrayElementType');
  14. var TypedArraySpeciesCreate = require('es-abstract/2024/TypedArraySpeciesCreate');
  15. var ValidateTypedArray = require('es-abstract/2024/ValidateTypedArray');
  16. var typedArrayBuffer = require('typed-array-buffer');
  17. var typedArrayByteOffset = require('typed-array-byte-offset');
  18. // https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice
  19. module.exports = function slice(start, end) {
  20. var O = this; // step 1
  21. ValidateTypedArray(O, 'SEQ-CST'); // step 2
  22. // 3. Let len be O.[[ArrayLength]].
  23. var len = O.length; // steps 3
  24. var relativeStart = ToIntegerOrInfinity(start); // step 4
  25. var k;
  26. if (relativeStart === -Infinity) {
  27. k = 0; // step 5
  28. } else if (relativeStart < 0) {
  29. k = max(len + relativeStart, 0); // step 6
  30. } else {
  31. k = min(relativeStart, len); // step 7
  32. }
  33. var relativeEnd = typeof end === 'undefined' ? len : ToIntegerOrInfinity(end); // step 8
  34. var final;
  35. if (relativeEnd === -Infinity) {
  36. final = 0; // step 9
  37. } else if (relativeEnd < 0) {
  38. final = max(len + relativeEnd, 0); // step 10
  39. } else {
  40. final = min(relativeEnd, len); // step 11
  41. }
  42. var count = max(final - k, 0); // step 12
  43. var A = TypedArraySpeciesCreate(O, [count]); // step 13
  44. if (count > 0) { // step 14
  45. if (IsDetachedBuffer(typedArrayBuffer(O))) {
  46. throw new $TypeError('Cannot use a Typed Array with an underlying ArrayBuffer that is detached'); // step 14.a
  47. }
  48. var srcType = TypedArrayElementType(O); // step 14.b
  49. var targetType = TypedArrayElementType(A); // step 14.c
  50. if (srcType === targetType) { // step 14.d
  51. // 1. NOTE: The transfer must be performed in a manner that preserves the bit-level encoding of the source data.
  52. var srcBuffer = typedArrayBuffer(O); // step 14.d.ii
  53. var targetBuffer = typedArrayBuffer(A); // step 14.d.iii
  54. var elementSize = TypedArrayElementSize(O); // step 14.d.iv
  55. var srcByteOffset = typedArrayByteOffset(O); // step 14.d.v
  56. var srcByteIndex = (k * elementSize) + srcByteOffset; // step 14.d.vi
  57. var targetByteIndex = typedArrayByteOffset(A); // step 14.d.vii
  58. var limit = targetByteIndex + (count * elementSize); // step 14.d.viii
  59. while (targetByteIndex < limit) { // step 14.d.ix
  60. var value = GetValueFromBuffer(srcBuffer, srcByteIndex, 'UINT8', true, 'UNORDERED'); // step 14.d.ix.1
  61. SetValueInBuffer(targetBuffer, targetByteIndex, 'UINT8', value, true, 'UNORDERED'); // step 14.d.ix.2
  62. srcByteIndex += 1; // step 14.d.ix.3
  63. targetByteIndex += 1; // step 14.d.ix.4
  64. }
  65. } else { // step 14.e
  66. var n = 0; // step 14.e.i
  67. while (k < final) { // step 14.e.ii
  68. var Pk = ToString(k); // step 14.e.ii.1
  69. var kValue = Get(O, Pk); // step 14.e.ii.2
  70. Set(A, ToString(n), kValue, true); // step 14.e.ii.3
  71. k += 1; // step 14.e.ii.4
  72. n += 1; // step 14.e.ii.5
  73. }
  74. }
  75. }
  76. return A; // step 15
  77. };