diff options
author | Jb Evain <jbevain@gmail.com> | 2011-10-27 18:55:29 +0400 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2011-10-27 18:55:29 +0400 |
commit | 2c2a311bdac229c3f2324895b9953c83324ce62a (patch) | |
tree | 0a1707ab3fc77c49d3f5f6f51628089ccffb1d19 /Mono.Cecil.Metadata | |
parent | d8b4ce06e180970f805d0372cbac037b0d58dc90 (diff) |
revert last two experimentations
Diffstat (limited to 'Mono.Cecil.Metadata')
-rw-r--r-- | Mono.Cecil.Metadata/BlobHeap.cs | 17 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/GuidHeap.cs | 11 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/Heap.cs | 18 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/StringHeap.cs | 28 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/TableHeap.cs | 7 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/UserStringHeap.cs | 24 | ||||
-rw-r--r-- | Mono.Cecil.Metadata/Utilities.cs | 20 |
7 files changed, 66 insertions, 59 deletions
diff --git a/Mono.Cecil.Metadata/BlobHeap.cs b/Mono.Cecil.Metadata/BlobHeap.cs index ecbe9c2..2488569 100644 --- a/Mono.Cecil.Metadata/BlobHeap.cs +++ b/Mono.Cecil.Metadata/BlobHeap.cs @@ -26,23 +26,30 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -using Mono.Cecil.PE; +using System; namespace Mono.Cecil.Metadata { sealed class BlobHeap : Heap { - public BlobHeap (Image image, uint offset, uint size) - : base (image, offset, size) + public BlobHeap (byte [] data) + : base (data) { } public byte [] Read (uint index) { - if (index == 0 || index > Size - 1) + if (index == 0 || index > this.data.Length - 1) return Empty<byte>.Array; - return ReadAt (index, reader => reader.ReadBytes ((int) reader.ReadCompressedUInt32 ())); + int position = (int) index; + int length = (int) data.ReadCompressedUInt32 (ref position); + + var buffer = new byte [length]; + + Buffer.BlockCopy (data, position, buffer, 0, length); + + return buffer; } } } diff --git a/Mono.Cecil.Metadata/GuidHeap.cs b/Mono.Cecil.Metadata/GuidHeap.cs index 996606f..4199af1 100644 --- a/Mono.Cecil.Metadata/GuidHeap.cs +++ b/Mono.Cecil.Metadata/GuidHeap.cs @@ -27,14 +27,13 @@ // using System; -using Mono.Cecil.PE; namespace Mono.Cecil.Metadata { sealed class GuidHeap : Heap { - public GuidHeap (Image image, uint offset, uint size) - : base (image, offset, size) + public GuidHeap (byte [] data) + : base (data) { } @@ -45,9 +44,13 @@ namespace Mono.Cecil.Metadata { const int guid_size = 16; + var buffer = new byte [guid_size]; + index--; - return ReadAt (index, reader => new Guid (reader.ReadBytes (guid_size))); + Buffer.BlockCopy (this.data, (int) index, buffer, 0, guid_size); + + return new Guid (buffer); } } } diff --git a/Mono.Cecil.Metadata/Heap.cs b/Mono.Cecil.Metadata/Heap.cs index afa6d7d..715e59b 100644 --- a/Mono.Cecil.Metadata/Heap.cs +++ b/Mono.Cecil.Metadata/Heap.cs @@ -26,29 +26,17 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -using System; -using Mono.Cecil.PE; - namespace Mono.Cecil.Metadata { abstract class Heap { public int IndexSize; - public readonly Image Image; - public readonly uint Offset; - public readonly uint Size; - - protected Heap (Image image, uint offset, uint size) - { - this.Image = image; - this.Offset = offset; - this.Size = size; - } + internal byte [] data; - public TRet ReadAt<TRet> (uint index, Func<BinaryStreamReader, TRet> read) + protected Heap (byte [] data) { - return Image.ReadAt(Image.MetadataSection.VirtualAddress, reader => { reader.Advance ((int)(Offset + index)); return read(reader); }); + this.data = data; } } } diff --git a/Mono.Cecil.Metadata/StringHeap.cs b/Mono.Cecil.Metadata/StringHeap.cs index c37b4fa..f195535 100644 --- a/Mono.Cecil.Metadata/StringHeap.cs +++ b/Mono.Cecil.Metadata/StringHeap.cs @@ -26,19 +26,18 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +using System; using System.Collections.Generic; using System.Text; -using Mono.Cecil.PE; - namespace Mono.Cecil.Metadata { class StringHeap : Heap { readonly Dictionary<uint, string> strings = new Dictionary<uint, string> (); - public StringHeap (Image image, uint offset, uint size) - : base (image, offset, size) + public StringHeap (byte [] data) + : base (data) { } @@ -51,7 +50,7 @@ namespace Mono.Cecil.Metadata { if (strings.TryGetValue (index, out @string)) return @string; - if (index > Size - 1) + if (index > data.Length - 1) return string.Empty; @string = ReadStringAt (index); @@ -63,20 +62,17 @@ namespace Mono.Cecil.Metadata { protected virtual string ReadStringAt (uint index) { - return ReadAt (index, reader => { - int length = 0; - var start = reader.Position; + int length = 0; + int start = (int) index; - for (int i = 0; ; i++) { - if (reader.ReadByte () == 0) - break; + for (int i = start; ; i++) { + if (data [i] == 0) + break; - length++; - } + length++; + } - reader.Position = start; - return Encoding.UTF8.GetString (reader.ReadBytes (length), 0, length); - }); + return Encoding.UTF8.GetString (data, start, length); } } } diff --git a/Mono.Cecil.Metadata/TableHeap.cs b/Mono.Cecil.Metadata/TableHeap.cs index af6b772..25a2ccc 100644 --- a/Mono.Cecil.Metadata/TableHeap.cs +++ b/Mono.Cecil.Metadata/TableHeap.cs @@ -98,12 +98,9 @@ namespace Mono.Cecil.Metadata { get { return Tables [(int) table]; } } - internal byte [] data; - - public TableHeap (Image image, uint offset, uint size, byte [] data) - : base (image, offset, size) + public TableHeap (byte [] data) + : base (data) { - this.data = data; } public bool HasTable (Table table) diff --git a/Mono.Cecil.Metadata/UserStringHeap.cs b/Mono.Cecil.Metadata/UserStringHeap.cs index b33eea8..7046eff 100644 --- a/Mono.Cecil.Metadata/UserStringHeap.cs +++ b/Mono.Cecil.Metadata/UserStringHeap.cs @@ -26,33 +26,29 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -using Mono.Cecil.PE; - namespace Mono.Cecil.Metadata { sealed class UserStringHeap : StringHeap { - public UserStringHeap (Image image, uint offset, uint size) - : base (image, offset, size) + public UserStringHeap (byte [] data) + : base (data) { } protected override string ReadStringAt (uint index) { - return ReadAt (index, reader => { - uint length = (uint) (reader.ReadCompressedUInt32 () & ~1); - var data = reader.ReadBytes ((int) length); + int start = (int) index; - if (length < 1) - return string.Empty; + uint length = (uint) (data.ReadCompressedUInt32 (ref start) & ~1); + if (length < 1) + return string.Empty; - var chars = new char [length / 2]; + var chars = new char [length / 2]; - for (int i = 0, j = 0; i < length; i += 2) - chars [j++] = (char) (data [i] | (data [i + 1] << 8)); + for (int i = start, j = 0; i < start + length; i += 2) + chars [j++] = (char) (data [i] | (data [i + 1] << 8)); - return new string (chars); - }); + return new string (chars); } } } diff --git a/Mono.Cecil.Metadata/Utilities.cs b/Mono.Cecil.Metadata/Utilities.cs index 4c5a6bf..d752b24 100644 --- a/Mono.Cecil.Metadata/Utilities.cs +++ b/Mono.Cecil.Metadata/Utilities.cs @@ -34,6 +34,26 @@ namespace Mono.Cecil { static partial class Mixin { + public static uint ReadCompressedUInt32 (this byte [] data, ref int position) + { + uint integer; + if ((data [position] & 0x80) == 0) { + integer = data [position]; + position++; + } else if ((data [position] & 0x40) == 0) { + integer = (uint) (data [position] & ~0x80) << 8; + integer |= data [position + 1]; + position += 2; + } else { + integer = (uint) (data [position] & ~0xc0) << 24; + integer |= (uint) data [position + 1] << 16; + integer |= (uint) data [position + 2] << 8; + integer |= (uint) data [position + 3]; + position += 4; + } + return integer; + } + public static MetadataToken GetMetadataToken (this CodedIndex self, uint data) { uint rid; |