From aa2a9e1d5bb9b4fb58a7183923cd3bc00e5e8a62 Mon Sep 17 00:00:00 2001 From: Alex Berezhnykh Date: Sun, 28 Jul 2024 01:08:33 +0300 Subject: [PATCH] Optimize metadata members and custom attributes reading (#17364) * wip * wip * cleanup * formatting * release notes * release notes --------- Co-authored-by: Petr Co-authored-by: Vlad Zarytovskii --- .../.FSharp.Compiler.Service/9.0.100.md | 1 + src/Compiler/AbstractIL/ilread.fs | 74 ++++++++++++------- 2 files changed, 48 insertions(+), 27 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md index 9a65849c833..1166f8b413e 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md @@ -12,6 +12,7 @@ * Change compiler default setting realsig+ when building assemblies ([Issue #17384](https://github.com/dotnet/fsharp/issues/17384), [PR #17378](https://github.com/dotnet/fsharp/pull/17385)) * Change compiler default setting for compressedMetadata ([Issue #17379](https://github.com/dotnet/fsharp/issues/17379), [PR #17383](https://github.com/dotnet/fsharp/pull/17383)) +* Optimize metadata reading for type members and custom attributes. ([PR #17364](https://github.com/dotnet/fsharp/pull/17364)) * Enforce `AttributeTargets` on unions. ([PR #17389](https://github.com/dotnet/fsharp/pull/17389)) ### Breaking Changes diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 17b97c5e9c2..7628df6311b 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -883,7 +883,7 @@ let tomdCompare (TaggedIndex(t1: TypeOrMethodDefTag, idx1)) (TaggedIndex(t2: Typ elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let simpleIndexCompare (idx1: int) (idx2: int) = compare idx1 idx2 +let inline simpleIndexCompare (idx1: int) (idx2: int) = compare idx1 idx2 //--------------------------------------------------------------------- // The various keys for the various caches. @@ -2314,6 +2314,8 @@ and seekReadTypeDefAsTypeUncached ctxtH (TypeDefAsTypIdx(boxity, ginst, idx)) = mkILTy boxity (ILTypeSpec.Create(seekReadTypeDefAsTypeRef ctxt idx, ginst)) and seekReadTypeDefAsTypeRef (ctxt: ILMetadataReader) idx = + let mdv = ctxt.mdfile.GetView() + let enc = if seekIsTopTypeDefOfIdx ctxt idx then [] @@ -2321,11 +2323,14 @@ and seekReadTypeDefAsTypeRef (ctxt: ILMetadataReader) idx = let enclIdx = seekReadIndexedRow ( ctxt.getNumRows TableNames.Nested, - seekReadNestedRow ctxt, - fst, - simpleIndexCompare idx, + id, + id, + (fun i -> + let mutable addr = ctxt.rowAddr TableNames.Nested i + let nestedIdx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv &addr + simpleIndexCompare idx nestedIdx), isSorted ctxt TableNames.Nested, - snd + (fun i -> seekReadNestedRow ctxt i |> snd) ) let tref = seekReadTypeDefAsTypeRef ctxt enclIdx @@ -3086,15 +3091,18 @@ and seekReadMethodImpls (ctxt: ILMetadataReader) numTypars tidx = let mimpls = seekReadIndexedRows ( ctxt.getNumRows TableNames.MethodImpl, - seekReadMethodImplRow ctxt mdv, - (fun (a, _, _) -> a), - simpleIndexCompare tidx, + id, + id, + (fun i -> + let mutable addr = ctxt.rowAddr TableNames.MethodImpl i + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv &addr + simpleIndexCompare tidx _tidx), isSorted ctxt TableNames.MethodImpl, - (fun (_, b, c) -> b, c) + seekReadMethodImplRow ctxt mdv ) mimpls - |> List.map (fun (b, c) -> + |> List.map (fun (_, b, c) -> { OverrideBy = let (MethodData(enclTy, cc, nm, argTys, retTy, methInst)) = @@ -3163,11 +3171,14 @@ and seekReadEvents (ctxt: ILMetadataReader) numTypars tidx = match seekReadOptionalIndexedRow ( ctxt.getNumRows TableNames.EventMap, - (fun i -> i, seekReadEventMapRow ctxt mdv i), - (fun (_, row) -> fst row), - compare tidx, + id, + id, + (fun i -> + let mutable addr = ctxt.rowAddr TableNames.EventMap i + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv &addr + simpleIndexCompare tidx _tidx), false, - (fun (i, row) -> (i, snd row)) + (fun i -> i, seekReadEventMapRow ctxt mdv i |> snd) ) with | None -> [] @@ -3230,11 +3241,14 @@ and seekReadProperties (ctxt: ILMetadataReader) numTypars tidx = match seekReadOptionalIndexedRow ( ctxt.getNumRows TableNames.PropertyMap, - (fun i -> i, seekReadPropertyMapRow ctxt mdv i), - (fun (_, row) -> fst row), - compare tidx, + id, + id, + (fun i -> + let mutable addr = ctxt.rowAddr TableNames.PropertyMap i + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv &addr + simpleIndexCompare tidx _tidx), false, - (fun (i, row) -> (i, snd row)) + (fun i -> i, seekReadPropertyMapRow ctxt mdv i |> snd) ) with | None -> [] @@ -3258,16 +3272,22 @@ and customAttrsReader ctxtH tag : ILAttributesStored = let (ctxt: ILMetadataReader) = getHole ctxtH let mdv = ctxt.mdfile.GetView() - let reader = - { new ISeekReadIndexedRowReader, ILAttribute> with - member _.GetRow(i, row) = - seekReadCustomAttributeRow ctxt mdv i &row - - member _.GetKey(attrRow) = attrRow.parentIndex - - member _.CompareKey(key) = hcaCompare (TaggedIndex(tag, idx)) key + let searchedKey = TaggedIndex(tag, idx) - member _.ConvertRow(attrRow) = + let reader = + { new ISeekReadIndexedRowReader with + member _.GetRow(i, rowIndex) = rowIndex <- i + member _.GetKey(rowIndex) = rowIndex + + member _.CompareKey(rowIndex) = + let mutable addr = ctxt.rowAddr TableNames.CustomAttribute rowIndex + // read parentIndex + let key = seekReadHasCustomAttributeIdx ctxt mdv &addr + hcaCompare searchedKey key + + member _.ConvertRow(rowIndex) = + let mutable attrRow = Unchecked.defaultof<_> + seekReadCustomAttributeRow ctxt mdv rowIndex &attrRow seekReadCustomAttr ctxt (attrRow.typeIndex, attrRow.valueIndex) }