|
|
@ -337,52 +337,62 @@ namespace ICSharpCode.Decompiler.Disassembler |
|
|
|
output.WriteLine(" = {"); |
|
|
|
output.WriteLine(" = {"); |
|
|
|
output.Indent(); |
|
|
|
output.Indent(); |
|
|
|
var blob = metadata.GetBlobReader(secdecl.PermissionSet); |
|
|
|
var blob = metadata.GetBlobReader(secdecl.PermissionSet); |
|
|
|
if ((char)blob.ReadByte() != '.') throw new InvalidOperationException("sanity check!"); |
|
|
|
if ((char)blob.ReadByte() != '.') { |
|
|
|
int count = blob.ReadCompressedInteger(); |
|
|
|
blob.Reset(); |
|
|
|
for (int i = 0; i < count; i++) { |
|
|
|
WriteXmlSecurityDeclaration(blob.ReadUTF8(blob.RemainingBytes)); |
|
|
|
var typeName = blob.ReadSerializedString(); |
|
|
|
} else { |
|
|
|
string[] nameParts = typeName.Split(new[] { ", " }, 2, StringSplitOptions.None); |
|
|
|
int count = blob.ReadCompressedInteger(); |
|
|
|
if (nameParts.Length != 2) |
|
|
|
for (int i = 0; i < count; i++) { |
|
|
|
throw new NotImplementedException(); |
|
|
|
var typeName = blob.ReadSerializedString(); |
|
|
|
var referencedModule = module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(nameParts[1])); |
|
|
|
string[] nameParts = typeName.Split(new[] { ", " }, 2, StringSplitOptions.None); |
|
|
|
if (referencedModule == module) { |
|
|
|
if (nameParts.Length != 2) |
|
|
|
output.Write("class "); |
|
|
|
|
|
|
|
output.Write(DisassemblerHelpers.Escape(typeName)); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
string[] typeNameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None); |
|
|
|
|
|
|
|
if (typeNameParts.Length < 2) |
|
|
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
throw new NotImplementedException(); |
|
|
|
output.Write('['); |
|
|
|
var referencedModule = module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(nameParts[1])); |
|
|
|
output.Write(typeNameParts[1]); |
|
|
|
if (referencedModule == module) { |
|
|
|
output.Write(']'); |
|
|
|
output.Write("class "); |
|
|
|
output.WriteReference(typeNameParts[0], null); // TODO : hyperlink!
|
|
|
|
output.Write(DisassemblerHelpers.Escape(typeName)); |
|
|
|
} |
|
|
|
} else { |
|
|
|
output.Write(" = {"); |
|
|
|
string[] typeNameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None); |
|
|
|
blob.ReadCompressedInteger(); // ?
|
|
|
|
if (typeNameParts.Length < 2) |
|
|
|
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead.
|
|
|
|
throw new NotImplementedException(); |
|
|
|
int argCount = blob.ReadCompressedInteger(); |
|
|
|
output.Write('['); |
|
|
|
if (argCount > 0) { |
|
|
|
output.Write(typeNameParts[1]); |
|
|
|
output.WriteLine(); |
|
|
|
output.Write(']'); |
|
|
|
output.Indent(); |
|
|
|
output.WriteReference(typeNameParts[0], null); // TODO : hyperlink!
|
|
|
|
|
|
|
|
} |
|
|
|
for (int j = 0; j < argCount; j++) { |
|
|
|
output.Write(" = {"); |
|
|
|
WriteSecurityDeclarationArgument(module, ref blob); |
|
|
|
blob.ReadCompressedInteger(); // ?
|
|
|
|
|
|
|
|
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead.
|
|
|
|
|
|
|
|
int argCount = blob.ReadCompressedInteger(); |
|
|
|
|
|
|
|
if (argCount > 0) { |
|
|
|
output.WriteLine(); |
|
|
|
output.WriteLine(); |
|
|
|
|
|
|
|
output.Indent(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < argCount; j++) { |
|
|
|
|
|
|
|
WriteSecurityDeclarationArgument(module, ref blob); |
|
|
|
|
|
|
|
output.WriteLine(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
output.Unindent(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
output.Write('}'); |
|
|
|
|
|
|
|
|
|
|
|
output.Unindent(); |
|
|
|
if (i + 1 < count) |
|
|
|
|
|
|
|
output.Write(','); |
|
|
|
|
|
|
|
output.WriteLine(); |
|
|
|
} |
|
|
|
} |
|
|
|
output.Write('}'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (i + 1 < count) |
|
|
|
|
|
|
|
output.Write(','); |
|
|
|
|
|
|
|
output.WriteLine(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
output.Unindent(); |
|
|
|
output.Unindent(); |
|
|
|
output.WriteLine("}"); |
|
|
|
output.WriteLine("}"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WriteXmlSecurityDeclaration(string xml) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
output.Write("property string XML = "); |
|
|
|
|
|
|
|
output.Write("string('{0}')", DisassemblerHelpers.EscapeString(xml).Replace("'", "\'")); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
enum TypeKind |
|
|
|
enum TypeKind |
|
|
|
{ |
|
|
|
{ |
|
|
|
Primitive, |
|
|
|
Primitive, |
|
|
@ -709,7 +719,8 @@ namespace ICSharpCode.Decompiler.Disassembler |
|
|
|
output.Write("unsigned int"); |
|
|
|
output.Write("unsigned int"); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 0x26: // NATIVE_TYPE_FUNC
|
|
|
|
case 0x26: // NATIVE_TYPE_FUNC
|
|
|
|
goto default; // ??
|
|
|
|
output.Write("Func"); |
|
|
|
|
|
|
|
break; |
|
|
|
case 0x2a: // NATIVE_TYPE_ARRAY
|
|
|
|
case 0x2a: // NATIVE_TYPE_ARRAY
|
|
|
|
if (blob.RemainingBytes > 0) |
|
|
|
if (blob.RemainingBytes > 0) |
|
|
|
WriteNativeType(ref blob); |
|
|
|
WriteNativeType(ref blob); |
|
|
@ -755,70 +766,72 @@ namespace ICSharpCode.Decompiler.Disassembler |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 0x1d: // SafeArray
|
|
|
|
case 0x1d: // SafeArray
|
|
|
|
output.Write("safearray "); |
|
|
|
output.Write("safearray "); |
|
|
|
byte elementType = blob.ReadByte(); |
|
|
|
if (blob.RemainingBytes > 0) { |
|
|
|
switch (elementType) { |
|
|
|
byte elementType = blob.ReadByte(); |
|
|
|
case 0: // None
|
|
|
|
switch (elementType) { |
|
|
|
break; |
|
|
|
case 0: // None
|
|
|
|
case 2: // I2
|
|
|
|
break; |
|
|
|
output.Write("int16"); |
|
|
|
case 2: // I2
|
|
|
|
break; |
|
|
|
output.Write("int16"); |
|
|
|
case 3: // I4
|
|
|
|
break; |
|
|
|
output.Write("int32"); |
|
|
|
case 3: // I4
|
|
|
|
break; |
|
|
|
output.Write("int32"); |
|
|
|
case 4: // R4
|
|
|
|
break; |
|
|
|
output.Write("float32"); |
|
|
|
case 4: // R4
|
|
|
|
break; |
|
|
|
output.Write("float32"); |
|
|
|
case 5: // R8
|
|
|
|
break; |
|
|
|
output.Write("float64"); |
|
|
|
case 5: // R8
|
|
|
|
break; |
|
|
|
output.Write("float64"); |
|
|
|
case 6: // Currency
|
|
|
|
break; |
|
|
|
output.Write("currency"); |
|
|
|
case 6: // Currency
|
|
|
|
break; |
|
|
|
output.Write("currency"); |
|
|
|
case 7: // Date
|
|
|
|
break; |
|
|
|
output.Write("date"); |
|
|
|
case 7: // Date
|
|
|
|
break; |
|
|
|
output.Write("date"); |
|
|
|
case 8: // BStr
|
|
|
|
break; |
|
|
|
output.Write("bstr"); |
|
|
|
case 8: // BStr
|
|
|
|
break; |
|
|
|
output.Write("bstr"); |
|
|
|
case 9: // Dispatch
|
|
|
|
break; |
|
|
|
output.Write("idispatch"); |
|
|
|
case 9: // Dispatch
|
|
|
|
break; |
|
|
|
output.Write("idispatch"); |
|
|
|
case 10: // Error
|
|
|
|
break; |
|
|
|
output.Write("error"); |
|
|
|
case 10: // Error
|
|
|
|
break; |
|
|
|
output.Write("error"); |
|
|
|
case 11: // Bool
|
|
|
|
break; |
|
|
|
output.Write("bool"); |
|
|
|
case 11: // Bool
|
|
|
|
break; |
|
|
|
output.Write("bool"); |
|
|
|
case 12: // Variant
|
|
|
|
break; |
|
|
|
output.Write("variant"); |
|
|
|
case 12: // Variant
|
|
|
|
break; |
|
|
|
output.Write("variant"); |
|
|
|
case 13: // Unknown
|
|
|
|
break; |
|
|
|
output.Write("iunknown"); |
|
|
|
case 13: // Unknown
|
|
|
|
break; |
|
|
|
output.Write("iunknown"); |
|
|
|
case 14: // Decimal
|
|
|
|
break; |
|
|
|
output.Write("decimal"); |
|
|
|
case 14: // Decimal
|
|
|
|
break; |
|
|
|
output.Write("decimal"); |
|
|
|
case 16: // I1
|
|
|
|
break; |
|
|
|
output.Write("int8"); |
|
|
|
case 16: // I1
|
|
|
|
break; |
|
|
|
output.Write("int8"); |
|
|
|
case 17: // UI1
|
|
|
|
break; |
|
|
|
output.Write("unsigned int8"); |
|
|
|
case 17: // UI1
|
|
|
|
break; |
|
|
|
output.Write("unsigned int8"); |
|
|
|
case 18: // UI2
|
|
|
|
break; |
|
|
|
output.Write("unsigned int16"); |
|
|
|
case 18: // UI2
|
|
|
|
break; |
|
|
|
output.Write("unsigned int16"); |
|
|
|
case 19: // UI4
|
|
|
|
break; |
|
|
|
output.Write("unsigned int32"); |
|
|
|
case 19: // UI4
|
|
|
|
break; |
|
|
|
output.Write("unsigned int32"); |
|
|
|
case 22: // Int
|
|
|
|
break; |
|
|
|
output.Write("int"); |
|
|
|
case 22: // Int
|
|
|
|
break; |
|
|
|
output.Write("int"); |
|
|
|
case 23: // UInt
|
|
|
|
break; |
|
|
|
output.Write("unsigned int"); |
|
|
|
case 23: // UInt
|
|
|
|
break; |
|
|
|
output.Write("unsigned int"); |
|
|
|
default: |
|
|
|
break; |
|
|
|
output.Write(elementType.ToString()); |
|
|
|
default: |
|
|
|
break; |
|
|
|
output.Write(elementType.ToString()); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 0x1e: // FixedArray
|
|
|
|
case 0x1e: // FixedArray
|
|
|
|