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

github.com/mono/ikdasm.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Safar <marek.safar@gmail.com>2015-02-18 16:07:07 +0300
committerMarek Safar <marek.safar@gmail.com>2015-02-18 16:07:07 +0300
commita3de8ec435d47292363b3012e76e2bc05e412d6d (patch)
treef41e72759c3f409498c418a0147274ba9b1c30b0
parent7ded4decb9c39446be634d42a575fda9bc3d945c (diff)
parent8093e6b7fd791b3e1dbe69ece5dbeb2fa0bbd4c6 (diff)
Merge remote-tracking branch 'upstream/master'
-rw-r--r--CABlob.cs2
-rw-r--r--Disassembler.cs98
-rw-r--r--IKVM.Reflection.dllbin442368 -> 458752 bytes
-rw-r--r--Keywords.cs2
-rw-r--r--Program.cs6
5 files changed, 82 insertions, 26 deletions
diff --git a/CABlob.cs b/CABlob.cs
index 0e728fd..108592f 100644
--- a/CABlob.cs
+++ b/CABlob.cs
@@ -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
index d79cd45..6353a61 100644
--- a/IKVM.Reflection.dll
+++ b/IKVM.Reflection.dll
Binary files differ
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",
diff --git a/Program.cs b/Program.cs
index 6d8ce03..43f828d 100644
--- a/Program.cs
+++ b/Program.cs
@@ -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");
}
}
}