Skip to content

Commit a20c005

Browse files
authored
fix: remove the parameter number limit for functionType infer (#2434)
1 parent bda41b9 commit a20c005

File tree

4 files changed

+108
-54
lines changed

4 files changed

+108
-54
lines changed

src/resolver.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -836,20 +836,21 @@ export class Resolver extends DiagnosticEmitter {
836836
} else if (node.kind == NodeKind.FUNCTIONTYPE) { // foo<T>(bar: (baz: T) => i32))
837837
let functionTypeNode = <FunctionTypeNode>node;
838838
let parameterNodes = functionTypeNode.parameters;
839-
if (parameterNodes && parameterNodes.length > 0) {
840-
let signatureReference = type.signatureReference;
841-
if (signatureReference) {
842-
let parameterTypes = signatureReference.parameterTypes;
843-
let thisType = signatureReference.thisType;
844-
if (parameterTypes.length == parameterNodes.length && !thisType == !functionTypeNode.explicitThisType) {
845-
for (let i = 0, k = parameterTypes.length; i < k; ++i) {
846-
this.propagateInferredGenericTypes(parameterNodes[i].type, parameterTypes[i], ctxElement, ctxTypes, typeParameterNames);
847-
}
848-
this.propagateInferredGenericTypes(functionTypeNode.returnType, signatureReference.returnType, ctxElement, ctxTypes, typeParameterNames);
849-
if (thisType) this.propagateInferredGenericTypes(functionTypeNode.explicitThisType!, thisType, ctxElement, ctxTypes, typeParameterNames);
850-
return;
851-
}
839+
let signatureReference = type.signatureReference;
840+
if (signatureReference) {
841+
let parameterTypes = signatureReference.parameterTypes;
842+
for (let i = 0, k = min(parameterTypes.length, parameterNodes.length) ; i < k; ++i) {
843+
this.propagateInferredGenericTypes(parameterNodes[i].type, parameterTypes[i], ctxElement, ctxTypes, typeParameterNames);
844+
}
845+
if (signatureReference.returnType != Type.void) {
846+
this.propagateInferredGenericTypes(functionTypeNode.returnType, signatureReference.returnType, ctxElement, ctxTypes, typeParameterNames);
847+
}
848+
let thisType = signatureReference.thisType;
849+
let explicitThisType = functionTypeNode.explicitThisType;
850+
if (thisType && explicitThisType) {
851+
this.propagateInferredGenericTypes(explicitThisType, thisType, ctxElement, ctxTypes, typeParameterNames);
852852
}
853+
return;
853854
}
854855
}
855856
}

tests/compiler/infer-generic.debug.wat

+70-26
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
(global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0))
3030
(global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0))
3131
(global $~lib/rt/__rtti_base i32 (i32.const 592))
32-
(global $~lib/memory/__data_end i32 (i32.const 660))
33-
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 17044))
34-
(global $~lib/memory/__heap_base i32 (i32.const 17044))
32+
(global $~lib/memory/__data_end i32 (i32.const 668))
33+
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 17052))
34+
(global $~lib/memory/__heap_base i32 (i32.const 17052))
3535
(memory $0 1)
3636
(data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00i\00n\00f\00e\00r\00-\00g\00e\00n\00e\00r\00i\00c\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00")
3737
(data (i32.const 76) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\80?\00\00\00@\00\00@@")
@@ -45,14 +45,15 @@
4545
(data (i32.const 444) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00")
4646
(data (i32.const 496) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
4747
(data (i32.const 524) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
48-
(data (i32.const 592) "\08\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\02\19\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")
48+
(data (i32.const 592) "\t\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\02\19\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")
4949
(table $0 2 2 funcref)
5050
(elem $0 (i32.const 1) $start:infer-generic~anonymous|0)
5151
(export "test1" (func $infer-generic/test1))
5252
(export "memory" (memory $0))
5353
(export "test2" (func $export:infer-generic/test2))
5454
(export "test3" (func $export:infer-generic/test3))
5555
(export "test4" (func $export:infer-generic/test4))
56+
(export "test5" (func $export:infer-generic/test5))
5657
(export "inferAssert" (func $export:infer-generic/inferAssert))
5758
(start $~start)
5859
(func $infer-generic/inferCompatible<f64> (param $a f64) (param $b f64) (result i32)
@@ -2220,17 +2221,24 @@
22202221
local.get $arr
22212222
call $infer-generic/inferEncapsulatedClass<f32>
22222223
)
2223-
(func $infer-generic/inferEncapsulatedFunction<f32,f64> (param $fn i32) (result i32)
2224+
(func $infer-generic/inferEncapsulatedFunctionNull<f64> (param $fn i32) (result i32)
22242225
local.get $fn
22252226
)
22262227
(func $infer-generic/test3 (param $fn i32) (result i32)
2228+
local.get $fn
2229+
call $infer-generic/inferEncapsulatedFunctionNull<f64>
2230+
)
2231+
(func $infer-generic/inferEncapsulatedFunction<f32,f64> (param $fn i32) (result i32)
2232+
local.get $fn
2233+
)
2234+
(func $infer-generic/test4 (param $fn i32) (result i32)
22272235
local.get $fn
22282236
call $infer-generic/inferEncapsulatedFunction<f32,f64>
22292237
)
22302238
(func $infer-generic/inferEncapsulatedFunctionMixed<f32,f64> (param $fn i32) (result i32)
22312239
local.get $fn
22322240
)
2233-
(func $infer-generic/test4 (param $fn i32) (result i32)
2241+
(func $infer-generic/test5 (param $fn i32) (result i32)
22342242
local.get $fn
22352243
call $infer-generic/inferEncapsulatedFunctionMixed<f32,f64>
22362244
)
@@ -2242,7 +2250,7 @@
22422250
if (result i32)
22432251
i32.const 0
22442252
i32.const 32
2245-
i32.const 67
2253+
i32.const 75
22462254
i32.const 3
22472255
call $~lib/builtins/abort
22482256
unreachable
@@ -2303,6 +2311,17 @@
23032311
local.get $1
23042312
call $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>#__visit
23052313
)
2314+
(func $~lib/function/Function<%28%29=>f64>#__visit (param $this i32) (param $cookie i32)
2315+
local.get $this
2316+
i32.load offset=4
2317+
local.get $cookie
2318+
call $~lib/rt/itcms/__visit
2319+
)
2320+
(func $~lib/function/Function<%28%29=>f64>~visit (param $0 i32) (param $1 i32)
2321+
local.get $0
2322+
local.get $1
2323+
call $~lib/function/Function<%28%29=>f64>#__visit
2324+
)
23062325
(func $~lib/function/Function<%28f32%29=>f64>#__visit (param $this i32) (param $cookie i32)
23072326
local.get $this
23082327
i32.load offset=4
@@ -2329,37 +2348,43 @@
23292348
block $invalid
23302349
block $~lib/function/Function<%28f32%2Ci32%29=>f64>
23312350
block $~lib/function/Function<%28f32%29=>f64>
2332-
block $infer-generic/Ref
2333-
block $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>
2334-
block $~lib/array/Array<f32>
2335-
block $~lib/arraybuffer/ArrayBufferView
2336-
block $~lib/string/String
2337-
block $~lib/arraybuffer/ArrayBuffer
2338-
local.get $0
2339-
i32.const 8
2340-
i32.sub
2341-
i32.load
2342-
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/array/Array<f32> $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool> $infer-generic/Ref $~lib/function/Function<%28f32%29=>f64> $~lib/function/Function<%28f32%2Ci32%29=>f64> $invalid
2351+
block $~lib/function/Function<%28%29=>f64>
2352+
block $infer-generic/Ref
2353+
block $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>
2354+
block $~lib/array/Array<f32>
2355+
block $~lib/arraybuffer/ArrayBufferView
2356+
block $~lib/string/String
2357+
block $~lib/arraybuffer/ArrayBuffer
2358+
local.get $0
2359+
i32.const 8
2360+
i32.sub
2361+
i32.load
2362+
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/array/Array<f32> $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool> $infer-generic/Ref $~lib/function/Function<%28%29=>f64> $~lib/function/Function<%28f32%29=>f64> $~lib/function/Function<%28f32%2Ci32%29=>f64> $invalid
2363+
end
2364+
return
23432365
end
23442366
return
23452367
end
2368+
local.get $0
2369+
local.get $1
2370+
call $~lib/arraybuffer/ArrayBufferView~visit
23462371
return
23472372
end
23482373
local.get $0
23492374
local.get $1
2350-
call $~lib/arraybuffer/ArrayBufferView~visit
2375+
call $~lib/array/Array<f32>~visit
23512376
return
23522377
end
23532378
local.get $0
23542379
local.get $1
2355-
call $~lib/array/Array<f32>~visit
2380+
call $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>~visit
23562381
return
23572382
end
2358-
local.get $0
2359-
local.get $1
2360-
call $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>~visit
23612383
return
23622384
end
2385+
local.get $0
2386+
local.get $1
2387+
call $~lib/function/Function<%28%29=>f64>~visit
23632388
return
23642389
end
23652390
local.get $0
@@ -2412,7 +2437,7 @@
24122437
if
24132438
i32.const 0
24142439
i32.const 32
2415-
i32.const 46
2440+
i32.const 54
24162441
i32.const 1
24172442
call $~lib/builtins/abort
24182443
unreachable
@@ -2440,7 +2465,7 @@
24402465
if
24412466
i32.const 0
24422467
i32.const 32
2443-
i32.const 62
2468+
i32.const 70
24442469
i32.const 1
24452470
call $~lib/builtins/abort
24462471
unreachable
@@ -2483,7 +2508,7 @@
24832508
if
24842509
i32.const 0
24852510
i32.const 32
2486-
i32.const 63
2511+
i32.const 71
24872512
i32.const 1
24882513
call $~lib/builtins/abort
24892514
unreachable
@@ -2581,6 +2606,25 @@
25812606
global.set $~lib/memory/__stack_pointer
25822607
local.get $1
25832608
)
2609+
(func $export:infer-generic/test5 (param $0 i32) (result i32)
2610+
(local $1 i32)
2611+
global.get $~lib/memory/__stack_pointer
2612+
i32.const 4
2613+
i32.sub
2614+
global.set $~lib/memory/__stack_pointer
2615+
call $~stack_check
2616+
global.get $~lib/memory/__stack_pointer
2617+
local.get $0
2618+
i32.store
2619+
local.get $0
2620+
call $infer-generic/test5
2621+
local.set $1
2622+
global.get $~lib/memory/__stack_pointer
2623+
i32.const 4
2624+
i32.add
2625+
global.set $~lib/memory/__stack_pointer
2626+
local.get $1
2627+
)
25842628
(func $export:infer-generic/inferAssert (param $0 i32)
25852629
global.get $~lib/memory/__stack_pointer
25862630
i32.const 4

tests/compiler/infer-generic.release.wat

+14-13
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
(global $~lib/rt/itcms/white (mut i32) (i32.const 0))
2020
(global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0))
2121
(global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0))
22-
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 18068))
22+
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 18076))
2323
(memory $0 1)
2424
(data (i32.const 1036) "<")
2525
(data (i32.const 1048) "\01\00\00\00 \00\00\00i\00n\00f\00e\00r\00-\00g\00e\00n\00e\00r\00i\00c\00.\00t\00s")
@@ -39,7 +39,7 @@
3939
(data (i32.const 1480) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s")
4040
(data (i32.const 1548) "<")
4141
(data (i32.const 1560) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s")
42-
(data (i32.const 1616) "\08\00\00\00 \00\00\00\00\00\00\00 ")
42+
(data (i32.const 1616) "\t\00\00\00 \00\00\00\00\00\00\00 ")
4343
(data (i32.const 1644) "\02\19")
4444
(data (i32.const 1660) " ")
4545
(table $0 2 2 funcref)
@@ -49,6 +49,7 @@
4949
(export "test2" (func $export:infer-generic/test2))
5050
(export "test3" (func $export:infer-generic/test2))
5151
(export "test4" (func $export:infer-generic/test2))
52+
(export "test5" (func $export:infer-generic/test2))
5253
(export "inferAssert" (func $export:infer-generic/inferAssert))
5354
(start $~start)
5455
(func $start:infer-generic~anonymous|0 (param $0 i32) (param $1 f32) (param $2 i32) (param $3 i32) (result i32)
@@ -778,7 +779,7 @@
778779
local.set $0
779780
loop $while-continue|0
780781
local.get $0
781-
i32.const 18068
782+
i32.const 18076
782783
i32.lt_u
783784
if
784785
local.get $0
@@ -878,7 +879,7 @@
878879
unreachable
879880
end
880881
local.get $0
881-
i32.const 18068
882+
i32.const 18076
882883
i32.lt_u
883884
if
884885
local.get $0
@@ -901,7 +902,7 @@
901902
i32.const 4
902903
i32.add
903904
local.tee $0
904-
i32.const 18068
905+
i32.const 18076
905906
i32.ge_u
906907
if
907908
global.get $~lib/rt/tlsf/ROOT
@@ -1266,7 +1267,7 @@
12661267
i32.const 8
12671268
i32.sub
12681269
i32.load
1269-
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner1 $folding-inner0 $infer-generic/Ref $folding-inner0 $folding-inner0 $invalid
1270+
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner1 $folding-inner0 $infer-generic/Ref $folding-inner0 $folding-inner0 $folding-inner0 $invalid
12701271
end
12711272
return
12721273
end
@@ -1304,7 +1305,7 @@
13041305
global.set $~lib/memory/__stack_pointer
13051306
block $folding-inner0
13061307
global.get $~lib/memory/__stack_pointer
1307-
i32.const 1684
1308+
i32.const 1692
13081309
i32.lt_s
13091310
br_if $folding-inner0
13101311
global.get $~lib/memory/__stack_pointer
@@ -1359,7 +1360,7 @@
13591360
memory.size
13601361
i32.const 16
13611362
i32.shl
1362-
i32.const 18068
1363+
i32.const 18076
13631364
i32.sub
13641365
i32.const 1
13651366
i32.shr_u
@@ -1394,7 +1395,7 @@
13941395
i32.sub
13951396
global.set $~lib/memory/__stack_pointer
13961397
global.get $~lib/memory/__stack_pointer
1397-
i32.const 1684
1398+
i32.const 1692
13981399
i32.lt_s
13991400
br_if $folding-inner0
14001401
global.get $~lib/memory/__stack_pointer
@@ -1441,7 +1442,7 @@
14411442
i32.sub
14421443
global.set $~lib/memory/__stack_pointer
14431444
global.get $~lib/memory/__stack_pointer
1444-
i32.const 1684
1445+
i32.const 1692
14451446
i32.lt_s
14461447
if
14471448
i32.const 18096
@@ -1467,7 +1468,7 @@
14671468
i32.sub
14681469
global.set $~lib/memory/__stack_pointer
14691470
global.get $~lib/memory/__stack_pointer
1470-
i32.const 1684
1471+
i32.const 1692
14711472
i32.lt_s
14721473
if
14731474
i32.const 18096
@@ -1485,7 +1486,7 @@
14851486
if
14861487
i32.const 0
14871488
i32.const 1056
1488-
i32.const 67
1489+
i32.const 75
14891490
i32.const 3
14901491
call $~lib/builtins/abort
14911492
unreachable
@@ -1541,7 +1542,7 @@
15411542
if
15421543
i32.const 0
15431544
local.get $1
1544-
i32.const 18068
1545+
i32.const 18076
15451546
i32.lt_u
15461547
local.get $1
15471548
i32.load offset=8

tests/compiler/infer-generic.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,21 @@ export function test2(arr: f32[]): f32[] {
1818
return inferEncapsulatedClass(arr);
1919
}
2020

21+
// () => R should infer R
22+
function inferEncapsulatedFunctionNull<R>(fn: () => R): () => R {
23+
return fn;
24+
}
25+
export function test3(fn: () => f64): () => f64 {
26+
return inferEncapsulatedFunctionNull(fn);
27+
}
28+
2129
// (a: T) => R should infer T,R
2230

2331
function inferEncapsulatedFunction<T, R>(fn: (a: T) => R): (a: T) => R {
2432
return fn;
2533
}
2634

27-
export function test3(fn: (a: f32) => f64): (a: f32) => f64 {
35+
export function test4(fn: (a: f32) => f64): (a: f32) => f64 {
2836
return inferEncapsulatedFunction(fn);
2937
}
3038

@@ -34,7 +42,7 @@ function inferEncapsulatedFunctionMixed<T, R>(fn: (a: T, b: i32) => R): (a: T, b
3442
return fn;
3543
}
3644

37-
export function test4(fn: (a: f32, b: i32) => f64): (a: f32, b: i32) => f64 {
45+
export function test5(fn: (a: f32, b: i32) => f64): (a: f32, b: i32) => f64 {
3846
return inferEncapsulatedFunctionMixed(fn);
3947
}
4048

0 commit comments

Comments
 (0)