Skip to content
9 changes: 8 additions & 1 deletion src/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,14 @@ export class Resolver extends DiagnosticEmitter {
}
let defaultType = typeParameterNode.defaultType;
if (defaultType) {
let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode);
// Default parameters are resolved in context of the called function, not the calling function
let defaultTypeContextualTypeArguments: Map<string, Type> | null = null;
if (prototype.parent.kind == ElementKind.CLASS) {
defaultTypeContextualTypeArguments = (<Class>prototype.parent).contextualTypeArguments;
} else if (prototype.parent.kind == ElementKind.FUNCTION) {
defaultTypeContextualTypeArguments = (<Function>prototype.parent).contextualTypeArguments;
}
let resolvedDefaultType = this.resolveType(defaultType, prototype, defaultTypeContextualTypeArguments, reportMode);
if (!resolvedDefaultType) return null;
resolvedTypeArguments[i] = resolvedDefaultType;
continue;
Expand Down
214 changes: 192 additions & 22 deletions tests/compiler/optional-typeparameters.debug.wat
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@
(global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0))
(global $optional-typeparameters/tConcrete (mut i32) (i32.const 0))
(global $optional-typeparameters/tDerived (mut i32) (i32.const 0))
(global $optional-typeparameters/tMethodDerived (mut i32) (i32.const 0))
(global $optional-typeparameters/tMethodDerived2 (mut i32) (i32.const 0))
(global $~lib/rt/__rtti_base i32 (i32.const 416))
(global $~lib/memory/__data_end i32 (i32.const 460))
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 16844))
(global $~lib/memory/__heap_base i32 (i32.const 16844))
(global $~lib/memory/__data_end i32 (i32.const 484))
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 16868))
(global $~lib/memory/__heap_base i32 (i32.const 16868))
(memory $0 1)
(data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00")
(data (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00")
Expand All @@ -39,7 +41,7 @@
(data (i32.const 268) ",\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")
(data (i32.const 320) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
(data (i32.const 348) "<\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")
(data (i32.const 416) "\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")
(data (i32.const 416) "\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 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\00\00\00\00 \00\00\00\00\00\00\00")
(table $0 1 1 funcref)
(elem $0 (i32.const 1))
(export "memory" (memory $0))
Expand Down Expand Up @@ -2132,6 +2134,16 @@
local.get $b
f64.add
)
(func $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> (param $this i32)
i32.const 6
i32.const 6
i32.eq
drop
)
(func $optional-typeparameters/TestMethodDerived2<f64>#foo (param $this i32) (param $v i32)
local.get $v
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>>
)
(func $~lib/rt/__visit_globals (param $0 i32)
(local $1 i32)
global.get $optional-typeparameters/tConcrete
Expand All @@ -2148,6 +2160,20 @@
local.get $0
call $~lib/rt/itcms/__visit
end
global.get $optional-typeparameters/tMethodDerived
local.tee $1
if
local.get $1
local.get $0
call $~lib/rt/itcms/__visit
end
global.get $optional-typeparameters/tMethodDerived2
local.tee $1
if
local.get $1
local.get $0
call $~lib/rt/itcms/__visit
end
i32.const 224
local.get $0
call $~lib/rt/itcms/__visit
Expand All @@ -2166,28 +2192,90 @@
call $~lib/rt/itcms/__visit
end
)
(func $~lib/array/Array<~lib/string/String>#__visit (param $this i32) (param $cookie i32)
(local $var$2 i32)
(local $var$3 i32)
(local $var$4 i32)
(local $val i32)
i32.const 1
drop
local.get $this
i32.load offset=4
local.set $var$2
local.get $var$2
local.get $this
i32.load offset=12
i32.const 2
i32.shl
i32.add
local.set $var$3
loop $while-continue|0
local.get $var$2
local.get $var$3
i32.lt_u
local.set $var$4
local.get $var$4
if
local.get $var$2
i32.load
local.set $val
local.get $val
if
local.get $val
local.get $cookie
call $~lib/rt/itcms/__visit
end
local.get $var$2
i32.const 4
i32.add
local.set $var$2
br $while-continue|0
end
end
local.get $this
i32.load
local.get $cookie
call $~lib/rt/itcms/__visit
)
(func $~lib/array/Array<~lib/string/String>~visit (param $0 i32) (param $1 i32)
local.get $0
local.get $1
call $~lib/array/Array<~lib/string/String>#__visit
)
(func $~lib/rt/__visit_members (param $0 i32) (param $1 i32)
block $invalid
block $optional-typeparameters/TestDerived<f64,f64>
block $optional-typeparameters/TestConcrete<i32,i32>
block $~lib/arraybuffer/ArrayBufferView
block $~lib/string/String
block $~lib/arraybuffer/ArrayBuffer
block $optional-typeparameters/TestMethodDerived2<f64>
block $~lib/array/Array<~lib/string/String>
block $optional-typeparameters/TestMethodDerived<~lib/string/String>
block $optional-typeparameters/TestDerived<f64,f64>
block $optional-typeparameters/TestConcrete<i32,i32>
block $~lib/arraybuffer/ArrayBufferView
block $~lib/string/String
block $~lib/arraybuffer/ArrayBuffer
local.get $0
i32.const 8
i32.sub
i32.load
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $optional-typeparameters/TestConcrete<i32,i32> $optional-typeparameters/TestDerived<f64,f64> $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $optional-typeparameters/TestMethodDerived2<f64> $invalid
end
return
end
return
end
local.get $0
i32.const 8
i32.sub
i32.load
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $optional-typeparameters/TestConcrete<i32,i32> $optional-typeparameters/TestDerived<f64,f64> $invalid
local.get $1
call $~lib/arraybuffer/ArrayBufferView~visit
return
end
return
end
return
end
local.get $0
local.get $1
call $~lib/arraybuffer/ArrayBufferView~visit
return
end
local.get $0
local.get $1
call $~lib/array/Array<~lib/string/String>~visit
return
end
return
Expand All @@ -2202,8 +2290,8 @@
global.get $~lib/memory/__data_end
i32.lt_s
if
i32.const 16864
i32.const 16912
i32.const 16896
i32.const 16944
i32.const 1
i32.const 1
call $~lib/builtins/abort
Expand All @@ -2213,13 +2301,13 @@
(func $start:optional-typeparameters
(local $0 i32)
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.const 8
i32.sub
global.set $~lib/memory/__stack_pointer
call $~stack_check
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.store
i64.const 0
i64.store
i32.const 1
call $optional-typeparameters/testConcrete<i32,i32>
drop
Expand Down Expand Up @@ -2269,8 +2357,34 @@
f64.const 2
call $optional-typeparameters/TestDerived<f64,f64>#test<f64>
drop
i32.const 0
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#constructor
global.set $optional-typeparameters/tMethodDerived
global.get $optional-typeparameters/tMethodDerived
local.set $0
global.get $~lib/memory/__stack_pointer
i32.const 4
local.get $0
i32.store
local.get $0
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>>
i32.const 0
call $optional-typeparameters/TestMethodDerived2<f64>#constructor
global.set $optional-typeparameters/tMethodDerived2
global.get $optional-typeparameters/tMethodDerived2
local.set $0
global.get $~lib/memory/__stack_pointer
local.get $0
i32.store
local.get $0
global.get $optional-typeparameters/tMethodDerived
local.set $0
global.get $~lib/memory/__stack_pointer
local.get $0
i32.store offset=4
local.get $0
call $optional-typeparameters/TestMethodDerived2<f64>#foo
global.get $~lib/memory/__stack_pointer
i32.const 8
i32.add
global.set $~lib/memory/__stack_pointer
)
Expand Down Expand Up @@ -2330,4 +2444,60 @@
global.set $~lib/memory/__stack_pointer
local.get $1
)
(func $optional-typeparameters/TestMethodDerived<~lib/string/String>#constructor (param $0 i32) (result i32)
(local $1 i32)
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.sub
global.set $~lib/memory/__stack_pointer
call $~stack_check
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.store
local.get $0
i32.eqz
if
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.const 5
call $~lib/rt/itcms/__new
local.tee $0
i32.store
end
local.get $0
local.set $1
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.add
global.set $~lib/memory/__stack_pointer
local.get $1
)
(func $optional-typeparameters/TestMethodDerived2<f64>#constructor (param $0 i32) (result i32)
(local $1 i32)
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.sub
global.set $~lib/memory/__stack_pointer
call $~stack_check
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.store
local.get $0
i32.eqz
if
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.const 7
call $~lib/rt/itcms/__new
local.tee $0
i32.store
end
local.get $0
local.set $1
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.add
global.set $~lib/memory/__stack_pointer
local.get $1
)
)
Loading