Skip to content

Commit 89035f5

Browse files
authored
fix: Fix invalid assumption when compiling binary overloads (#2237)
1 parent 6e7c8f4 commit 89035f5

File tree

4 files changed

+281
-69
lines changed

4 files changed

+281
-69
lines changed

Diff for: src/compiler.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -5733,14 +5733,15 @@ export class Compiler extends DiagnosticEmitter {
57335733
reportNode: Node
57345734
): ExpressionRef {
57355735
var rightType: Type;
5736+
var signature = operatorInstance.signature;
5737+
var parameterTypes = signature.parameterTypes;
57365738
if (operatorInstance.is(CommonFlags.INSTANCE)) {
5737-
assert(leftType.isStrictlyAssignableTo(operatorInstance.signature.parameterTypes[0]));
5738-
let classInstance = assert(operatorInstance.parent); assert(classInstance.kind == ElementKind.CLASS);
5739-
rightType = operatorInstance.signature.parameterTypes[0];
5739+
leftExpr = this.convertExpression(leftExpr, leftType, assert(signature.thisType), false, left);
5740+
rightType = parameterTypes[0];
57405741
} else {
5741-
rightType = operatorInstance.signature.parameterTypes[1];
5742+
leftExpr = this.convertExpression(leftExpr, leftType, parameterTypes[0], false, left);
5743+
rightType = parameterTypes[1];
57425744
}
5743-
leftExpr = this.convertExpression(leftExpr, leftType, operatorInstance.signature.parameterTypes[0], false, left);
57445745
var rightExpr = this.compileExpression(right, rightType, Constraints.CONV_IMPLICIT);
57455746
return this.makeCallDirect(operatorInstance, [ leftExpr, rightExpr ], reportNode);
57465747
}

Diff for: tests/compiler/resolve-binary.debug.wat

+150-20
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(module
22
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
3-
(type $i32_i32_=>_none (func (param i32 i32)))
43
(type $i32_=>_i32 (func (param i32) (result i32)))
4+
(type $i32_i32_=>_none (func (param i32 i32)))
55
(type $i32_=>_none (func (param i32)))
66
(type $none_=>_none (func))
77
(type $i32_i32_i32_=>_none (func (param i32 i32 i32)))
@@ -45,10 +45,11 @@
4545
(global $resolve-binary/foo (mut i32) (i32.const 0))
4646
(global $resolve-binary/bar (mut i32) (i32.const 0))
4747
(global $resolve-binary/bar2 (mut i32) (i32.const 0))
48+
(global $resolve-binary/baz (mut i32) (i32.const 0))
4849
(global $~lib/rt/__rtti_base i32 (i32.const 10192))
49-
(global $~lib/memory/__data_end i32 (i32.const 10236))
50-
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 26620))
51-
(global $~lib/memory/__heap_base i32 (i32.const 26620))
50+
(global $~lib/memory/__data_end i32 (i32.const 10244))
51+
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 26628))
52+
(global $~lib/memory/__heap_base i32 (i32.const 26628))
5253
(memory $0 1)
5354
(data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00t\00r\00u\00e\00\00\00\00\00")
5455
(data (i32.const 44) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00f\00a\00l\00s\00e\00\00\00")
@@ -95,7 +96,7 @@
9596
(data (i32.const 10092) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00d\00i\00v\00\00\00\00\00\00\00")
9697
(data (i32.const 10124) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00r\00e\00m\00\00\00\00\00\00\00")
9798
(data (i32.const 10156) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00p\00o\00w\00\00\00\00\00\00\00")
98-
(data (i32.const 10192) "\05\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00")
99+
(data (i32.const 10192) "\06\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00")
99100
(table $0 1 funcref)
100101
(elem $0 (i32.const 1))
101102
(export "memory" (memory $0))
@@ -5255,6 +5256,18 @@
52555256
(func $resolve-binary/Bar#self (param $0 i32) (result i32)
52565257
local.get $0
52575258
)
5259+
(func $resolve-binary/Baz#add (param $0 i32) (param $1 i32) (result i32)
5260+
local.get $1
5261+
)
5262+
(func $resolve-binary/Baz#sub (param $0 i32) (param $1 i32) (result i32)
5263+
local.get $0
5264+
)
5265+
(func $resolve-binary/Baz.mul (param $0 i32) (param $1 i32) (result i32)
5266+
local.get $1
5267+
)
5268+
(func $resolve-binary/Baz.div (param $0 i32) (param $1 i32) (result i32)
5269+
local.get $0
5270+
)
52585271
(func $~lib/rt/__visit_globals (param $0 i32)
52595272
(local $1 i32)
52605273
global.get $resolve-binary/foo
@@ -5278,6 +5291,13 @@
52785291
local.get $0
52795292
call $~lib/rt/itcms/__visit
52805293
end
5294+
global.get $resolve-binary/baz
5295+
local.tee $1
5296+
if
5297+
local.get $1
5298+
local.get $0
5299+
call $~lib/rt/itcms/__visit
5300+
end
52815301
i32.const 576
52825302
local.get $0
52835303
call $~lib/rt/itcms/__visit
@@ -5304,24 +5324,27 @@
53045324
)
53055325
(func $~lib/rt/__visit_members (param $0 i32) (param $1 i32)
53065326
block $invalid
5307-
block $resolve-binary/Bar
5308-
block $resolve-binary/Foo
5309-
block $~lib/arraybuffer/ArrayBufferView
5310-
block $~lib/string/String
5311-
block $~lib/arraybuffer/ArrayBuffer
5312-
local.get $0
5313-
i32.const 8
5314-
i32.sub
5315-
i32.load
5316-
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $resolve-binary/Foo $resolve-binary/Bar $invalid
5327+
block $resolve-binary/Baz
5328+
block $resolve-binary/Bar
5329+
block $resolve-binary/Foo
5330+
block $~lib/arraybuffer/ArrayBufferView
5331+
block $~lib/string/String
5332+
block $~lib/arraybuffer/ArrayBuffer
5333+
local.get $0
5334+
i32.const 8
5335+
i32.sub
5336+
i32.load
5337+
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $resolve-binary/Foo $resolve-binary/Bar $resolve-binary/Baz $invalid
5338+
end
5339+
return
53175340
end
53185341
return
53195342
end
5343+
local.get $0
5344+
local.get $1
5345+
call $~lib/arraybuffer/ArrayBufferView~visit
53205346
return
53215347
end
5322-
local.get $0
5323-
local.get $1
5324-
call $~lib/arraybuffer/ArrayBufferView~visit
53255348
return
53265349
end
53275350
return
@@ -5338,8 +5361,8 @@
53385361
global.get $~lib/memory/__data_end
53395362
i32.lt_s
53405363
if
5341-
i32.const 26640
5342-
i32.const 26688
5364+
i32.const 26656
5365+
i32.const 26704
53435366
i32.const 1
53445367
i32.const 1
53455368
call $~lib/builtins/abort
@@ -6909,6 +6932,85 @@
69096932
call $~lib/builtins/abort
69106933
unreachable
69116934
end
6935+
i32.const 0
6936+
call $resolve-binary/Baz#constructor
6937+
global.set $resolve-binary/baz
6938+
global.get $resolve-binary/baz
6939+
local.set $0
6940+
global.get $~lib/memory/__stack_pointer
6941+
local.get $0
6942+
i32.store
6943+
local.get $0
6944+
i32.const 42
6945+
call $resolve-binary/Baz#add
6946+
i32.const 42
6947+
i32.eq
6948+
i32.eqz
6949+
if
6950+
i32.const 0
6951+
i32.const 96
6952+
i32.const 363
6953+
i32.const 1
6954+
call $~lib/builtins/abort
6955+
unreachable
6956+
end
6957+
global.get $resolve-binary/baz
6958+
local.set $0
6959+
global.get $~lib/memory/__stack_pointer
6960+
local.get $0
6961+
i32.store
6962+
local.get $0
6963+
i32.const 42
6964+
call $resolve-binary/Baz#sub
6965+
global.get $resolve-binary/baz
6966+
i32.eq
6967+
i32.eqz
6968+
if
6969+
i32.const 0
6970+
i32.const 96
6971+
i32.const 366
6972+
i32.const 1
6973+
call $~lib/builtins/abort
6974+
unreachable
6975+
end
6976+
global.get $resolve-binary/baz
6977+
local.set $0
6978+
global.get $~lib/memory/__stack_pointer
6979+
local.get $0
6980+
i32.store
6981+
local.get $0
6982+
i32.const 42
6983+
call $resolve-binary/Baz.mul
6984+
i32.const 42
6985+
i32.eq
6986+
i32.eqz
6987+
if
6988+
i32.const 0
6989+
i32.const 96
6990+
i32.const 369
6991+
i32.const 1
6992+
call $~lib/builtins/abort
6993+
unreachable
6994+
end
6995+
global.get $resolve-binary/baz
6996+
local.set $0
6997+
global.get $~lib/memory/__stack_pointer
6998+
local.get $0
6999+
i32.store
7000+
local.get $0
7001+
i32.const 42
7002+
call $resolve-binary/Baz.div
7003+
global.get $resolve-binary/baz
7004+
i32.eq
7005+
i32.eqz
7006+
if
7007+
i32.const 0
7008+
i32.const 96
7009+
i32.const 372
7010+
i32.const 1
7011+
call $~lib/builtins/abort
7012+
unreachable
7013+
end
69127014
global.get $~lib/memory/__stack_pointer
69137015
i32.const 20
69147016
i32.add
@@ -7220,4 +7322,32 @@
72207322
global.set $~lib/memory/__stack_pointer
72217323
local.get $1
72227324
)
7325+
(func $resolve-binary/Baz#constructor (param $0 i32) (result i32)
7326+
(local $1 i32)
7327+
global.get $~lib/memory/__stack_pointer
7328+
i32.const 4
7329+
i32.sub
7330+
global.set $~lib/memory/__stack_pointer
7331+
call $~stack_check
7332+
global.get $~lib/memory/__stack_pointer
7333+
i32.const 0
7334+
i32.store
7335+
local.get $0
7336+
i32.eqz
7337+
if
7338+
global.get $~lib/memory/__stack_pointer
7339+
i32.const 0
7340+
i32.const 5
7341+
call $~lib/rt/itcms/__new
7342+
local.tee $0
7343+
i32.store
7344+
end
7345+
local.get $0
7346+
local.set $1
7347+
global.get $~lib/memory/__stack_pointer
7348+
i32.const 4
7349+
i32.add
7350+
global.set $~lib/memory/__stack_pointer
7351+
local.get $1
7352+
)
72237353
)

0 commit comments

Comments
 (0)