mirror of https://github.com/icsharpcode/ILSpy.git
70 changed files with 7585 additions and 689 deletions
@ -1,30 +0,0 @@
@@ -1,30 +0,0 @@
|
||||
using NUnit.Framework; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
using System.Reflection; |
||||
using System.Text; |
||||
using System.Threading.Tasks; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.FSharpPatterns |
||||
{ |
||||
[TestFixture] |
||||
public class FSharpPatternTests |
||||
{ |
||||
[Test] |
||||
public void FSharpUsingDecompilesToCSharpUsing_Debug() |
||||
{ |
||||
var ilCode = TestHelpers.FuzzyReadResource("FSharpUsing.fs.Debug.il"); |
||||
var csharpCode = TestHelpers.FuzzyReadResource("FSharpUsing.fs.Debug.cs"); |
||||
TestHelpers.RunIL(ilCode, csharpCode); |
||||
} |
||||
|
||||
[Test] |
||||
public void FSharpUsingDecompilesToCSharpUsing_Release() |
||||
{ |
||||
var ilCode = TestHelpers.FuzzyReadResource("FSharpUsing.fs.Release.il"); |
||||
var csharpCode = TestHelpers.FuzzyReadResource("FSharpUsing.fs.Release.cs"); |
||||
TestHelpers.RunIL(ilCode, csharpCode); |
||||
} |
||||
} |
||||
} |
@ -1,64 +0,0 @@
@@ -1,64 +0,0 @@
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
public static class FSharpUsingPatterns |
||||
{ |
||||
public static void sample1() |
||||
{ |
||||
using (FileStream fs = File.Create("x.txt")) |
||||
{ |
||||
fs.WriteByte((byte)1); |
||||
} |
||||
} |
||||
|
||||
public static void sample2() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fs = File.Create("x.txt")) |
||||
{ |
||||
fs.WriteByte((byte)2); |
||||
Console.WriteLine("some text"); |
||||
} |
||||
} |
||||
|
||||
public static void sample3() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fs = File.Create("x.txt")) |
||||
{ |
||||
fs.WriteByte((byte)3); |
||||
} |
||||
Console.WriteLine("some text"); |
||||
} |
||||
|
||||
public static void sample4() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num; |
||||
using (FileStream fs = File.OpenRead("x.txt")) |
||||
{ |
||||
num = fs.ReadByte(); |
||||
} |
||||
int firstByte = num; |
||||
Console.WriteLine("read:" + firstByte.ToString()); |
||||
} |
||||
|
||||
public static void sample5() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num; |
||||
using (FileStream fs = File.OpenRead("x.txt")) |
||||
{ |
||||
num = fs.ReadByte(); |
||||
} |
||||
int firstByte = num; |
||||
int num3; |
||||
using (FileStream fs = File.OpenRead("x.txt")) |
||||
{ |
||||
int num2 = fs.ReadByte(); |
||||
num3 = fs.ReadByte(); |
||||
} |
||||
int secondByte = num3; |
||||
Console.WriteLine("read: {0}, {1}", firstByte, secondByte); |
||||
} |
||||
} |
@ -1,64 +0,0 @@
@@ -1,64 +0,0 @@
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
public static class FSharpUsingPatterns |
||||
{ |
||||
public static void sample1() |
||||
{ |
||||
using (FileStream fs = File.Create("x.txt")) |
||||
{ |
||||
fs.WriteByte(1); |
||||
} |
||||
} |
||||
|
||||
public static void sample2() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fs = File.Create("x.txt")) |
||||
{ |
||||
fs.WriteByte(2); |
||||
Console.WriteLine("some text"); |
||||
} |
||||
} |
||||
|
||||
public static void sample3() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fs = File.Create("x.txt")) |
||||
{ |
||||
fs.WriteByte(3); |
||||
} |
||||
Console.WriteLine("some text"); |
||||
} |
||||
|
||||
public static void sample4() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num; |
||||
using (FileStream fs = File.OpenRead("x.txt")) |
||||
{ |
||||
num = fs.ReadByte(); |
||||
} |
||||
int firstByte = num; |
||||
Console.WriteLine("read:" + firstByte.ToString()); |
||||
} |
||||
|
||||
public static void sample5() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int secondByte; |
||||
using (FileStream fs = File.OpenRead("x.txt")) |
||||
{ |
||||
secondByte = fs.ReadByte(); |
||||
} |
||||
int firstByte = secondByte; |
||||
int num2; |
||||
using (FileStream fs = File.OpenRead("x.txt")) |
||||
{ |
||||
int num = fs.ReadByte(); |
||||
num2 = fs.ReadByte(); |
||||
} |
||||
secondByte = num2; |
||||
Console.WriteLine("read: {0}, {1}", firstByte, secondByte); |
||||
} |
||||
} |
@ -1,87 +0,0 @@
@@ -1,87 +0,0 @@
|
||||
using ICSharpCode.Decompiler.Ast; |
||||
using ICSharpCode.Decompiler.Tests.Helpers; |
||||
using ICSharpCode.NRefactory.CSharp; |
||||
using Mono.Cecil; |
||||
using NUnit.Framework; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Reflection; |
||||
using System.Text; |
||||
using System.Threading.Tasks; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.FSharpPatterns |
||||
{ |
||||
public class TestHelpers |
||||
{ |
||||
public static string FuzzyReadResource(string resourceName) |
||||
{ |
||||
var asm = Assembly.GetExecutingAssembly(); |
||||
var allResources = asm.GetManifestResourceNames(); |
||||
var fullResourceName = allResources.Single(r => r.EndsWith(resourceName, StringComparison.OrdinalIgnoreCase)); |
||||
return new StreamReader(asm.GetManifestResourceStream(fullResourceName)).ReadToEnd(); |
||||
} |
||||
|
||||
static Lazy<string> ilasm = new Lazy<string>(() => ToolLocator.FindTool("ilasm.exe")); |
||||
static Lazy<string> ildasm = new Lazy<string>(() => ToolLocator.FindTool("ildasm.exe")); |
||||
|
||||
public static string CompileIL(string source) |
||||
{ |
||||
if (ilasm.Value == null) |
||||
Assert.NotNull(ilasm.Value, "Could not find ILASM.exe"); |
||||
var tmp = Path.GetTempFileName(); |
||||
File.Delete(tmp); |
||||
var sourceFile = Path.ChangeExtension(tmp, ".il"); |
||||
File.WriteAllText(sourceFile, source); |
||||
var asmFile = Path.ChangeExtension(sourceFile, ".dll"); |
||||
|
||||
var args = string.Format("{0} /dll /debug /output:{1}", sourceFile, asmFile); |
||||
using (var proc = Process.Start(new ProcessStartInfo(ilasm.Value, args) { UseShellExecute = false, })) |
||||
{ |
||||
proc.WaitForExit(); |
||||
Assert.AreEqual(0, proc.ExitCode); |
||||
} |
||||
|
||||
File.Delete(sourceFile); |
||||
Assert.True(File.Exists(asmFile), "Assembly File does not exist"); |
||||
return asmFile; |
||||
} |
||||
|
||||
public static void RunIL(string ilCode, string expectedCSharpCode) |
||||
{ |
||||
var asmFilePath = CompileIL(ilCode); |
||||
CompareAssemblyAgainstCSharp(expectedCSharpCode, asmFilePath); |
||||
} |
||||
|
||||
private static void CompareAssemblyAgainstCSharp(string expectedCSharpCode, string asmFilePath) |
||||
{ |
||||
var module = ModuleDefinition.ReadModule(asmFilePath); |
||||
try |
||||
{ |
||||
try { module.ReadSymbols(); } catch { } |
||||
AstBuilder decompiler = new AstBuilder(new DecompilerContext(module)); |
||||
decompiler.AddAssembly(module); |
||||
new Helpers.RemoveCompilerAttribute().Run(decompiler.SyntaxTree); |
||||
StringWriter output = new StringWriter(); |
||||
|
||||
// the F# assembly contains a namespace `<StartupCode$tmp6D55>` where the part after tmp is randomly generated.
|
||||
// remove this from the ast to simplify the diff
|
||||
var startupCodeNode = decompiler.SyntaxTree.Children.OfType<NamespaceDeclaration>().SingleOrDefault(d => d.Name.StartsWith("<StartupCode$", StringComparison.Ordinal)); |
||||
if (startupCodeNode != null) |
||||
startupCodeNode.Remove(); |
||||
|
||||
decompiler.GenerateCode(new PlainTextOutput(output)); |
||||
var fullCSharpCode = output.ToString(); |
||||
|
||||
CodeAssert.AreEqual(expectedCSharpCode, output.ToString()); |
||||
} |
||||
finally |
||||
{ |
||||
File.Delete(asmFilePath); |
||||
File.Delete(Path.ChangeExtension(asmFilePath, ".pdb")); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,99 +0,0 @@
@@ -1,99 +0,0 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Text; |
||||
using System.Threading.Tasks; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.FSharpPatterns |
||||
{ |
||||
public class ToolLocator |
||||
{ |
||||
public static string FindTool(string fileName) |
||||
{ |
||||
var allPaths = FindPathForDotNetFramework().Concat(FindPathForWindowsSdk()); |
||||
return allPaths.Select(dir => Path.Combine(dir, fileName)).FirstOrDefault(File.Exists); |
||||
} |
||||
|
||||
private static IEnumerable<string> FindPathForWindowsSdk() |
||||
{ |
||||
string[] windowsSdkPaths = new[] |
||||
{ |
||||
@"Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\", |
||||
@"Microsoft SDKs\Windows\v8.0A\bin\", |
||||
@"Microsoft SDKs\Windows\v8.0\bin\NETFX 4.0 Tools\", |
||||
@"Microsoft SDKs\Windows\v8.0\bin\", |
||||
@"Microsoft SDKs\Windows\v7.1A\bin\NETFX 4.0 Tools\", |
||||
@"Microsoft SDKs\Windows\v7.1A\bin\", |
||||
@"Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\", |
||||
@"Microsoft SDKs\Windows\v7.0A\bin\", |
||||
@"Microsoft SDKs\Windows\v6.1A\bin\", |
||||
@"Microsoft SDKs\Windows\v6.0A\bin\", |
||||
@"Microsoft SDKs\Windows\v6.0\bin\", |
||||
@"Microsoft.NET\FrameworkSDK\bin" |
||||
}; |
||||
|
||||
foreach (var possiblePath in windowsSdkPaths) |
||||
{ |
||||
string fullPath = string.Empty; |
||||
|
||||
// Check alternate program file paths as well as 64-bit versions.
|
||||
if (Environment.Is64BitProcess) |
||||
{ |
||||
fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), possiblePath, "x64"); |
||||
if (Directory.Exists(fullPath)) |
||||
{ |
||||
yield return fullPath; |
||||
} |
||||
|
||||
fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), possiblePath, "x64"); |
||||
if (Directory.Exists(fullPath)) |
||||
{ |
||||
yield return fullPath; |
||||
} |
||||
} |
||||
|
||||
fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), possiblePath); |
||||
if (Directory.Exists(fullPath)) |
||||
{ |
||||
yield return fullPath; |
||||
} |
||||
|
||||
fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), possiblePath); |
||||
if (Directory.Exists(fullPath)) |
||||
{ |
||||
yield return fullPath; |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static IEnumerable<string> FindPathForDotNetFramework() |
||||
{ |
||||
string[] frameworkPaths = new[] |
||||
{ |
||||
@"Microsoft.NET\Framework\v4.0.30319", |
||||
@"Microsoft.NET\Framework\v2.0.50727" |
||||
}; |
||||
|
||||
foreach (var possiblePath in frameworkPaths) |
||||
{ |
||||
string fullPath = string.Empty; |
||||
|
||||
if (Environment.Is64BitProcess) |
||||
{ |
||||
fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), possiblePath.Replace(@"\Framework\", @"\Framework64\")); |
||||
if (Directory.Exists(fullPath)) |
||||
{ |
||||
yield return fullPath; |
||||
} |
||||
} |
||||
|
||||
fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), possiblePath); |
||||
if (Directory.Exists(fullPath)) |
||||
{ |
||||
yield return fullPath; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
/*.dll |
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
open System |
||||
|
||||
let disposable() = { new IDisposable with member x.Dispose() = () } |
||||
|
||||
let getSeq() = seq { yield 1; } |
||||
let getList() = [ 1 ] |
||||
let getArray() = [| 1 |] |
||||
|
||||
[<EntryPoint>] |
||||
let main argv = |
||||
|
||||
// nested using scopes? |
||||
use disp1 = |
||||
use disp2 = disposable() |
||||
Console.WriteLine "Hello 1" |
||||
disposable() |
||||
|
||||
// for loop over seq |
||||
for i in getSeq() do |
||||
Console.WriteLine i |
||||
|
||||
// for loop over list |
||||
for i in getList() do |
||||
Console.WriteLine i |
||||
|
||||
// for loop over array |
||||
for i in getArray() do |
||||
Console.WriteLine i |
||||
|
||||
0 // return an integer exit code |
@ -0,0 +1,209 @@
@@ -0,0 +1,209 @@
|
||||
|
||||
// C:\Users\Siegfried\Documents\Visual Studio 2017\Projects\ConsoleApp13\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
|
||||
// ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Global type: <Module>
|
||||
// Entry point: Program.main
|
||||
// Architecture: AnyCPU (32-bit preferred)
|
||||
// Runtime: .NET 4.0
|
||||
|
||||
using Microsoft.FSharp.Collections; |
||||
using Microsoft.FSharp.Core; |
||||
using Microsoft.FSharp.Core.CompilerServices; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.Reflection; |
||||
using System.Runtime.CompilerServices; |
||||
using System.Runtime.InteropServices; |
||||
using System.Runtime.Versioning; |
||||
|
||||
[assembly: FSharpInterfaceDataVersion(2, 0, 0)] |
||||
[assembly: TargetFramework(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")] |
||||
[assembly: AssemblyTitle("ConsoleApplication1")] |
||||
[assembly: AssemblyDescription("")] |
||||
[assembly: AssemblyConfiguration("")] |
||||
[assembly: AssemblyCompany("")] |
||||
[assembly: AssemblyProduct("ConsoleApplication1")] |
||||
[assembly: AssemblyCopyright("Copyright © 2017")] |
||||
[assembly: AssemblyTrademark("")] |
||||
[assembly: AssemblyCulture("")] |
||||
[assembly: ComVisible(false)] |
||||
[assembly: Guid("e0674ff5-5e8f-4d4e-a88f-e447192454c7")] |
||||
[assembly: AssemblyVersion("1.0.0.0")] |
||||
[assembly: AssemblyFileVersion("1.0.0.0")] |
||||
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations)] |
||||
[assembly: AssemblyVersion("1.0.0.0")] |
||||
[CompilationMapping(SourceConstructFlags.Module)] |
||||
public static class Program |
||||
{ |
||||
[Serializable] |
||||
[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] |
||||
[CompilationMapping(SourceConstructFlags.Closure)] |
||||
internal sealed class disposable@3 : IDisposable |
||||
{ |
||||
public disposable@3() |
||||
{ |
||||
((object)this)..ctor(); |
||||
} |
||||
|
||||
private void System-IDisposable-Dispose() |
||||
{ |
||||
} |
||||
|
||||
void IDisposable.Dispose() |
||||
{ |
||||
//ILSpy generated this explicit interface implementation from .override directive in System-IDisposable-Dispose
|
||||
this.System-IDisposable-Dispose(); |
||||
} |
||||
} |
||||
|
||||
[Serializable] |
||||
[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] |
||||
[CompilationMapping(SourceConstructFlags.Closure)] |
||||
internal sealed class getSeq@5 : GeneratedSequenceBase<int> |
||||
{ |
||||
[DebuggerBrowsable(DebuggerBrowsableState.Never)] |
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public int pc = pc; |
||||
|
||||
[DebuggerBrowsable(DebuggerBrowsableState.Never)] |
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public int current = current; |
||||
|
||||
public getSeq@5(int pc, int current) |
||||
{ |
||||
} |
||||
|
||||
public override int GenerateNext(ref IEnumerable<int> next) |
||||
{ |
||||
switch (this.pc) |
||||
{ |
||||
default: |
||||
this.pc = 1; |
||||
this.current = 1; |
||||
return 1; |
||||
case 1: |
||||
this.pc = 2; |
||||
break; |
||||
case 2: |
||||
break; |
||||
} |
||||
this.current = 0; |
||||
return 0; |
||||
} |
||||
|
||||
public override void Close() |
||||
{ |
||||
this.pc = 2; |
||||
} |
||||
|
||||
public override bool get_CheckClose() |
||||
{ |
||||
switch (this.pc) |
||||
{ |
||||
default: |
||||
return false; |
||||
case 0: |
||||
case 2: |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public override int get_LastGenerated() |
||||
{ |
||||
return this.current; |
||||
} |
||||
|
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public override IEnumerator<int> GetFreshEnumerator() |
||||
{ |
||||
return new getSeq@5(0, 0); |
||||
} |
||||
} |
||||
|
||||
public static IDisposable disposable() |
||||
{ |
||||
return new disposable@3(); |
||||
} |
||||
|
||||
public static IEnumerable<int> getSeq() |
||||
{ |
||||
return new getSeq@5(0, 0); |
||||
} |
||||
|
||||
public static FSharpList<int> getList() |
||||
{ |
||||
return FSharpList<int>.Cons(1, FSharpList<int>.Empty); |
||||
} |
||||
|
||||
public static int[] getArray() |
||||
{ |
||||
return new int[1] |
||||
{ |
||||
1 |
||||
}; |
||||
} |
||||
|
||||
[EntryPoint] |
||||
public static int main(string[] argv) |
||||
{ |
||||
IDisposable disposable = default(IDisposable); |
||||
using (Program.disposable()) |
||||
{ |
||||
Console.WriteLine("Hello 1"); |
||||
disposable = Program.disposable(); |
||||
} |
||||
using (disposable) |
||||
{ |
||||
IEnumerable<int> seq = Program.getSeq(); |
||||
using (IEnumerator<int> enumerator = seq.GetEnumerator()) |
||||
{ |
||||
while (true) |
||||
{ |
||||
if (!enumerator.MoveNext()) |
||||
break; |
||||
int k = enumerator.Current; |
||||
Console.WriteLine(k); |
||||
} |
||||
} |
||||
FSharpList<int> fSharpList = Program.getList(); |
||||
FSharpList<int> tailOrNull = fSharpList.TailOrNull; |
||||
while (true) |
||||
{ |
||||
if (tailOrNull == null) |
||||
break; |
||||
int j = fSharpList.HeadOrDefault; |
||||
Console.WriteLine(j); |
||||
fSharpList = tailOrNull; |
||||
tailOrNull = fSharpList.TailOrNull; |
||||
} |
||||
int[] array = Program.getArray(); |
||||
for (int l = 0; l < array.Length; l++) |
||||
{ |
||||
int i = array[l]; |
||||
Console.WriteLine(i); |
||||
} |
||||
return 0; |
||||
} |
||||
} |
||||
} |
||||
namespace <StartupCode$ConsoleApplication1> |
||||
{ |
||||
internal static class $Program |
||||
{ |
||||
} |
||||
internal static class $AssemblyInfo |
||||
{ |
||||
} |
||||
} |
||||
namespace <StartupCode$ConsoleApplication1>.$.NETFramework,Version=v4.6.1 |
||||
{ |
||||
internal static class AssemblyAttributes |
||||
{ |
||||
} |
||||
} |
@ -0,0 +1,586 @@
@@ -0,0 +1,586 @@
|
||||
// C:\Users\Siegfried\Documents\Visual Studio 2017\Projects\ConsoleApp13\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe |
||||
|
||||
.assembly extern mscorlib |
||||
{ |
||||
.publickeytoken = ( |
||||
b7 7a 5c 56 19 34 e0 89 |
||||
) |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly extern FSharp.Core |
||||
{ |
||||
.publickeytoken = ( |
||||
b0 3f 5f 7f 11 d5 0a 3a |
||||
) |
||||
.ver 4:4:1:0 |
||||
} |
||||
.assembly ConsoleApplication1 |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, int32, int32) = ( |
||||
01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( |
||||
01 00 1c 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b |
||||
2c 56 65 72 73 69 6f 6e 3d 76 34 2e 36 2e 31 01 |
||||
00 54 0e 14 46 72 61 6d 65 77 6f 72 6b 44 69 73 |
||||
70 6c 61 79 4e 61 6d 65 14 2e 4e 45 54 20 46 72 |
||||
61 6d 65 77 6f 72 6b 20 34 2e 36 2e 31 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( |
||||
01 00 13 43 6f 6e 73 6f 6c 65 41 70 70 6c 69 63 |
||||
61 74 69 6f 6e 31 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( |
||||
01 00 13 43 6f 6e 73 6f 6c 65 41 70 70 6c 69 63 |
||||
61 74 69 6f 6e 31 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( |
||||
01 00 12 43 6f 70 79 72 69 67 68 74 20 c2 a9 20 |
||||
20 32 30 31 37 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyCultureAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( |
||||
01 00 24 65 30 36 37 34 66 66 35 2d 35 65 38 66 |
||||
2d 34 64 34 65 2d 61 38 38 66 2d 65 34 34 37 31 |
||||
39 32 34 35 34 63 37 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyVersionAttribute::.ctor(string) = ( |
||||
01 00 07 31 2e 30 2e 30 2e 30 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( |
||||
01 00 07 31 2e 30 2e 30 2e 30 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( |
||||
01 00 01 01 00 00 00 00 |
||||
) |
||||
.hash algorithm 0x00008004 // SHA1 |
||||
.ver 1:0:0:0 |
||||
} |
||||
|
||||
.module ConsoleApplication1.exe |
||||
// MVID: {59F64D20-6A1F-D4CE-A745-0383204DF659} |
||||
.corflags 0x00020003 // ILOnly, Required32Bit, Preferred32Bit |
||||
|
||||
|
||||
.class private auto ansi '<Module>' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <Module> |
||||
|
||||
.class public auto ansi abstract sealed Program |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( |
||||
01 00 07 00 00 00 00 00 |
||||
) |
||||
// Nested Types |
||||
.class nested assembly auto auto sealed specialname serializable beforefieldinit disposable@3 |
||||
extends [mscorlib]System.Object |
||||
implements [mscorlib]System.IDisposable |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( |
||||
01 00 06 00 00 00 00 00 |
||||
) |
||||
// Methods |
||||
.method public specialname rtspecialname |
||||
instance void .ctor () cil managed |
||||
{ |
||||
// Method begins at RVA 0x21c8 |
||||
// Code size 9 (0x9) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: callvirt instance void [mscorlib]System.Object::.ctor() |
||||
IL_0006: ldarg.0 |
||||
IL_0007: pop |
||||
IL_0008: ret |
||||
} // end of method disposable@3::.ctor |
||||
|
||||
.method private final hidebysig newslot virtual |
||||
instance void 'System-IDisposable-Dispose' () cil managed |
||||
{ |
||||
.override method instance void [mscorlib]System.IDisposable::Dispose() |
||||
// Method begins at RVA 0x21d4 |
||||
// Code size 1 (0x1) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ret |
||||
} // end of method disposable@3::'System-IDisposable-Dispose' |
||||
|
||||
} // end of class disposable@3 |
||||
|
||||
.class nested assembly auto auto sealed specialname serializable beforefieldinit getSeq@5 |
||||
extends class [FSharp.Core]Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1<int32> |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( |
||||
01 00 06 00 00 00 00 00 |
||||
) |
||||
// Fields |
||||
.field public int32 pc |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( |
||||
01 00 00 00 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.field public int32 current |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( |
||||
01 00 00 00 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
|
||||
// Methods |
||||
.method public specialname rtspecialname |
||||
instance void .ctor ( |
||||
int32 pc, |
||||
int32 current |
||||
) cil managed |
||||
{ |
||||
// Method begins at RVA 0x21d8 |
||||
// Code size 21 (0x15) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldarg.1 |
||||
IL_0002: stfld int32 Program/getSeq@5::pc |
||||
IL_0007: ldarg.0 |
||||
IL_0008: ldarg.2 |
||||
IL_0009: stfld int32 Program/getSeq@5::current |
||||
IL_000e: ldarg.0 |
||||
IL_000f: call instance void class [FSharp.Core]Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1<int32>::.ctor() |
||||
IL_0014: ret |
||||
} // end of method getSeq@5::.ctor |
||||
|
||||
.method public strict virtual |
||||
instance int32 GenerateNext ( |
||||
class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>& next |
||||
) cil managed |
||||
{ |
||||
// Method begins at RVA 0x21f0 |
||||
// Code size 66 (0x42) |
||||
.maxstack 6 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldfld int32 Program/getSeq@5::pc |
||||
IL_0006: ldc.i4.1 |
||||
IL_0007: sub |
||||
IL_0008: switch (IL_0017, IL_0019) |
||||
|
||||
IL_0015: br.s IL_0021 |
||||
|
||||
IL_0017: br.s IL_001b |
||||
|
||||
IL_0019: br.s IL_001e |
||||
|
||||
IL_001b: nop |
||||
IL_001c: br.s IL_0032 |
||||
|
||||
IL_001e: nop |
||||
IL_001f: br.s IL_0039 |
||||
|
||||
IL_0021: nop |
||||
IL_0022: ldarg.0 |
||||
IL_0023: ldc.i4.1 |
||||
IL_0024: stfld int32 Program/getSeq@5::pc |
||||
IL_0029: ldarg.0 |
||||
IL_002a: ldc.i4.1 |
||||
IL_002b: stfld int32 Program/getSeq@5::current |
||||
IL_0030: ldc.i4.1 |
||||
IL_0031: ret |
||||
|
||||
IL_0032: ldarg.0 |
||||
IL_0033: ldc.i4.2 |
||||
IL_0034: stfld int32 Program/getSeq@5::pc |
||||
|
||||
IL_0039: ldarg.0 |
||||
IL_003a: ldc.i4.0 |
||||
IL_003b: stfld int32 Program/getSeq@5::current |
||||
IL_0040: ldc.i4.0 |
||||
IL_0041: ret |
||||
} // end of method getSeq@5::GenerateNext |
||||
|
||||
.method public strict virtual |
||||
instance void Close () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2240 |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.2 |
||||
IL_0002: stfld int32 Program/getSeq@5::pc |
||||
IL_0007: ret |
||||
} // end of method getSeq@5::Close |
||||
|
||||
.method public strict virtual |
||||
instance bool get_CheckClose () cil managed |
||||
{ |
||||
// Method begins at RVA 0x224c |
||||
// Code size 45 (0x2d) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldfld int32 Program/getSeq@5::pc |
||||
IL_0006: switch (IL_0019, IL_001b, IL_001d) |
||||
|
||||
IL_0017: br.s IL_0028 |
||||
|
||||
IL_0019: br.s IL_001f |
||||
|
||||
IL_001b: br.s IL_0022 |
||||
|
||||
IL_001d: br.s IL_0025 |
||||
|
||||
IL_001f: nop |
||||
IL_0020: br.s IL_002b |
||||
|
||||
IL_0022: nop |
||||
IL_0023: br.s IL_0029 |
||||
|
||||
IL_0025: nop |
||||
IL_0026: br.s IL_002b |
||||
|
||||
IL_0028: nop |
||||
|
||||
IL_0029: ldc.i4.0 |
||||
IL_002a: ret |
||||
|
||||
IL_002b: ldc.i4.0 |
||||
IL_002c: ret |
||||
} // end of method getSeq@5::get_CheckClose |
||||
|
||||
.method public strict virtual |
||||
instance int32 get_LastGenerated () cil managed |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
// Method begins at RVA 0x227c |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldfld int32 Program/getSeq@5::current |
||||
IL_0006: ret |
||||
} // end of method getSeq@5::get_LastGenerated |
||||
|
||||
.method public strict virtual |
||||
instance class [mscorlib]System.Collections.Generic.IEnumerator`1<int32> GetFreshEnumerator () cil managed |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
// Method begins at RVA 0x2284 |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: newobj instance void Program/getSeq@5::.ctor(int32, int32) |
||||
IL_0007: ret |
||||
} // end of method getSeq@5::GetFreshEnumerator |
||||
|
||||
} // end of class getSeq@5 |
||||
|
||||
|
||||
// Methods |
||||
.method public static |
||||
class [mscorlib]System.IDisposable disposable () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2050 |
||||
// Code size 6 (0x6) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: newobj instance void Program/disposable@3::.ctor() |
||||
IL_0005: ret |
||||
} // end of method Program::disposable |
||||
|
||||
.method public static |
||||
class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> getSeq () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2058 |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: newobj instance void Program/getSeq@5::.ctor(int32, int32) |
||||
IL_0007: ret |
||||
} // end of method Program::getSeq |
||||
|
||||
.method public static |
||||
class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32> getList () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2064 |
||||
// Code size 12 (0xc) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.1 |
||||
IL_0001: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_Empty() |
||||
IL_0006: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::Cons(!0, class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0>) |
||||
IL_000b: ret |
||||
} // end of method Program::getList |
||||
|
||||
.method public static |
||||
int32[] getArray () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2074 |
||||
// Code size 15 (0xf) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.1 |
||||
IL_0001: newarr [mscorlib]System.Int32 |
||||
IL_0006: dup |
||||
IL_0007: ldc.i4.0 |
||||
IL_0008: ldc.i4.1 |
||||
IL_0009: stelem.any [mscorlib]System.Int32 |
||||
IL_000e: ret |
||||
} // end of method Program::getArray |
||||
|
||||
.method public static |
||||
int32 main ( |
||||
string[] argv |
||||
) cil managed |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.EntryPointAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
// Method begins at RVA 0x2084 |
||||
// Code size 270 (0x10e) |
||||
.maxstack 4 |
||||
.entrypoint |
||||
.locals init ( |
||||
[0] class [mscorlib]System.IDisposable, |
||||
[1] class [mscorlib]System.IDisposable, |
||||
[2] class [mscorlib]System.IDisposable, |
||||
[3] class [mscorlib]System.IDisposable, |
||||
[4] int32, |
||||
[5] class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>, |
||||
[6] class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>, |
||||
[7] class [FSharp.Core]Microsoft.FSharp.Core.Unit, |
||||
[8] int32, |
||||
[9] class [mscorlib]System.IDisposable, |
||||
[10] class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>, |
||||
[11] class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>, |
||||
[12] int32, |
||||
[13] int32[], |
||||
[14] int32, |
||||
[15] int32, |
||||
[16] class [mscorlib]System.IDisposable |
||||
) |
||||
|
||||
IL_0000: call class [mscorlib]System.IDisposable Program::disposable() |
||||
IL_0005: stloc.1 |
||||
.try |
||||
{ |
||||
IL_0006: ldstr "Hello 1" |
||||
IL_000b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0010: call class [mscorlib]System.IDisposable Program::disposable() |
||||
IL_0015: stloc.2 |
||||
IL_0016: leave.s IL_0032 |
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_0018: ldloc.1 |
||||
IL_0019: isinst [mscorlib]System.IDisposable |
||||
IL_001e: stloc.3 |
||||
IL_001f: ldloc.3 |
||||
IL_0020: brfalse.s IL_0024 |
||||
|
||||
IL_0022: br.s IL_0026 |
||||
|
||||
IL_0024: br.s IL_002f |
||||
|
||||
IL_0026: ldloc.3 |
||||
IL_0027: callvirt instance void [mscorlib]System.IDisposable::Dispose() |
||||
IL_002c: ldnull |
||||
IL_002d: pop |
||||
IL_002e: endfinally |
||||
|
||||
IL_002f: ldnull |
||||
IL_0030: pop |
||||
IL_0031: endfinally |
||||
} // end handler |
||||
|
||||
IL_0032: ldloc.2 |
||||
IL_0033: stloc.0 |
||||
.try |
||||
{ |
||||
IL_0034: call class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> Program::getSeq() |
||||
IL_0039: stloc.s 5 |
||||
IL_003b: ldloc.s 5 |
||||
IL_003d: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator() |
||||
IL_0042: stloc.s 6 |
||||
.try |
||||
{ |
||||
// loop start (head: IL_0044) |
||||
IL_0044: ldloc.s 6 |
||||
IL_0046: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext() |
||||
IL_004b: brfalse.s IL_0060 |
||||
|
||||
IL_004d: ldloc.s 6 |
||||
IL_004f: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current() |
||||
IL_0054: stloc.s 8 |
||||
IL_0056: ldloc.s 8 |
||||
IL_0058: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_005d: nop |
||||
IL_005e: br.s IL_0044 |
||||
// end loop |
||||
|
||||
IL_0060: ldnull |
||||
IL_0061: stloc.s 7 |
||||
IL_0063: leave.s IL_0083 |
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_0065: ldloc.s 6 |
||||
IL_0067: isinst [mscorlib]System.IDisposable |
||||
IL_006c: stloc.s 9 |
||||
IL_006e: ldloc.s 9 |
||||
IL_0070: brfalse.s IL_0074 |
||||
|
||||
IL_0072: br.s IL_0076 |
||||
|
||||
IL_0074: br.s IL_0080 |
||||
|
||||
IL_0076: ldloc.s 9 |
||||
IL_0078: callvirt instance void [mscorlib]System.IDisposable::Dispose() |
||||
IL_007d: ldnull |
||||
IL_007e: pop |
||||
IL_007f: endfinally |
||||
|
||||
IL_0080: ldnull |
||||
IL_0081: pop |
||||
IL_0082: endfinally |
||||
} // end handler |
||||
|
||||
IL_0083: ldloc.s 7 |
||||
IL_0085: pop |
||||
IL_0086: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32> Program::getList() |
||||
IL_008b: stloc.s 10 |
||||
IL_008d: ldloc.s 10 |
||||
IL_008f: call instance class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_TailOrNull() |
||||
IL_0094: stloc.s 11 |
||||
// loop start (head: IL_0096) |
||||
IL_0096: ldloc.s 11 |
||||
IL_0098: ldnull |
||||
IL_0099: cgt.un |
||||
IL_009b: brfalse.s IL_00bd |
||||
|
||||
IL_009d: ldloc.s 10 |
||||
IL_009f: call instance !0 class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_HeadOrDefault() |
||||
IL_00a4: stloc.s 12 |
||||
IL_00a6: ldloc.s 12 |
||||
IL_00a8: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00ad: ldloc.s 11 |
||||
IL_00af: stloc.s 10 |
||||
IL_00b1: ldloc.s 10 |
||||
IL_00b3: call instance class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_TailOrNull() |
||||
IL_00b8: stloc.s 11 |
||||
IL_00ba: nop |
||||
IL_00bb: br.s IL_0096 |
||||
// end loop |
||||
|
||||
IL_00bd: call int32[] Program::getArray() |
||||
IL_00c2: stloc.s 13 |
||||
IL_00c4: ldc.i4.0 |
||||
IL_00c5: stloc.s 14 |
||||
IL_00c7: br.s IL_00e1 |
||||
// loop start (head: IL_00e1) |
||||
IL_00c9: ldloc.s 13 |
||||
IL_00cb: ldloc.s 14 |
||||
IL_00cd: ldelem.any [mscorlib]System.Int32 |
||||
IL_00d2: stloc.s 15 |
||||
IL_00d4: ldloc.s 15 |
||||
IL_00d6: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00db: ldloc.s 14 |
||||
IL_00dd: ldc.i4.1 |
||||
IL_00de: add |
||||
IL_00df: stloc.s 14 |
||||
|
||||
IL_00e1: ldloc.s 14 |
||||
IL_00e3: ldloc.s 13 |
||||
IL_00e5: ldlen |
||||
IL_00e6: conv.i4 |
||||
IL_00e7: blt.s IL_00c9 |
||||
// end loop |
||||
|
||||
IL_00e9: ldc.i4.0 |
||||
IL_00ea: stloc.s 4 |
||||
IL_00ec: leave.s IL_010b |
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_00ee: ldloc.0 |
||||
IL_00ef: isinst [mscorlib]System.IDisposable |
||||
IL_00f4: stloc.s 16 |
||||
IL_00f6: ldloc.s 16 |
||||
IL_00f8: brfalse.s IL_00fc |
||||
|
||||
IL_00fa: br.s IL_00fe |
||||
|
||||
IL_00fc: br.s IL_0108 |
||||
|
||||
IL_00fe: ldloc.s 16 |
||||
IL_0100: callvirt instance void [mscorlib]System.IDisposable::Dispose() |
||||
IL_0105: ldnull |
||||
IL_0106: pop |
||||
IL_0107: endfinally |
||||
|
||||
IL_0108: ldnull |
||||
IL_0109: pop |
||||
IL_010a: endfinally |
||||
} // end handler |
||||
|
||||
IL_010b: ldloc.s 4 |
||||
IL_010d: ret |
||||
} // end of method Program::main |
||||
|
||||
} // end of class Program |
||||
|
||||
.class private auto ansi abstract sealed '<StartupCode$ConsoleApplication1>.$Program' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <StartupCode$ConsoleApplication1>.$Program |
||||
|
||||
.class private auto ansi abstract sealed '<StartupCode$ConsoleApplication1>.$AssemblyInfo' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <StartupCode$ConsoleApplication1>.$AssemblyInfo |
||||
|
||||
.class private auto ansi abstract sealed '<StartupCode$ConsoleApplication1>.$.NETFramework,Version=v4.6.1.AssemblyAttributes' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <StartupCode$ConsoleApplication1>.$.NETFramework,Version=v4.6.1.AssemblyAttributes |
||||
|
@ -0,0 +1,210 @@
@@ -0,0 +1,210 @@
|
||||
|
||||
// C:\Users\Siegfried\Documents\Visual Studio 2017\Projects\ConsoleApp13\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
|
||||
// ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Global type: <Module>
|
||||
// Entry point: Program.main
|
||||
// Architecture: AnyCPU (32-bit preferred)
|
||||
// Runtime: .NET 4.0
|
||||
|
||||
using Microsoft.FSharp.Collections; |
||||
using Microsoft.FSharp.Core; |
||||
using Microsoft.FSharp.Core.CompilerServices; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.Reflection; |
||||
using System.Runtime.CompilerServices; |
||||
using System.Runtime.InteropServices; |
||||
using System.Runtime.Versioning; |
||||
|
||||
[assembly: FSharpInterfaceDataVersion(2, 0, 0)] |
||||
[assembly: TargetFramework(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")] |
||||
[assembly: AssemblyTitle("ConsoleApplication1")] |
||||
[assembly: AssemblyDescription("")] |
||||
[assembly: AssemblyConfiguration("")] |
||||
[assembly: AssemblyCompany("")] |
||||
[assembly: AssemblyProduct("ConsoleApplication1")] |
||||
[assembly: AssemblyCopyright("Copyright © 2017")] |
||||
[assembly: AssemblyTrademark("")] |
||||
[assembly: AssemblyCulture("")] |
||||
[assembly: ComVisible(false)] |
||||
[assembly: Guid("e0674ff5-5e8f-4d4e-a88f-e447192454c7")] |
||||
[assembly: AssemblyVersion("1.0.0.0")] |
||||
[assembly: AssemblyFileVersion("1.0.0.0")] |
||||
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.None)] |
||||
[assembly: AssemblyVersion("1.0.0.0")] |
||||
[CompilationMapping(SourceConstructFlags.Module)] |
||||
public static class Program |
||||
{ |
||||
[Serializable] |
||||
[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] |
||||
[CompilationMapping(SourceConstructFlags.Closure)] |
||||
internal sealed class disposable@3 : IDisposable |
||||
{ |
||||
public disposable@3() |
||||
{ |
||||
((object)this)..ctor(); |
||||
} |
||||
|
||||
private void System-IDisposable-Dispose() |
||||
{ |
||||
} |
||||
|
||||
void IDisposable.Dispose() |
||||
{ |
||||
//ILSpy generated this explicit interface implementation from .override directive in System-IDisposable-Dispose
|
||||
this.System-IDisposable-Dispose(); |
||||
} |
||||
} |
||||
|
||||
[Serializable] |
||||
[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] |
||||
[CompilationMapping(SourceConstructFlags.Closure)] |
||||
internal sealed class getSeq@5 : GeneratedSequenceBase<int> |
||||
{ |
||||
[DebuggerBrowsable(DebuggerBrowsableState.Never)] |
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public int pc = pc; |
||||
|
||||
[DebuggerBrowsable(DebuggerBrowsableState.Never)] |
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public int current = current; |
||||
|
||||
public getSeq@5(int pc, int current) |
||||
{ |
||||
} |
||||
|
||||
public override int GenerateNext(ref IEnumerable<int> next) |
||||
{ |
||||
switch (this.pc) |
||||
{ |
||||
default: |
||||
this.pc = 1; |
||||
this.current = 1; |
||||
return 1; |
||||
case 1: |
||||
this.pc = 2; |
||||
break; |
||||
case 2: |
||||
break; |
||||
} |
||||
this.current = 0; |
||||
return 0; |
||||
} |
||||
|
||||
public override void Close() |
||||
{ |
||||
this.pc = 2; |
||||
} |
||||
|
||||
public override bool get_CheckClose() |
||||
{ |
||||
switch (this.pc) |
||||
{ |
||||
default: |
||||
return false; |
||||
case 0: |
||||
case 2: |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public override int get_LastGenerated() |
||||
{ |
||||
return this.current; |
||||
} |
||||
|
||||
[CompilerGenerated] |
||||
[DebuggerNonUserCode] |
||||
public override IEnumerator<int> GetFreshEnumerator() |
||||
{ |
||||
return new getSeq@5(0, 0); |
||||
} |
||||
} |
||||
|
||||
public static IDisposable disposable() |
||||
{ |
||||
return new disposable@3(); |
||||
} |
||||
|
||||
public static IEnumerable<int> getSeq() |
||||
{ |
||||
return new getSeq@5(0, 0); |
||||
} |
||||
|
||||
public static FSharpList<int> getList() |
||||
{ |
||||
return FSharpList<int>.Cons(1, FSharpList<int>.Empty); |
||||
} |
||||
|
||||
public static int[] getArray() |
||||
{ |
||||
return new int[1] |
||||
{ |
||||
1 |
||||
}; |
||||
} |
||||
|
||||
[EntryPoint] |
||||
public static int main(string[] argv) |
||||
{ |
||||
IDisposable disposable = default(IDisposable); |
||||
using (Program.disposable()) |
||||
{ |
||||
Console.WriteLine("Hello 1"); |
||||
disposable = Program.disposable(); |
||||
} |
||||
using (disposable) |
||||
{ |
||||
IEnumerable<int> seq = Program.getSeq(); |
||||
using (IEnumerator<int> enumerator = seq.GetEnumerator()) |
||||
{ |
||||
while (true) |
||||
{ |
||||
if (!enumerator.MoveNext()) |
||||
break; |
||||
Console.WriteLine(enumerator.Current); |
||||
} |
||||
} |
||||
FSharpList<int> fSharpList = FSharpList<int>.Cons(1, FSharpList<int>.Empty); |
||||
FSharpList<int> tailOrNull = fSharpList.TailOrNull; |
||||
while (true) |
||||
{ |
||||
if (tailOrNull == null) |
||||
break; |
||||
int j = fSharpList.HeadOrDefault; |
||||
Console.WriteLine(j); |
||||
fSharpList = tailOrNull; |
||||
tailOrNull = fSharpList.TailOrNull; |
||||
} |
||||
int[] array = new int[1] |
||||
{ |
||||
1 |
||||
}; |
||||
for (int j = 0; j < array.Length; j++) |
||||
{ |
||||
Console.WriteLine(array[j]); |
||||
} |
||||
return 0; |
||||
} |
||||
} |
||||
} |
||||
namespace <StartupCode$ConsoleApplication1> |
||||
{ |
||||
internal static class $Program |
||||
{ |
||||
} |
||||
internal static class $AssemblyInfo |
||||
{ |
||||
} |
||||
} |
||||
namespace <StartupCode$ConsoleApplication1>.$.NETFramework,Version=v4.6.1 |
||||
{ |
||||
internal static class AssemblyAttributes |
||||
{ |
||||
} |
||||
} |
@ -0,0 +1,561 @@
@@ -0,0 +1,561 @@
|
||||
// C:\Users\Siegfried\Documents\Visual Studio 2017\Projects\ConsoleApp13\ConsoleApplication1\bin\Release\ConsoleApplication1.exe |
||||
|
||||
.assembly extern mscorlib |
||||
{ |
||||
.publickeytoken = ( |
||||
b7 7a 5c 56 19 34 e0 89 |
||||
) |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly extern FSharp.Core |
||||
{ |
||||
.publickeytoken = ( |
||||
b0 3f 5f 7f 11 d5 0a 3a |
||||
) |
||||
.ver 4:4:1:0 |
||||
} |
||||
.assembly ConsoleApplication1 |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, int32, int32) = ( |
||||
01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( |
||||
01 00 1c 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b |
||||
2c 56 65 72 73 69 6f 6e 3d 76 34 2e 36 2e 31 01 |
||||
00 54 0e 14 46 72 61 6d 65 77 6f 72 6b 44 69 73 |
||||
70 6c 61 79 4e 61 6d 65 14 2e 4e 45 54 20 46 72 |
||||
61 6d 65 77 6f 72 6b 20 34 2e 36 2e 31 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( |
||||
01 00 13 43 6f 6e 73 6f 6c 65 41 70 70 6c 69 63 |
||||
61 74 69 6f 6e 31 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( |
||||
01 00 13 43 6f 6e 73 6f 6c 65 41 70 70 6c 69 63 |
||||
61 74 69 6f 6e 31 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( |
||||
01 00 12 43 6f 70 79 72 69 67 68 74 20 c2 a9 20 |
||||
20 32 30 31 37 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyCultureAttribute::.ctor(string) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( |
||||
01 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( |
||||
01 00 24 65 30 36 37 34 66 66 35 2d 35 65 38 66 |
||||
2d 34 64 34 65 2d 61 38 38 66 2d 65 34 34 37 31 |
||||
39 32 34 35 34 63 37 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyVersionAttribute::.ctor(string) = ( |
||||
01 00 07 31 2e 30 2e 30 2e 30 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( |
||||
01 00 07 31 2e 30 2e 30 2e 30 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( |
||||
01 00 00 00 00 00 00 00 |
||||
) |
||||
.hash algorithm 0x00008004 // SHA1 |
||||
.ver 1:0:0:0 |
||||
} |
||||
|
||||
.module ConsoleApplication1.exe |
||||
// MVID: {59F64D28-6A1F-D4CE-A745-0383284DF659} |
||||
.corflags 0x00020003 // ILOnly, Required32Bit, Preferred32Bit |
||||
|
||||
|
||||
.class private auto ansi '<Module>' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <Module> |
||||
|
||||
.class public auto ansi abstract sealed Program |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( |
||||
01 00 07 00 00 00 00 00 |
||||
) |
||||
// Nested Types |
||||
.class nested assembly auto auto sealed specialname serializable beforefieldinit disposable@3 |
||||
extends [mscorlib]System.Object |
||||
implements [mscorlib]System.IDisposable |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( |
||||
01 00 06 00 00 00 00 00 |
||||
) |
||||
// Methods |
||||
.method public specialname rtspecialname |
||||
instance void .ctor () cil managed |
||||
{ |
||||
// Method begins at RVA 0x21bc |
||||
// Code size 9 (0x9) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: callvirt instance void [mscorlib]System.Object::.ctor() |
||||
IL_0006: ldarg.0 |
||||
IL_0007: pop |
||||
IL_0008: ret |
||||
} // end of method disposable@3::.ctor |
||||
|
||||
.method private final hidebysig newslot virtual |
||||
instance void 'System-IDisposable-Dispose' () cil managed |
||||
{ |
||||
.override method instance void [mscorlib]System.IDisposable::Dispose() |
||||
// Method begins at RVA 0x21c8 |
||||
// Code size 1 (0x1) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ret |
||||
} // end of method disposable@3::'System-IDisposable-Dispose' |
||||
|
||||
} // end of class disposable@3 |
||||
|
||||
.class nested assembly auto auto sealed specialname serializable beforefieldinit getSeq@5 |
||||
extends class [FSharp.Core]Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1<int32> |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( |
||||
01 00 06 00 00 00 00 00 |
||||
) |
||||
// Fields |
||||
.field public int32 pc |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( |
||||
01 00 00 00 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.field public int32 current |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( |
||||
01 00 00 00 00 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
|
||||
// Methods |
||||
.method public specialname rtspecialname |
||||
instance void .ctor ( |
||||
int32 pc, |
||||
int32 current |
||||
) cil managed |
||||
{ |
||||
// Method begins at RVA 0x21cc |
||||
// Code size 21 (0x15) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldarg.1 |
||||
IL_0002: stfld int32 Program/getSeq@5::pc |
||||
IL_0007: ldarg.0 |
||||
IL_0008: ldarg.2 |
||||
IL_0009: stfld int32 Program/getSeq@5::current |
||||
IL_000e: ldarg.0 |
||||
IL_000f: call instance void class [FSharp.Core]Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1<int32>::.ctor() |
||||
IL_0014: ret |
||||
} // end of method getSeq@5::.ctor |
||||
|
||||
.method public strict virtual |
||||
instance int32 GenerateNext ( |
||||
class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>& next |
||||
) cil managed |
||||
{ |
||||
// Method begins at RVA 0x21e4 |
||||
// Code size 62 (0x3e) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldfld int32 Program/getSeq@5::pc |
||||
IL_0006: ldc.i4.1 |
||||
IL_0007: sub |
||||
IL_0008: switch (IL_0018, IL_001b) |
||||
|
||||
IL_0015: nop |
||||
IL_0016: br.s IL_001e |
||||
|
||||
IL_0018: nop |
||||
IL_0019: br.s IL_002e |
||||
|
||||
IL_001b: nop |
||||
IL_001c: br.s IL_0035 |
||||
|
||||
IL_001e: ldarg.0 |
||||
IL_001f: ldc.i4.1 |
||||
IL_0020: stfld int32 Program/getSeq@5::pc |
||||
IL_0025: ldarg.0 |
||||
IL_0026: ldc.i4.1 |
||||
IL_0027: stfld int32 Program/getSeq@5::current |
||||
IL_002c: ldc.i4.1 |
||||
IL_002d: ret |
||||
|
||||
IL_002e: ldarg.0 |
||||
IL_002f: ldc.i4.2 |
||||
IL_0030: stfld int32 Program/getSeq@5::pc |
||||
|
||||
IL_0035: ldarg.0 |
||||
IL_0036: ldc.i4.0 |
||||
IL_0037: stfld int32 Program/getSeq@5::current |
||||
IL_003c: ldc.i4.0 |
||||
IL_003d: ret |
||||
} // end of method getSeq@5::GenerateNext |
||||
|
||||
.method public strict virtual |
||||
instance void Close () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2224 |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.2 |
||||
IL_0002: stfld int32 Program/getSeq@5::pc |
||||
IL_0007: ret |
||||
} // end of method getSeq@5::Close |
||||
|
||||
.method public strict virtual |
||||
instance bool get_CheckClose () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2230 |
||||
// Code size 39 (0x27) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldfld int32 Program/getSeq@5::pc |
||||
IL_0006: switch (IL_001a, IL_001d, IL_0020) |
||||
|
||||
IL_0017: nop |
||||
IL_0018: br.s IL_0023 |
||||
|
||||
IL_001a: nop |
||||
IL_001b: br.s IL_0025 |
||||
|
||||
IL_001d: nop |
||||
IL_001e: br.s IL_0023 |
||||
|
||||
IL_0020: nop |
||||
IL_0021: br.s IL_0025 |
||||
|
||||
IL_0023: ldc.i4.0 |
||||
IL_0024: ret |
||||
|
||||
IL_0025: ldc.i4.0 |
||||
IL_0026: ret |
||||
} // end of method getSeq@5::get_CheckClose |
||||
|
||||
.method public strict virtual |
||||
instance int32 get_LastGenerated () cil managed |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
// Method begins at RVA 0x2258 |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldfld int32 Program/getSeq@5::current |
||||
IL_0006: ret |
||||
} // end of method getSeq@5::get_LastGenerated |
||||
|
||||
.method public strict virtual |
||||
instance class [mscorlib]System.Collections.Generic.IEnumerator`1<int32> GetFreshEnumerator () cil managed |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
// Method begins at RVA 0x2260 |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: newobj instance void Program/getSeq@5::.ctor(int32, int32) |
||||
IL_0007: ret |
||||
} // end of method getSeq@5::GetFreshEnumerator |
||||
|
||||
} // end of class getSeq@5 |
||||
|
||||
|
||||
// Methods |
||||
.method public static |
||||
class [mscorlib]System.IDisposable disposable () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2050 |
||||
// Code size 6 (0x6) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: newobj instance void Program/disposable@3::.ctor() |
||||
IL_0005: ret |
||||
} // end of method Program::disposable |
||||
|
||||
.method public static |
||||
class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> getSeq () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2058 |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: newobj instance void Program/getSeq@5::.ctor(int32, int32) |
||||
IL_0007: ret |
||||
} // end of method Program::getSeq |
||||
|
||||
.method public static |
||||
class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32> getList () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2064 |
||||
// Code size 12 (0xc) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.1 |
||||
IL_0001: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_Empty() |
||||
IL_0006: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::Cons(!0, class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0>) |
||||
IL_000b: ret |
||||
} // end of method Program::getList |
||||
|
||||
.method public static |
||||
int32[] getArray () cil managed |
||||
{ |
||||
// Method begins at RVA 0x2074 |
||||
// Code size 15 (0xf) |
||||
.maxstack 8 |
||||
|
||||
IL_0000: ldc.i4.1 |
||||
IL_0001: newarr [mscorlib]System.Int32 |
||||
IL_0006: dup |
||||
IL_0007: ldc.i4.0 |
||||
IL_0008: ldc.i4.1 |
||||
IL_0009: stelem.any [mscorlib]System.Int32 |
||||
IL_000e: ret |
||||
} // end of method Program::getArray |
||||
|
||||
.method public static |
||||
int32 main ( |
||||
string[] argv |
||||
) cil managed |
||||
{ |
||||
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.EntryPointAttribute::.ctor() = ( |
||||
01 00 00 00 |
||||
) |
||||
// Method begins at RVA 0x2084 |
||||
// Code size 259 (0x103) |
||||
.maxstack 6 |
||||
.entrypoint |
||||
.locals init ( |
||||
[0] class [mscorlib]System.IDisposable, |
||||
[1] class [mscorlib]System.IDisposable, |
||||
[2] class [mscorlib]System.IDisposable, |
||||
[3] class [mscorlib]System.IDisposable, |
||||
[4] int32, |
||||
[5] class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>, |
||||
[6] class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>, |
||||
[7] class [FSharp.Core]Microsoft.FSharp.Core.Unit, |
||||
[8] class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>, |
||||
[9] class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>, |
||||
[10] int32, |
||||
[11] int32[] |
||||
) |
||||
|
||||
IL_0000: call class [mscorlib]System.IDisposable Program::disposable() |
||||
IL_0005: stloc.1 |
||||
.try |
||||
{ |
||||
IL_0006: ldstr "Hello 1" |
||||
IL_000b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0010: call class [mscorlib]System.IDisposable Program::disposable() |
||||
IL_0015: stloc.2 |
||||
IL_0016: leave.s IL_002e |
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_0018: ldloc.1 |
||||
IL_0019: isinst [mscorlib]System.IDisposable |
||||
IL_001e: stloc.3 |
||||
IL_001f: ldloc.3 |
||||
IL_0020: brfalse.s IL_002b |
||||
|
||||
IL_0022: ldloc.3 |
||||
IL_0023: callvirt instance void [mscorlib]System.IDisposable::Dispose() |
||||
IL_0028: ldnull |
||||
IL_0029: pop |
||||
IL_002a: endfinally |
||||
|
||||
IL_002b: ldnull |
||||
IL_002c: pop |
||||
IL_002d: endfinally |
||||
} // end handler |
||||
|
||||
IL_002e: ldloc.2 |
||||
IL_002f: stloc.0 |
||||
.try |
||||
{ |
||||
IL_0030: call class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> Program::getSeq() |
||||
IL_0035: stloc.s 5 |
||||
IL_0037: ldloc.s 5 |
||||
IL_0039: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator() |
||||
IL_003e: stloc.s 6 |
||||
.try |
||||
{ |
||||
// loop start (head: IL_0040) |
||||
IL_0040: ldloc.s 6 |
||||
IL_0042: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext() |
||||
IL_0047: brfalse.s IL_0058 |
||||
|
||||
IL_0049: ldloc.s 6 |
||||
IL_004b: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current() |
||||
IL_0050: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0055: nop |
||||
IL_0056: br.s IL_0040 |
||||
// end loop |
||||
|
||||
IL_0058: ldnull |
||||
IL_0059: stloc.s 7 |
||||
IL_005b: leave.s IL_0074 |
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_005d: ldloc.s 6 |
||||
IL_005f: isinst [mscorlib]System.IDisposable |
||||
IL_0064: stloc.1 |
||||
IL_0065: ldloc.1 |
||||
IL_0066: brfalse.s IL_0071 |
||||
|
||||
IL_0068: ldloc.1 |
||||
IL_0069: callvirt instance void [mscorlib]System.IDisposable::Dispose() |
||||
IL_006e: ldnull |
||||
IL_006f: pop |
||||
IL_0070: endfinally |
||||
|
||||
IL_0071: ldnull |
||||
IL_0072: pop |
||||
IL_0073: endfinally |
||||
} // end handler |
||||
|
||||
IL_0074: ldloc.s 7 |
||||
IL_0076: pop |
||||
IL_0077: ldc.i4.1 |
||||
IL_0078: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_Empty() |
||||
IL_007d: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::Cons(!0, class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0>) |
||||
IL_0082: stloc.s 8 |
||||
IL_0084: ldloc.s 8 |
||||
IL_0086: call instance class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_TailOrNull() |
||||
IL_008b: stloc.s 9 |
||||
// loop start (head: IL_008d) |
||||
IL_008d: ldloc.s 9 |
||||
IL_008f: ldnull |
||||
IL_0090: cgt.un |
||||
IL_0092: brfalse.s IL_00b4 |
||||
|
||||
IL_0094: ldloc.s 8 |
||||
IL_0096: call instance !0 class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_HeadOrDefault() |
||||
IL_009b: stloc.s 10 |
||||
IL_009d: ldloc.s 10 |
||||
IL_009f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00a4: ldloc.s 9 |
||||
IL_00a6: stloc.s 8 |
||||
IL_00a8: ldloc.s 8 |
||||
IL_00aa: call instance class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<!0> class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<int32>::get_TailOrNull() |
||||
IL_00af: stloc.s 9 |
||||
IL_00b1: nop |
||||
IL_00b2: br.s IL_008d |
||||
// end loop |
||||
|
||||
IL_00b4: ldc.i4.1 |
||||
IL_00b5: newarr [mscorlib]System.Int32 |
||||
IL_00ba: dup |
||||
IL_00bb: ldc.i4.0 |
||||
IL_00bc: ldc.i4.1 |
||||
IL_00bd: stelem.any [mscorlib]System.Int32 |
||||
IL_00c2: stloc.s 11 |
||||
IL_00c4: ldc.i4.0 |
||||
IL_00c5: stloc.s 10 |
||||
IL_00c7: br.s IL_00dd |
||||
// loop start (head: IL_00dd) |
||||
IL_00c9: ldloc.s 11 |
||||
IL_00cb: ldloc.s 10 |
||||
IL_00cd: ldelem.any [mscorlib]System.Int32 |
||||
IL_00d2: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00d7: ldloc.s 10 |
||||
IL_00d9: ldc.i4.1 |
||||
IL_00da: add |
||||
IL_00db: stloc.s 10 |
||||
|
||||
IL_00dd: ldloc.s 10 |
||||
IL_00df: ldloc.s 11 |
||||
IL_00e1: ldlen |
||||
IL_00e2: conv.i4 |
||||
IL_00e3: blt.s IL_00c9 |
||||
// end loop |
||||
|
||||
IL_00e5: ldc.i4.0 |
||||
IL_00e6: stloc.s 4 |
||||
IL_00e8: leave.s IL_0100 |
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_00ea: ldloc.0 |
||||
IL_00eb: isinst [mscorlib]System.IDisposable |
||||
IL_00f0: stloc.1 |
||||
IL_00f1: ldloc.1 |
||||
IL_00f2: brfalse.s IL_00fd |
||||
|
||||
IL_00f4: ldloc.1 |
||||
IL_00f5: callvirt instance void [mscorlib]System.IDisposable::Dispose() |
||||
IL_00fa: ldnull |
||||
IL_00fb: pop |
||||
IL_00fc: endfinally |
||||
|
||||
IL_00fd: ldnull |
||||
IL_00fe: pop |
||||
IL_00ff: endfinally |
||||
} // end handler |
||||
|
||||
IL_0100: ldloc.s 4 |
||||
IL_0102: ret |
||||
} // end of method Program::main |
||||
|
||||
} // end of class Program |
||||
|
||||
.class private auto ansi abstract sealed '<StartupCode$ConsoleApplication1>.$Program' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <StartupCode$ConsoleApplication1>.$Program |
||||
|
||||
.class private auto ansi abstract sealed '<StartupCode$ConsoleApplication1>.$AssemblyInfo' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <StartupCode$ConsoleApplication1>.$AssemblyInfo |
||||
|
||||
.class private auto ansi abstract sealed '<StartupCode$ConsoleApplication1>.$.NETFramework,Version=v4.6.1.AssemblyAttributes' |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
} // end of class <StartupCode$ConsoleApplication1>.$.NETFramework,Version=v4.6.1.AssemblyAttributes |
||||
|
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
public static class FSharpUsingPatterns |
||||
{ |
||||
public static void sample1() |
||||
{ |
||||
using (FileStream fileStream = File.Create("x.txt")) { |
||||
fileStream.WriteByte((byte)1); |
||||
} |
||||
} |
||||
|
||||
public static void sample2() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fileStream = File.Create("x.txt")) { |
||||
fileStream.WriteByte((byte)2); |
||||
Console.WriteLine("some text"); |
||||
} |
||||
} |
||||
|
||||
public static void sample3() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fileStream = File.Create("x.txt")) { |
||||
fileStream.WriteByte((byte)3); |
||||
} |
||||
Console.WriteLine("some text"); |
||||
} |
||||
|
||||
public static void sample4() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num = default(int); |
||||
using (FileStream fileStream = File.OpenRead("x.txt")) { |
||||
num = fileStream.ReadByte(); |
||||
} |
||||
int num2 = num; |
||||
Console.WriteLine("read:" + num2.ToString()); |
||||
} |
||||
|
||||
public static void sample5() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num = default(int); |
||||
using (FileStream fileStream = File.OpenRead("x.txt")) { |
||||
num = fileStream.ReadByte(); |
||||
} |
||||
int num2 = num; |
||||
int num3 = default(int); |
||||
using (FileStream fileStream = File.OpenRead("x.txt")) { |
||||
fileStream.ReadByte(); |
||||
num3 = fileStream.ReadByte(); |
||||
} |
||||
int num4 = num3; |
||||
Console.WriteLine("read: {0}, {1}", num2, num4); |
||||
} |
||||
} |
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
public static class FSharpUsingPatterns |
||||
{ |
||||
public static void sample1() |
||||
{ |
||||
using (FileStream fileStream = File.Create("x.txt")) { |
||||
fileStream.WriteByte(1); |
||||
} |
||||
} |
||||
|
||||
public static void sample2() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fileStream = File.Create("x.txt")) { |
||||
fileStream.WriteByte(2); |
||||
Console.WriteLine("some text"); |
||||
} |
||||
} |
||||
|
||||
public static void sample3() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
using (FileStream fileStream = File.Create("x.txt")) { |
||||
fileStream.WriteByte(3); |
||||
} |
||||
Console.WriteLine("some text"); |
||||
} |
||||
|
||||
public static void sample4() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num = default(int); |
||||
using (FileStream fileStream = File.OpenRead("x.txt")) { |
||||
num = fileStream.ReadByte(); |
||||
} |
||||
int num2 = num; |
||||
Console.WriteLine("read:" + num2.ToString()); |
||||
} |
||||
|
||||
public static void sample5() |
||||
{ |
||||
Console.WriteLine("some text"); |
||||
int num = default(int); |
||||
using (FileStream fileStream = File.OpenRead("x.txt")) { |
||||
num = fileStream.ReadByte(); |
||||
} |
||||
int num2 = num; |
||||
int num3 = default(int); |
||||
using (FileStream fileStream = File.OpenRead("x.txt")) { |
||||
fileStream.ReadByte(); |
||||
num3 = fileStream.ReadByte(); |
||||
} |
||||
num = num3; |
||||
Console.WriteLine("read: {0}, {1}", num2, num); |
||||
} |
||||
} |
@ -1,3 +1,4 @@
@@ -1,3 +1,4 @@
|
||||
/*.res |
||||
/*.dll |
||||
/*.exe |
||||
/*.pdb |
||||
|
@ -0,0 +1,288 @@
@@ -0,0 +1,288 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
// software and associated documentation files (the "Software"), to deal in the Software
|
||||
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or
|
||||
// substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
||||
{ |
||||
public class UnsafeCode |
||||
{ |
||||
public struct SimpleStruct |
||||
{ |
||||
public int X; |
||||
public double Y; |
||||
} |
||||
|
||||
public struct StructWithFixedSizeMembers |
||||
{ |
||||
public unsafe fixed int Integers[100]; |
||||
public int NormalMember; |
||||
public unsafe fixed double Doubles[200]; |
||||
|
||||
[Obsolete("another attribute")] |
||||
public unsafe fixed byte Old[1]; |
||||
} |
||||
|
||||
public unsafe int* NullPointer { |
||||
get { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public unsafe int SizeOf() |
||||
{ |
||||
return sizeof(SimpleStruct); |
||||
} |
||||
|
||||
private static void UseBool(bool b) |
||||
{ |
||||
} |
||||
|
||||
public unsafe void PointerComparison(int* a, double* b) |
||||
{ |
||||
UnsafeCode.UseBool(a == b); |
||||
UnsafeCode.UseBool(a != b); |
||||
UnsafeCode.UseBool(a < b); |
||||
UnsafeCode.UseBool(a > b); |
||||
UnsafeCode.UseBool(a <= b); |
||||
UnsafeCode.UseBool(a >= b); |
||||
} |
||||
|
||||
public unsafe void PointerComparisonWithNull(int* a) |
||||
{ |
||||
UnsafeCode.UseBool(a == null); |
||||
UnsafeCode.UseBool(a != null); |
||||
} |
||||
|
||||
public unsafe int* PointerCast(long* p) |
||||
{ |
||||
return (int*)p; |
||||
} |
||||
|
||||
public unsafe long ConvertDoubleToLong(double d) |
||||
{ |
||||
return *(long*)(&d); |
||||
} |
||||
|
||||
public unsafe double ConvertLongToDouble(long d) |
||||
{ |
||||
return *(double*)(&d); |
||||
} |
||||
|
||||
public unsafe int ConvertFloatToInt(float d) |
||||
{ |
||||
return *(int*)(&d); |
||||
} |
||||
|
||||
public unsafe float ConvertIntToFloat(int d) |
||||
{ |
||||
return *(float*)(&d); |
||||
} |
||||
|
||||
public unsafe int PointerCasts() |
||||
{ |
||||
int result = 0; |
||||
*(float*)(&result) = 0.5f; |
||||
((byte*)(&result))[3] = 3; |
||||
return result; |
||||
} |
||||
|
||||
public unsafe void PassRefParameterAsPointer(ref int p) |
||||
{ |
||||
fixed (int* p2 = &p) { |
||||
this.PassPointerAsRefParameter(p2); |
||||
} |
||||
} |
||||
|
||||
public unsafe void PassPointerAsRefParameter(int* p) |
||||
{ |
||||
this.PassRefParameterAsPointer(ref *p); |
||||
} |
||||
|
||||
public unsafe void AddressInMultiDimensionalArray(double[,] matrix) |
||||
{ |
||||
fixed (double* d = &matrix[1, 2]) { |
||||
this.PointerReferenceExpression(d); |
||||
this.PointerReferenceExpression(d); |
||||
} |
||||
} |
||||
|
||||
public unsafe void FixedStringAccess(string text) |
||||
{ |
||||
fixed (char* ptr = text) { |
||||
char* ptr2 = ptr; |
||||
while (*ptr2 == 'a') { |
||||
*ptr2 = 'A'; |
||||
ptr2++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public unsafe void PutDoubleIntoLongArray1(long[] array, int index, double val) |
||||
{ |
||||
fixed (long* ptr = array) { |
||||
*(double*)(ptr + index) = val; |
||||
} |
||||
} |
||||
|
||||
public unsafe void PutDoubleIntoLongArray2(long[] array, int index, double val) |
||||
{ |
||||
fixed (long* ptr = &array[index]) { |
||||
*(double*)ptr = val; |
||||
} |
||||
} |
||||
|
||||
public unsafe string PointerReferenceExpression(double* d) |
||||
{ |
||||
return d->ToString(); |
||||
} |
||||
|
||||
public unsafe string PointerReferenceExpression2(long addr) |
||||
{ |
||||
return ((int*)addr)->ToString(); |
||||
} |
||||
|
||||
public unsafe int* PointerArithmetic(int* p) |
||||
{ |
||||
return p + 2; |
||||
} |
||||
|
||||
public unsafe long* PointerArithmetic2(long* p) |
||||
{ |
||||
return 3 + p; |
||||
} |
||||
|
||||
public unsafe long* PointerArithmetic3(long* p) |
||||
{ |
||||
return (long*)((byte*)p + 3); |
||||
} |
||||
|
||||
public unsafe long* PointerArithmetic4(void* p) |
||||
{ |
||||
return (long*)((byte*)p + 3); |
||||
} |
||||
|
||||
public unsafe int PointerArithmetic5(void* p, byte* q, int i) |
||||
{ |
||||
return q[i] + *(byte*)p; |
||||
} |
||||
|
||||
public unsafe int PointerArithmetic6(SimpleStruct* p, int i) |
||||
{ |
||||
return p[i].X; |
||||
} |
||||
|
||||
public unsafe int* PointerArithmeticLong1(int* p, long offset) |
||||
{ |
||||
return p + offset; |
||||
} |
||||
|
||||
public unsafe int* PointerArithmeticLong2(int* p, long offset) |
||||
{ |
||||
return offset + p; |
||||
} |
||||
|
||||
public unsafe int* PointerArithmeticLong3(int* p, long offset) |
||||
{ |
||||
return p - offset; |
||||
} |
||||
|
||||
public unsafe SimpleStruct* PointerArithmeticLong1s(SimpleStruct* p, long offset) |
||||
{ |
||||
return p + offset; |
||||
} |
||||
|
||||
public unsafe SimpleStruct* PointerArithmeticLong2s(SimpleStruct* p, long offset) |
||||
{ |
||||
return offset + p; |
||||
} |
||||
|
||||
public unsafe SimpleStruct* PointerArithmeticLong3s(SimpleStruct* p, long offset) |
||||
{ |
||||
return p - offset; |
||||
} |
||||
|
||||
public unsafe int PointerSubtraction(long* p, long* q) |
||||
{ |
||||
return (int)(p - q); |
||||
} |
||||
|
||||
public unsafe long PointerSubtractionLong(long* p, long* q) |
||||
{ |
||||
return p - q; |
||||
} |
||||
|
||||
public unsafe int PointerSubtraction2(long* p, short* q) |
||||
{ |
||||
return (int)((byte*)p - (byte*)q); |
||||
} |
||||
|
||||
public unsafe int PointerSubtraction3(void* p, void* q) |
||||
{ |
||||
return (int)((byte*)p - (byte*)q); |
||||
} |
||||
|
||||
public unsafe long PointerSubtraction4(sbyte* p, sbyte* q) |
||||
{ |
||||
return p - q; |
||||
} |
||||
|
||||
public unsafe long PointerSubtraction5(SimpleStruct* p, SimpleStruct* q) |
||||
{ |
||||
return p - q; |
||||
} |
||||
|
||||
public unsafe double FixedMemberAccess(StructWithFixedSizeMembers* m, int i) |
||||
{ |
||||
return (double)m->Integers[i] + m->Doubles[i]; |
||||
} |
||||
|
||||
public unsafe double* FixedMemberBasePointer(StructWithFixedSizeMembers* m) |
||||
{ |
||||
return m->Doubles; |
||||
} |
||||
|
||||
public unsafe string UsePointer(double* ptr) |
||||
{ |
||||
return ptr->ToString(); |
||||
} |
||||
|
||||
public unsafe string StackAlloc(int count) |
||||
{ |
||||
char* ptr = stackalloc char[count]; |
||||
char* ptr2 = stackalloc char[100]; |
||||
for (int i = 0; i < count; i++) { |
||||
ptr[i] = (char)i; |
||||
ptr2[i] = '\0'; |
||||
} |
||||
return this.UsePointer((double*)ptr); |
||||
} |
||||
|
||||
public unsafe string StackAllocStruct(int count) |
||||
{ |
||||
SimpleStruct* ptr = stackalloc SimpleStruct[checked(count * 2)]; |
||||
SimpleStruct* _ = stackalloc SimpleStruct[10]; |
||||
return this.UsePointer(&ptr->Y); |
||||
} |
||||
|
||||
unsafe ~UnsafeCode() |
||||
{ |
||||
this.PassPointerAsRefParameter(this.NullPointer); |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,904 @@
@@ -0,0 +1,904 @@
|
||||
|
||||
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 |
||||
// Copyright (c) Microsoft Corporation. All rights reserved. |
||||
|
||||
|
||||
|
||||
// Metadata version: v4.0.30319 |
||||
.assembly extern mscorlib |
||||
{ |
||||
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly zuwavv1x |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx |
||||
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. |
||||
.permissionset reqmin |
||||
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} |
||||
.hash algorithm 0x00008004 |
||||
.ver 0:0:0:0 |
||||
} |
||||
.module zuwavv1x.dll |
||||
// MVID: {4CC9FC6C-21CA-408A-ABC9-544A07D1E512} |
||||
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.imagebase 0x10000000 |
||||
.file alignment 0x00000200 |
||||
.stackreserve 0x00100000 |
||||
.subsystem 0x0003 // WINDOWS_CUI |
||||
.corflags 0x00000001 // ILONLY |
||||
// Image base: 0x01600000 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class public auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.class sequential ansi sealed nested public beforefieldinit SimpleStruct |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.field public int32 X |
||||
.field public float64 Y |
||||
} // end of class SimpleStruct |
||||
|
||||
.class sequential ansi sealed nested public beforefieldinit StructWithFixedSizeMembers |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.class sequential ansi sealed nested public beforefieldinit '<Integers>e__FixedBuffer0' |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.pack 0 |
||||
.size 400 |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.field public int32 FixedElementField |
||||
} // end of class '<Integers>e__FixedBuffer0' |
||||
|
||||
.class sequential ansi sealed nested public beforefieldinit '<Doubles>e__FixedBuffer1' |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.pack 0 |
||||
.size 1600 |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.field public float64 FixedElementField |
||||
} // end of class '<Doubles>e__FixedBuffer1' |
||||
|
||||
.class sequential ansi sealed nested public beforefieldinit '<Old>e__FixedBuffer2' |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.pack 0 |
||||
.size 1 |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.field public uint8 FixedElementField |
||||
} // end of class '<Old>e__FixedBuffer2' |
||||
|
||||
.field public valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Integers>e__FixedBuffer0' Integers |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class [mscorlib]System.Type, |
||||
int32) = ( 01 00 59 53 79 73 74 65 6D 2E 49 6E 74 33 32 2C // ..YSystem.Int32, |
||||
20 6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 69 // mscorlib, Versi |
||||
6F 6E 3D 34 2E 30 2E 30 2E 30 2C 20 43 75 6C 74 // on=4.0.0.0, Cult |
||||
75 72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 62 // ure=neutral, Pub |
||||
6C 69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 61 // licKeyToken=b77a |
||||
35 63 35 36 31 39 33 34 65 30 38 39 64 00 00 00 // 5c561934e089d... |
||||
00 00 ) |
||||
.field public int32 NormalMember |
||||
.field public valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer1' Doubles |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class [mscorlib]System.Type, |
||||
int32) = ( 01 00 5A 53 79 73 74 65 6D 2E 44 6F 75 62 6C 65 // ..ZSystem.Double |
||||
2C 20 6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 // , mscorlib, Vers |
||||
69 6F 6E 3D 34 2E 30 2E 30 2E 30 2C 20 43 75 6C // ion=4.0.0.0, Cul |
||||
74 75 72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 // ture=neutral, Pu |
||||
62 6C 69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 // blicKeyToken=b77 |
||||
61 35 63 35 36 31 39 33 34 65 30 38 39 C8 00 00 // a5c561934e089... |
||||
00 00 00 ) |
||||
.field public valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Old>e__FixedBuffer2' Old |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class [mscorlib]System.Type, |
||||
int32) = ( 01 00 58 53 79 73 74 65 6D 2E 42 79 74 65 2C 20 // ..XSystem.Byte, |
||||
6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 69 6F // mscorlib, Versio |
||||
6E 3D 34 2E 30 2E 30 2E 30 2C 20 43 75 6C 74 75 // n=4.0.0.0, Cultu |
||||
72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 62 6C // re=neutral, Publ |
||||
69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 61 35 // icKeyToken=b77a5 |
||||
63 35 36 31 39 33 34 65 30 38 39 01 00 00 00 00 // c561934e089..... |
||||
00 ) |
||||
.custom instance void [mscorlib]System.ObsoleteAttribute::.ctor(string) = ( 01 00 11 61 6E 6F 74 68 65 72 20 61 74 74 72 69 // ...another attri |
||||
62 75 74 65 00 00 ) // bute.. |
||||
} // end of class StructWithFixedSizeMembers |
||||
|
||||
.method public hidebysig specialname instance int32* |
||||
get_NullPointer() cil managed |
||||
{ |
||||
// Code size 3 (0x3) |
||||
.maxstack 8 |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: conv.u |
||||
IL_0002: ret |
||||
} // end of method UnsafeCode::get_NullPointer |
||||
|
||||
.method public hidebysig instance int32 |
||||
SizeOf() cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::SizeOf |
||||
|
||||
.method private hidebysig static void UseBool(bool b) cil managed |
||||
{ |
||||
// Code size 1 (0x1) |
||||
.maxstack 8 |
||||
IL_0000: ret |
||||
} // end of method UnsafeCode::UseBool |
||||
|
||||
.method public hidebysig instance void |
||||
PointerComparison(int32* a, |
||||
float64* b) cil managed |
||||
{ |
||||
// Code size 64 (0x40) |
||||
.maxstack 2 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ceq |
||||
IL_0004: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0009: ldarg.1 |
||||
IL_000a: ldarg.2 |
||||
IL_000b: ceq |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: ceq |
||||
IL_0010: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0015: ldarg.1 |
||||
IL_0016: ldarg.2 |
||||
IL_0017: clt.un |
||||
IL_0019: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_001e: ldarg.1 |
||||
IL_001f: ldarg.2 |
||||
IL_0020: cgt.un |
||||
IL_0022: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0027: ldarg.1 |
||||
IL_0028: ldarg.2 |
||||
IL_0029: cgt.un |
||||
IL_002b: ldc.i4.0 |
||||
IL_002c: ceq |
||||
IL_002e: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0033: ldarg.1 |
||||
IL_0034: ldarg.2 |
||||
IL_0035: clt.un |
||||
IL_0037: ldc.i4.0 |
||||
IL_0038: ceq |
||||
IL_003a: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_003f: ret |
||||
} // end of method UnsafeCode::PointerComparison |
||||
|
||||
.method public hidebysig instance void |
||||
PointerComparisonWithNull(int32* a) cil managed |
||||
{ |
||||
// Code size 24 (0x18) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: conv.u |
||||
IL_0003: ceq |
||||
IL_0005: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_000a: ldarg.1 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: conv.u |
||||
IL_000d: ceq |
||||
IL_000f: ldc.i4.0 |
||||
IL_0010: ceq |
||||
IL_0012: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0017: ret |
||||
} // end of method UnsafeCode::PointerComparisonWithNull |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerCast(int64* p) cil managed |
||||
{ |
||||
// Code size 2 (0x2) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ret |
||||
} // end of method UnsafeCode::PointerCast |
||||
|
||||
.method public hidebysig instance int64 |
||||
ConvertDoubleToLong(float64 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.i8 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertDoubleToLong |
||||
|
||||
.method public hidebysig instance float64 |
||||
ConvertLongToDouble(int64 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.r8 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertLongToDouble |
||||
|
||||
.method public hidebysig instance int32 |
||||
ConvertFloatToInt(float32 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.i4 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertFloatToInt |
||||
|
||||
.method public hidebysig instance float32 |
||||
ConvertIntToFloat(int32 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.r4 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertIntToFloat |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerCasts() cil managed |
||||
{ |
||||
// Code size 21 (0x15) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: ldloca.s V_0 |
||||
IL_0004: conv.u |
||||
IL_0005: ldc.r4 0.5 |
||||
IL_000a: stind.r4 |
||||
IL_000b: ldloca.s V_0 |
||||
IL_000d: conv.u |
||||
IL_000e: ldc.i4.3 |
||||
IL_000f: conv.i |
||||
IL_0010: add |
||||
IL_0011: ldc.i4.3 |
||||
IL_0012: stind.i1 |
||||
IL_0013: ldloc.0 |
||||
IL_0014: ret |
||||
} // end of method UnsafeCode::PointerCasts |
||||
|
||||
.method public hidebysig instance void |
||||
PassRefParameterAsPointer(int32& p) cil managed |
||||
{ |
||||
// Code size 14 (0xe) |
||||
.maxstack 2 |
||||
.locals init (int32& pinned V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: stloc.0 |
||||
IL_0002: ldarg.0 |
||||
IL_0003: ldloc.0 |
||||
IL_0004: conv.i |
||||
IL_0005: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PassPointerAsRefParameter(int32*) |
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: conv.u |
||||
IL_000c: stloc.0 |
||||
IL_000d: ret |
||||
} // end of method UnsafeCode::PassRefParameterAsPointer |
||||
|
||||
.method public hidebysig instance void |
||||
PassPointerAsRefParameter(int32* p) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldarg.1 |
||||
IL_0002: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PassRefParameterAsPointer(int32&) |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PassPointerAsRefParameter |
||||
|
||||
.method public hidebysig instance void |
||||
AddressInMultiDimensionalArray(float64[0...,0...] matrix) cil managed |
||||
{ |
||||
// Code size 31 (0x1f) |
||||
.maxstack 3 |
||||
.locals init (float64& pinned V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.1 |
||||
IL_0002: ldc.i4.2 |
||||
IL_0003: call instance float64& float64[0...,0...]::Address(int32, |
||||
int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldarg.0 |
||||
IL_000a: ldloc.0 |
||||
IL_000b: conv.i |
||||
IL_000c: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PointerReferenceExpression(float64*) |
||||
IL_0011: pop |
||||
IL_0012: ldarg.0 |
||||
IL_0013: ldloc.0 |
||||
IL_0014: conv.i |
||||
IL_0015: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PointerReferenceExpression(float64*) |
||||
IL_001a: pop |
||||
IL_001b: ldc.i4.0 |
||||
IL_001c: conv.u |
||||
IL_001d: stloc.0 |
||||
IL_001e: ret |
||||
} // end of method UnsafeCode::AddressInMultiDimensionalArray |
||||
|
||||
.method public hidebysig instance void |
||||
FixedStringAccess(string text) cil managed |
||||
{ |
||||
// Code size 36 (0x24) |
||||
.maxstack 2 |
||||
.locals init (char* V_0, |
||||
char* V_1, |
||||
string pinned V_2) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: stloc.2 |
||||
IL_0002: ldloc.2 |
||||
IL_0003: conv.i |
||||
IL_0004: dup |
||||
IL_0005: brfalse.s IL_000d |
||||
|
||||
IL_0007: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() |
||||
IL_000c: add |
||||
IL_000d: stloc.0 |
||||
IL_000e: ldloc.0 |
||||
IL_000f: stloc.1 |
||||
IL_0010: br.s IL_001b |
||||
|
||||
IL_0012: ldloc.1 |
||||
IL_0013: ldc.i4.s 65 |
||||
IL_0015: stind.i2 |
||||
IL_0016: ldloc.1 |
||||
IL_0017: ldc.i4.2 |
||||
IL_0018: conv.i |
||||
IL_0019: add |
||||
IL_001a: stloc.1 |
||||
IL_001b: ldloc.1 |
||||
IL_001c: ldind.u2 |
||||
IL_001d: ldc.i4.s 97 |
||||
IL_001f: beq.s IL_0012 |
||||
|
||||
IL_0021: ldnull |
||||
IL_0022: stloc.2 |
||||
IL_0023: ret |
||||
} // end of method UnsafeCode::FixedStringAccess |
||||
|
||||
.method public hidebysig instance void |
||||
PutDoubleIntoLongArray1(int64[] 'array', |
||||
int32 index, |
||||
float64 val) cil managed |
||||
{ |
||||
// Code size 36 (0x24) |
||||
.maxstack 3 |
||||
.locals init (int64& pinned V_0, |
||||
int64[] V_1) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: dup |
||||
IL_0002: stloc.1 |
||||
IL_0003: brfalse.s IL_000a |
||||
|
||||
IL_0005: ldloc.1 |
||||
IL_0006: ldlen |
||||
IL_0007: conv.i4 |
||||
IL_0008: brtrue.s IL_000f |
||||
|
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: conv.u |
||||
IL_000c: stloc.0 |
||||
IL_000d: br.s IL_0017 |
||||
|
||||
IL_000f: ldloc.1 |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: ldelema [mscorlib]System.Int64 |
||||
IL_0016: stloc.0 |
||||
IL_0017: ldloc.0 |
||||
IL_0018: conv.i |
||||
IL_0019: ldarg.2 |
||||
IL_001a: conv.i |
||||
IL_001b: ldc.i4.8 |
||||
IL_001c: mul |
||||
IL_001d: add |
||||
IL_001e: ldarg.3 |
||||
IL_001f: stind.r8 |
||||
IL_0020: ldc.i4.0 |
||||
IL_0021: conv.u |
||||
IL_0022: stloc.0 |
||||
IL_0023: ret |
||||
} // end of method UnsafeCode::PutDoubleIntoLongArray1 |
||||
|
||||
.method public hidebysig instance void |
||||
PutDoubleIntoLongArray2(int64[] 'array', |
||||
int32 index, |
||||
float64 val) cil managed |
||||
{ |
||||
// Code size 16 (0x10) |
||||
.maxstack 2 |
||||
.locals init (int64& pinned V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ldelema [mscorlib]System.Int64 |
||||
IL_0007: stloc.0 |
||||
IL_0008: ldloc.0 |
||||
IL_0009: conv.i |
||||
IL_000a: ldarg.3 |
||||
IL_000b: stind.r8 |
||||
IL_000c: ldc.i4.0 |
||||
IL_000d: conv.u |
||||
IL_000e: stloc.0 |
||||
IL_000f: ret |
||||
} // end of method UnsafeCode::PutDoubleIntoLongArray2 |
||||
|
||||
.method public hidebysig instance string |
||||
PointerReferenceExpression(float64* d) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: call instance string [mscorlib]System.Double::ToString() |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerReferenceExpression |
||||
|
||||
.method public hidebysig instance string |
||||
PointerReferenceExpression2(int64 addr) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: conv.u |
||||
IL_0002: call instance string [mscorlib]System.Int32::ToString() |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerReferenceExpression2 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmetic(int32* p) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.8 |
||||
IL_0002: conv.i |
||||
IL_0003: add |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::PointerArithmetic |
||||
|
||||
.method public hidebysig instance int64* |
||||
PointerArithmetic2(int64* p) cil managed |
||||
{ |
||||
// Code size 6 (0x6) |
||||
.maxstack 8 |
||||
IL_0000: ldc.i4.s 24 |
||||
IL_0002: conv.i |
||||
IL_0003: ldarg.1 |
||||
IL_0004: add |
||||
IL_0005: ret |
||||
} // end of method UnsafeCode::PointerArithmetic2 |
||||
|
||||
.method public hidebysig instance int64* |
||||
PointerArithmetic3(int64* p) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.3 |
||||
IL_0002: conv.i |
||||
IL_0003: add |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::PointerArithmetic3 |
||||
|
||||
.method public hidebysig instance int64* |
||||
PointerArithmetic4(void* p) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.3 |
||||
IL_0002: conv.i |
||||
IL_0003: add |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::PointerArithmetic4 |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerArithmetic5(void* p, |
||||
uint8* q, |
||||
int32 i) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.2 |
||||
IL_0001: ldarg.3 |
||||
IL_0002: add |
||||
IL_0003: ldind.u1 |
||||
IL_0004: ldarg.1 |
||||
IL_0005: ldind.u1 |
||||
IL_0006: add |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmetic5 |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerArithmetic6(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int32 i) cil managed |
||||
{ |
||||
// Code size 17 (0x11) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: conv.i |
||||
IL_0003: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0009: mul |
||||
IL_000a: add |
||||
IL_000b: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct::X |
||||
IL_0010: ret |
||||
} // end of method UnsafeCode::PointerArithmetic6 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmeticLong1(int32* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ldc.i4.4 |
||||
IL_0003: conv.i8 |
||||
IL_0004: mul |
||||
IL_0005: conv.i |
||||
IL_0006: add |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong1 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmeticLong2(int32* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.2 |
||||
IL_0001: ldc.i4.4 |
||||
IL_0002: conv.i8 |
||||
IL_0003: mul |
||||
IL_0004: conv.i |
||||
IL_0005: ldarg.1 |
||||
IL_0006: add |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong2 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmeticLong3(int32* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ldc.i4.4 |
||||
IL_0003: conv.i8 |
||||
IL_0004: mul |
||||
IL_0005: conv.i |
||||
IL_0006: sub |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong3 |
||||
|
||||
.method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* |
||||
PointerArithmeticLong1s(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0008: conv.i8 |
||||
IL_0009: mul |
||||
IL_000a: conv.i |
||||
IL_000b: add |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong1s |
||||
|
||||
.method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* |
||||
PointerArithmeticLong2s(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.2 |
||||
IL_0001: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0007: conv.i8 |
||||
IL_0008: mul |
||||
IL_0009: conv.i |
||||
IL_000a: ldarg.1 |
||||
IL_000b: add |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong2s |
||||
|
||||
.method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* |
||||
PointerArithmeticLong3s(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0008: conv.i8 |
||||
IL_0009: mul |
||||
IL_000a: conv.i |
||||
IL_000b: sub |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong3s |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerSubtraction(int64* p, |
||||
int64* q) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.8 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: conv.i4 |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerSubtraction |
||||
|
||||
.method public hidebysig instance int64 |
||||
PointerSubtractionLong(int64* p, |
||||
int64* q) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.8 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerSubtractionLong |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerSubtraction2(int64* p, |
||||
int16* q) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.1 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: conv.i4 |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerSubtraction2 |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerSubtraction3(void* p, |
||||
void* q) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.1 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: conv.i4 |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerSubtraction3 |
||||
|
||||
.method public hidebysig instance int64 |
||||
PointerSubtraction4(int8* p, |
||||
int8* q) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.1 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerSubtraction4 |
||||
|
||||
.method public hidebysig instance int64 |
||||
PointerSubtraction5(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* q) cil managed |
||||
{ |
||||
// Code size 12 (0xc) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0009: div |
||||
IL_000a: conv.i8 |
||||
IL_000b: ret |
||||
} // end of method UnsafeCode::PointerSubtraction5 |
||||
|
||||
.method public hidebysig instance float64 |
||||
FixedMemberAccess(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers* m, |
||||
int32 i) cil managed |
||||
{ |
||||
// Code size 39 (0x27) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldflda valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Integers>e__FixedBuffer0' ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers::Integers |
||||
IL_0006: ldflda int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Integers>e__FixedBuffer0'::FixedElementField |
||||
IL_000b: conv.u |
||||
IL_000c: ldarg.2 |
||||
IL_000d: conv.i |
||||
IL_000e: ldc.i4.4 |
||||
IL_000f: mul |
||||
IL_0010: add |
||||
IL_0011: ldind.i4 |
||||
IL_0012: conv.r8 |
||||
IL_0013: ldarg.1 |
||||
IL_0014: ldflda valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer1' ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers::Doubles |
||||
IL_0019: ldflda float64 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer1'::FixedElementField |
||||
IL_001e: conv.u |
||||
IL_001f: ldarg.2 |
||||
IL_0020: conv.i |
||||
IL_0021: ldc.i4.8 |
||||
IL_0022: mul |
||||
IL_0023: add |
||||
IL_0024: ldind.r8 |
||||
IL_0025: add |
||||
IL_0026: ret |
||||
} // end of method UnsafeCode::FixedMemberAccess |
||||
|
||||
.method public hidebysig instance float64* |
||||
FixedMemberBasePointer(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers* m) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldflda valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer1' ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers::Doubles |
||||
IL_0006: ldflda float64 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer1'::FixedElementField |
||||
IL_000b: conv.u |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::FixedMemberBasePointer |
||||
|
||||
.method public hidebysig instance string |
||||
UsePointer(float64* ptr) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: call instance string [mscorlib]System.Double::ToString() |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::UsePointer |
||||
|
||||
.method public hidebysig instance string |
||||
StackAlloc(int32 count) cil managed |
||||
{ |
||||
// Code size 52 (0x34) |
||||
.maxstack 3 |
||||
.locals init (char* V_0, |
||||
char* V_1, |
||||
int32 V_2) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: conv.u |
||||
IL_0002: ldc.i4.2 |
||||
IL_0003: mul.ovf.un |
||||
IL_0004: localloc |
||||
IL_0006: stloc.0 |
||||
IL_0007: ldc.i4.s 100 |
||||
IL_0009: conv.u |
||||
IL_000a: ldc.i4.2 |
||||
IL_000b: mul.ovf.un |
||||
IL_000c: localloc |
||||
IL_000e: stloc.1 |
||||
IL_000f: ldc.i4.0 |
||||
IL_0010: stloc.2 |
||||
IL_0011: br.s IL_0028 |
||||
|
||||
IL_0013: ldloc.0 |
||||
IL_0014: ldloc.2 |
||||
IL_0015: conv.i |
||||
IL_0016: ldc.i4.2 |
||||
IL_0017: mul |
||||
IL_0018: add |
||||
IL_0019: ldloc.2 |
||||
IL_001a: conv.u2 |
||||
IL_001b: stind.i2 |
||||
IL_001c: ldloc.1 |
||||
IL_001d: ldloc.2 |
||||
IL_001e: conv.i |
||||
IL_001f: ldc.i4.2 |
||||
IL_0020: mul |
||||
IL_0021: add |
||||
IL_0022: ldc.i4.0 |
||||
IL_0023: stind.i2 |
||||
IL_0024: ldloc.2 |
||||
IL_0025: ldc.i4.1 |
||||
IL_0026: add |
||||
IL_0027: stloc.2 |
||||
IL_0028: ldloc.2 |
||||
IL_0029: ldarg.1 |
||||
IL_002a: blt.s IL_0013 |
||||
|
||||
IL_002c: ldarg.0 |
||||
IL_002d: ldloc.0 |
||||
IL_002e: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UsePointer(float64*) |
||||
IL_0033: ret |
||||
} // end of method UnsafeCode::StackAlloc |
||||
|
||||
.method public hidebysig instance string |
||||
StackAllocStruct(int32 count) cil managed |
||||
{ |
||||
// Code size 41 (0x29) |
||||
.maxstack 2 |
||||
.locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.2 |
||||
IL_0002: mul.ovf |
||||
IL_0003: conv.u |
||||
IL_0004: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_000a: mul.ovf.un |
||||
IL_000b: localloc |
||||
IL_000d: stloc.0 |
||||
IL_000e: ldc.i4.s 10 |
||||
IL_0010: conv.u |
||||
IL_0011: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0017: mul.ovf.un |
||||
IL_0018: localloc |
||||
IL_001a: pop |
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldloc.0 |
||||
IL_001d: ldflda float64 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct::Y |
||||
IL_0022: conv.u |
||||
IL_0023: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UsePointer(float64*) |
||||
IL_0028: ret |
||||
} // end of method UnsafeCode::StackAllocStruct |
||||
|
||||
.method family hidebysig virtual instance void |
||||
Finalize() cil managed |
||||
{ |
||||
// Code size 22 (0x16) |
||||
.maxstack 2 |
||||
.try |
||||
{ |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldarg.0 |
||||
IL_0002: call instance int32* ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::get_NullPointer() |
||||
IL_0007: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PassPointerAsRefParameter(int32*) |
||||
IL_000c: leave.s IL_0015 |
||||
|
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_000e: ldarg.0 |
||||
IL_000f: call instance void [mscorlib]System.Object::Finalize() |
||||
IL_0014: endfinally |
||||
} // end handler |
||||
IL_0015: ret |
||||
} // end of method UnsafeCode::Finalize |
||||
|
||||
.method public hidebysig specialname rtspecialname |
||||
instance void .ctor() cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: call instance void [mscorlib]System.Object::.ctor() |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::.ctor |
||||
|
||||
.property instance int32* NullPointer() |
||||
{ |
||||
.get instance int32* ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::get_NullPointer() |
||||
} // end of property UnsafeCode::NullPointer |
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
||||
// WARNING: Created Win32 resource file ../../../TestCases/Pretty\UnsafeCode.opt.res |
@ -0,0 +1,910 @@
@@ -0,0 +1,910 @@
|
||||
|
||||
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 |
||||
// Copyright (c) Microsoft Corporation. All rights reserved. |
||||
|
||||
|
||||
|
||||
// Metadata version: v4.0.30319 |
||||
.assembly extern mscorlib |
||||
{ |
||||
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly UnsafeCode |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx |
||||
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. |
||||
|
||||
// --- The following custom attribute is added automatically, do not uncomment ------- |
||||
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) |
||||
|
||||
.permissionset reqmin |
||||
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} |
||||
.hash algorithm 0x00008004 |
||||
.ver 0:0:0:0 |
||||
} |
||||
.module UnsafeCode.dll |
||||
// MVID: {958D637E-F39D-447B-A248-B73AECEC847A} |
||||
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.imagebase 0x10000000 |
||||
.file alignment 0x00000200 |
||||
.stackreserve 0x00100000 |
||||
.subsystem 0x0003 // WINDOWS_CUI |
||||
.corflags 0x00000001 // ILONLY |
||||
// Image base: 0x007C0000 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class public auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.class sequential ansi sealed nested public beforefieldinit SimpleStruct |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.field public int32 X |
||||
.field public float64 Y |
||||
} // end of class SimpleStruct |
||||
|
||||
.class sequential ansi sealed nested public beforefieldinit StructWithFixedSizeMembers |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.class sequential ansi sealed nested public beforefieldinit '<Integers>e__FixedBuffer' |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.pack 0 |
||||
.size 400 |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.field public int32 FixedElementField |
||||
} // end of class '<Integers>e__FixedBuffer' |
||||
|
||||
.class sequential ansi sealed nested public beforefieldinit '<Doubles>e__FixedBuffer' |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.pack 0 |
||||
.size 1600 |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.field public float64 FixedElementField |
||||
} // end of class '<Doubles>e__FixedBuffer' |
||||
|
||||
.class sequential ansi sealed nested public beforefieldinit '<Old>e__FixedBuffer' |
||||
extends [mscorlib]System.ValueType |
||||
{ |
||||
.pack 0 |
||||
.size 1 |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.field public uint8 FixedElementField |
||||
} // end of class '<Old>e__FixedBuffer' |
||||
|
||||
.field public valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Integers>e__FixedBuffer' Integers |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class [mscorlib]System.Type, |
||||
int32) = ( 01 00 59 53 79 73 74 65 6D 2E 49 6E 74 33 32 2C // ..YSystem.Int32, |
||||
20 6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 69 // mscorlib, Versi |
||||
6F 6E 3D 34 2E 30 2E 30 2E 30 2C 20 43 75 6C 74 // on=4.0.0.0, Cult |
||||
75 72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 62 // ure=neutral, Pub |
||||
6C 69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 61 // licKeyToken=b77a |
||||
35 63 35 36 31 39 33 34 65 30 38 39 64 00 00 00 // 5c561934e089d... |
||||
00 00 ) |
||||
.field public int32 NormalMember |
||||
.field public valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer' Doubles |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class [mscorlib]System.Type, |
||||
int32) = ( 01 00 5A 53 79 73 74 65 6D 2E 44 6F 75 62 6C 65 // ..ZSystem.Double |
||||
2C 20 6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 // , mscorlib, Vers |
||||
69 6F 6E 3D 34 2E 30 2E 30 2E 30 2C 20 43 75 6C // ion=4.0.0.0, Cul |
||||
74 75 72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 // ture=neutral, Pu |
||||
62 6C 69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 // blicKeyToken=b77 |
||||
61 35 63 35 36 31 39 33 34 65 30 38 39 C8 00 00 // a5c561934e089... |
||||
00 00 00 ) |
||||
.field public valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Old>e__FixedBuffer' Old |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class [mscorlib]System.Type, |
||||
int32) = ( 01 00 58 53 79 73 74 65 6D 2E 42 79 74 65 2C 20 // ..XSystem.Byte, |
||||
6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 69 6F // mscorlib, Versio |
||||
6E 3D 34 2E 30 2E 30 2E 30 2C 20 43 75 6C 74 75 // n=4.0.0.0, Cultu |
||||
72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 62 6C // re=neutral, Publ |
||||
69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 61 35 // icKeyToken=b77a5 |
||||
63 35 36 31 39 33 34 65 30 38 39 01 00 00 00 00 // c561934e089..... |
||||
00 ) |
||||
.custom instance void [mscorlib]System.ObsoleteAttribute::.ctor(string) = ( 01 00 11 61 6E 6F 74 68 65 72 20 61 74 74 72 69 // ...another attri |
||||
62 75 74 65 00 00 ) // bute.. |
||||
} // end of class StructWithFixedSizeMembers |
||||
|
||||
.method public hidebysig specialname instance int32* |
||||
get_NullPointer() cil managed |
||||
{ |
||||
// Code size 3 (0x3) |
||||
.maxstack 8 |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: conv.u |
||||
IL_0002: ret |
||||
} // end of method UnsafeCode::get_NullPointer |
||||
|
||||
.method public hidebysig instance int32 |
||||
SizeOf() cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::SizeOf |
||||
|
||||
.method private hidebysig static void UseBool(bool b) cil managed |
||||
{ |
||||
// Code size 1 (0x1) |
||||
.maxstack 8 |
||||
IL_0000: ret |
||||
} // end of method UnsafeCode::UseBool |
||||
|
||||
.method public hidebysig instance void |
||||
PointerComparison(int32* a, |
||||
float64* b) cil managed |
||||
{ |
||||
// Code size 64 (0x40) |
||||
.maxstack 2 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ceq |
||||
IL_0004: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0009: ldarg.1 |
||||
IL_000a: ldarg.2 |
||||
IL_000b: ceq |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: ceq |
||||
IL_0010: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0015: ldarg.1 |
||||
IL_0016: ldarg.2 |
||||
IL_0017: clt.un |
||||
IL_0019: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_001e: ldarg.1 |
||||
IL_001f: ldarg.2 |
||||
IL_0020: cgt.un |
||||
IL_0022: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0027: ldarg.1 |
||||
IL_0028: ldarg.2 |
||||
IL_0029: cgt.un |
||||
IL_002b: ldc.i4.0 |
||||
IL_002c: ceq |
||||
IL_002e: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0033: ldarg.1 |
||||
IL_0034: ldarg.2 |
||||
IL_0035: clt.un |
||||
IL_0037: ldc.i4.0 |
||||
IL_0038: ceq |
||||
IL_003a: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_003f: ret |
||||
} // end of method UnsafeCode::PointerComparison |
||||
|
||||
.method public hidebysig instance void |
||||
PointerComparisonWithNull(int32* a) cil managed |
||||
{ |
||||
// Code size 24 (0x18) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: conv.u |
||||
IL_0003: ceq |
||||
IL_0005: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_000a: ldarg.1 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: conv.u |
||||
IL_000d: ceq |
||||
IL_000f: ldc.i4.0 |
||||
IL_0010: ceq |
||||
IL_0012: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UseBool(bool) |
||||
IL_0017: ret |
||||
} // end of method UnsafeCode::PointerComparisonWithNull |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerCast(int64* p) cil managed |
||||
{ |
||||
// Code size 2 (0x2) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ret |
||||
} // end of method UnsafeCode::PointerCast |
||||
|
||||
.method public hidebysig instance int64 |
||||
ConvertDoubleToLong(float64 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.i8 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertDoubleToLong |
||||
|
||||
.method public hidebysig instance float64 |
||||
ConvertLongToDouble(int64 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.r8 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertLongToDouble |
||||
|
||||
.method public hidebysig instance int32 |
||||
ConvertFloatToInt(float32 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.i4 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertFloatToInt |
||||
|
||||
.method public hidebysig instance float32 |
||||
ConvertIntToFloat(int32 d) cil managed |
||||
{ |
||||
// Code size 5 (0x5) |
||||
.maxstack 8 |
||||
IL_0000: ldarga.s d |
||||
IL_0002: conv.u |
||||
IL_0003: ldind.r4 |
||||
IL_0004: ret |
||||
} // end of method UnsafeCode::ConvertIntToFloat |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerCasts() cil managed |
||||
{ |
||||
// Code size 20 (0x14) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: ldloca.s V_0 |
||||
IL_0004: conv.u |
||||
IL_0005: ldc.r4 0.5 |
||||
IL_000a: stind.r4 |
||||
IL_000b: ldloca.s V_0 |
||||
IL_000d: conv.u |
||||
IL_000e: ldc.i4.3 |
||||
IL_000f: add |
||||
IL_0010: ldc.i4.3 |
||||
IL_0011: stind.i1 |
||||
IL_0012: ldloc.0 |
||||
IL_0013: ret |
||||
} // end of method UnsafeCode::PointerCasts |
||||
|
||||
.method public hidebysig instance void |
||||
PassRefParameterAsPointer(int32& p) cil managed |
||||
{ |
||||
// Code size 14 (0xe) |
||||
.maxstack 2 |
||||
.locals init (int32& pinned V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: stloc.0 |
||||
IL_0002: ldarg.0 |
||||
IL_0003: ldloc.0 |
||||
IL_0004: conv.i |
||||
IL_0005: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PassPointerAsRefParameter(int32*) |
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: conv.u |
||||
IL_000c: stloc.0 |
||||
IL_000d: ret |
||||
} // end of method UnsafeCode::PassRefParameterAsPointer |
||||
|
||||
.method public hidebysig instance void |
||||
PassPointerAsRefParameter(int32* p) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldarg.1 |
||||
IL_0002: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PassRefParameterAsPointer(int32&) |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PassPointerAsRefParameter |
||||
|
||||
.method public hidebysig instance void |
||||
AddressInMultiDimensionalArray(float64[0...,0...] matrix) cil managed |
||||
{ |
||||
// Code size 31 (0x1f) |
||||
.maxstack 3 |
||||
.locals init (float64& pinned V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.1 |
||||
IL_0002: ldc.i4.2 |
||||
IL_0003: call instance float64& float64[0...,0...]::Address(int32, |
||||
int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldarg.0 |
||||
IL_000a: ldloc.0 |
||||
IL_000b: conv.i |
||||
IL_000c: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PointerReferenceExpression(float64*) |
||||
IL_0011: pop |
||||
IL_0012: ldarg.0 |
||||
IL_0013: ldloc.0 |
||||
IL_0014: conv.i |
||||
IL_0015: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PointerReferenceExpression(float64*) |
||||
IL_001a: pop |
||||
IL_001b: ldc.i4.0 |
||||
IL_001c: conv.u |
||||
IL_001d: stloc.0 |
||||
IL_001e: ret |
||||
} // end of method UnsafeCode::AddressInMultiDimensionalArray |
||||
|
||||
.method public hidebysig instance void |
||||
FixedStringAccess(string text) cil managed |
||||
{ |
||||
// Code size 37 (0x25) |
||||
.maxstack 2 |
||||
.locals init (char* V_0, |
||||
string pinned V_1, |
||||
char* V_2) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: stloc.1 |
||||
IL_0002: ldloc.1 |
||||
IL_0003: conv.i |
||||
IL_0004: stloc.0 |
||||
IL_0005: ldloc.0 |
||||
IL_0006: brfalse.s IL_0010 |
||||
|
||||
IL_0008: ldloc.0 |
||||
IL_0009: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() |
||||
IL_000e: add |
||||
IL_000f: stloc.0 |
||||
IL_0010: ldloc.0 |
||||
IL_0011: stloc.2 |
||||
IL_0012: br.s IL_001c |
||||
|
||||
IL_0014: ldloc.2 |
||||
IL_0015: ldc.i4.s 65 |
||||
IL_0017: stind.i2 |
||||
IL_0018: ldloc.2 |
||||
IL_0019: ldc.i4.2 |
||||
IL_001a: add |
||||
IL_001b: stloc.2 |
||||
IL_001c: ldloc.2 |
||||
IL_001d: ldind.u2 |
||||
IL_001e: ldc.i4.s 97 |
||||
IL_0020: beq.s IL_0014 |
||||
|
||||
IL_0022: ldnull |
||||
IL_0023: stloc.1 |
||||
IL_0024: ret |
||||
} // end of method UnsafeCode::FixedStringAccess |
||||
|
||||
.method public hidebysig instance void |
||||
PutDoubleIntoLongArray1(int64[] 'array', |
||||
int32 index, |
||||
float64 val) cil managed |
||||
{ |
||||
// Code size 36 (0x24) |
||||
.maxstack 3 |
||||
.locals init (int64& pinned V_0, |
||||
int64[] V_1) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: dup |
||||
IL_0002: stloc.1 |
||||
IL_0003: brfalse.s IL_000a |
||||
|
||||
IL_0005: ldloc.1 |
||||
IL_0006: ldlen |
||||
IL_0007: conv.i4 |
||||
IL_0008: brtrue.s IL_000f |
||||
|
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: conv.u |
||||
IL_000c: stloc.0 |
||||
IL_000d: br.s IL_0017 |
||||
|
||||
IL_000f: ldloc.1 |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: ldelema [mscorlib]System.Int64 |
||||
IL_0016: stloc.0 |
||||
IL_0017: ldloc.0 |
||||
IL_0018: conv.i |
||||
IL_0019: ldarg.2 |
||||
IL_001a: conv.i |
||||
IL_001b: ldc.i4.8 |
||||
IL_001c: mul |
||||
IL_001d: add |
||||
IL_001e: ldarg.3 |
||||
IL_001f: stind.r8 |
||||
IL_0020: ldc.i4.0 |
||||
IL_0021: conv.u |
||||
IL_0022: stloc.0 |
||||
IL_0023: ret |
||||
} // end of method UnsafeCode::PutDoubleIntoLongArray1 |
||||
|
||||
.method public hidebysig instance void |
||||
PutDoubleIntoLongArray2(int64[] 'array', |
||||
int32 index, |
||||
float64 val) cil managed |
||||
{ |
||||
// Code size 16 (0x10) |
||||
.maxstack 2 |
||||
.locals init (int64& pinned V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ldelema [mscorlib]System.Int64 |
||||
IL_0007: stloc.0 |
||||
IL_0008: ldloc.0 |
||||
IL_0009: conv.i |
||||
IL_000a: ldarg.3 |
||||
IL_000b: stind.r8 |
||||
IL_000c: ldc.i4.0 |
||||
IL_000d: conv.u |
||||
IL_000e: stloc.0 |
||||
IL_000f: ret |
||||
} // end of method UnsafeCode::PutDoubleIntoLongArray2 |
||||
|
||||
.method public hidebysig instance string |
||||
PointerReferenceExpression(float64* d) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: call instance string [mscorlib]System.Double::ToString() |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerReferenceExpression |
||||
|
||||
.method public hidebysig instance string |
||||
PointerReferenceExpression2(int64 addr) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: conv.u |
||||
IL_0002: call instance string [mscorlib]System.Int32::ToString() |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerReferenceExpression2 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmetic(int32* p) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.2 |
||||
IL_0002: conv.i |
||||
IL_0003: ldc.i4.4 |
||||
IL_0004: mul |
||||
IL_0005: add |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerArithmetic |
||||
|
||||
.method public hidebysig instance int64* |
||||
PointerArithmetic2(int64* p) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldc.i4.3 |
||||
IL_0001: conv.i |
||||
IL_0002: ldc.i4.8 |
||||
IL_0003: mul |
||||
IL_0004: ldarg.1 |
||||
IL_0005: add |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerArithmetic2 |
||||
|
||||
.method public hidebysig instance int64* |
||||
PointerArithmetic3(int64* p) cil managed |
||||
{ |
||||
// Code size 4 (0x4) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.3 |
||||
IL_0002: add |
||||
IL_0003: ret |
||||
} // end of method UnsafeCode::PointerArithmetic3 |
||||
|
||||
.method public hidebysig instance int64* |
||||
PointerArithmetic4(void* p) cil managed |
||||
{ |
||||
// Code size 4 (0x4) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.3 |
||||
IL_0002: add |
||||
IL_0003: ret |
||||
} // end of method UnsafeCode::PointerArithmetic4 |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerArithmetic5(void* p, |
||||
uint8* q, |
||||
int32 i) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.2 |
||||
IL_0001: ldarg.3 |
||||
IL_0002: add |
||||
IL_0003: ldind.u1 |
||||
IL_0004: ldarg.1 |
||||
IL_0005: ldind.u1 |
||||
IL_0006: add |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmetic5 |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerArithmetic6(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int32 i) cil managed |
||||
{ |
||||
// Code size 17 (0x11) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: conv.i |
||||
IL_0003: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0009: mul |
||||
IL_000a: add |
||||
IL_000b: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct::X |
||||
IL_0010: ret |
||||
} // end of method UnsafeCode::PointerArithmetic6 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmeticLong1(int32* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ldc.i4.4 |
||||
IL_0003: conv.i8 |
||||
IL_0004: mul |
||||
IL_0005: conv.i |
||||
IL_0006: add |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong1 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmeticLong2(int32* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.2 |
||||
IL_0001: ldc.i4.4 |
||||
IL_0002: conv.i8 |
||||
IL_0003: mul |
||||
IL_0004: conv.i |
||||
IL_0005: ldarg.1 |
||||
IL_0006: add |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong2 |
||||
|
||||
.method public hidebysig instance int32* |
||||
PointerArithmeticLong3(int32* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: ldc.i4.4 |
||||
IL_0003: conv.i8 |
||||
IL_0004: mul |
||||
IL_0005: conv.i |
||||
IL_0006: sub |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong3 |
||||
|
||||
.method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* |
||||
PointerArithmeticLong1s(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0008: conv.i8 |
||||
IL_0009: mul |
||||
IL_000a: conv.i |
||||
IL_000b: add |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong1s |
||||
|
||||
.method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* |
||||
PointerArithmeticLong2s(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.2 |
||||
IL_0001: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0007: conv.i8 |
||||
IL_0008: mul |
||||
IL_0009: conv.i |
||||
IL_000a: ldarg.1 |
||||
IL_000b: add |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong2s |
||||
|
||||
.method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* |
||||
PointerArithmeticLong3s(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
int64 offset) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0008: conv.i8 |
||||
IL_0009: mul |
||||
IL_000a: conv.i |
||||
IL_000b: sub |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::PointerArithmeticLong3s |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerSubtraction(int64* p, |
||||
int64* q) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.8 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: conv.i4 |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerSubtraction |
||||
|
||||
.method public hidebysig instance int64 |
||||
PointerSubtractionLong(int64* p, |
||||
int64* q) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.8 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerSubtractionLong |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerSubtraction2(int64* p, |
||||
int16* q) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.1 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: conv.i4 |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerSubtraction2 |
||||
|
||||
.method public hidebysig instance int32 |
||||
PointerSubtraction3(void* p, |
||||
void* q) cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.1 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: conv.i4 |
||||
IL_0007: ret |
||||
} // end of method UnsafeCode::PointerSubtraction3 |
||||
|
||||
.method public hidebysig instance int64 |
||||
PointerSubtraction4(int8* p, |
||||
int8* q) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: ldc.i4.1 |
||||
IL_0004: div |
||||
IL_0005: conv.i8 |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::PointerSubtraction4 |
||||
|
||||
.method public hidebysig instance int64 |
||||
PointerSubtraction5(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* p, |
||||
valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* q) cil managed |
||||
{ |
||||
// Code size 12 (0xc) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldarg.2 |
||||
IL_0002: sub |
||||
IL_0003: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0009: div |
||||
IL_000a: conv.i8 |
||||
IL_000b: ret |
||||
} // end of method UnsafeCode::PointerSubtraction5 |
||||
|
||||
.method public hidebysig instance float64 |
||||
FixedMemberAccess(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers* m, |
||||
int32 i) cil managed |
||||
{ |
||||
// Code size 39 (0x27) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldflda valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Integers>e__FixedBuffer' ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers::Integers |
||||
IL_0006: ldflda int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Integers>e__FixedBuffer'::FixedElementField |
||||
IL_000b: conv.u |
||||
IL_000c: ldarg.2 |
||||
IL_000d: conv.i |
||||
IL_000e: ldc.i4.4 |
||||
IL_000f: mul |
||||
IL_0010: add |
||||
IL_0011: ldind.i4 |
||||
IL_0012: conv.r8 |
||||
IL_0013: ldarg.1 |
||||
IL_0014: ldflda valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer' ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers::Doubles |
||||
IL_0019: ldflda float64 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer'::FixedElementField |
||||
IL_001e: conv.u |
||||
IL_001f: ldarg.2 |
||||
IL_0020: conv.i |
||||
IL_0021: ldc.i4.8 |
||||
IL_0022: mul |
||||
IL_0023: add |
||||
IL_0024: ldind.r8 |
||||
IL_0025: add |
||||
IL_0026: ret |
||||
} // end of method UnsafeCode::FixedMemberAccess |
||||
|
||||
.method public hidebysig instance float64* |
||||
FixedMemberBasePointer(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers* m) cil managed |
||||
{ |
||||
// Code size 13 (0xd) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldflda valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer' ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers::Doubles |
||||
IL_0006: ldflda float64 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/StructWithFixedSizeMembers/'<Doubles>e__FixedBuffer'::FixedElementField |
||||
IL_000b: conv.u |
||||
IL_000c: ret |
||||
} // end of method UnsafeCode::FixedMemberBasePointer |
||||
|
||||
.method public hidebysig instance string |
||||
UsePointer(float64* ptr) cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.1 |
||||
IL_0001: call instance string [mscorlib]System.Double::ToString() |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::UsePointer |
||||
|
||||
.method public hidebysig instance string |
||||
StackAlloc(int32 count) cil managed |
||||
{ |
||||
// Code size 52 (0x34) |
||||
.maxstack 3 |
||||
.locals init (char* V_0, |
||||
char* V_1, |
||||
int32 V_2) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: conv.u |
||||
IL_0002: ldc.i4.2 |
||||
IL_0003: mul.ovf.un |
||||
IL_0004: localloc |
||||
IL_0006: stloc.0 |
||||
IL_0007: ldc.i4.s 100 |
||||
IL_0009: conv.u |
||||
IL_000a: ldc.i4.2 |
||||
IL_000b: mul.ovf.un |
||||
IL_000c: localloc |
||||
IL_000e: stloc.1 |
||||
IL_000f: ldc.i4.0 |
||||
IL_0010: stloc.2 |
||||
IL_0011: br.s IL_0028 |
||||
|
||||
IL_0013: ldloc.0 |
||||
IL_0014: ldloc.2 |
||||
IL_0015: conv.i |
||||
IL_0016: ldc.i4.2 |
||||
IL_0017: mul |
||||
IL_0018: add |
||||
IL_0019: ldloc.2 |
||||
IL_001a: conv.u2 |
||||
IL_001b: stind.i2 |
||||
IL_001c: ldloc.1 |
||||
IL_001d: ldloc.2 |
||||
IL_001e: conv.i |
||||
IL_001f: ldc.i4.2 |
||||
IL_0020: mul |
||||
IL_0021: add |
||||
IL_0022: ldc.i4.0 |
||||
IL_0023: stind.i2 |
||||
IL_0024: ldloc.2 |
||||
IL_0025: ldc.i4.1 |
||||
IL_0026: add |
||||
IL_0027: stloc.2 |
||||
IL_0028: ldloc.2 |
||||
IL_0029: ldarg.1 |
||||
IL_002a: blt.s IL_0013 |
||||
|
||||
IL_002c: ldarg.0 |
||||
IL_002d: ldloc.0 |
||||
IL_002e: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UsePointer(float64*) |
||||
IL_0033: ret |
||||
} // end of method UnsafeCode::StackAlloc |
||||
|
||||
.method public hidebysig instance string |
||||
StackAllocStruct(int32 count) cil managed |
||||
{ |
||||
// Code size 41 (0x29) |
||||
.maxstack 2 |
||||
.locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct* V_0) |
||||
IL_0000: ldarg.1 |
||||
IL_0001: ldc.i4.2 |
||||
IL_0002: mul.ovf |
||||
IL_0003: conv.u |
||||
IL_0004: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_000a: mul.ovf.un |
||||
IL_000b: localloc |
||||
IL_000d: stloc.0 |
||||
IL_000e: ldc.i4.s 10 |
||||
IL_0010: conv.u |
||||
IL_0011: sizeof ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct |
||||
IL_0017: mul.ovf.un |
||||
IL_0018: localloc |
||||
IL_001a: pop |
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldloc.0 |
||||
IL_001d: ldflda float64 ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode/SimpleStruct::Y |
||||
IL_0022: conv.u |
||||
IL_0023: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::UsePointer(float64*) |
||||
IL_0028: ret |
||||
} // end of method UnsafeCode::StackAllocStruct |
||||
|
||||
.method family hidebysig virtual instance void |
||||
Finalize() cil managed |
||||
{ |
||||
.override [mscorlib]System.Object::Finalize |
||||
// Code size 22 (0x16) |
||||
.maxstack 2 |
||||
.try |
||||
{ |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldarg.0 |
||||
IL_0002: call instance int32* ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::get_NullPointer() |
||||
IL_0007: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::PassPointerAsRefParameter(int32*) |
||||
IL_000c: leave.s IL_0015 |
||||
|
||||
} // end .try |
||||
finally |
||||
{ |
||||
IL_000e: ldarg.0 |
||||
IL_000f: call instance void [mscorlib]System.Object::Finalize() |
||||
IL_0014: endfinally |
||||
} // end handler |
||||
IL_0015: ret |
||||
} // end of method UnsafeCode::Finalize |
||||
|
||||
.method public hidebysig specialname rtspecialname |
||||
instance void .ctor() cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: call instance void [mscorlib]System.Object::.ctor() |
||||
IL_0006: ret |
||||
} // end of method UnsafeCode::.ctor |
||||
|
||||
.property instance int32* NullPointer() |
||||
{ |
||||
.get instance int32* ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode::get_NullPointer() |
||||
} // end of property UnsafeCode::NullPointer |
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.UnsafeCode |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,352 @@
@@ -0,0 +1,352 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Text; |
||||
using ICSharpCode.Decompiler.Util; |
||||
using Mono.Cecil; |
||||
|
||||
namespace ICSharpCode.Decompiler |
||||
{ |
||||
public class UniversalAssemblyResolver : IAssemblyResolver |
||||
{ |
||||
DotNetCorePathFinder dotNetCorePathFinder; |
||||
readonly bool throwOnError; |
||||
readonly string mainAssemblyFileName; |
||||
readonly string baseDirectory; |
||||
readonly Dictionary<string, UnresolvedAssemblyNameReference> loadedAssemblyReferences; |
||||
readonly List<string> directories; |
||||
readonly List<string> gac_paths = GetGacPaths(); |
||||
|
||||
public static readonly bool OnMono = Type.GetType("Mono.Runtime") != null; |
||||
|
||||
public event AssemblyResolveEventHandler ResolveFailed; |
||||
|
||||
public void AddSearchDirectory(string directory) |
||||
{ |
||||
directories.Add(directory); |
||||
} |
||||
|
||||
public void RemoveSearchDirectory(string directory) |
||||
{ |
||||
directories.Remove(directory); |
||||
} |
||||
|
||||
public string[] GetSearchDirectories() |
||||
{ |
||||
return directories.ToArray(); |
||||
} |
||||
|
||||
public string TargetFramework { get; set; } |
||||
|
||||
private UniversalAssemblyResolver(string mainAssemblyFileName, bool throwOnError) |
||||
{ |
||||
this.mainAssemblyFileName = mainAssemblyFileName; |
||||
this.baseDirectory = Path.GetDirectoryName(mainAssemblyFileName); |
||||
this.throwOnError = throwOnError; |
||||
if (string.IsNullOrWhiteSpace(this.baseDirectory)) |
||||
this.baseDirectory = Environment.CurrentDirectory; |
||||
AddSearchDirectory(baseDirectory); |
||||
} |
||||
|
||||
public static ModuleDefinition LoadMainModule(string mainAssemblyFileName, bool throwOnError = true, bool inMemory = false) |
||||
{ |
||||
var resolver = new UniversalAssemblyResolver(mainAssemblyFileName, throwOnError); |
||||
|
||||
var module = ModuleDefinition.ReadModule(mainAssemblyFileName, new ReaderParameters { |
||||
AssemblyResolver = resolver, |
||||
InMemory = inMemory |
||||
}); |
||||
|
||||
resolver.TargetFramework = module.Assembly.DetectTargetFrameworkId(); |
||||
|
||||
return module; |
||||
} |
||||
|
||||
public AssemblyDefinition Resolve(AssemblyNameReference name) |
||||
{ |
||||
return Resolve(name, new ReaderParameters()); |
||||
} |
||||
|
||||
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) |
||||
{ |
||||
var targetFramework = TargetFramework.Split(new[] { ",Version=v" }, StringSplitOptions.None); |
||||
string file = null; |
||||
switch (targetFramework[0]) { |
||||
case ".NETCoreApp": |
||||
case ".NETStandard": |
||||
if (targetFramework.Length != 2) goto default; |
||||
if (dotNetCorePathFinder == null) { |
||||
var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1]; |
||||
dotNetCorePathFinder = new DotNetCorePathFinder(mainAssemblyFileName, TargetFramework, version, this.loadedAssemblyReferences); |
||||
} |
||||
file = dotNetCorePathFinder.TryResolveDotNetCore(name); |
||||
if (file == null) |
||||
goto default; |
||||
else { |
||||
var asm = ModuleDefinition.ReadModule(file, parameters).Assembly; |
||||
if (throwOnError && asm == null) |
||||
throw new AssemblyResolutionException(name); |
||||
return asm; |
||||
} |
||||
default: |
||||
return ResolveInternal(name, parameters); |
||||
} |
||||
} |
||||
|
||||
AssemblyDefinition ResolveInternal(AssemblyNameReference name, ReaderParameters parameters) |
||||
{ |
||||
if (name == null) |
||||
throw new ArgumentNullException(nameof(name)); |
||||
|
||||
if (parameters == null) |
||||
throw new ArgumentNullException(nameof(parameters)); |
||||
|
||||
var assembly = SearchDirectory(name, directories, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
|
||||
if (name.IsRetargetable) { |
||||
// if the reference is retargetable, zero it
|
||||
name = new AssemblyNameReference(name.Name, ZeroVersion) { |
||||
PublicKeyToken = Empty<byte>.Array, |
||||
}; |
||||
} |
||||
|
||||
var framework_dir = Path.GetDirectoryName(typeof(object).Module.FullyQualifiedName); |
||||
var framework_dirs = OnMono |
||||
? new[] { framework_dir, Path.Combine(framework_dir, "Facades") } |
||||
: new[] { framework_dir }; |
||||
|
||||
if (IsZero(name.Version)) { |
||||
assembly = SearchDirectory(name, framework_dirs, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
} |
||||
|
||||
if (name.Name == "mscorlib") { |
||||
assembly = GetCorlib(name, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
} |
||||
|
||||
assembly = GetAssemblyInGac(name, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
|
||||
assembly = SearchDirectory(name, framework_dirs, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
|
||||
if (ResolveFailed != null) { |
||||
assembly = ResolveFailed(this, name); |
||||
if (assembly != null) |
||||
return assembly; |
||||
} |
||||
|
||||
if (throwOnError) |
||||
throw new AssemblyResolutionException(name); |
||||
return null; |
||||
} |
||||
|
||||
#region .NET / mono GAC handling
|
||||
AssemblyDefinition SearchDirectory(AssemblyNameReference name, IEnumerable<string> directories, ReaderParameters parameters) |
||||
{ |
||||
var extensions = name.IsWindowsRuntime ? new[] { ".winmd", ".dll" } : new[] { ".exe", ".dll" }; |
||||
foreach (var directory in directories) { |
||||
foreach (var extension in extensions) { |
||||
string file = Path.Combine(directory, name.Name + extension); |
||||
if (!File.Exists(file)) |
||||
continue; |
||||
try { |
||||
return GetAssembly(file, parameters); |
||||
} catch (System.BadImageFormatException) { |
||||
continue; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static bool IsZero(Version version) |
||||
{ |
||||
return version.Major == 0 && version.Minor == 0 && version.Build == 0 && version.Revision == 0; |
||||
} |
||||
|
||||
static Version ZeroVersion = new Version(0, 0, 0, 0); |
||||
|
||||
AssemblyDefinition GetCorlib(AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
var version = reference.Version; |
||||
var corlib = typeof(object).Assembly.GetName(); |
||||
|
||||
if (corlib.Version == version || IsZero(version)) |
||||
return GetAssembly(typeof(object).Module.FullyQualifiedName, parameters); |
||||
|
||||
var path = Directory.GetParent( |
||||
Directory.GetParent( |
||||
typeof(object).Module.FullyQualifiedName).FullName |
||||
).FullName; |
||||
|
||||
if (OnMono) { |
||||
if (version.Major == 1) |
||||
path = Path.Combine(path, "1.0"); |
||||
else if (version.Major == 2) { |
||||
if (version.MajorRevision == 5) |
||||
path = Path.Combine(path, "2.1"); |
||||
else |
||||
path = Path.Combine(path, "2.0"); |
||||
} else if (version.Major == 4) |
||||
path = Path.Combine(path, "4.0"); |
||||
else |
||||
throw new NotSupportedException("Version not supported: " + version); |
||||
} else { |
||||
switch (version.Major) { |
||||
case 1: |
||||
if (version.MajorRevision == 3300) |
||||
path = Path.Combine(path, "v1.0.3705"); |
||||
else |
||||
path = Path.Combine(path, "v1.0.5000.0"); |
||||
break; |
||||
case 2: |
||||
path = Path.Combine(path, "v2.0.50727"); |
||||
break; |
||||
case 4: |
||||
path = Path.Combine(path, "v4.0.30319"); |
||||
break; |
||||
default: |
||||
throw new NotSupportedException("Version not supported: " + version); |
||||
} |
||||
} |
||||
|
||||
var file = Path.Combine(path, "mscorlib.dll"); |
||||
if (File.Exists(file)) |
||||
return GetAssembly(file, parameters); |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static List<string> GetGacPaths() |
||||
{ |
||||
if (OnMono) |
||||
return GetDefaultMonoGacPaths(); |
||||
|
||||
var paths = new List<string>(2); |
||||
var windir = Environment.GetEnvironmentVariable("WINDIR"); |
||||
if (windir == null) |
||||
return paths; |
||||
|
||||
paths.Add(Path.Combine(windir, "assembly")); |
||||
paths.Add(Path.Combine(windir, Path.Combine("Microsoft.NET", "assembly"))); |
||||
return paths; |
||||
} |
||||
|
||||
static List<string> GetDefaultMonoGacPaths() |
||||
{ |
||||
var paths = new List<string>(1); |
||||
var gac = GetCurrentMonoGac(); |
||||
if (gac != null) |
||||
paths.Add(gac); |
||||
|
||||
var gac_paths_env = Environment.GetEnvironmentVariable("MONO_GAC_PREFIX"); |
||||
if (string.IsNullOrEmpty(gac_paths_env)) |
||||
return paths; |
||||
|
||||
var prefixes = gac_paths_env.Split(Path.PathSeparator); |
||||
foreach (var prefix in prefixes) { |
||||
if (string.IsNullOrEmpty(prefix)) |
||||
continue; |
||||
|
||||
var gac_path = Path.Combine(Path.Combine(Path.Combine(prefix, "lib"), "mono"), "gac"); |
||||
if (Directory.Exists(gac_path) && !paths.Contains(gac)) |
||||
paths.Add(gac_path); |
||||
} |
||||
|
||||
return paths; |
||||
} |
||||
|
||||
static string GetCurrentMonoGac() |
||||
{ |
||||
return Path.Combine( |
||||
Directory.GetParent( |
||||
Path.GetDirectoryName(typeof(object).Module.FullyQualifiedName)).FullName, |
||||
"gac"); |
||||
} |
||||
|
||||
AssemblyDefinition GetAssembly(string file, ReaderParameters parameters) |
||||
{ |
||||
if (parameters.AssemblyResolver == null) |
||||
parameters.AssemblyResolver = this; |
||||
|
||||
return ModuleDefinition.ReadModule(file, parameters).Assembly; |
||||
} |
||||
|
||||
AssemblyDefinition GetAssemblyInGac(AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
if (reference.PublicKeyToken == null || reference.PublicKeyToken.Length == 0) |
||||
return null; |
||||
|
||||
if (OnMono) |
||||
return GetAssemblyInMonoGac(reference, parameters); |
||||
|
||||
return GetAssemblyInNetGac(reference, parameters); |
||||
} |
||||
|
||||
AssemblyDefinition GetAssemblyInMonoGac(AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
for (int i = 0; i < gac_paths.Count; i++) { |
||||
var gac_path = gac_paths[i]; |
||||
var file = GetAssemblyFile(reference, string.Empty, gac_path); |
||||
if (File.Exists(file)) |
||||
return GetAssembly(file, parameters); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
AssemblyDefinition GetAssemblyInNetGac(AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
var gacs = new[] { "GAC_MSIL", "GAC_32", "GAC_64", "GAC" }; |
||||
var prefixes = new[] { string.Empty, "v4.0_" }; |
||||
|
||||
for (int i = 0; i < 2; i++) { |
||||
for (int j = 0; j < gacs.Length; j++) { |
||||
var gac = Path.Combine(gac_paths[i], gacs[j]); |
||||
var file = GetAssemblyFile(reference, prefixes[i], gac); |
||||
if (Directory.Exists(gac) && File.Exists(file)) |
||||
return GetAssembly(file, parameters); |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static string GetAssemblyFile(AssemblyNameReference reference, string prefix, string gac) |
||||
{ |
||||
var gac_folder = new StringBuilder() |
||||
.Append(prefix) |
||||
.Append(reference.Version) |
||||
.Append("__"); |
||||
|
||||
for (int i = 0; i < reference.PublicKeyToken.Length; i++) |
||||
gac_folder.Append(reference.PublicKeyToken[i].ToString("x2")); |
||||
|
||||
return Path.Combine( |
||||
Path.Combine( |
||||
Path.Combine(gac, reference.Name), gac_folder.ToString()), |
||||
reference.Name + ".dll"); |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public void Dispose() |
||||
{ |
||||
Dispose(true); |
||||
GC.SuppressFinalize(this); |
||||
} |
||||
|
||||
protected virtual void Dispose(bool disposing) |
||||
{ |
||||
} |
||||
} |
||||
} |
After Width: | Height: | Size: 436 B |
Loading…
Reference in new issue