diff options
author | Jb Evain <jb@evain.net> | 2017-03-29 02:27:15 +0300 |
---|---|---|
committer | Jb Evain <jb@evain.net> | 2017-03-29 02:27:53 +0300 |
commit | bbe5501fa1a11f96196621fa8f51713b8e5698a7 (patch) | |
tree | b9f38d2093f4254cc5ed683a812641ef1295f932 /Mono.Cecil.Metadata | |
parent | 1530a21d652992e9adb749d207a4f4fd44ad8024 (diff) |
Fix reading/writing the size of table indexes in external pdbs
Diffstat (limited to 'Mono.Cecil.Metadata')
-rw-r--r-- | Mono.Cecil.Metadata/Buffers.cs | 27 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/TableHeap.cs | 4 |
2 files changed, 26 insertions, 5 deletions
diff --git a/Mono.Cecil.Metadata/Buffers.cs b/Mono.Cecil.Metadata/Buffers.cs index 0eb0b48..d87cb2a 100644 --- a/Mono.Cecil.Metadata/Buffers.cs +++ b/Mono.Cecil.Metadata/Buffers.cs @@ -25,7 +25,8 @@ namespace Mono.Cecil.Metadata { readonly ModuleDefinition module; readonly MetadataBuilder metadata; - internal MetadataTable [] tables = new MetadataTable [Mixin.TableCount]; + readonly internal TableInformation [] table_infos = new TableInformation [Mixin.TableCount]; + readonly internal MetadataTable [] tables = new MetadataTable [Mixin.TableCount]; bool large_string; bool large_blob; @@ -50,8 +51,7 @@ namespace Mono.Cecil.Metadata { int GetTableLength (Table table) { - var md_table = tables [(int) table]; - return md_table != null ? md_table.Length : 0; + return (int) table_infos [(int) table].Length; } public TTable GetTable<TTable> (Table table) where TTable : MetadataTable, new () @@ -98,8 +98,7 @@ namespace Mono.Cecil.Metadata { public void WriteRID (uint rid, Table table) { - var md_table = tables [(int) table]; - WriteBySize (rid, md_table == null ? false : md_table.IsLarge); + WriteBySize (rid, table_infos [(int) table].IsLarge); } int GetCodedIndexSize (CodedIndex coded_index) @@ -169,6 +168,24 @@ namespace Mono.Cecil.Metadata { return valid; } + public void ComputeTableInformations () + { + if (metadata.metadata_builder != null) + ComputeTableInformations (metadata.metadata_builder.table_heap); + + ComputeTableInformations (metadata.table_heap); + } + + void ComputeTableInformations (TableHeapBuffer table_heap) + { + var tables = table_heap.tables; + for (int i = 0; i < tables.Length; i++) { + var table = tables [i]; + if (table != null && table.Length > 0) + table_infos [i].Length = (uint) table.Length; + } + } + byte GetHeapSizes () { byte heap_sizes = 0; diff --git a/Mono.Cecil.Metadata/TableHeap.cs b/Mono.Cecil.Metadata/TableHeap.cs index ebc802b..dee655a 100644 --- a/Mono.Cecil.Metadata/TableHeap.cs +++ b/Mono.Cecil.Metadata/TableHeap.cs @@ -74,6 +74,10 @@ namespace Mono.Cecil.Metadata { public uint Offset; public uint Length; public uint RowSize; + + public bool IsLarge { + get { return Length > ushort.MaxValue; } + } } sealed class TableHeap : Heap { |