1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- '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);
- };
|