Skip to content

Commit 84e4e34

Browse files
committed
fix: runtime-helper does not truly handles augmented assignment so strip = sign from operator before calling it
1 parent 885a8ce commit 84e4e34

File tree

2 files changed

+2
-43
lines changed

2 files changed

+2
-43
lines changed

src/runtime-helpers.ts

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,7 @@ export function switchableValue(x: unknown): bigint | string | boolean {
2020
// internalError(`Cannot wrap ${nameOfType(x)}`)
2121
// }
2222

23-
type BinaryOps =
24-
| '+'
25-
| '-'
26-
| '*'
27-
| '**'
28-
| '/'
29-
| '%'
30-
| '>'
31-
| '>='
32-
| '<'
33-
| '<='
34-
| '==='
35-
| '!=='
36-
| '<<'
37-
| '>>'
38-
| '&'
39-
| '|'
40-
| '^'
41-
| '+='
42-
| '-='
43-
| '/='
44-
| '*='
45-
| '**='
46-
| '%='
23+
type BinaryOps = '+' | '-' | '*' | '**' | '/' | '%' | '>' | '>=' | '<' | '<=' | '===' | '!==' | '<<' | '>>' | '&' | '|' | '^'
4724
type UnaryOps = '~'
4825

4926
function tryGetBigInt(value: unknown): bigint | undefined {
@@ -95,25 +72,19 @@ function uint64BinaryOp(left: DeliberateAny, right: DeliberateAny, op: BinaryOps
9572
const result = (function () {
9673
switch (op) {
9774
case '+':
98-
case '+=':
9975
return lbi + rbi
10076
case '-':
101-
case '-=':
10277
return lbi - rbi
10378
case '*':
104-
case '*=':
10579
return lbi * rbi
10680
case '**':
107-
case '**=':
10881
if (lbi === 0n && rbi === 0n) {
10982
throw internal.errors.codeError('0 ** 0 is undefined')
11083
}
11184
return lbi ** rbi
11285
case '/':
113-
case '/=':
11486
return lbi / rbi
11587
case '%':
116-
case '%=':
11788
return lbi % rbi
11889
case '>>':
11990
if (rbi > 63n) {
@@ -156,25 +127,19 @@ function bigUintBinaryOp(left: DeliberateAny, right: DeliberateAny, op: BinaryOp
156127
const result = (function () {
157128
switch (op) {
158129
case '+':
159-
case '+=':
160130
return lbi + rbi
161131
case '-':
162-
case '-=':
163132
return lbi - rbi
164133
case '*':
165-
case '*=':
166134
return lbi * rbi
167135
case '**':
168-
case '**=':
169136
if (lbi === 0n && rbi === 0n) {
170137
throw internal.errors.codeError('0 ** 0 is undefined')
171138
}
172139
return lbi ** rbi
173140
case '/':
174-
case '/=':
175141
return lbi / rbi
176142
case '%':
177-
case '%=':
178143
return lbi % rbi
179144
case '>>':
180145
throw new internal.errors.CodeError('BigUint does not support >> operator')
@@ -242,25 +207,19 @@ function bytesBinaryOp(left: DeliberateAny, right: DeliberateAny, op: BinaryOps)
242207
function defaultBinaryOp(left: DeliberateAny, right: DeliberateAny, op: BinaryOps): DeliberateAny {
243208
switch (op) {
244209
case '+':
245-
case '+=':
246210
return left + right
247211
case '-':
248-
case '-=':
249212
return left - right
250213
case '*':
251-
case '*=':
252214
return left * right
253215
case '**':
254-
case '**=':
255216
if (left === 0n && right === 0n) {
256217
throw new internal.errors.CodeError('0 ** 0 is undefined')
257218
}
258219
return left ** right
259220
case '/':
260-
case '/=':
261221
return left / right
262222
case '%':
263-
case '%=':
264223
return left % right
265224
case '>>':
266225
if (typeof left === 'bigint' && typeof right === 'bigint') {

src/test-transformer/node-factory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const nodeFactory = {
3434
factory.createCallExpression(
3535
factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('binaryOp')),
3636
undefined,
37-
[left, right, factory.createStringLiteral(op)],
37+
[left, right, factory.createStringLiteral(op.replace('=', ''))],
3838
),
3939
)
4040
},

0 commit comments

Comments
 (0)