Tim van der Lippe | bc3a0b7 | 2021-11-08 15:22:37 | [diff] [blame] | 1 | 'use strict'; |
| 2 | |
| 3 | var GetIntrinsic = require('get-intrinsic'); |
| 4 | |
| 5 | var $TypeError = GetIntrinsic('%TypeError%'); |
| 6 | |
| 7 | var HasOwnProperty = require('./HasOwnProperty'); |
| 8 | var ToNumeric = require('./ToNumeric'); |
| 9 | var ToPrimitive = require('./ToPrimitive'); |
| 10 | var ToString = require('./ToString'); |
| 11 | var Type = require('./Type'); |
| 12 | |
| 13 | var NumberAdd = require('./Number/add'); |
| 14 | var NumberBitwiseAND = require('./Number/bitwiseAND'); |
| 15 | var NumberBitwiseOR = require('./Number/bitwiseOR'); |
| 16 | var NumberBitwiseXOR = require('./Number/bitwiseXOR'); |
| 17 | var NumberDivide = require('./Number/divide'); |
| 18 | var NumberExponentiate = require('./Number/exponentiate'); |
| 19 | var NumberLeftShift = require('./Number/leftShift'); |
| 20 | var NumberMultiply = require('./Number/multiply'); |
| 21 | var NumberRemainder = require('./Number/remainder'); |
| 22 | var NumberSignedRightShift = require('./Number/signedRightShift'); |
| 23 | var NumberSubtract = require('./Number/subtract'); |
| 24 | var NumberUnsignedRightShift = require('./Number/unsignedRightShift'); |
| 25 | var BigIntAdd = require('./BigInt/add'); |
| 26 | var BigIntBitwiseAND = require('./BigInt/bitwiseAND'); |
| 27 | var BigIntBitwiseOR = require('./BigInt/bitwiseOR'); |
| 28 | var BigIntBitwiseXOR = require('./BigInt/bitwiseXOR'); |
| 29 | var BigIntDivide = require('./BigInt/divide'); |
| 30 | var BigIntExponentiate = require('./BigInt/exponentiate'); |
| 31 | var BigIntLeftShift = require('./BigInt/leftShift'); |
| 32 | var BigIntMultiply = require('./BigInt/multiply'); |
| 33 | var BigIntRemainder = require('./BigInt/remainder'); |
| 34 | var BigIntSignedRightShift = require('./BigInt/signedRightShift'); |
| 35 | var BigIntSubtract = require('./BigInt/subtract'); |
| 36 | var 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 |
| 41 | var 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 | |
| 56 | module.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 | }; |