Permalink
Cannot retrieve contributors at this time
74 lines (59 sloc)
2.22 KB
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/es-abstract/2019/RawBytesToNumber.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var GetIntrinsic = require('get-intrinsic'); | |
var callBound = require('call-bind/callBound'); | |
var $RangeError = GetIntrinsic('%RangeError%'); | |
var $TypeError = GetIntrinsic('%TypeError%'); | |
var $charAt = callBound('String.prototype.charAt'); | |
var $reverse = callBound('Array.prototype.reverse'); | |
var $slice = callBound('Array.prototype.slice'); | |
var hasOwnProperty = require('./HasOwnProperty'); | |
var IsArray = require('./IsArray'); | |
var Type = require('./Type'); | |
var bytesAsFloat32 = require('../helpers/bytesAsFloat32'); | |
var bytesAsFloat64 = require('../helpers/bytesAsFloat64'); | |
var bytesAsInteger = require('../helpers/bytesAsInteger'); | |
var every = require('../helpers/every'); | |
var isByteValue = require('../helpers/isByteValue'); | |
var keys = require('object-keys'); | |
// https://262.ecma-international.org/8.0/#table-50 | |
var TypeToSizes = { | |
__proto__: null, | |
Int8: 1, | |
Uint8: 1, | |
Uint8C: 1, | |
Int16: 2, | |
Uint16: 2, | |
Int32: 4, | |
Uint32: 4, | |
Float32: 4, | |
Float64: 8 | |
}; | |
// https://262.ecma-international.org/8.0/#sec-rawbytestonumber | |
module.exports = function RawBytesToNumber(type, rawBytes, isLittleEndian) { | |
if (typeof type !== 'string' || !hasOwnProperty(TypeToSizes, type)) { | |
throw new $TypeError('Assertion failed: `type` must be a TypedArray element type: ' + keys(TypeToSizes)); | |
} | |
if (!IsArray(rawBytes) || !every(rawBytes, isByteValue)) { | |
throw new $TypeError('Assertion failed: `rawBytes` must be an Array of bytes'); | |
} | |
if (Type(isLittleEndian) !== 'Boolean') { | |
throw new $TypeError('Assertion failed: `isLittleEndian` must be a Boolean'); | |
} | |
var elementSize = TypeToSizes[type]; // step 1 | |
if (rawBytes.length !== elementSize) { | |
// this assertion is not in the spec, but it'd be an editorial error if it were ever violated | |
throw new $RangeError('Assertion failed: `rawBytes` must have a length of ' + elementSize + ' for type ' + type); | |
} | |
// eslint-disable-next-line no-param-reassign | |
rawBytes = $slice(rawBytes, 0, elementSize); | |
if (!isLittleEndian) { | |
$reverse(rawBytes); // step 2 | |
} | |
if (type === 'Float32') { // step 3 | |
return bytesAsFloat32(rawBytes); | |
} | |
if (type === 'Float64') { // step 4 | |
return bytesAsFloat64(rawBytes); | |
} | |
return bytesAsInteger(rawBytes, elementSize, $charAt(type, 0) === 'U', false); | |
}; |