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 RequiredParameterCount = p.RequiredParameterCount
} }
let map<'a, 'b> (f : 'a -> 'b) (signature : TypeMethodSignature<'a>) : TypeMethodSignature<'b> = let map<'a, 'b, 'state>
{ (state : 'state)
Header = signature.Header (f : 'state -> 'a -> 'state * 'b)
ReturnType = f signature.ReturnType (signature : TypeMethodSignature<'a>)
ParameterTypes = signature.ParameterTypes |> List.map f : 'state * TypeMethodSignature<'b>
GenericParameterCount = signature.GenericParameterCount =
RequiredParameterCount = signature.RequiredParameterCount 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 /// See I.8.2.2
type PrimitiveType = type PrimitiveType =

View File

@@ -84,6 +84,16 @@ type TypeInfo<'generic, 'fieldGeneric> =
override this.ToString () = override this.ToString () =
$"%s{this.Assembly.Name}.%s{this.Namespace}.%s{this.Name}" $"%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> = type TypeInfoEval<'ret> =
abstract Eval<'a, 'field> : TypeInfo<'a, 'field> -> 'ret abstract Eval<'a, 'field> : TypeInfo<'a, 'field> -> 'ret
@@ -97,7 +107,7 @@ type TypeInfoCrate =
[<RequireQualifiedAccess>] [<RequireQualifiedAccess>]
module TypeInfoCrate = module TypeInfoCrate =
let make<'a, 'field> (t : TypeInfo<'a, 'field>) = let make<'a, 'field> (t : TypeInfo<'a, 'field>) : TypeInfoCrate =
{ new TypeInfoCrate with { new TypeInfoCrate with
member _.Apply e = e.Eval t member _.Apply e = e.Eval t
@@ -317,7 +327,7 @@ module TypeInfo =
(getName : 'corelib -> AssemblyName) (getName : 'corelib -> AssemblyName)
(getTypeDef : 'corelib -> TypeDefinitionHandle -> TypeInfo<'generic, 'field>) (getTypeDef : 'corelib -> TypeDefinitionHandle -> TypeInfo<'generic, 'field>)
(getTypeRef : 'corelib -> TypeReferenceHandle -> TypeInfo<'generic, 'field>) (getTypeRef : 'corelib -> TypeReferenceHandle -> TypeInfo<'generic, 'field>)
(ty : TypeInfo<'generic, 'field>) (ty : TypeInfo<TypeDefn, TypeDefn>)
: TypeDefn : TypeDefn
= =
let stk = let stk =
@@ -327,4 +337,11 @@ module TypeInfo =
| ResolvedBaseType.Object | ResolvedBaseType.Object
| ResolvedBaseType.Delegate -> SignatureTypeKind.Class | 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 _.Name
(fun x y -> x.TypeDefs.[y]) (fun x y -> x.TypeDefs.[y])
(fun x y -> x.TypeRefs.[y] |> failwithf "%+A") (fun x y -> x.TypeRefs.[y] |> failwithf "%+A")
(elementType elementType
|> TypeInfo.mapGeneric (fun i _ ->
{
Name = "<unknown>"
SequenceNumber = i
}
))
let state, zeroOfType = let state, zeroOfType =
IlMachineState.cliTypeZeroOf IlMachineState.cliTypeZeroOf