diff options
author | Marek Safar <marek.safar@gmail.com> | 2015-02-18 16:07:07 +0300 |
---|---|---|
committer | Marek Safar <marek.safar@gmail.com> | 2015-02-18 16:07:07 +0300 |
commit | a3de8ec435d47292363b3012e76e2bc05e412d6d (patch) | |
tree | f41e72759c3f409498c418a0147274ba9b1c30b0 | |
parent | 7ded4decb9c39446be634d42a575fda9bc3d945c (diff) | |
parent | 8093e6b7fd791b3e1dbe69ece5dbeb2fa0bbd4c6 (diff) |
Merge remote-tracking branch 'upstream/master'
-rw-r--r-- | CABlob.cs | 2 | ||||
-rw-r--r-- | Disassembler.cs | 98 | ||||
-rw-r--r-- | IKVM.Reflection.dll | bin | 442368 -> 458752 bytes | |||
-rw-r--r-- | Keywords.cs | 2 | ||||
-rw-r--r-- | Program.cs | 6 |
5 files changed, 82 insertions, 26 deletions
@@ -93,7 +93,7 @@ namespace Ildasm void AppendTypeName(StringBuilder sb, Type type, string typeName, bool noself = false, bool securityCompatHack = false) { - if (type.Assembly == assembly && !noself && (!type.IsGenericType || type.IsGenericTypeDefinition) && !type.HasElementType) + if (type.Assembly == assembly && !type.__IsMissing && !noself && (!type.IsGenericType || type.IsGenericTypeDefinition) && !type.HasElementType) { AppendTypeName(sb, type); } diff --git a/Disassembler.cs b/Disassembler.cs index 063e294..b7e5c1a 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -44,6 +44,7 @@ namespace Ildasm None = 0, DiffMode = 1, Caverbal = 2, + Project = 4, } sealed partial class Disassembler @@ -59,7 +60,7 @@ namespace Ildasm const int COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x00000008; const int COMIMAGE_FLAGS_NATIVE_ENTRYPOINT = 0x00000010; const int COMIMAGE_FLAGS_32BITPREFERRED = 0x00020000; - readonly Universe universe = new Universe(UniverseOptions.EnableFunctionPointers | UniverseOptions.ResolveMissingMembers | UniverseOptions.DisablePseudoCustomAttributeRetrieval); + readonly Universe universe; readonly Assembly mscorlib; readonly Type typeofSystemBoolean; readonly Type typeofSystemSByte; @@ -100,6 +101,12 @@ namespace Ildasm this.compat = compat; this.diffMode = (flags & Flags.DiffMode) != 0; this.flags = flags; + UniverseOptions options = UniverseOptions.EnableFunctionPointers | UniverseOptions.ResolveMissingMembers | UniverseOptions.DisablePseudoCustomAttributeRetrieval; + if ((flags & Flags.Project) == 0) + { + options |= UniverseOptions.DisableWindowsRuntimeProjection; + } + universe = new Universe(options); universe.AssemblyResolve += new IKVM.Reflection.ResolveEventHandler(universe_AssemblyResolve); mscorlib = universe.Import(typeof(object)).Assembly; typeofSystemBoolean = universe.Import(typeof(bool)); @@ -505,7 +512,7 @@ namespace Ildasm { typeSize = GetPointerSize(); } - else if (!type.__GetLayout(out packingSize, out typeSize)) + else if (type.__IsMissing || !type.__GetLayout(out packingSize, out typeSize)) { if (type == typeofSystemSByte || type == typeofSystemByte @@ -531,6 +538,11 @@ namespace Ildasm { typeSize = 8; } + else + { + // unknown + typeSize = 0; + } } return typeSize; } @@ -683,7 +695,7 @@ namespace Ildasm else if (compat == CompatLevel.V45) { lw.WriteLine(); - lw.WriteLine("// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.17929"); + lw.WriteLine("// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.18020"); lw.WriteLine("// Copyright (c) Microsoft Corporation. All rights reserved."); lw.WriteLine(); lw.WriteLine(); @@ -807,14 +819,7 @@ namespace Ildasm if (type.BaseType != null) { lw.Write(" extends "); - if (type.BaseType.__IsMissing || !type.BaseType.IsGenericType) - { - WriteTypeDefOrRef(lw, type.BaseType); - } - else - { - WriteSignatureType(lw, type.BaseType, TypeLocation.General); - } + WriteInterfaceOrBaseType(lw, type.BaseType); lw.WriteLine(); lw.GoToColumn(level); } @@ -831,14 +836,7 @@ namespace Ildasm lw.GoToColumn(level + 18); } first = false; - if (iface.__IsMissing || !iface.IsGenericType) - { - WriteTypeDefOrRef(lw, iface); - } - else - { - WriteSignatureType(lw, iface, TypeLocation.General); - } + WriteInterfaceOrBaseType(lw, iface); } lw.WriteLine(); lw.GoToColumn(level); @@ -865,7 +863,7 @@ namespace Ildasm { lw.GoToColumn(level + 2); lw.Write(".interfaceimpl type "); - WriteTypeDefOrRef(lw, iface); + WriteInterfaceOrBaseType(lw, iface); lw.WriteLine(); WriteCustomAttributes(lw, level + 2, cas); } @@ -908,6 +906,18 @@ namespace Ildasm lw.WriteLine(); } + void WriteInterfaceOrBaseType(LineWriter lw, Type type) + { + if (type.__IsMissing || !type.IsGenericType) + { + WriteTypeDefOrRef(lw, type); + } + else + { + WriteSignatureType(lw, type, TypeLocation.General); + } + } + void WriteGenericParameterCustomAttributes(LineWriter lw, int level, Type[] args) { foreach (var typeParam in args) @@ -1055,6 +1065,7 @@ namespace Ildasm } WriteCallingConvention(lw, prop.__CallingConvention); WriteSignatureType(lw, prop.PropertyType); + WriteCustomModifiers(lw, prop.__GetCustomModifiers()); if (lw.Column > 40) { lw.WriteLine(); @@ -2029,9 +2040,37 @@ namespace Ildasm for (int i = 0; i < referencedAssemblies.Length; i++) { AssemblyName asm = referencedAssemblies[i]; - lw.Write(".assembly extern {0}{1}", - asm.ContentType == AssemblyContentType.WindowsRuntime && (compat == CompatLevel.None || compat >= CompatLevel.V45) ? "windowsruntime " : "", - QuoteIdentifier(asm.Name)); + lw.Write(".assembly extern "); + if ((asm.Flags & AssemblyNameFlags.Retargetable) != 0) + { + lw.Write("retargetable "); + } + if (asm.ContentType == AssemblyContentType.WindowsRuntime && (compat == CompatLevel.None || compat >= CompatLevel.V45)) + { + lw.Write("windowsruntime "); + } + switch (asm.ProcessorArchitecture) + { + case ProcessorArchitecture.MSIL: + lw.Write("cil "); + break; + case ProcessorArchitecture.X86: + lw.Write("x86 "); + break; + case ProcessorArchitecture.IA64: + lw.Write("ia64 "); + break; + case ProcessorArchitecture.Amd64: + lw.Write("amd64 "); + break; + case ProcessorArchitecture.Arm: + if (compat == CompatLevel.None) + { + lw.Write("/*arm*/ "); + } + break; + } + lw.Write(QuoteIdentifier(asm.Name)); if (asm.Name != this.referencedAssemblies[resolvedAssemblies[i]]) { lw.Write(" as {0}", QuoteIdentifier(this.referencedAssemblies[resolvedAssemblies[i]])); @@ -2070,8 +2109,7 @@ namespace Ildasm } foreach (var ca in cas) { - if (ca.Constructor.DeclaringType.FullName == "System.Diagnostics.DebuggableAttribute" - && ca.Constructor.DeclaringType.Assembly.GetName().Name == "mscorlib") + if (compat != CompatLevel.None && IsDebuggableAttribute(ca.AttributeType)) { lw.WriteLine(); lw.WriteLine(" // --- The following custom attribute is added automatically, do not uncomment -------"); @@ -2117,6 +2155,16 @@ namespace Ildasm lw.WriteLine("}"); } + static bool IsDebuggableAttribute(Type type) + { + return !type.IsNested + && (type.__IsMissing || !type.IsGenericType) + && !type.HasElementType + && !type.__IsFunctionPointer + && type.__Name == "DebuggableAttribute" + && type.__Namespace == "System.Diagnostics"; + } + void WriteDeclarativeSecurity(LineWriter lw, int level, IList<CustomAttributeData> list, int metadataToken) { var action = (System.Security.Permissions.SecurityAction)(- 1); diff --git a/IKVM.Reflection.dll b/IKVM.Reflection.dll Binary files differindex d79cd45..6353a61 100644 --- a/IKVM.Reflection.dll +++ b/IKVM.Reflection.dll diff --git a/Keywords.cs b/Keywords.cs index e77b28f..bdbde79 100644 --- a/Keywords.cs +++ b/Keywords.cs @@ -176,6 +176,7 @@ namespace Ildasm "opt", "or", "out", + "permitonly", "pinned", "pop", "prefix1", @@ -191,6 +192,7 @@ namespace Ildasm "request", "runtime", "sealed", + "sequential", "serializable", "sizeof", "shl", @@ -92,6 +92,10 @@ namespace Ildasm { flags |= Flags.Caverbal; } + else if (IsIldasmOption(arg, "project")) + { + flags |= Flags.Project; + } else { PrintUsage(); @@ -174,6 +178,7 @@ namespace Ildasm Console.WriteLine("Usage: ikdasm [options] <file_name> [options]"); Console.WriteLine(); Console.WriteLine("Options:"); + if (typeof (int).Assembly.GetType ("Mono.Runtime") != null) { Console.WriteLine (" --out=<file name> Direct output to file rather than stdout."); Console.WriteLine (" --help Print this help."); @@ -182,6 +187,7 @@ namespace Ildasm Console.WriteLine(" /COMPAT=<version> Match ildasm behavior. (<version> = 2.0 | 4.0 | 4.5)"); Console.WriteLine(" /DIFFMODE Remove superficial differences to allow assembly comparisons"); Console.WriteLine(" /CAVERBAL Try to decode custom attribute blobs"); + Console.WriteLine(" /PROJECT Project WinMD metadata into .NET format"); } } } |