165 lines
6.1 KiB
JavaScript
165 lines
6.1 KiB
JavaScript
|
'use strict';
|
||
|
var DESCRIPTORS = require('../internals/descriptors');
|
||
|
var global = require('../internals/global');
|
||
|
var isObject = require('../internals/is-object');
|
||
|
var has = require('../internals/has');
|
||
|
var classof = require('../internals/classof');
|
||
|
var hide = require('../internals/hide');
|
||
|
var redefine = require('../internals/redefine');
|
||
|
var defineProperty = require('../internals/object-define-property').f;
|
||
|
var getPrototypeOf = require('../internals/object-get-prototype-of');
|
||
|
var setPrototypeOf = require('../internals/object-set-prototype-of');
|
||
|
var wellKnownSymbol = require('../internals/well-known-symbol');
|
||
|
var uid = require('../internals/uid');
|
||
|
|
||
|
var DataView = global.DataView;
|
||
|
var DataViewPrototype = DataView && DataView.prototype;
|
||
|
var Int8Array = global.Int8Array;
|
||
|
var Int8ArrayPrototype = Int8Array && Int8Array.prototype;
|
||
|
var Uint8ClampedArray = global.Uint8ClampedArray;
|
||
|
var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;
|
||
|
var TypedArray = Int8Array && getPrototypeOf(Int8Array);
|
||
|
var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);
|
||
|
var ObjectPrototype = Object.prototype;
|
||
|
var isPrototypeOf = ObjectPrototype.isPrototypeOf;
|
||
|
|
||
|
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
||
|
var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');
|
||
|
var NATIVE_ARRAY_BUFFER = !!(global.ArrayBuffer && DataView);
|
||
|
// Fixing native typed arrays in Opera Presto crashes the browser, see #595
|
||
|
var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';
|
||
|
var TYPED_ARRAY_TAG_REQIRED = false;
|
||
|
var NAME;
|
||
|
|
||
|
var TypedArrayConstructorsList = {
|
||
|
Int8Array: 1,
|
||
|
Uint8Array: 1,
|
||
|
Uint8ClampedArray: 1,
|
||
|
Int16Array: 2,
|
||
|
Uint16Array: 2,
|
||
|
Int32Array: 4,
|
||
|
Uint32Array: 4,
|
||
|
Float32Array: 4,
|
||
|
Float64Array: 8
|
||
|
};
|
||
|
|
||
|
var isView = function isView(it) {
|
||
|
var klass = classof(it);
|
||
|
return klass === 'DataView' || has(TypedArrayConstructorsList, klass);
|
||
|
};
|
||
|
|
||
|
var isTypedArray = function (it) {
|
||
|
return isObject(it) && has(TypedArrayConstructorsList, classof(it));
|
||
|
};
|
||
|
|
||
|
var aTypedArray = function (it) {
|
||
|
if (isTypedArray(it)) return it;
|
||
|
throw TypeError('Target is not a typed array');
|
||
|
};
|
||
|
|
||
|
var aTypedArrayConstructor = function (C) {
|
||
|
if (setPrototypeOf) {
|
||
|
if (isPrototypeOf.call(TypedArray, C)) return C;
|
||
|
} else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {
|
||
|
var TypedArrayConstructor = global[ARRAY];
|
||
|
if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {
|
||
|
return C;
|
||
|
}
|
||
|
} throw TypeError('Target is not a typed array constructor');
|
||
|
};
|
||
|
|
||
|
var exportProto = function (KEY, property, forced) {
|
||
|
if (!DESCRIPTORS) return;
|
||
|
if (forced) for (var ARRAY in TypedArrayConstructorsList) {
|
||
|
var TypedArrayConstructor = global[ARRAY];
|
||
|
if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {
|
||
|
delete TypedArrayConstructor.prototype[KEY];
|
||
|
}
|
||
|
}
|
||
|
if (!TypedArrayPrototype[KEY] || forced) {
|
||
|
redefine(TypedArrayPrototype, KEY, forced ? property
|
||
|
: NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var exportStatic = function (KEY, property, forced) {
|
||
|
var ARRAY, TypedArrayConstructor;
|
||
|
if (!DESCRIPTORS) return;
|
||
|
if (setPrototypeOf) {
|
||
|
if (forced) for (ARRAY in TypedArrayConstructorsList) {
|
||
|
TypedArrayConstructor = global[ARRAY];
|
||
|
if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {
|
||
|
delete TypedArrayConstructor[KEY];
|
||
|
}
|
||
|
}
|
||
|
if (!TypedArray[KEY] || forced) {
|
||
|
// V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
|
||
|
try {
|
||
|
return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);
|
||
|
} catch (error) { /* empty */ }
|
||
|
} else return;
|
||
|
}
|
||
|
for (ARRAY in TypedArrayConstructorsList) {
|
||
|
TypedArrayConstructor = global[ARRAY];
|
||
|
if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
|
||
|
redefine(TypedArrayConstructor, KEY, property);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
for (NAME in TypedArrayConstructorsList) {
|
||
|
if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;
|
||
|
}
|
||
|
|
||
|
// WebKit bug - typed arrays constructors prototype is Object.prototype
|
||
|
if (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {
|
||
|
// eslint-disable-next-line no-shadow
|
||
|
TypedArray = function TypedArray() {
|
||
|
throw TypeError('Incorrect invocation');
|
||
|
};
|
||
|
if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
|
||
|
if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {
|
||
|
TypedArrayPrototype = TypedArray.prototype;
|
||
|
if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
|
||
|
if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// WebKit bug - one more object in Uint8ClampedArray prototype chain
|
||
|
if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {
|
||
|
setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);
|
||
|
}
|
||
|
|
||
|
if (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {
|
||
|
TYPED_ARRAY_TAG_REQIRED = true;
|
||
|
defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {
|
||
|
return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;
|
||
|
} });
|
||
|
for (NAME in TypedArrayConstructorsList) if (global[NAME]) {
|
||
|
hide(global[NAME], TYPED_ARRAY_TAG, NAME);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// WebKit bug - the same parent prototype for typed arrays and data view
|
||
|
if (NATIVE_ARRAY_BUFFER && setPrototypeOf && getPrototypeOf(DataViewPrototype) !== ObjectPrototype) {
|
||
|
setPrototypeOf(DataViewPrototype, ObjectPrototype);
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
NATIVE_ARRAY_BUFFER: NATIVE_ARRAY_BUFFER,
|
||
|
NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,
|
||
|
TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,
|
||
|
aTypedArray: aTypedArray,
|
||
|
aTypedArrayConstructor: aTypedArrayConstructor,
|
||
|
exportProto: exportProto,
|
||
|
exportStatic: exportStatic,
|
||
|
isView: isView,
|
||
|
isTypedArray: isTypedArray,
|
||
|
TypedArray: TypedArray,
|
||
|
TypedArrayPrototype: TypedArrayPrototype
|
||
|
};
|