mirror of
https://github.com/Smaug123/WoofWare.PawPrint
synced 2025-10-07 06:58:39 +00:00
Compare commits
2 Commits
5173805562
...
more-ldind
Author | SHA1 | Date | |
---|---|---|---|
|
f404700b2b | ||
|
e6d56510fd |
@@ -46,6 +46,13 @@ type TypeMethodSignature<'Types> =
|
|||||||
|
|
||||||
[<RequireQualifiedAccess>]
|
[<RequireQualifiedAccess>]
|
||||||
module TypeMethodSignature =
|
module TypeMethodSignature =
|
||||||
|
let sigsEqual<'T> (equal : 'T -> 'T -> bool) (s1 : TypeMethodSignature<'T>) (s2 : TypeMethodSignature<'T>) : bool =
|
||||||
|
s1.GenericParameterCount = s2.GenericParameterCount
|
||||||
|
&& s1.ParameterTypes.Length = s2.ParameterTypes.Length
|
||||||
|
&& equal s1.ReturnType s2.ReturnType
|
||||||
|
&& List.zip s1.ParameterTypes s2.ParameterTypes
|
||||||
|
|> List.forall (fun (x, y) -> equal x y)
|
||||||
|
|
||||||
let make<'T> (p : MethodSignature<'T>) : TypeMethodSignature<'T> =
|
let make<'T> (p : MethodSignature<'T>) : TypeMethodSignature<'T> =
|
||||||
{
|
{
|
||||||
Header = ComparableSignatureHeader.Make p.Header
|
Header = ComparableSignatureHeader.Make p.Header
|
||||||
@@ -170,6 +177,30 @@ type TypeDefn =
|
|||||||
|
|
||||||
[<RequireQualifiedAccess>]
|
[<RequireQualifiedAccess>]
|
||||||
module TypeDefn =
|
module TypeDefn =
|
||||||
|
let rec equals
|
||||||
|
(t1TypeGenerics : TypeDefn ImmutableArray)
|
||||||
|
(t1MethodGenerics : TypeDefn ImmutableArray)
|
||||||
|
(t2TypeGenerics : TypeDefn ImmutableArray)
|
||||||
|
(t2MethodGenerics : TypeDefn ImmutableArray)
|
||||||
|
(t1 : TypeDefn)
|
||||||
|
(t2 : TypeDefn)
|
||||||
|
: bool
|
||||||
|
=
|
||||||
|
match t1, t2 with
|
||||||
|
| TypeDefn.GenericTypeParameter i, j ->
|
||||||
|
equals t1TypeGenerics t1MethodGenerics t2TypeGenerics t2MethodGenerics t1TypeGenerics.[i] j
|
||||||
|
| TypeDefn.GenericMethodParameter i, j ->
|
||||||
|
equals t1TypeGenerics t1MethodGenerics t2TypeGenerics t2MethodGenerics t1MethodGenerics.[i] j
|
||||||
|
| i, TypeDefn.GenericTypeParameter j ->
|
||||||
|
equals t1TypeGenerics t1MethodGenerics t2TypeGenerics t2MethodGenerics i t2TypeGenerics.[j]
|
||||||
|
| i, TypeDefn.GenericMethodParameter j ->
|
||||||
|
equals t1TypeGenerics t1MethodGenerics t2TypeGenerics t2MethodGenerics i t2MethodGenerics.[j]
|
||||||
|
| TypeDefn.PrimitiveType x, TypeDefn.PrimitiveType y -> x = y
|
||||||
|
| TypeDefn.Array (x, shapeX), TypeDefn.Array (y, shapeY) ->
|
||||||
|
shapeX = shapeY
|
||||||
|
&& equals t1TypeGenerics t1MethodGenerics t2TypeGenerics t2TypeGenerics x y
|
||||||
|
| t1, t2 -> failwith $"TODO: {t1} = {t2}"
|
||||||
|
|
||||||
let isManaged (typeDefn : TypeDefn) : bool =
|
let isManaged (typeDefn : TypeDefn) : bool =
|
||||||
match typeDefn with
|
match typeDefn with
|
||||||
| TypeDefn.PrimitiveType primitiveType -> failwith "todo"
|
| TypeDefn.PrimitiveType primitiveType -> failwith "todo"
|
||||||
|
@@ -1211,6 +1211,10 @@ module IlMachineState =
|
|||||||
resolveTypeFromSpec loggerFactory corelib parent assy typeGenerics methodGenerics state
|
resolveTypeFromSpec loggerFactory corelib parent assy typeGenerics methodGenerics state
|
||||||
| parent -> failwith $"Unexpected: {parent}"
|
| parent -> failwith $"Unexpected: {parent}"
|
||||||
|
|
||||||
|
let executingMethod = state.ThreadState.[currentThread].MethodState.ExecutingMethod
|
||||||
|
let methodGenerics = executingMethod.Generics
|
||||||
|
let typeGenerics = executingMethod.DeclaringType.Generics
|
||||||
|
|
||||||
match mem.Signature with
|
match mem.Signature with
|
||||||
| MemberSignature.Field fieldSig ->
|
| MemberSignature.Field fieldSig ->
|
||||||
let availableFields =
|
let availableFields =
|
||||||
@@ -1234,8 +1238,12 @@ module IlMachineState =
|
|||||||
let availableMethods =
|
let availableMethods =
|
||||||
targetType.Methods
|
targetType.Methods
|
||||||
|> List.filter (fun mi -> mi.Name = memberName)
|
|> List.filter (fun mi -> mi.Name = memberName)
|
||||||
// TODO: this needs to resolve the TypeMethodSignature to e.g. remove references to generic parameters
|
|> List.filter (fun mi ->
|
||||||
|> List.filter (fun mi -> mi.Signature = memberSig)
|
let pars = mi.Signature.ParameterTypes = memberSig.ParameterTypes
|
||||||
|
let ret = mi.Signature.ReturnType = memberSig.ReturnType
|
||||||
|
pars && ret
|
||||||
|
// TypeMethodSignature.sigsEqual (TypeDefn.equals ) mi.Signature memberSig
|
||||||
|
)
|
||||||
|
|
||||||
let method =
|
let method =
|
||||||
match availableMethods with
|
match availableMethods with
|
||||||
|
@@ -141,7 +141,54 @@ module internal UnaryMetadataIlOp =
|
|||||||
|> fst
|
|> fst
|
||||||
|> IlMachineState.callMethodInActiveAssembly loggerFactory baseClassTypes thread true generics method None
|
|> IlMachineState.callMethodInActiveAssembly loggerFactory baseClassTypes thread true generics method None
|
||||||
|
|
||||||
| Castclass -> failwith "TODO: Castclass unimplemented"
|
| Castclass ->
|
||||||
|
let logger = loggerFactory.CreateLogger "Castclass"
|
||||||
|
|
||||||
|
let actualObj, state = IlMachineState.popEvalStack thread state
|
||||||
|
|
||||||
|
let actualObj =
|
||||||
|
match actualObj with
|
||||||
|
| EvalStackValue.ManagedPointer p ->
|
||||||
|
match p with
|
||||||
|
| ManagedPointerSource.Heap a -> a
|
||||||
|
| ManagedPointerSource.Null -> failwith "TODO: push null and succeed"
|
||||||
|
| _ -> failwith $"TODO: {p}"
|
||||||
|
| s -> failwith $"TODO: {s}"
|
||||||
|
|
||||||
|
let targetType : TypeDefn =
|
||||||
|
match metadataToken with
|
||||||
|
| MetadataToken.TypeDefinition td ->
|
||||||
|
let activeAssy = state.ActiveAssembly thread
|
||||||
|
let ty = activeAssy.TypeDefs.[td]
|
||||||
|
|
||||||
|
let baseTy =
|
||||||
|
DumpedAssembly.resolveBaseType
|
||||||
|
baseClassTypes
|
||||||
|
state._LoadedAssemblies
|
||||||
|
activeAssy.Name
|
||||||
|
ty.BaseType
|
||||||
|
|
||||||
|
let sigType =
|
||||||
|
match baseTy with
|
||||||
|
| ResolvedBaseType.Enum
|
||||||
|
| ResolvedBaseType.ValueType -> SignatureTypeKind.ValueType
|
||||||
|
| ResolvedBaseType.Object -> SignatureTypeKind.Class
|
||||||
|
| ResolvedBaseType.Delegate -> failwith "todo"
|
||||||
|
|
||||||
|
TypeDefn.FromDefinition (ComparableTypeDefinitionHandle.Make td, activeAssy.Name.FullName, sigType)
|
||||||
|
| MetadataToken.TypeSpecification handle -> state.ActiveAssembly(thread).TypeSpecs.[handle].Signature
|
||||||
|
| m -> failwith $"unexpected metadata token {m} in Castclass"
|
||||||
|
|
||||||
|
let sourceType = state.ManagedHeap.NonArrayObjects.[actualObj].Type
|
||||||
|
|
||||||
|
logger.LogDebug (
|
||||||
|
"Casting object of type {SourceTypeAssembly}.{SourceTypeNamespace}.{SourceTypeName}",
|
||||||
|
sourceType.Assembly.Name,
|
||||||
|
sourceType.Namespace,
|
||||||
|
sourceType.Name
|
||||||
|
)
|
||||||
|
|
||||||
|
failwith "TODO: Castclass unimplemented"
|
||||||
| Newobj ->
|
| Newobj ->
|
||||||
let logger = loggerFactory.CreateLogger "Newobj"
|
let logger = loggerFactory.CreateLogger "Newobj"
|
||||||
|
|
||||||
@@ -342,6 +389,8 @@ module internal UnaryMetadataIlOp =
|
|||||||
| Box -> failwith "TODO: Box unimplemented"
|
| Box -> failwith "TODO: Box unimplemented"
|
||||||
| Ldelema -> failwith "TODO: Ldelema unimplemented"
|
| Ldelema -> failwith "TODO: Ldelema unimplemented"
|
||||||
| Isinst ->
|
| Isinst ->
|
||||||
|
let logger = loggerFactory.CreateLogger "Isinst"
|
||||||
|
|
||||||
let actualObj, state = IlMachineState.popEvalStack thread state
|
let actualObj, state = IlMachineState.popEvalStack thread state
|
||||||
|
|
||||||
let targetType : TypeDefn =
|
let targetType : TypeDefn =
|
||||||
|
Reference in New Issue
Block a user