prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
364 lines (279 loc) • 14.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ArrayElementType = exports.ArrayElementSize = undefined;
exports.IntegerIndexedObjectCreate = IntegerIndexedObjectCreate;
exports.IntegerIndexedElementGet = IntegerIndexedElementGet;
exports.IntegerIndexedElementSet = IntegerIndexedElementSet;
exports.ValidateTypedArray = ValidateTypedArray;
exports.AllocateTypedArray = AllocateTypedArray;
exports.AllocateTypedArrayBuffer = AllocateTypedArrayBuffer;
exports.TypedArrayCreate = TypedArrayCreate;
exports.TypedArraySpeciesCreate = TypedArraySpeciesCreate;
var _errors = require("../errors.js");
var _index = require("../values/index.js");
var _get = require("../methods/get.js");
var _arraybuffer = require("../methods/arraybuffer.js");
var _is = require("../methods/is.js");
var _construct = require("../methods/construct.js");
var _singletons = require("../singletons.js");
var _invariant = require("../invariant.js");
var _invariant2 = _interopRequireDefault(_invariant);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const ArrayElementSize = exports.ArrayElementSize = {
Float32Array: 4,
Float64Array: 8,
Int8Array: 1,
Int16Array: 2,
Int32Array: 4,
Uint8Array: 1,
Uint16Array: 2,
Uint32Array: 4,
Uint8ClampedArray: 1
}; /**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
const ArrayElementType = exports.ArrayElementType = {
Float32Array: "Float32",
Float64Array: "Float64",
Int8Array: "Int8",
Int16Array: "Int16",
Int32Array: "Int32",
Uint8Array: "Uint8",
Uint16Array: "Uint16",
Uint32Array: "Uint32",
Uint8ClampedArray: "Uint8Clamped"
};
// ECMA262 9.4.5.7
function IntegerIndexedObjectCreate(realm, prototype, internalSlotsList) {
// 1. Assert: internalSlotsList contains the names [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]].
(0, _invariant2.default)("$ViewedArrayBuffer" in internalSlotsList && "$ArrayLength" in internalSlotsList && "$ByteOffset" in internalSlotsList && "$TypedArrayName" in internalSlotsList);
// 2. Let A be a newly created object with an internal slot for each name in internalSlotsList.
let A = new _index.IntegerIndexedExotic(realm);
Object.assign(A, internalSlotsList);
// 3. Set A's essential internal methods to the default ordinary object definitions specified in 9.1.
// 4. Set the [[GetOwnProperty]] internal method of A as specified in 9.4.5.1.
// 5. Set the [[HasProperty]] internal method of A as specified in 9.4.5.2.
// 6. Set the [[DefineOwnProperty]] internal method of A as specified in 9.4.5.3.
// 7. Set the [[Get]] internal method of A as specified in 9.4.5.4.
// 8. Set the [[Set]] internal method of A as specified in 9.4.5.5.
// 9. Set the [[OwnPropertyKeys]] internal method of A as specified in 9.4.5.6.
// 10. Set A.[[Prototype]] to prototype.
A.$Prototype = prototype;
// 11. Set A.[[Extensible]] to true.
A.setExtensible(true);
// 12. Return A.
return A;
}
// ECMA262 9.4.5.8
function IntegerIndexedElementGet(realm, O, index) {
// 1. Assert: Type(index) is Number.
(0, _invariant2.default)(typeof index === "number", "Type(index) is Number");
// 2. Assert: O is an Object that has [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
(0, _invariant2.default)(O instanceof _index.ObjectValue && O.$ViewedArrayBuffer && O.$ArrayLength !== undefined && O.$ByteOffset !== undefined && O.$TypedArrayName);
// 3. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer;
// 4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, buffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(buffer) is true");
}
// 5. If IsInteger(index) is false, return undefined.
if ((0, _is.IsInteger)(realm, index) === false) return realm.intrinsics.undefined;
// 6. If index = -0, return undefined.
if (Object.is(index, -0)) return realm.intrinsics.undefined;
// 7. Let length be O.[[ArrayLength]].
let length = O.$ArrayLength;
(0, _invariant2.default)(typeof length === "number");
// 8. If index < 0 or index ≥ length, return undefined.
if (index < 0 || index >= length) return realm.intrinsics.undefined;
// 9. Let offset be O.[[ByteOffset]].
let offset = O.$ByteOffset;
(0, _invariant2.default)(typeof offset === "number");
// 10. Let arrayTypeName be the String value of O.[[TypedArrayName]].
let arrayTypeName = O.$TypedArrayName;
(0, _invariant2.default)(typeof arrayTypeName === "string");
// 11. Let elementSize be the Number value of the Element Size value specified in Table 50 for arrayTypeName.
let elementSize = ArrayElementSize[arrayTypeName];
// 12. Let indexedPosition be (index × elementSize) + offset.
let indexedPosition = index * elementSize + offset;
// 13. Let elementType be the String value of the Element Type value in Table 50 for arrayTypeName.
let elementType = ArrayElementType[arrayTypeName];
// 14. Return GetValueFromBuffer(buffer, indexedPosition, elementType).
return (0, _arraybuffer.GetValueFromBuffer)(realm, buffer, indexedPosition, elementType);
}
// ECMA262 9.4.5.9
function IntegerIndexedElementSet(realm, O, index, value) {
// 1. Assert: Type(index) is Number.
(0, _invariant2.default)(typeof index === "number", "Type(index) is Number");
// 2. Assert: O is an Object that has [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
(0, _invariant2.default)(O instanceof _index.ObjectValue && O.$ViewedArrayBuffer && O.$ArrayLength !== undefined && O.$ByteOffset !== undefined && O.$TypedArrayName);
// 3. Let numValue be ? ToNumber(value).
let numValue = _singletons.To.ToNumber(realm, value);
// 4. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer;
(0, _invariant2.default)(buffer);
// 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, buffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(buffer) is true");
}
// 6. If IsInteger(index) is false, return false.
if ((0, _is.IsInteger)(realm, index) === false) return false;
// 7. If index = -0, return false.
if (Object.is(index, -0)) return false;
// 8. Let length be O.[[ArrayLength]].
let length = O.$ArrayLength;
(0, _invariant2.default)(typeof length === "number");
// 9. If index < 0 or index ≥ length, return false.
if (index < 0 || index >= length) return false;
// 10. Let offset be O.[[ByteOffset]].
let offset = O.$ByteOffset;
(0, _invariant2.default)(typeof offset === "number");
// 11. Let arrayTypeName be the String value of O.[[TypedArrayName]].
let arrayTypeName = O.$TypedArrayName;
(0, _invariant2.default)(typeof arrayTypeName === "string");
// 12. Let elementSize be the Number value of the Element Size value specified in Table 50 for arrayTypeName.
let elementSize = ArrayElementSize[arrayTypeName];
// 13. Let indexedPosition be (index × elementSize) + offset.
let indexedPosition = index * elementSize + offset;
// 14. Let elementType be the String value of the Element Type value in Table 50 for arrayTypeName.
let elementType = ArrayElementType[arrayTypeName];
// 15. Perform SetValueInBuffer(buffer, indexedPosition, elementType, numValue).
(0, _arraybuffer.SetValueInBuffer)(realm, buffer, indexedPosition, elementType, numValue);
// 16. Return true.
return true;
}
// ECMA262 22.2.3.5.1
function ValidateTypedArray(realm, O) {
O = O.throwIfNotConcrete();
// 1. If Type(O) is not Object, throw a TypeError exception.
if (!(O instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(O) is not Object");
}
// 2. If O does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (!O.$TypedArrayName) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(O) is not Object");
}
// 3. Assert: O has a [[ViewedArrayBuffer]] internal slot.
(0, _invariant2.default)(O.$ViewedArrayBuffer, "O has a [[ViewedArrayBuffer]] internal slot");
// 4. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer;
// 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, buffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(buffer) is true");
}
// 6. Return buffer.
return buffer;
}
// ECMA262 22.2.4.2.1
function AllocateTypedArray(realm, constructorName, newTarget, defaultProto, length) {
// 1. Let proto be ? GetPrototypeFromConstructor(newTarget, defaultProto).
let proto = (0, _get.GetPrototypeFromConstructor)(realm, newTarget, defaultProto);
// 2. Let obj be IntegerIndexedObjectCreate(proto, « [[ViewedArrayBuffer]], [[TypedArrayName]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] »).
let obj = IntegerIndexedObjectCreate(realm, proto, {
$ViewedArrayBuffer: undefined,
$TypedArrayName: undefined,
$ByteLength: undefined,
$ByteOffset: undefined,
$ArrayLength: undefined
});
// 3. Assert: obj.[[ViewedArrayBuffer]] is undefined.
(0, _invariant2.default)(obj.$ViewedArrayBuffer === undefined);
// 4. Set obj.[[TypedArrayName]] to constructorName.
obj.$TypedArrayName = constructorName;
// 5. If length was not passed, then
if (length === undefined) {
// a. Set obj.[[ByteLength]] to 0.
obj.$ByteLength = 0;
// b. Set obj.[[ByteOffset]] to 0.
obj.$ByteOffset = 0;
// c. Set obj.[[ArrayLength]] to 0.
obj.$ArrayLength = 0;
} else {
// 6. Else,
// a. Perform ? AllocateTypedArrayBuffer(obj, length).
AllocateTypedArrayBuffer(realm, obj, length);
}
// 7. Return obj.
return obj;
}
// ECMA262 22.2.4.2.2
function AllocateTypedArrayBuffer(realm, O, length) {
// Note that O is a new object, and we can thus write to internal slots
(0, _invariant2.default)(realm.isNewObject(O));
// 1. Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
(0, _invariant2.default)(O instanceof _index.ObjectValue && "$ViewedArrayBuffer" in O, "O is an Object that has a [[ViewedArrayBuffer]] internal slot");
// 2. Assert: O.[[ViewedArrayBuffer]] is undefined.
(0, _invariant2.default)(O.$ViewedArrayBuffer === undefined, "O.[[ViewedArrayBuffer]] is undefined");
// 3. Assert: length ≥ 0.
(0, _invariant2.default)(length >= 0, "length ≥ 0");
// 4. Let constructorName be the String value of O.[[TypedArrayName]].
let constructorName = O.$TypedArrayName;
(0, _invariant2.default)(constructorName);
// 5. Let elementSize be the Element Size value in Table 50 for constructorName.
let elementSize = ArrayElementSize[constructorName];
// 6. Let byteLength be elementSize × length.
let byteLength = elementSize * length;
// 7. Let data be ? AllocateArrayBuffer(%ArrayBuffer%, byteLength).
let data = (0, _arraybuffer.AllocateArrayBuffer)(realm, realm.intrinsics.ArrayBuffer, byteLength);
// 8. Set O.[[ViewedArrayBuffer]] to data.
O.$ViewedArrayBuffer = data;
// 9. Set O.[[ByteLength]] to byteLength.
O.$ByteLength = byteLength;
// 10. Set O.[[ByteOffset]] to 0.
O.$ByteOffset = 0;
// 11. Set O.[[ArrayLength]] to length.
O.$ArrayLength = length;
// 12. Return O.
return O;
}
// ECMA262 22.2.4.6
function TypedArrayCreate(realm, constructor, argumentList) {
// 1. Let newTypedArray be ? Construct(constructor, argumentList).
let newTypedArray = (0, _construct.Construct)(realm, constructor, argumentList);
// 2. Perform ? ValidateTypedArray(newTypedArray).
ValidateTypedArray(realm, newTypedArray);
// 3. If argumentList is a List of a single Number, then
if (argumentList.length === 1 && argumentList[0].mightBeNumber()) {
if (argumentList[0].mightNotBeNumber()) {
(0, _invariant2.default)(argumentList[0] instanceof _index.AbstractValue);
_index.AbstractValue.reportIntrospectionError(argumentList[0]);
throw new _errors.FatalError();
}
// a. If newTypedArray.[[ArrayLength]] < argumentList[0], throw a TypeError exception.
(0, _invariant2.default)(typeof newTypedArray.$ArrayLength === "number");
if (newTypedArray.$ArrayLength < argumentList[0].throwIfNotConcrete().value) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "newTypedArray.[[ArrayLength]] < argumentList[0]");
}
}
// 4. Return newTypedArray.
return newTypedArray;
}
// ECMA262 22.2.4.7
function TypedArraySpeciesCreate(realm, exemplar, argumentList) {
// 1. Assert: exemplar is an Object that has a [[TypedArrayName]] internal slot.
(0, _invariant2.default)(exemplar instanceof _index.ObjectValue && typeof exemplar.$TypedArrayName === "string");
// 2. Let defaultConstructor be the intrinsic object listed in column one of Table 50 for exemplar.[[TypedArrayName]].
(0, _invariant2.default)(typeof exemplar.$TypedArrayName === "string");
let defaultConstructor = {
Float32Array: realm.intrinsics.Float32Array,
Float64Array: realm.intrinsics.Float64Array,
Int8Array: realm.intrinsics.Int8Array,
Int16Array: realm.intrinsics.Int16Array,
Int32Array: realm.intrinsics.Int32Array,
Uint8Array: realm.intrinsics.Uint8Array,
Uint16Array: realm.intrinsics.Uint16Array,
Uint32Array: realm.intrinsics.Uint32Array,
Uint8ClampedArray: realm.intrinsics.Uint8ClampedArray
}[exemplar.$TypedArrayName];
// 3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
let constructor = (0, _construct.SpeciesConstructor)(realm, exemplar, defaultConstructor);
// 4. Return ? TypedArrayCreate(constructor, argumentList).
return TypedArrayCreate(realm, constructor, argumentList);
}
//# sourceMappingURL=typedarray.js.map