Skip to content

Commit 9cec718

Browse files
committed
fix: remove the parameter number limit for functionType infer
1 parent fd90fda commit 9cec718

File tree

4 files changed

+102
-49
lines changed

4 files changed

+102
-49
lines changed

src/resolver.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -832,19 +832,19 @@ export class Resolver extends DiagnosticEmitter {
832832
} else if (node.kind == NodeKind.FUNCTIONTYPE) { // foo<T>(bar: (baz: T) => i32))
833833
let functionTypeNode = <FunctionTypeNode>node;
834834
let parameterNodes = functionTypeNode.parameters;
835-
if (parameterNodes && parameterNodes.length > 0) {
836-
let signatureReference = type.signatureReference;
837-
if (signatureReference) {
838-
let parameterTypes = signatureReference.parameterTypes;
839-
let thisType = signatureReference.thisType;
840-
if (parameterTypes.length == parameterNodes.length && !thisType == !functionTypeNode.explicitThisType) {
841-
for (let i = 0, k = parameterTypes.length; i < k; ++i) {
842-
this.propagateInferredGenericTypes(parameterNodes[i].type, parameterTypes[i], ctxElement, ctxTypes, typeParameterNames);
843-
}
835+
let signatureReference = type.signatureReference;
836+
if (signatureReference) {
837+
let parameterTypes = signatureReference.parameterTypes;
838+
let thisType = signatureReference.thisType;
839+
if (parameterTypes.length == parameterNodes.length && !thisType == !functionTypeNode.explicitThisType) {
840+
for (let i = 0, k = parameterTypes.length; i < k; ++i) {
841+
this.propagateInferredGenericTypes(parameterNodes[i].type, parameterTypes[i], ctxElement, ctxTypes, typeParameterNames);
842+
}
843+
if (signatureReference.returnType != Type.void) {
844844
this.propagateInferredGenericTypes(functionTypeNode.returnType, signatureReference.returnType, ctxElement, ctxTypes, typeParameterNames);
845-
if (thisType) this.propagateInferredGenericTypes(functionTypeNode.explicitThisType!, thisType, ctxElement, ctxTypes, typeParameterNames);
846-
return;
847845
}
846+
if (thisType) this.propagateInferredGenericTypes(functionTypeNode.explicitThisType!, thisType, ctxElement, ctxTypes, typeParameterNames);
847+
return;
848848
}
849849
}
850850
}

tests/compiler/infer-generic.debug.wat

Lines changed: 69 additions & 25 deletions
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
(start $~start)
5758
(func $infer-generic/inferCompatible<f64> (param $0 f64) (param $1 f64) (result i32)
5859
local.get $0
@@ -2219,17 +2220,24 @@
22192220
local.get $0
22202221
call $infer-generic/inferEncapsulatedClass<f32>
22212222
)
2222-
(func $infer-generic/inferEncapsulatedFunction<f32,f64> (param $0 i32) (result i32)
2223+
(func $infer-generic/inferEncapsulatedFunctionNull<f64> (param $0 i32) (result i32)
22232224
local.get $0
22242225
)
22252226
(func $infer-generic/test3 (param $0 i32) (result i32)
2227+
local.get $0
2228+
call $infer-generic/inferEncapsulatedFunctionNull<f64>
2229+
)
2230+
(func $infer-generic/inferEncapsulatedFunction<f32,f64> (param $0 i32) (result i32)
2231+
local.get $0
2232+
)
2233+
(func $infer-generic/test4 (param $0 i32) (result i32)
22262234
local.get $0
22272235
call $infer-generic/inferEncapsulatedFunction<f32,f64>
22282236
)
22292237
(func $infer-generic/inferEncapsulatedFunctionMixed<f32,f64> (param $0 i32) (result i32)
22302238
local.get $0
22312239
)
2232-
(func $infer-generic/test4 (param $0 i32) (result i32)
2240+
(func $infer-generic/test5 (param $0 i32) (result i32)
22332241
local.get $0
22342242
call $infer-generic/inferEncapsulatedFunctionMixed<f32,f64>
22352243
)
@@ -2284,6 +2292,17 @@
22842292
local.get $1
22852293
call $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>#__visit
22862294
)
2295+
(func $~lib/function/Function<%28%29=>f64>#__visit (param $0 i32) (param $1 i32)
2296+
local.get $0
2297+
i32.load offset=4
2298+
local.get $1
2299+
call $~lib/rt/itcms/__visit
2300+
)
2301+
(func $~lib/function/Function<%28%29=>f64>~visit (param $0 i32) (param $1 i32)
2302+
local.get $0
2303+
local.get $1
2304+
call $~lib/function/Function<%28%29=>f64>#__visit
2305+
)
22872306
(func $~lib/function/Function<%28f32%29=>f64>#__visit (param $0 i32) (param $1 i32)
22882307
local.get $0
22892308
i32.load offset=4
@@ -2310,37 +2329,43 @@
23102329
block $invalid
23112330
block $~lib/function/Function<%28f32%2Ci32%29=>f64>
23122331
block $~lib/function/Function<%28f32%29=>f64>
2313-
block $infer-generic/Ref
2314-
block $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>
2315-
block $~lib/array/Array<f32>
2316-
block $~lib/arraybuffer/ArrayBufferView
2317-
block $~lib/string/String
2318-
block $~lib/arraybuffer/ArrayBuffer
2319-
local.get $0
2320-
i32.const 8
2321-
i32.sub
2322-
i32.load
2323-
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
2332+
block $~lib/function/Function<%28%29=>f64>
2333+
block $infer-generic/Ref
2334+
block $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>
2335+
block $~lib/array/Array<f32>
2336+
block $~lib/arraybuffer/ArrayBufferView
2337+
block $~lib/string/String
2338+
block $~lib/arraybuffer/ArrayBuffer
2339+
local.get $0
2340+
i32.const 8
2341+
i32.sub
2342+
i32.load
2343+
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
2344+
end
2345+
return
23242346
end
23252347
return
23262348
end
2349+
local.get $0
2350+
local.get $1
2351+
call $~lib/arraybuffer/ArrayBufferView~visit
23272352
return
23282353
end
23292354
local.get $0
23302355
local.get $1
2331-
call $~lib/arraybuffer/ArrayBufferView~visit
2356+
call $~lib/array/Array<f32>~visit
23322357
return
23332358
end
23342359
local.get $0
23352360
local.get $1
2336-
call $~lib/array/Array<f32>~visit
2361+
call $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>~visit
23372362
return
23382363
end
2339-
local.get $0
2340-
local.get $1
2341-
call $~lib/function/Function<%28bool%2Cf32%2Ci32%2C~lib/array/Array<f32>%29=>bool>~visit
23422364
return
23432365
end
2366+
local.get $0
2367+
local.get $1
2368+
call $~lib/function/Function<%28%29=>f64>~visit
23442369
return
23452370
end
23462371
local.get $0
@@ -2393,7 +2418,7 @@
23932418
if
23942419
i32.const 0
23952420
i32.const 32
2396-
i32.const 46
2421+
i32.const 54
23972422
i32.const 1
23982423
call $~lib/builtins/abort
23992424
unreachable
@@ -2421,7 +2446,7 @@
24212446
if
24222447
i32.const 0
24232448
i32.const 32
2424-
i32.const 60
2449+
i32.const 68
24252450
i32.const 1
24262451
call $~lib/builtins/abort
24272452
unreachable
@@ -2464,7 +2489,7 @@
24642489
if
24652490
i32.const 0
24662491
i32.const 32
2467-
i32.const 61
2492+
i32.const 69
24682493
i32.const 1
24692494
call $~lib/builtins/abort
24702495
unreachable
@@ -2562,4 +2587,23 @@
25622587
global.set $~lib/memory/__stack_pointer
25632588
local.get $1
25642589
)
2590+
(func $export:infer-generic/test5 (param $0 i32) (result i32)
2591+
(local $1 i32)
2592+
global.get $~lib/memory/__stack_pointer
2593+
i32.const 4
2594+
i32.sub
2595+
global.set $~lib/memory/__stack_pointer
2596+
call $~stack_check
2597+
global.get $~lib/memory/__stack_pointer
2598+
local.get $0
2599+
i32.store
2600+
local.get $0
2601+
call $infer-generic/test5
2602+
local.set $1
2603+
global.get $~lib/memory/__stack_pointer
2604+
i32.const 4
2605+
i32.add
2606+
global.set $~lib/memory/__stack_pointer
2607+
local.get $1
2608+
)
25652609
)

tests/compiler/infer-generic.release.wat

Lines changed: 12 additions & 11 deletions
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
(start $~start)
5354
(func $start:infer-generic~anonymous|0 (param $0 i32) (param $1 f32) (param $2 i32) (param $3 i32) (result i32)
5455
local.get $1
@@ -777,7 +778,7 @@
777778
local.set $0
778779
loop $while-continue|0
779780
local.get $0
780-
i32.const 18068
781+
i32.const 18076
781782
i32.lt_u
782783
if
783784
local.get $0
@@ -877,7 +878,7 @@
877878
unreachable
878879
end
879880
local.get $0
880-
i32.const 18068
881+
i32.const 18076
881882
i32.lt_u
882883
if
883884
local.get $0
@@ -900,7 +901,7 @@
900901
i32.const 4
901902
i32.add
902903
local.tee $0
903-
i32.const 18068
904+
i32.const 18076
904905
i32.ge_u
905906
if
906907
global.get $~lib/rt/tlsf/ROOT
@@ -1263,7 +1264,7 @@
12631264
i32.const 8
12641265
i32.sub
12651266
i32.load
1266-
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner1 $folding-inner0 $infer-generic/Ref $folding-inner0 $folding-inner0 $invalid
1267+
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner1 $folding-inner0 $infer-generic/Ref $folding-inner0 $folding-inner0 $folding-inner0 $invalid
12671268
end
12681269
return
12691270
end
@@ -1301,7 +1302,7 @@
13011302
global.set $~lib/memory/__stack_pointer
13021303
block $folding-inner0
13031304
global.get $~lib/memory/__stack_pointer
1304-
i32.const 1684
1305+
i32.const 1692
13051306
i32.lt_s
13061307
br_if $folding-inner0
13071308
global.get $~lib/memory/__stack_pointer
@@ -1356,7 +1357,7 @@
13561357
memory.size
13571358
i32.const 16
13581359
i32.shl
1359-
i32.const 18068
1360+
i32.const 18076
13601361
i32.sub
13611362
i32.const 1
13621363
i32.shr_u
@@ -1391,7 +1392,7 @@
13911392
i32.sub
13921393
global.set $~lib/memory/__stack_pointer
13931394
global.get $~lib/memory/__stack_pointer
1394-
i32.const 1684
1395+
i32.const 1692
13951396
i32.lt_s
13961397
br_if $folding-inner0
13971398
global.get $~lib/memory/__stack_pointer
@@ -1438,7 +1439,7 @@
14381439
i32.sub
14391440
global.set $~lib/memory/__stack_pointer
14401441
global.get $~lib/memory/__stack_pointer
1441-
i32.const 1684
1442+
i32.const 1692
14421443
i32.lt_s
14431444
if
14441445
i32.const 18096
@@ -1501,7 +1502,7 @@
15011502
if
15021503
i32.const 0
15031504
local.get $1
1504-
i32.const 18068
1505+
i32.const 18076
15051506
i32.lt_u
15061507
local.get $1
15071508
i32.load offset=8

tests/compiler/infer-generic.ts

Lines changed: 10 additions & 2 deletions
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)