Browse Source

Fix some bugs introduced by nested type lazy-loading.

pull/1108/head
Daniel Grunwald 8 years ago
parent
commit
ec86ba2dad
  1. 2
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 37
      ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs

2
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1311,7 +1311,7 @@ namespace ICSharpCode.Decompiler.CSharp
// A = inputType.GetSize() // A = inputType.GetSize()
// B = inputStackType.GetSize() // B = inputStackType.GetSize()
// C = inst.TargetType.GetSize(). // C = inst.TargetType.GetSize().
// We know that C <= B (otherwise this wouldn't be the truncation case). // We know that C < B (otherwise this wouldn't be the truncation case).
// 1) If C < B < A, we just combine the two truncations into one. // 1) If C < B < A, we just combine the two truncations into one.
// 2) If C < B = A, there's no input conversion, just the truncation // 2) If C < B = A, there's no input conversion, just the truncation
// 3) If C <= A < B, all the extended bits get removed again by the truncation. // 3) If C <= A < B, all the extended bits get removed again by the truncation.

37
ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs

@ -967,14 +967,6 @@ namespace ICSharpCode.Decompiler.TypeSystem
{ {
if (!typeDefinition.HasNestedTypes) if (!typeDefinition.HasNestedTypes)
return; return;
if (LazyLoad) {
foreach (TypeDefinition nestedTypeDef in typeDefinition.NestedTypes) {
var nestedTd = new LazyCecilTypeDefinition(this, nestedTypeDef, declaringTypeDefinition);
nestedTypes.Add(nestedTd);
RegisterCecilObject(nestedTd, nestedTypeDef);
}
return;
}
foreach (TypeDefinition nestedTypeDef in typeDefinition.NestedTypes) { foreach (TypeDefinition nestedTypeDef in typeDefinition.NestedTypes) {
TypeAttributes visibility = nestedTypeDef.Attributes & TypeAttributes.VisibilityMask; TypeAttributes visibility = nestedTypeDef.Attributes & TypeAttributes.VisibilityMask;
if (this.IncludeInternalMembers if (this.IncludeInternalMembers
@ -986,12 +978,18 @@ namespace ICSharpCode.Decompiler.TypeSystem
int pos = name.LastIndexOf('/'); int pos = name.LastIndexOf('/');
if (pos > 0) if (pos > 0)
name = name.Substring(pos + 1); name = name.Substring(pos + 1);
name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(name); if (LazyLoad) {
var nestedType = new DefaultUnresolvedTypeDefinition(declaringTypeDefinition, name); var nestedTd = new LazyCecilTypeDefinition(this, nestedTypeDef, declaringTypeDefinition, name);
nestedType.MetadataToken = nestedTypeDef.MetadataToken; nestedTypes.Add(nestedTd);
InitTypeParameters(nestedTypeDef, nestedType.TypeParameters); RegisterCecilObject(nestedTd, nestedTypeDef);
nestedTypes.Add(nestedType); } else {
InitTypeDefinition(nestedTypeDef, nestedType); name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(name);
var nestedType = new DefaultUnresolvedTypeDefinition(declaringTypeDefinition, name);
nestedType.MetadataToken = nestedTypeDef.MetadataToken;
InitTypeParameters(nestedTypeDef, nestedType.TypeParameters);
nestedTypes.Add(nestedType);
InitTypeDefinition(nestedTypeDef, nestedType);
}
} }
} }
} }
@ -1167,7 +1165,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
IList<IUnresolvedTypeDefinition> nestedTypes; IList<IUnresolvedTypeDefinition> nestedTypes;
IList<IUnresolvedMember> members; IList<IUnresolvedMember> members;
public LazyCecilTypeDefinition(CecilLoader loader, TypeDefinition typeDefinition, IUnresolvedTypeDefinition declaringTypeDefinition = null) public LazyCecilTypeDefinition(CecilLoader loader, TypeDefinition typeDefinition, IUnresolvedTypeDefinition declaringTypeDefinition = null, string name = null)
{ {
this.loader = loader; this.loader = loader;
this.cecilTypeDef = typeDefinition; this.cecilTypeDef = typeDefinition;
@ -1179,7 +1177,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
} else { } else {
this.namespaceName = typeDefinition.Namespace; this.namespaceName = typeDefinition.Namespace;
} }
this.Name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(typeDefinition.Name); this.Name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(name ?? typeDefinition.Name);
var tps = new List<IUnresolvedTypeParameter>(); var tps = new List<IUnresolvedTypeParameter>();
InitTypeParameters(typeDefinition, tps); InitTypeParameters(typeDefinition, tps);
this.typeParameters = FreezableHelper.FreezeList(tps); this.typeParameters = FreezableHelper.FreezeList(tps);
@ -1206,7 +1204,12 @@ namespace ICSharpCode.Decompiler.TypeSystem
public FullTypeName FullTypeName { public FullTypeName FullTypeName {
get { get {
return new TopLevelTypeName(namespaceName, this.Name, typeParameters.Count); IUnresolvedTypeDefinition declaringTypeDef = this.DeclaringTypeDefinition;
if (declaringTypeDef != null) {
return declaringTypeDef.FullTypeName.NestedType(this.Name, typeParameters.Count - declaringTypeDef.TypeParameters.Count);
} else {
return new TopLevelTypeName(namespaceName, this.Name, typeParameters.Count);
}
} }
} }

Loading…
Cancel
Save