@ -37,19 +37,32 @@ namespace ICSharpCode.Decompiler
@@ -37,19 +37,32 @@ namespace ICSharpCode.Decompiler
new OpCodeInfo ( OpCodes . And ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Arglist ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Beq ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Beq_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bge ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bge_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bge_Un ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bge_Un_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bgt ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bgt_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bgt_Un ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bgt_Un_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ble ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ble_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ble_Un ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ble_Un_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Blt ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Blt_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Blt_Un ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Blt_Un_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bne_Un ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Bne_Un_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Br ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Br_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Break ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Brfalse ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Brfalse_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Brtrue ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Brtrue_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Call ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Calli ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Ceq ) { CanThrow = false } ,
@ -103,9 +116,26 @@ namespace ICSharpCode.Decompiler
@@ -103,9 +116,26 @@ namespace ICSharpCode.Decompiler
new OpCodeInfo ( OpCodes . Endfinally ) { CanThrow = false } ,
//new OpCodeInfo(OpCodes.Initblk) { CanThrow = true }, - no idea whether this might cause trouble for the type system, C# shouldn't use it so I'll disable it
//new OpCodeInfo(OpCodes.Jmp) { CanThrow = true } - We don't support non-local control transfers.
new OpCodeInfo ( OpCodes . Ldarg ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarga ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldarg ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarg_0 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarg_1 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarg_2 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarg_3 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarg_S ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldarga ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldarga_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_M1 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_0 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_1 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_2 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_3 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_4 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_5 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_6 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_7 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_8 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I4_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_I8 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_R4 ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldc_R8 ) { CanThrow = false } ,
@ -124,9 +154,16 @@ namespace ICSharpCode.Decompiler
@@ -124,9 +154,16 @@ namespace ICSharpCode.Decompiler
new OpCodeInfo ( OpCodes . Ldind_Ref ) { CanThrow = true } ,
// the ldloc exceptions described in the spec can only occur on methods without .localsinit - but csc always sets that flag
new OpCodeInfo ( OpCodes . Ldloc ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldloc_0 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldloc_1 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldloc_2 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldloc_3 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldloc_S ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Ldloca ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldloca_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Ldnull ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Leave ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Leave_S ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Localloc ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Mul ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Mul_Ovf ) { CanThrow = true } ,
@ -143,6 +180,7 @@ namespace ICSharpCode.Decompiler
@@ -143,6 +180,7 @@ namespace ICSharpCode.Decompiler
new OpCodeInfo ( OpCodes . Shr ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Shr_Un ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Starg ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Starg_S ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Stind_I1 ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Stind_I2 ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Stind_I4 ) { CanThrow = true } ,
@ -152,6 +190,11 @@ namespace ICSharpCode.Decompiler
@@ -152,6 +190,11 @@ namespace ICSharpCode.Decompiler
new OpCodeInfo ( OpCodes . Stind_I ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Stind_Ref ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Stloc ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Stloc_0 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Stloc_1 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Stloc_2 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Stloc_3 ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Stloc_S ) { CanThrow = false , IsMoveInstruction = true } ,
new OpCodeInfo ( OpCodes . Sub ) { CanThrow = false } ,
new OpCodeInfo ( OpCodes . Sub_Ovf ) { CanThrow = true } ,
new OpCodeInfo ( OpCodes . Sub_Ovf_Un ) { CanThrow = true } ,