Hi all,
There are several bugs in Reflector. Below are code snippets that reproduce the bugs:
public struct ImplicitCastBug
{
// Expected:
// ((int)this).ToString();
// Actual:
// *(((int*) this)).ToString();
public void TestMethod()
{
int i = this;
i.ToString();
}
public static implicit operator int(ImplicitCastBug x)
{
return 0;
}
}
This one generates code that compiles but is not equivalent to original:
public class MissedClosureInitializationBug
{
// To reproduce set optimization level to .NET 2.0 or higher.
// Expected:
// <>c__DisplayClass1 CS$<>8__locals2;
// CS$<>8__locals2.x = 1;
// this.AnotherMethod(new Action(CS$<>8__locals2, (IntPtr) this.<TestMethod>b__0));
// Actual:
// <>c__DisplayClass1 CS$<>8__locals2;
// this.AnotherMethod(new Action(CS$<>8__locals2, (IntPtr) this.<TestMethod>b__0));
public void TestMethod()
{
int x = 1;
AnotherMethod(() =>
{
x++;
Console.WriteLine(x);
});
}
public void AnotherMethod(Action action)
{
action();
}
}
This one is also generates non-equivalent code:
public class TypeInferenceBug
{
// To reproduce set optimization level to None.
// Expected:
// bool b;
// int i;
// char c;
// bool CS$4$0000;
// b = false;
// i = 0;
// c = 'a';
// if ((((b != false) || (i == 0)) ? false : ((c == 'a') == false)) != false)
// {
// goto Label_001F;
// }
// Label_001F:
// return;
// Actual:
// bool b;
// int i;
// char c;
// bool CS$4$0000;
// b = 0;
// i = 0;
// c = 97;
// if ((((b != null) || (i == null)) ? 0 : ((c == 97) == 0)) != null)
// {
// goto Label_001F;
// }
// Label_001F:
// return;
public void TestMethod()
{
bool b = false;
int i = 0;
char c = 'a';
if (b || i == 0 || c == 'a')
{
}
}
}
public class FixedBug
{
// To reproduce set optimization level to .NET 1.0 or higher.
// Actual:
// int[] CS$0$0000;
// int[] arr = new int[0];
// if (((CS$0$0000 = (arr == null) ? null : arr) != null) && (CS$0$0000.Length != 0))
// {
// goto Label_001D; // Compile error.
// }
// fixed (int* p = null) // Compile error.
// {
// goto Label_0025;
// Label_001D:
// p = CS$0$0000;
// Label_0025:
// this.AnotherMethod(p);
// }
public unsafe void TestMethod()
{
int[] arr = new int[0];
fixed (int* p = arr == null ? null : arr)
{
AnotherMethod(p);
}
}
public unsafe void AnotherMethod(int* p)
{
}
}
There are several bugs in Reflector. Below are code snippets that reproduce the bugs:
public struct ImplicitCastBug { // Expected: // ((int)this).ToString(); // Actual: // *(((int*) this)).ToString(); public void TestMethod() { int i = this; i.ToString(); } public static implicit operator int(ImplicitCastBug x) { return 0; } }This one generates code that compiles but is not equivalent to original:
public class MissedClosureInitializationBug { // To reproduce set optimization level to .NET 2.0 or higher. // Expected: // <>c__DisplayClass1 CS$<>8__locals2; // CS$<>8__locals2.x = 1; // this.AnotherMethod(new Action(CS$<>8__locals2, (IntPtr) this.<TestMethod>b__0)); // Actual: // <>c__DisplayClass1 CS$<>8__locals2; // this.AnotherMethod(new Action(CS$<>8__locals2, (IntPtr) this.<TestMethod>b__0)); public void TestMethod() { int x = 1; AnotherMethod(() => { x++; Console.WriteLine(x); }); } public void AnotherMethod(Action action) { action(); } }This one is also generates non-equivalent code:
public class TypeInferenceBug { // To reproduce set optimization level to None. // Expected: // bool b; // int i; // char c; // bool CS$4$0000; // b = false; // i = 0; // c = 'a'; // if ((((b != false) || (i == 0)) ? false : ((c == 'a') == false)) != false) // { // goto Label_001F; // } // Label_001F: // return; // Actual: // bool b; // int i; // char c; // bool CS$4$0000; // b = 0; // i = 0; // c = 97; // if ((((b != null) || (i == null)) ? 0 : ((c == 97) == 0)) != null) // { // goto Label_001F; // } // Label_001F: // return; public void TestMethod() { bool b = false; int i = 0; char c = 'a'; if (b || i == 0 || c == 'a') { } } }public class FixedBug { // To reproduce set optimization level to .NET 1.0 or higher. // Actual: // int[] CS$0$0000; // int[] arr = new int[0]; // if (((CS$0$0000 = (arr == null) ? null : arr) != null) && (CS$0$0000.Length != 0)) // { // goto Label_001D; // Compile error. // } // fixed (int* p = null) // Compile error. // { // goto Label_0025; // Label_001D: // p = CS$0$0000; // Label_0025: // this.AnotherMethod(p); // } public unsafe void TestMethod() { int[] arr = new int[0]; fixed (int* p = arr == null ? null : arr) { AnotherMethod(p); } } public unsafe void AnotherMethod(int* p) { } }