blob: 824a1054300cae691fe79b24323c2be1e75becc2 [file] [log] [blame]
Tim van der Lippebc3a0b72021-11-08 15:22:371'use strict';
2
3var GetIntrinsic = require('get-intrinsic');
4
5var $TypeError = GetIntrinsic('%TypeError%');
6
7var HasOwnProperty = require('./HasOwnProperty');
8var ToNumeric = require('./ToNumeric');
9var ToPrimitive = require('./ToPrimitive');
10var ToString = require('./ToString');
11var Type = require('./Type');
12
13var NumberAdd = require('./Number/add');
14var NumberBitwiseAND = require('./Number/bitwiseAND');
15var NumberBitwiseOR = require('./Number/bitwiseOR');
16var NumberBitwiseXOR = require('./Number/bitwiseXOR');
17var NumberDivide = require('./Number/divide');
18var NumberExponentiate = require('./Number/exponentiate');
19var NumberLeftShift = require('./Number/leftShift');
20var NumberMultiply = require('./Number/multiply');
21var NumberRemainder = require('./Number/remainder');
22var NumberSignedRightShift = require('./Number/signedRightShift');
23var NumberSubtract = require('./Number/subtract');
24var NumberUnsignedRightShift = require('./Number/unsignedRightShift');
25var BigIntAdd = require('./BigInt/add');
26var BigIntBitwiseAND = require('./BigInt/bitwiseAND');
27var BigIntBitwiseOR = require('./BigInt/bitwiseOR');
28var BigIntBitwiseXOR = require('./BigInt/bitwiseXOR');
29var BigIntDivide = require('./BigInt/divide');
30var BigIntExponentiate = require('./BigInt/exponentiate');
31var BigIntLeftShift = require('./BigInt/leftShift');
32var BigIntMultiply = require('./BigInt/multiply');
33var BigIntRemainder = require('./BigInt/remainder');
34var BigIntSignedRightShift = require('./BigInt/signedRightShift');
35var BigIntSubtract = require('./BigInt/subtract');
36var BigIntUnsignedRightShift = require('./BigInt/unsignedRightShift');
37
38// https://ecma-international.org/ecma-262/12.0/#sec-applystringornumericbinaryoperator
39
40// https://ecma-international.org/ecma-262/12.0/#step-applystringornumericbinaryoperator-operations-table
41var table = {
42 '**': [NumberExponentiate, BigIntExponentiate],
43 '*': [NumberMultiply, BigIntMultiply],
44 '/': [NumberDivide, BigIntDivide],
45 '%': [NumberRemainder, BigIntRemainder],
46 '+': [NumberAdd, BigIntAdd],
47 '-': [NumberSubtract, BigIntSubtract],
48 '<<': [NumberLeftShift, BigIntLeftShift],
49 '>>': [NumberSignedRightShift, BigIntSignedRightShift],
50 '>>>': [NumberUnsignedRightShift, BigIntUnsignedRightShift],
51 '&': [NumberBitwiseAND, BigIntBitwiseAND],
52 '^': [NumberBitwiseXOR, BigIntBitwiseXOR],
53 '|': [NumberBitwiseOR, BigIntBitwiseOR]
54};
55
56module.exports = function ApplyStringOrNumericBinaryOperator(lval, opText, rval) {
57 if (Type(opText) !== 'String' || !HasOwnProperty(table, opText)) {
58 throw new $TypeError('Assertion failed: `opText` must be a valid operation string');
59 }
60 if (opText === '+') {
61 var lprim = ToPrimitive(lval);
62 var rprim = ToPrimitive(rval);
63 if (Type(lprim) === 'String' || Type(rprim) === 'String') {
64 var lstr = ToString(lprim);
65 var rstr = ToString(rprim);
66 return lstr + rstr;
67 }
68 /* eslint no-param-reassign: 1 */
69 lval = lprim;
70 rval = rprim;
71 }
72 var lnum = ToNumeric(lval);
73 var rnum = ToNumeric(rval);
74 var T = Type(lnum);
75 if (T !== Type(rnum)) {
76 throw new $TypeError('types of ' + lnum + ' and ' + rnum + ' differ');
77 }
78 var Operation = table[opText][T === 'BigInt' ? 1 : 0];
79 return Operation(lnum, rnum);
80};