prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
133 lines (86 loc) • 6.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _index = require("../../values/index.js");
var _index2 = require("../../methods/index.js");
var _singletons = require("../../singletons.js");
var _invariant = _interopRequireDefault(require("../../invariant.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* 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.
*/
/* strict-local */
function _default(realm, obj) {
// ECMA262 24.1.4.1
obj.defineNativeGetter("byteLength", context => {
// 1. Let O be the this value.
let O = context.throwIfNotConcrete(); // 2. 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");
} // 3. If O does not have an [[ArrayBufferData]] internal slot, throw a TypeError exception.
if (!("$ArrayBufferData" in O)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have an [[ArrayBufferData]] internal slot");
} // 4. If IsDetachedBuffer(O) is true, throw a TypeError exception.
if ((0, _index2.IsDetachedBuffer)(realm, O) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(O) is true");
} // 5. Let length be O.[[ArrayBufferByteLength]].
let length = O.$ArrayBufferByteLength;
(0, _invariant.default)(typeof length === "number"); // 6. Return length.
return new _index.NumberValue(realm, length);
}); // ECMA262 24.1.4.3
obj.defineNativeMethod("slice", 2, (context, [start, end]) => {
// 1. Let O be the this value.
let O = context.throwIfNotConcrete(); // 2. 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");
} // 3. If O does not have an [[ArrayBufferData]] internal slot, throw a TypeError exception.
if (!("$ArrayBufferData" in O)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have an [[ArrayBufferData]] internal slot");
} // 4. If IsDetachedBuffer(O) is true, throw a TypeError exception.
if ((0, _index2.IsDetachedBuffer)(realm, O) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(O) is true");
} // 5. Let len be O.[[ArrayBufferByteLength]].
let len = O.$ArrayBufferByteLength;
(0, _invariant.default)(typeof len === "number"); // 6. Let relativeStart be ? ToInteger(start).
let relativeStart = _singletons.To.ToInteger(realm, start); // 7. If relativeStart < 0, let first be max((len + relativeStart), 0); else let first be min(relativeStart, len).
let first = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // 8. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end).
let relativeEnd = !end || end instanceof _index.UndefinedValue ? len : _singletons.To.ToInteger(realm, end.throwIfNotConcrete()); // 9. If relativeEnd < 0, let final be max((len + relativeEnd), 0); else let final be min(relativeEnd, len).
let final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); // 10. Let newLen be max(final-first, 0).
let newLen = Math.max(final - first, 0); // 11. Let ctor be ? SpeciesConstructor(O, %ArrayBuffer%).
let ctor = (0, _index2.SpeciesConstructor)(realm, O, realm.intrinsics.ArrayBuffer); // 12. Let New be ? Construct(ctor, « newLen »).
let New = (0, _index2.Construct)(realm, ctor, [new _index.NumberValue(realm, newLen)]).throwIfNotConcreteObject(); // 13. If New does not have an [[ArrayBufferData]] internal slot, throw a TypeError exception.
if (!("$ArrayBufferData" in New)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "new does not have an [[ArrayBufferData]] internal slot");
} // 14. If IsDetachedBuffer(New) is true, throw a TypeError exception.
if ((0, _index2.IsDetachedBuffer)(realm, New) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(new) is true");
} // 15. If SameValue(New, O) is true, throw a TypeError exception.
if ((0, _index2.SameValue)(realm, New, O) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "SameValue(new, O) is true");
} // 16. If new.[[ArrayBufferByteLength]] < newLen, throw a TypeError exception.
if (typeof New.$ArrayBufferByteLength !== "number" || New.$ArrayBufferByteLength < newLen) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "new.[[ArrayBufferByteLength]] < newLen");
} // 17. NOTE: Side-effects of the above steps may have detached O.
// 18. If IsDetachedBuffer(O) is true, throw a TypeError exception.
if ((0, _index2.IsDetachedBuffer)(realm, O) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(O) is true");
} // 19. Let fromBuf be O.[[ArrayBufferData]].
let fromBuf = O.$ArrayBufferData;
(0, _invariant.default)(fromBuf); // 20. Let toBuf be New.[[ArrayBufferData]].
let toBuf = New.$ArrayBufferData;
(0, _invariant.default)(toBuf); // 21. Perform CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen).
(0, _index2.CopyDataBlockBytes)(realm, toBuf, 0, fromBuf, first, newLen); // 22. Return New.
return New;
}); // ECMA262 24.1.4.4
obj.defineNativeProperty(realm.intrinsics.SymbolToStringTag, new _index.StringValue(realm, "ArrayBuffer"), {
writable: false
});
}
//# sourceMappingURL=ArrayBufferPrototype.js.map