You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.1 KiB
80 lines
3.1 KiB
'use strict'; |
|
|
|
var GetIntrinsic = require('get-intrinsic'); |
|
|
|
var $TypeError = GetIntrinsic('%TypeError%'); |
|
|
|
var HasOwnProperty = require('./HasOwnProperty'); |
|
var ToNumeric = require('./ToNumeric'); |
|
var ToPrimitive = require('./ToPrimitive'); |
|
var ToString = require('./ToString'); |
|
var Type = require('./Type'); |
|
|
|
var NumberAdd = require('./Number/add'); |
|
var NumberBitwiseAND = require('./Number/bitwiseAND'); |
|
var NumberBitwiseOR = require('./Number/bitwiseOR'); |
|
var NumberBitwiseXOR = require('./Number/bitwiseXOR'); |
|
var NumberDivide = require('./Number/divide'); |
|
var NumberExponentiate = require('./Number/exponentiate'); |
|
var NumberLeftShift = require('./Number/leftShift'); |
|
var NumberMultiply = require('./Number/multiply'); |
|
var NumberRemainder = require('./Number/remainder'); |
|
var NumberSignedRightShift = require('./Number/signedRightShift'); |
|
var NumberSubtract = require('./Number/subtract'); |
|
var NumberUnsignedRightShift = require('./Number/unsignedRightShift'); |
|
var BigIntAdd = require('./BigInt/add'); |
|
var BigIntBitwiseAND = require('./BigInt/bitwiseAND'); |
|
var BigIntBitwiseOR = require('./BigInt/bitwiseOR'); |
|
var BigIntBitwiseXOR = require('./BigInt/bitwiseXOR'); |
|
var BigIntDivide = require('./BigInt/divide'); |
|
var BigIntExponentiate = require('./BigInt/exponentiate'); |
|
var BigIntLeftShift = require('./BigInt/leftShift'); |
|
var BigIntMultiply = require('./BigInt/multiply'); |
|
var BigIntRemainder = require('./BigInt/remainder'); |
|
var BigIntSignedRightShift = require('./BigInt/signedRightShift'); |
|
var BigIntSubtract = require('./BigInt/subtract'); |
|
var BigIntUnsignedRightShift = require('./BigInt/unsignedRightShift'); |
|
|
|
// https://ecma-international.org/ecma-262/12.0/#sec-applystringornumericbinaryoperator |
|
|
|
// https://ecma-international.org/ecma-262/12.0/#step-applystringornumericbinaryoperator-operations-table |
|
var table = { |
|
'**': [NumberExponentiate, BigIntExponentiate], |
|
'*': [NumberMultiply, BigIntMultiply], |
|
'/': [NumberDivide, BigIntDivide], |
|
'%': [NumberRemainder, BigIntRemainder], |
|
'+': [NumberAdd, BigIntAdd], |
|
'-': [NumberSubtract, BigIntSubtract], |
|
'<<': [NumberLeftShift, BigIntLeftShift], |
|
'>>': [NumberSignedRightShift, BigIntSignedRightShift], |
|
'>>>': [NumberUnsignedRightShift, BigIntUnsignedRightShift], |
|
'&': [NumberBitwiseAND, BigIntBitwiseAND], |
|
'^': [NumberBitwiseXOR, BigIntBitwiseXOR], |
|
'|': [NumberBitwiseOR, BigIntBitwiseOR] |
|
}; |
|
|
|
module.exports = function ApplyStringOrNumericBinaryOperator(lval, opText, rval) { |
|
if (Type(opText) !== 'String' || !HasOwnProperty(table, opText)) { |
|
throw new $TypeError('Assertion failed: `opText` must be a valid operation string'); |
|
} |
|
if (opText === '+') { |
|
var lprim = ToPrimitive(lval); |
|
var rprim = ToPrimitive(rval); |
|
if (Type(lprim) === 'String' || Type(rprim) === 'String') { |
|
var lstr = ToString(lprim); |
|
var rstr = ToString(rprim); |
|
return lstr + rstr; |
|
} |
|
/* eslint no-param-reassign: 1 */ |
|
lval = lprim; |
|
rval = rprim; |
|
} |
|
var lnum = ToNumeric(lval); |
|
var rnum = ToNumeric(rval); |
|
var T = Type(lnum); |
|
if (T !== Type(rnum)) { |
|
throw new $TypeError('types of ' + lnum + ' and ' + rnum + ' differ'); |
|
} |
|
var Operation = table[opText][T === 'BigInt' ? 1 : 0]; |
|
return Operation(lnum, rnum); |
|
};
|
|
|