Browse Source

Fix transformation of closure variables for anonymous methods within generic methods.

pull/100/head
Daniel Grunwald 15 years ago
parent
commit
f95c53384c
  1. 8
      ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs
  2. 8
      ICSharpCode.Decompiler/CecilExtensions.cs

8
ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs

@ -173,11 +173,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -173,11 +173,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
if (stmt.Variables.Count() != 1)
continue;
var variable = stmt.Variables.Single();
TypeDefinition type = stmt.Type.Annotation<TypeDefinition>();
TypeDefinition type = stmt.Type.Annotation<TypeReference>().ResolveWithinSameModule();
if (!IsPotentialClosure(context, type))
continue;
ObjectCreateExpression oce = variable.Initializer as ObjectCreateExpression;
if (oce == null || oce.Type.Annotation<TypeReference>() != type || oce.Arguments.Any() || !oce.Initializer.IsNull)
if (oce == null || oce.Type.Annotation<TypeReference>().ResolveWithinSameModule() != type || oce.Arguments.Any() || !oce.Initializer.IsNull)
continue;
// Looks like we found a display class creation. Now let's verify that the variable is used only for field accesses:
bool ok = true;
@ -222,7 +222,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -222,7 +222,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
isParameter = parameterOccurrances.Count(c => c == param) == 1;
}
if (isParameter) {
dict[m.Get<MemberReferenceExpression>("left").Single().Annotation<FieldReference>()] = right;
dict[m.Get<MemberReferenceExpression>("left").Single().Annotation<FieldReference>().ResolveWithinSameModule()] = right;
cur.Remove();
} else {
break;
@ -247,7 +247,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -247,7 +247,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
if (identExpr.Identifier == variable.Name) {
MemberReferenceExpression mre = (MemberReferenceExpression)identExpr.Parent;
AstNode replacement;
if (dict.TryGetValue(mre.Annotation<FieldReference>(), out replacement)) {
if (dict.TryGetValue(mre.Annotation<FieldReference>().ResolveWithinSameModule(), out replacement)) {
mre.ReplaceWith(replacement.Clone());
}
}

8
ICSharpCode.Decompiler/CecilExtensions.cs

@ -159,6 +159,14 @@ namespace ICSharpCode.Decompiler @@ -159,6 +159,14 @@ namespace ICSharpCode.Decompiler
return accessorMethods;
}
public static TypeDefinition ResolveWithinSameModule(this TypeReference type)
{
if (type != null && type.GetElementType().Module == type.Module)
return type.Resolve();
else
return null;
}
public static FieldDefinition ResolveWithinSameModule(this FieldReference field)
{
if (field != null && field.DeclaringType.GetElementType().Module == field.Module)

Loading…
Cancel
Save