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

8
ICSharpCode.Decompiler/CecilExtensions.cs

@ -159,6 +159,14 @@ namespace ICSharpCode.Decompiler
return accessorMethods; 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) public static FieldDefinition ResolveWithinSameModule(this FieldReference field)
{ {
if (field != null && field.DeclaringType.GetElementType().Module == field.Module) if (field != null && field.DeclaringType.GetElementType().Module == field.Module)

Loading…
Cancel
Save