Browse Source

Add support for arglist opcode.

pull/124/head
Daniel Grunwald 14 years ago
parent
commit
2a462c3451
  1. 16
      ICSharpCode.Decompiler/Ast/AstBuilder.cs
  2. 3
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  3. 2
      ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs
  4. 7
      ILSpy/TreeNodes/MethodTreeNode.cs

16
ICSharpCode.Decompiler/Ast/AstBuilder.cs

@ -257,7 +257,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -257,7 +257,7 @@ namespace ICSharpCode.Decompiler.Ast
foreach (var m in typeDef.Methods) {
if (m.Name == "Invoke") {
dd.ReturnType = ConvertType(m.ReturnType, m.MethodReturnType);
dd.Parameters.AddRange(MakeParameters(m.Parameters));
dd.Parameters.AddRange(MakeParameters(m));
}
}
result = dd;
@ -618,7 +618,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -618,7 +618,7 @@ namespace ICSharpCode.Decompiler.Ast
astMethod.ReturnType = ConvertType(methodDef.ReturnType, methodDef.MethodReturnType);
astMethod.Name = CleanName(methodDef.Name);
astMethod.TypeParameters.AddRange(MakeTypeParameters(methodDef.GenericParameters));
astMethod.Parameters.AddRange(MakeParameters(methodDef.Parameters));
astMethod.Parameters.AddRange(MakeParameters(methodDef));
astMethod.Constraints.AddRange(MakeConstraints(methodDef.GenericParameters));
if (!methodDef.DeclaringType.IsInterface) {
if (!methodDef.HasOverrides) {
@ -706,7 +706,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -706,7 +706,7 @@ namespace ICSharpCode.Decompiler.Ast
astMethod.Modifiers &= ~Modifiers.VisibilityMask;
}
astMethod.Name = CleanName(methodDef.DeclaringType.Name);
astMethod.Parameters.AddRange(MakeParameters(methodDef.Parameters));
astMethod.Parameters.AddRange(MakeParameters(methodDef));
astMethod.Body = AstMethodBodyBuilder.CreateMethodBody(methodDef, context, astMethod.Parameters);
ConvertAttributes(astMethod, methodDef);
return astMethod;
@ -857,6 +857,16 @@ namespace ICSharpCode.Decompiler.Ast @@ -857,6 +857,16 @@ namespace ICSharpCode.Decompiler.Ast
return astField;
}
public static IEnumerable<ParameterDeclaration> MakeParameters(MethodDefinition method, bool isLambda = false)
{
var parameters = MakeParameters(method.Parameters, isLambda);
if (method.CallingConvention == MethodCallingConvention.VarArg) {
return parameters.Concat(new[] { new ParameterDeclaration { Name = "__arglist" } });
} else {
return parameters;
}
}
public static IEnumerable<ParameterDeclaration> MakeParameters(IEnumerable<ParameterDefinition> paramCol, bool isLambda = false)
{
foreach(ParameterDefinition paramDef in paramCol) {

3
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -476,7 +476,8 @@ namespace ICSharpCode.Decompiler.Ast @@ -476,7 +476,8 @@ namespace ICSharpCode.Decompiler.Ast
else
return new AssignmentExpression(new UnaryOperatorExpression(UnaryOperatorType.Dereference, arg1), arg2);
#endregion
case ILCode.Arglist: return InlineAssembly(byteCode, args);
case ILCode.Arglist:
return new ArgListExpression { IsAccess = true };
case ILCode.Break: return InlineAssembly(byteCode, args);
case ILCode.Call:
case ILCode.CallGetter:

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

@ -119,7 +119,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -119,7 +119,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
// Create AnonymousMethodExpression and prepare parameters
AnonymousMethodExpression ame = new AnonymousMethodExpression();
ame.Parameters.AddRange(AstBuilder.MakeParameters(method.Parameters, isLambda: true));
ame.Parameters.AddRange(AstBuilder.MakeParameters(method, isLambda: true));
ame.HasParameterList = true;
// rename variables so that they don't conflict with the parameters:

7
ILSpy/TreeNodes/MethodTreeNode.cs

@ -60,6 +60,11 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -60,6 +60,11 @@ namespace ICSharpCode.ILSpy.TreeNodes
b.Append(", ");
b.Append(language.TypeToString(method.Parameters[i].ParameterType, false, method.Parameters[i]));
}
if (method.CallingConvention == MethodCallingConvention.VarArg) {
if (method.HasParameters)
b.Append(", ");
b.Append("...");
}
b.Append(") : ");
b.Append(language.TypeToString(method.ReturnType, false, method.MethodReturnType));
return HighlightSearchMatch(method.Name, b.ToString());
@ -85,7 +90,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -85,7 +90,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
if (method.IsSpecialName &&
(method.Name == ".ctor" || method.Name == ".cctor")) {
(method.Name == ".ctor" || method.Name == ".cctor")) {
return Images.GetIcon(MemberIcon.Constructor, GetOverlayIcon(method.Attributes), false);
}

Loading…
Cancel
Save