diff --git a/src/Ben.Demystifier/Ben.Demystifier.csproj b/src/Ben.Demystifier/Ben.Demystifier.csproj
index d8699e9..6ba71f1 100644
--- a/src/Ben.Demystifier/Ben.Demystifier.csproj
+++ b/src/Ben.Demystifier/Ben.Demystifier.csproj
@@ -27,4 +27,9 @@
+
+
+ <_Parameter1>$(AssemblyName).Test, PublicKey=00240000048000009400000006020000002400005253413100040000010001005532489e147c0de0c5872048d20f7acf99d172a599d217950eba8fdbd1f98fa5ac47901b076d2bd7da8d436e6b5d6292694902e9748514bb0c3b17e6a0e0386f22447847c1c5cd9e034f79a8fe1c120a12785f7f79617414e63861cf13d6fd1cbb4211b87202c6a52c1e22962a6bd310413c37ca440fad14ab8422707517fbae
+
+
diff --git a/src/Ben.Demystifier/Internal/ILReader.cs b/src/Ben.Demystifier/Internal/ILReader.cs
index 6da2be9..758710f 100644
--- a/src/Ben.Demystifier/Internal/ILReader.cs
+++ b/src/Ben.Demystifier/Internal/ILReader.cs
@@ -41,6 +41,7 @@ namespace System.Diagnostics.Internal
MemberInfo ReadOperand(OpCode code, MethodBase methodInfo)
{
MetadataToken = 0;
+ int inlineLength;
switch (code.OperandType)
{
case OperandType.InlineMethod:
@@ -64,7 +65,47 @@ namespace System.Diagnostics.Internal
// Can return System.ArgumentException : Token xxx is not a valid MemberInfo token in the scope of module xxx.dll
return null;
}
+
+ case OperandType.InlineNone:
+ inlineLength = 0;
+ break;
+
+ case OperandType.ShortInlineBrTarget:
+ case OperandType.ShortInlineVar:
+ inlineLength = 1;
+ break;
+
+ case OperandType.InlineVar:
+ inlineLength = 2;
+ break;
+
+ case OperandType.InlineBrTarget:
+ case OperandType.InlineField:
+ case OperandType.InlineI:
+ case OperandType.InlineString:
+ case OperandType.InlineSig:
+ case OperandType.InlineSwitch:
+ case OperandType.InlineTok:
+ case OperandType.InlineType:
+ case OperandType.ShortInlineR:
+ inlineLength = 4;
+ break;
+
+ case OperandType.InlineI8:
+ case OperandType.InlineR:
+ inlineLength = 8;
+ break;
+
+ default:
+ // Can return System.ArgumentException : Unexpected operand type xxx
+ return null;
}
+
+ for (var i = 0; i < inlineLength; i++)
+ {
+ ReadByte();
+ }
+
return null;
}
diff --git a/test/Ben.Demystifier.Test/Ben.Demystifier.Test.csproj b/test/Ben.Demystifier.Test/Ben.Demystifier.Test.csproj
index e75a1bd..ee86c07 100644
--- a/test/Ben.Demystifier.Test/Ben.Demystifier.Test.csproj
+++ b/test/Ben.Demystifier.Test/Ben.Demystifier.Test.csproj
@@ -2,7 +2,8 @@
netcoreapp2.0;net46
-
+ true
+ ..\..\src\Ben.Demystifier\key.snk
false
diff --git a/test/Ben.Demystifier.Test/ILReaderTests.cs b/test/Ben.Demystifier.Test/ILReaderTests.cs
new file mode 100644
index 0000000..c978814
--- /dev/null
+++ b/test/Ben.Demystifier.Test/ILReaderTests.cs
@@ -0,0 +1,49 @@
+using System.Diagnostics.Internal;
+
+using Xunit;
+
+namespace Ben.Demystifier.Test
+{
+ public class ILReaderTests
+ {
+ public static TheoryData InlineCilSamples =>
+ new TheoryData
+ {
+ // https://github.com/benaadams/Ben.Demystifier/issues/56#issuecomment-366490463
+ { new byte[] {
+ 2, 123, 209, 5, 0, 4, 20, 254, 1, 114, 193, 103, 1, 112, 40, 160, 22, 0, 6,
+ 2, 115, 183, 10, 0, 10, 125, 210, 5, 0, 4, 2, 123, 212, 5, 0, 4, 2, 123, 211,
+ 5, 0, 4, 40, 221, 15, 0, 6, 44, 68, 2, 123, 212, 5, 0, 4, 111, 103, 17, 0, 6, 2,
+ 111, 222, 9, 0, 6, 2, 40, 184, 10, 0, 10, 2, 254, 6, 249, 15, 0, 6, 115, 185, 10,
+ 0, 10, 2, 123, 210, 5, 0, 4, 111, 186, 10, 0, 10, 22, 40, 101, 6, 0, 10, 111, 221,
+ 0, 0, 43, 40, 188, 10, 0, 10, 125, 209, 5, 0, 4, 42, 2, 123, 212, 5, 0, 4, 111,
+ 103, 17, 0, 6, 111, 216, 9, 0, 6, 2, 123, 211, 5, 0, 4, 111, 166, 14, 0, 6, 111,
+ 125, 16, 0, 6, 254, 1, 22, 254, 1, 114, 235, 103, 1, 112, 40, 160, 22, 0, 6, 114,
+ 160, 104, 1, 112, 40, 210, 0, 0, 10, 114, 194, 5, 0, 112, 40, 221, 0, 0, 10, 44, 51,
+ 2, 40, 184, 10, 0, 10, 2, 254, 6, 250, 15, 0, 6, 115, 185, 10, 0, 10, 2, 123, 210,
+ 5, 0, 4, 111, 186, 10, 0, 10, 22, 40, 196, 21, 0, 6, 111, 221, 0, 0, 43, 40, 188,
+ 10, 0, 10, 125, 209, 5, 0, 4, 42, 2, 40, 184, 10, 0, 10, 2, 254, 6, 251, 15, 0, 6,
+ 115, 185, 10, 0, 10, 2, 123, 210, 5, 0, 4, 111, 186, 10, 0, 10, 24, 40, 101, 6, 0,
+ 10, 111, 221, 0, 0, 43, 40, 188, 10, 0, 10, 125, 209, 5, 0, 4, 42
+ } },
+
+ // https://github.com/benaadams/Ben.Demystifier/issues/56#issuecomment-390654651
+ { new byte[] {
+ 115, 31, 5, 0, 6, 37, 2, 125, 94, 1, 0, 4, 37, 3, 125, 91, 1, 0, 4, 37, 4, 125, 92,
+ 1, 0, 4, 37, 5, 125, 93, 1, 0, 4, 37, 123, 91, 1, 0, 4, 40, 61, 0, 0, 10, 44, 16,
+ 40, 160, 4, 0, 6, 114, 253, 15, 0, 112, 115, 90, 0, 0, 10, 122, 254, 6, 32, 5, 0,
+ 6, 115, 137, 2, 0, 10, 115, 61, 2, 0, 6, 42
+ } },
+ };
+
+ // https://github.com/benaadams/Ben.Demystifier/issues/56
+ [Theory, MemberData(nameof(InlineCilSamples))]
+ public void ReadsInlinedOpcodes(byte[] cil)
+ {
+ var sut = new ILReader(cil);
+ while (sut.Read(GetType().GetMethod(nameof(ReadsInlinedOpcodes))))
+ {
+ }
+ }
+ }
+}