blob: 11425ffded076a0f37bd06b3a4b2cc0964eede2b [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var GetIntrinsic = require('get-intrinsic');
4
5var $TypeError = GetIntrinsic('%TypeError%');
6
7var ToInt32 = require('./ToInt32');
8var ToUint32 = require('./ToUint32');
9var Type = require('./Type');
10
11// https://262.ecma-international.org/11.0/#sec-numberbitwiseop
12
13module.exports = function NumberBitwiseOp(op, x, y) {
14 if (op !== '&' && op !== '|' && op !== '^') {
15 throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
16 }
17 if (Type(x) !== 'Number' || Type(y) !== 'Number') {
18 throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
19 }
20 var lnum = ToInt32(x);
21 var rnum = ToUint32(y);
22 if (op === '&') {
23 return lnum & rnum;
24 }
25 if (op === '|') {
26 return lnum | rnum;
27 }
28 return lnum ^ rnum;
29};