Fix stelem of nested generic (#86)

This commit is contained in:
Patrick Stevens
2025-07-02 22:22:16 +01:00
committed by GitHub
parent 0fc4335760
commit ad8e625678
3 changed files with 48 additions and 18 deletions

View File

@@ -55,14 +55,33 @@ module TypeMethodSignature =
RequiredParameterCount = p.RequiredParameterCount
}
let map<'a, 'b> (f : 'a -> 'b) (signature : TypeMethodSignature<'a>) : TypeMethodSignature<'b> =
{
Header = signature.Header
ReturnType = f signature.ReturnType
ParameterTypes = signature.ParameterTypes |> List.map f
GenericParameterCount = signature.GenericParameterCount
RequiredParameterCount = signature.RequiredParameterCount
}
let map<'a, 'b, 'state>
(state : 'state)
(f : 'state -> 'a -> 'state * 'b)
(signature : TypeMethodSignature<'a>)
: 'state * TypeMethodSignature<'b>
=
let state, ret = f state signature.ReturnType
let state, pars =
((state, []), signature.ParameterTypes)
||> List.fold (fun (state, acc) par ->
let state, result = f state par
state, result :: acc
)
let pars = List.rev pars
let answer =
{
Header = signature.Header
ReturnType = ret
ParameterTypes = pars
GenericParameterCount = signature.GenericParameterCount
RequiredParameterCount = signature.RequiredParameterCount
}
state, answer
/// See I.8.2.2
type PrimitiveType =

View File

@@ -84,6 +84,16 @@ type TypeInfo<'generic, 'fieldGeneric> =
override this.ToString () =
$"%s{this.Assembly.Name}.%s{this.Namespace}.%s{this.Name}"
static member NominallyEqual
(a : TypeInfo<'generic, 'fieldGeneric>)
(b : TypeInfo<'generic, 'fieldGeneric>)
: bool
=
a.Assembly.FullName = b.Assembly.FullName
&& a.Namespace = b.Namespace
&& a.Name = b.Name
&& a.Generics = b.Generics
type TypeInfoEval<'ret> =
abstract Eval<'a, 'field> : TypeInfo<'a, 'field> -> 'ret
@@ -97,7 +107,7 @@ type TypeInfoCrate =
[<RequireQualifiedAccess>]
module TypeInfoCrate =
let make<'a, 'field> (t : TypeInfo<'a, 'field>) =
let make<'a, 'field> (t : TypeInfo<'a, 'field>) : TypeInfoCrate =
{ new TypeInfoCrate with
member _.Apply e = e.Eval t
@@ -317,7 +327,7 @@ module TypeInfo =
(getName : 'corelib -> AssemblyName)
(getTypeDef : 'corelib -> TypeDefinitionHandle -> TypeInfo<'generic, 'field>)
(getTypeRef : 'corelib -> TypeReferenceHandle -> TypeInfo<'generic, 'field>)
(ty : TypeInfo<'generic, 'field>)
(ty : TypeInfo<TypeDefn, TypeDefn>)
: TypeDefn
=
let stk =
@@ -327,4 +337,11 @@ module TypeInfo =
| ResolvedBaseType.Object
| ResolvedBaseType.Delegate -> SignatureTypeKind.Class
TypeDefn.FromDefinition (ComparableTypeDefinitionHandle.Make ty.TypeDefHandle, ty.Assembly.FullName, stk)
let defn =
TypeDefn.FromDefinition (ComparableTypeDefinitionHandle.Make ty.TypeDefHandle, ty.Assembly.FullName, stk)
if ty.Generics.IsEmpty then
defn
else
let generics = ty.Generics
TypeDefn.GenericInstantiation (defn, generics)

View File

@@ -827,13 +827,7 @@ module internal UnaryMetadataIlOp =
_.Name
(fun x y -> x.TypeDefs.[y])
(fun x y -> x.TypeRefs.[y] |> failwithf "%+A")
(elementType
|> TypeInfo.mapGeneric (fun i _ ->
{
Name = "<unknown>"
SequenceNumber = i
}
))
elementType
let state, zeroOfType =
IlMachineState.cliTypeZeroOf