ByteListBitwiseOp.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. 'use strict';
  2. var $TypeError = require('es-errors/type');
  3. var IsArray = require('./IsArray');
  4. var isByteValue = require('../helpers/isByteValue');
  5. // https://262.ecma-international.org/12.0/#sec-bytelistbitwiseop
  6. module.exports = function ByteListBitwiseOp(op, xBytes, yBytes) {
  7. if (op !== '&' && op !== '^' && op !== '|') {
  8. throw new $TypeError('Assertion failed: `op` must be `&`, `^`, or `|`');
  9. }
  10. if (!IsArray(xBytes) || !IsArray(yBytes) || xBytes.length !== yBytes.length) {
  11. throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be same-length sequences of byte values (an integer 0-255, inclusive)');
  12. }
  13. var result = [];
  14. for (var i = 0; i < xBytes.length; i += 1) {
  15. var xByte = xBytes[i];
  16. var yByte = yBytes[i];
  17. if (!isByteValue(xByte) || !isByteValue(yByte)) {
  18. throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be same-length sequences of byte values (an integer 0-255, inclusive)');
  19. }
  20. var resultByte;
  21. if (op === '&') {
  22. resultByte = xByte & yByte;
  23. } else if (op === '^') {
  24. resultByte = xByte ^ yByte;
  25. } else {
  26. resultByte = xByte | yByte;
  27. }
  28. result[result.length] = resultByte;
  29. }
  30. return result;
  31. };