保誠-保戶業務員媒合平台
HelenHuang
2022-06-09 9bdb95c9e34cef640534e5e5a1e2225a80442000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'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);
};