Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJb Evain <jb@evain.net>2017-03-29 02:27:15 +0300
committerJb Evain <jb@evain.net>2017-03-29 02:27:53 +0300
commitbbe5501fa1a11f96196621fa8f51713b8e5698a7 (patch)
treeb9f38d2093f4254cc5ed683a812641ef1295f932 /Mono.Cecil.Metadata
parent1530a21d652992e9adb749d207a4f4fd44ad8024 (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.cs27
-rw-r--r--Mono.Cecil.Metadata/TableHeap.cs4
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 {