|
|
|
|
@ -423,26 +423,36 @@ namespace Decompiler
@@ -423,26 +423,36 @@ namespace Decompiler
|
|
|
|
|
return InlineAssembly(byteCode, args); |
|
|
|
|
#endregion
|
|
|
|
|
#region Indirect
|
|
|
|
|
case Code.Ldind_I: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_I1: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_I2: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_I4: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_I8: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_U1: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_U2: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_U4: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_R4: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_R8: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_Ref: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldind_I: |
|
|
|
|
case Code.Ldind_I1: |
|
|
|
|
case Code.Ldind_I2: |
|
|
|
|
case Code.Ldind_I4: |
|
|
|
|
case Code.Ldind_I8: |
|
|
|
|
case Code.Ldind_U1: |
|
|
|
|
case Code.Ldind_U2: |
|
|
|
|
case Code.Ldind_U4: |
|
|
|
|
case Code.Ldind_R4: |
|
|
|
|
case Code.Ldind_R8: |
|
|
|
|
case Code.Ldind_Ref: |
|
|
|
|
case Code.Ldobj: |
|
|
|
|
if (args[0] is DirectionExpression) |
|
|
|
|
return ((DirectionExpression)args[0]).Expression.Detach(); |
|
|
|
|
else |
|
|
|
|
return InlineAssembly(byteCode, args); |
|
|
|
|
|
|
|
|
|
case Code.Stind_I: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_I1: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_I2: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_I4: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_I8: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_R4: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_R8: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_Ref: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Stind_I: |
|
|
|
|
case Code.Stind_I1: |
|
|
|
|
case Code.Stind_I2: |
|
|
|
|
case Code.Stind_I4: |
|
|
|
|
case Code.Stind_I8: |
|
|
|
|
case Code.Stind_R4: |
|
|
|
|
case Code.Stind_R8: |
|
|
|
|
case Code.Stind_Ref: |
|
|
|
|
case Code.Stobj: |
|
|
|
|
if (args[0] is DirectionExpression) |
|
|
|
|
return new AssignmentExpression(((DirectionExpression)args[0]).Expression.Detach(), args[1]); |
|
|
|
|
else |
|
|
|
|
return InlineAssembly(byteCode, args); |
|
|
|
|
#endregion
|
|
|
|
|
case Code.Arglist: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Break: return InlineAssembly(byteCode, args); |
|
|
|
|
@ -478,13 +488,24 @@ namespace Decompiler
@@ -478,13 +488,24 @@ namespace Decompiler
|
|
|
|
|
case Code.Endfilter: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Endfinally: return null; |
|
|
|
|
case Code.Initblk: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Initobj: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Initobj: |
|
|
|
|
if (args[0] is DirectionExpression) |
|
|
|
|
return new AssignmentExpression(((DirectionExpression)args[0]).Expression.Detach(), new DefaultValueExpression { Type = operandAsTypeRef }); |
|
|
|
|
else |
|
|
|
|
return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Jmp: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldarg: |
|
|
|
|
if (methodDef.HasThis && ((ParameterDefinition)operand).Index < 0) { |
|
|
|
|
return new Ast.ThisReferenceExpression(); |
|
|
|
|
if (context.CurrentMethod.DeclaringType.IsValueType) |
|
|
|
|
return MakeRef(new Ast.ThisReferenceExpression()); |
|
|
|
|
else |
|
|
|
|
return new Ast.ThisReferenceExpression(); |
|
|
|
|
} else { |
|
|
|
|
return new Ast.IdentifierExpression(((ParameterDefinition)operand).Name).WithAnnotation(operand); |
|
|
|
|
var expr = new Ast.IdentifierExpression(((ParameterDefinition)operand).Name).WithAnnotation(operand); |
|
|
|
|
if (((ParameterDefinition)operand).ParameterType is ByReferenceType) |
|
|
|
|
return MakeRef(expr); |
|
|
|
|
else |
|
|
|
|
return expr; |
|
|
|
|
} |
|
|
|
|
case Code.Ldarga: |
|
|
|
|
if (methodDef.HasThis && ((ParameterDefinition)operand).Index < 0) { |
|
|
|
|
@ -499,11 +520,15 @@ namespace Decompiler
@@ -499,11 +520,15 @@ namespace Decompiler
|
|
|
|
|
case Code.Ldc_R8: |
|
|
|
|
return new Ast.PrimitiveExpression(operand); |
|
|
|
|
case Code.Ldfld: |
|
|
|
|
if (arg1 is DirectionExpression) |
|
|
|
|
arg1 = ((DirectionExpression)arg1).Expression.Detach(); |
|
|
|
|
return arg1.Member(((FieldReference) operand).Name).WithAnnotation(operand); |
|
|
|
|
case Code.Ldsfld: |
|
|
|
|
return AstBuilder.ConvertType(((FieldReference)operand).DeclaringType) |
|
|
|
|
.Member(((FieldReference)operand).Name).WithAnnotation(operand); |
|
|
|
|
case Code.Stfld: |
|
|
|
|
if (arg1 is DirectionExpression) |
|
|
|
|
arg1 = ((DirectionExpression)arg1).Expression.Detach(); |
|
|
|
|
return new AssignmentExpression(arg1.Member(((FieldReference) operand).Name).WithAnnotation(operand), arg2); |
|
|
|
|
case Code.Stsfld: |
|
|
|
|
return new AssignmentExpression( |
|
|
|
|
@ -517,11 +542,13 @@ namespace Decompiler
@@ -517,11 +542,13 @@ namespace Decompiler
|
|
|
|
|
AstBuilder.ConvertType(((FieldReference)operand).DeclaringType) |
|
|
|
|
.Member(((FieldReference)operand).Name).WithAnnotation(operand)); |
|
|
|
|
case Code.Ldloc: |
|
|
|
|
localVariablesToDefine.Add((ILVariable)operand); |
|
|
|
|
return new Ast.IdentifierExpression(((ILVariable)operand).Name).WithAnnotation(operand); |
|
|
|
|
case Code.Ldloca: |
|
|
|
|
localVariablesToDefine.Add((ILVariable)operand); |
|
|
|
|
return MakeRef(new Ast.IdentifierExpression(((ILVariable)operand).Name).WithAnnotation(operand)); |
|
|
|
|
case Code.Ldnull: return new Ast.NullReferenceExpression(); |
|
|
|
|
case Code.Ldobj: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Ldnull: |
|
|
|
|
return new Ast.NullReferenceExpression(); |
|
|
|
|
case Code.Ldstr: return new Ast.PrimitiveExpression(operand); |
|
|
|
|
case Code.Ldtoken: |
|
|
|
|
if (operand is Cecil.TypeReference) { |
|
|
|
|
@ -562,17 +589,15 @@ namespace Decompiler
@@ -562,17 +589,15 @@ namespace Decompiler
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
case Code.Rethrow: return new Ast.ThrowStatement(); |
|
|
|
|
case Code.Sizeof: return new Ast.SizeOfExpression { Type = AstBuilder.ConvertType(operand as TypeReference) }; |
|
|
|
|
case Code.Sizeof: |
|
|
|
|
return new Ast.SizeOfExpression { Type = operandAsTypeRef }; |
|
|
|
|
case Code.Starg: |
|
|
|
|
return new Ast.AssignmentExpression(new Ast.IdentifierExpression(((ParameterDefinition)operand).Name).WithAnnotation(operand), arg1); |
|
|
|
|
case Code.Stloc: { |
|
|
|
|
ILVariable locVar = (ILVariable)operand; |
|
|
|
|
if (!localVariablesToDefine.Contains(locVar)) { |
|
|
|
|
localVariablesToDefine.Add(locVar); |
|
|
|
|
} |
|
|
|
|
localVariablesToDefine.Add(locVar); |
|
|
|
|
return new Ast.AssignmentExpression(new Ast.IdentifierExpression(locVar.Name).WithAnnotation(locVar), arg1); |
|
|
|
|
} |
|
|
|
|
case Code.Stobj: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Switch: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Tail: return InlineAssembly(byteCode, args); |
|
|
|
|
case Code.Throw: return new Ast.ThrowStatement { Expression = arg1 }; |
|
|
|
|
|